#2992: Add support to webadmin for milestones - diff included in the description
-------------------------+--------------------------------------------------
 Reporter:  anonymous    |       Owner:  daniel
     Type:  enhancement  |      Status:  new   
 Priority:  normal       |   Milestone:  0.11  
Component:  trac-admin   |     Version:  none  
 Severity:  normal       |    Keywords:        
-------------------------+--------------------------------------------------
 {{{
 Index: webadmin/ticket.py
 ===================================================================
 --- webadmin/ticket.py  (revision 3111)
 +++ webadmin/ticket.py  (working copy)
 @@ -98,7 +98,81 @@

          return 'admin_component.cs', None

 +class MilestoneAdminPage(Component):

 +    implements(IAdminPageProvider)
 +
 +    # IAdminPageProvider
 +    def get_admin_pages(self, req):
 +        if req.perm.has_permission('TICKET_ADMIN'):
 +            yield ('ticket', 'Ticket System', 'milestones', 'Milestones')
 +
 +    def process_admin_request(self, req, cat, page, milestone):
 +        req.perm.assert_permission('TICKET_ADMIN')
 +
 +        # Detail view?
 +        if milestone:
 +            mil = ticket.Milestone(self.env, milestone)
 +            if req.method == 'POST':
 +                if req.args.get('save'):
 +                    mil.name = req.args.get('name')
 +                    if req.args.get('time'):
 +                        mil.time =  util.parse_date(req.args.get('time'))
 +                    mil.description = req.args.get('description')
 +                    mil.update()
 +                    req.redirect(self.env.href.admin(cat, page))
 +                elif req.args.get('cancel'):
 +                    req.redirect(self.env.href.admin(cat, page))
 +
 +            req.hdf['admin.milestone'] = {
 +                'name': mil.name,
 +                'due': mil.due and util.format_datetime(mil.due) or '',
 +                'description': mil.description
 +            }
 +        else:
 +            if req.method == 'POST':
 +                # Add Milestone
 +                if req.args.get('add') and req.args.get('name'):
 +                    mil = ticket.Milestone(self.env)
 +                    mil.name = req.args.get('name')
 +                    if req.args.get('due'):
 +                        mil.time = util.parse_date(req.args.get('due'))
 +                    mil.insert()
 +                    req.redirect(self.env.href.admin(cat, page))
 +
 +                # Remove milestone
 +                elif req.args.get('remove') and req.args.get('sel'):
 +                    sel = req.args.get('sel')
 +                    sel = isinstance(sel, list) and sel or [sel]
 +                    if not sel:
 +                        raise TracError, 'No milestone selected'
 +                    db = self.env.get_db_cnx()
 +                    for name in sel:
 +                        mil = ticket.Milestone(self.env, name, db=db)
 +                        mil.delete(db=db)
 +                    db.commit()
 +                    req.redirect(self.env.href.admin(cat, page))
 +
 +                # Set default milestone
 +                elif req.args.get('apply'):
 +                    if req.args.get('default'):
 +                        name = req.args.get('default')
 +                        self.log.info('Setting default milestone to %s',
 name)
 +                        self.config.set('ticket', 'default_milestone',
 name)
 +                        self.config.save()
 +                        req.redirect(self.env.href.admin(cat, page))
 +
 +            default = self.config.get('ticket', 'default_milestone')
 +            req.hdf['admin.milestones'] = \
 +                [{'name': m.name,
 +                  'due': m.due and util.format_datetime(m.due) or '',
 +                  'is_default': m.name == default,
 +                  'href': self.env.href.admin(cat, page, m.name)
 +                 } for m in ticket.Milestone.select(self.env)]
 +
 +        return 'admin_milestone.cs', None
 +
 +
  class VersionAdminPage(Component):

      implements(IAdminPageProvider)
 Index: webadmin/templates/admin_milestone.cs
 ===================================================================
 --- webadmin/templates/admin_milestone.cs       (revision 0)
 +++ webadmin/templates/admin_milestone.cs       (revision 0)
 @@ -0,0 +1,83 @@
 +<h2>Manage Milestones</h2><?cs
 +
 +if:admin.milestone.name ?>
 + <form class="mod" id="modmil" method="post">
 +  <fieldset>
 +   <legend>Modify Milestone:</legend>
 +   <div class="field">
 +    <label>Name:<br /> <input type="text" name="name"value="<?cs
 +      var:admin.milestone.name ?>" /></label>
 +   </div>
 +   <div class="field">
 +    <label>Due:<br /> <input type="text" name="due" value="<?cs
 +      var:admin.milestone.due ?>"></label>
 +   </div>
 +   <div class="field">
 +    <label>Completed:<br /> <input type="text" name="completed"
 value="<?cs
 +      var:admin.milestone.completed ?>"></label>
 +   </div>
 +   <div class="field">
 +    <fieldset class="iefix">
 +     <label for="description">Description (you may use <a tabindex="42"
 href="<?cs
 +       var:trac.href.wiki ?>/WikiFormatting">WikiFormatting</a>
 here):</label>
 +     <p><textarea id="description" name="description" class="wikitext"
 rows="6" cols="60"><?cs
 +       var:admin.milestone.description ?></textarea></p>
 +    </fieldset>
 +   </div>
 +   <script type="text/javascript" src="<?cs
 +     var:chrome.href ?>/common/js/wikitoolbar.js"></script>
 +   <div class="buttons">
 +    <input type="submit" name="cancel" value="Cancel">
 +    <input type="submit" name="save" value="Save">
 +   </div>
 +  </fieldset>
 + </form><?cs
 +
 +else ?>
 +
 + <form class="addnew" id="addmil" method="post">
 +  <fieldset>
 +   <legend>Add Milestone:</legend>
 +   <div class="field">
 +    <label>Name:<input type="text" name="name" id="name"></label>
 +   </div>
 +   <div class="field">
 +    <label>Due: <input type="text" name="due" value="<?cs
 +      var:admin.milestone.due ?>"></label>
 +   </div>
 +   <div class="buttons">
 +    <input type="submit" name="add" value="Add">
 +   </div>
 +  </fieldset>
 + </form><?cs
 +
 + if:len(admin.milestones) ?><form method="POST">
 +  <table class="listing" id="millist">
 +   <thead>
 +    <tr><th class="sel">&nbsp;</th><th>Name</th>
 +    <th>Time</th><th>Default</th></tr>
 +   </thead><tbody><?cs
 +   each:mil = admin.milestones ?>
 +   <tr>
 +    <td><input type="checkbox" name="sel" value="<?cs var:mil.name ?>"
 /></td>
 +    <td><a href="<?cs var:mil.href ?>"><?cs var:mil.name ?></a></td>
 +    <td><?cs var:mil.due ?></td>
 +     <td class="default"><input type="radio" name="default" value="<?cs
 +       var:mil.name ?>"<?cs
 +       if:mil.is_default ?> checked="checked" <?cs /if ?>></td>
 +   </tr><?cs
 +   /each ?></tbody>
 +  </table>
 +  <div class="buttons">
 +   <input type="submit" name="remove" value="Remove selected items" />
 +   <input type="submit" name="apply" value="Apply changes" />
 +  </div>
 +  <p class="help">You can remove all items from this list to completely
 hide
 +  this field from the user interface.</p>
 + </form><?cs
 + else ?>
 +  <p class="help">As long as you don't add any items to the list, this
 field
 +  will remain completely hidden from the user interface.</p><?cs
 + /if ?><?cs
 +
 +/if ?>
 }}}

-- 
Ticket URL: <http://projects.edgewall.com/trac/ticket/2992>
The Trac Project <http://trac.edgewall.com/>
_______________________________________________
Trac-Tickets mailing list
[email protected]
http://lists.edgewall.com/mailman/listinfo/trac-tickets

Reply via email to