Thanks for sharing this code John. I'm trying to recreate your mod and 
follow the steps:
>
> All I did was mod the core.py file, then re-run the setup.py, copy the 
> egg, and bounce the server

but when I run 'python setup.py install' it seems to break the plugin. Can 
anyone share in more detail how exactly a Python plugin can be modified?

On Tuesday, June 16, 2009 at 1:37:56 PM UTC-5, Dan Winslow wrote:
>
> Well, I can inline the code for ticketvalidator/core.py...be aware that I 
> know virtually nothing about python and was operating totally in the dark. 
> This operates off of an addition to the ini file as so : 
>
> [fieldscheck] 
> actual_hours = int,1,200 
> date_due = date 
> estimate_hours = int,1,200 
>
> the params for the field name are <data type>, optional val, optional val. 
> The 'int' means integer and the two optionals are min and max. Right now 
> int is the only one implemented, but you can see there's a case for others. 
> All I did was mod the core.py file, then re-run the setup.py, copy the egg, 
> and bounce the server. You should diff this with the stock core.py to see 
> the changes. Basically, I added _is_not_integer and also hacked the 
> validate_ticket function. 
>
>
>
> # -*- coding: utf-8 -*- 
> # 
> # Copyright (C) 2008 Max Stewart 
> # All rights reserved. 
> # 
> # This file is part of the TicketValidator plugin for Trac 
> # 
> # TicketValidator is free software: you can redistribute it and/or 
> # modify it under the terms of the GNU General Public License as 
> # published by the Free Software Foundation, either version 3 of 
> # the License, or (at your option) any later version. 
> # 
> # TicketValidator is distributed in the hope that it will be useful, 
> # but WITHOUT ANY WARRANTY; without even the implied warranty of 
> # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
> # GNU General Public License for more details. 
> # 
> # You should have received a copy of the GNU General Public License 
> # along with TicketValidator.  If not, see 
> # <http://www.gnu.org/licenses/>. 
>
> from trac.core import * 
> from trac.ticket import ITicketManipulator 
> from trac.ticket import TicketSystem 
>
> class RequiredFieldValidator(Component): 
>     """Basic ticket validator for required fields""" 
>
>     implements(ITicketManipulator) 
>
>     def _is_not_integer(self, value): 
>         if value is None: 
>             return True 
>         try: 
>             dummy = int(value.strip()) 
>             return False 
>         except ValueError: 
>             # 'source' does not represent a number 
>             return True 
>         return False 
>
>
>
>     def _is_empty(self, value): 
>         """Check if 'value' is empty. 
>
>         :param value: the value to check 
>         :type value: object""" 
>
>         if value is None: 
>             return True 
>
>         if len(value) == 0: 
>             return True 
>
>         return False 
>
>     def prepare_ticket(self, req, ticket, fields, actions): 
>         """Not currently called, but should be provided for future 
>         compatibility.""" 
>
>     def validate_ticket(self, req, ticket): 
>         """Make sure required fields for the next state have been 
>         the ticket will be in have been entered.""" 
>
>         state = self._get_state(req, ticket) 
>         res   = ticket["resolution"] 
>
>         #this section forces certain values based on resolution 
>         if res == "canceled - duplicate": 
>             ticket["actual_hours"]="0" 
>             ticket["estimate_hours"]="0" 
>             ticket["date_due"]="" 
>
>         #this section validates based on required and type lookup tables 
>         errors=[] 
>         required_fields = self.config.getlist('ticketvalidator',state + 
> '.required') 
>         for field_name in required_fields: 
>            field_name=field_name.lower() 
>            self.env.log.info("found required field name %s" % field_name) 
>            flist = self.config.getlist('fieldscheck',field_name) 
>            if flist: 
>                self.env.log.info(" found custom validate for %s type : %s 
> value : %s" 
>                                  % 
> (field_name,flist[0],ticket[field_name])) 
>                if flist[0] == "int": 
>                    if self._is_not_integer(ticket[field_name]): 
>                        errors.append((field_name, '%s must be an integer 
> range %s to %s' % 
>                        (field_name,flist[1],flist[2]))) 
>                elif flist[0] == "date": 
>                    if ticket[field_name]=="<click to set date>" or 
> ticket[field_name]=="": 
>                        errors.append((field_name, '%s must be set to a 
> date.' % field_name)) 
>                else: 
>                    if self._is_empty(ticket[field_name]): 
>                        errors.append((field_name, ' cannot be empty.')) 
>            else: 
>                if self._is_empty(ticket[field_name]): 
>                    errors.append((field_name, ' cannot be empty.')) 
>
>         #this section does special validation based on resolution 
>         if state == "closed": 
>             self.env.log.info("resolution : %s" % ticket["resolution"]) 
>             if ticket["resolution"] == "canceled - duplicate": 
>                 if self._is_empty(ticket["duplicate"]): 
>                     errors.append(("duplicate", ' cannot be empty.')) 
>
>
>         #errors=[(field_name, '%s must be an integer' % field_name) 
>         #          for field_name in editcheck_fields 
>         #          if self._is_not_integer(ticket[field_name])] 
>
>         #required_fields = self.config.getlist('ticketvalidator', 
>         #                                      state + '.required') 
>
>         #errors = [(field_name, '%s is required' % field_name) 
>         #           for field_name in required_fields 
>         #           if self._is_empty(ticket[field_name])] 
>
>         return errors 
>
>     def _get_state(self, req, ticket): 
>         """Get the state this ticket is going to be in.""" 
>
>         if 'action' not in req.args: 
>             return 'new' 
>
>         action = req.args['action'] 
>         action_changes = {} 
>
>         for controller in self._get_action_controllers(req, ticket, 
> action): 
>             action_changes.update(controller.get_ticket_changes(req, 
> ticket, action)) 
>
>         return 'status' in action_changes and action_changes['status'] or 
> ticket['status'] 
>
>     def _get_action_controllers(self, req, ticket, action): 
>
>         for controller in TicketSystem(self.env).action_controllers: 
>             actions = [action for weight, action in 
>                        controller.get_ticket_actions(req, ticket)] 
>             if action in actions: 
>                 yield controller 
>
>
> -----Original Message----- 
> From: [email protected] <javascript:> [mailto:
> [email protected] <javascript:>] On Behalf Of yoheeb 
> Sent: Tuesday, June 16, 2009 1:01 PM 
> To: Trac Users 
> Subject: [Trac] Re: Mandatory fields 
>
>
> On Jun 10, 3:33 pm, "Dan Winslow" <[email protected]> wrote: 
> > You can use a couple different plugins. I wound up using TicketValidator 
> > plugin...although I had to modify it to do more than just check if the 
> > field was blank or not. 
> > 
> > -----Original Message----- 
> > From: [email protected] <javascript:> [mailto:
> [email protected] <javascript:>] 
> > 
> > On Behalf Of John Andrunas 
> > Sent: Wednesday, June 10, 2009 3:22 PM 
> > To: [email protected] <javascript:> 
> > Subject: [Trac] Mandatory fields 
> > 
> > Is there any way to make mandatory fields in trac?  I don't seen any 
> > way but it seems like the kind of thing that would be in there. 
> > 
> > -- 
> > John 
>
> Any chance you could post these modifications to the hack as an 
> attachment or something similiar? 
>
>

-- 
You received this message because you are subscribed to the Google Groups "Trac 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/trac-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to