Changeset 3345

Show
Ignore:
Timestamp:
03/11/08 18:52:53 (10 months ago)
Author:
rharkins
Message:

Added basic, untested, support for permissions.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • checklistplugin/0.11/trac_checklist/db.py

    r3337 r3345  
    1616    def checklist_setValue(context, field, value, who): 
    1717        "Adds or updates a value for the context field specified." 
     18 
     19    def checklist_updateFields(fields): 
     20        "Performs setValue calls based on the 4-tuple list fields" 
    1821 
    1922class ChecklistDBComponent(Component): 
     
    6265 
    6366    def checklist_setValue(self, context, field, value, who): 
    64         when = datetime.now().isoformat(':') 
     67        self.updateField(context, field, value, who) 
     68        self.commit() 
     69 
     70    def checklist_updateFields(self, fields): 
     71        for context, field, value, who in fields: 
     72            self.updateField(context, field, value, who) 
     73        self.commit() 
     74 
     75    # 
     76    # Database access/update methods 
     77    def updateField(self, context, field, value, who): 
     78        when = datetime.now().isoformat(' ') 
    6579        self.log.debug('checklist_setValue(%r, %r, %r, %r, %r)' % 
    6680            (context, field, value, who, when)) 
     
    7185            """, context, field): 
    7286 
    73             self.commit(""" 
     87            self.execute(""" 
    7488                UPDATE  checklist_value 
    7589                SET     value = %s, 
     
    8094                """, value, when, who, context, field) 
    8195        else: 
    82             self.commit(""" 
     96            self.execute(""" 
    8397                INSERT  INTO checklist_value( 
    8498                        context, field, value, updated_when, updater) 
     
    176190 
    177191    def rollback(self): 
    178         self.db.rollback() 
     192        self.env.get_db_cnx().rollback() 
    179193 
    180194    def commit(self, sql=None, *params, **kw): 
    181195        if sql is not None: 
    182196            cursor = self.execute(sql, *params, **kw) 
    183         self.db.commit() 
     197        self.env.get_db_cnx().commit() 
    184198 
  • checklistplugin/0.11/trac_checklist/macros.py

    r3344 r3345  
    4646                                break 
    4747        section = flags.get('section') 
     48        can_set = str(flags.get('can-set', '')) 
     49        can_get = str(flags.get('can-get', '')) 
     50        can_change = str(flags.get('can-change', '')) 
    4851        if section: 
    4952            context += '::' + section 
     
    5558        def replacer(match): 
    5659            op, field = match.groups() 
    57             fn = getattr(self, 'op_' + (op or 'checkbox'), None) 
     60            op, argstr = (op.split(':', 1) + [''])[:2] 
     61            fn = getattr(self, 
     62                'op_' + (op or 'checkbox').replace('-', '_'), None) 
    5863            if fn is not None: 
    59                 return fn(field, data, notes) 
     64                args = [arg.strip() for arg in argstr.split(':')] 
     65                return fn(field, data, notes, *(arg for arg in args if arg)) 
    6066            else: 
    6167                return 'ERROR: No function for operation %r' % op 
     
    6874            '<FORM method="GET" action="%s"' % href, 
    6975                '>', 
     76            '<INPUT type="hidden" name="can-set:*" value=%r>' % can_set, 
     77            '<INPUT type="hidden" name="can-get:*" value=%r>' % can_get, 
     78            '<INPUT type="hidden" name="can-change:*" value=%r>' % can_change, 
    7079            '<INPUT type="hidden" name="__backpath__" value=%r>'  
    7180                % formatter.req.href(formatter.req.path_info), 
     
    112121            )) 
    113122 
     123    def op_can_set(self, field, data, notes, right=''): 
     124        return ''.join(( 
     125            '<INPUT type="hidden" name=%r value=%r>' % 
     126                ('can-set:' + field, right) 
     127            )) 
     128 
     129    def op_can_get(self, field, data, notes, right=''): 
     130        return ''.join(( 
     131            '<INPUT type="hidden" name=%r value=%r>' % 
     132                ('can-get:' + field, right) 
     133            )) 
     134 
     135    def op_can_change(self, field, data, notes, right=''): 
     136        return ''.join(( 
     137            '<INPUT type="hidden" name=%r value=%r>' % 
     138                ('can-change:' + field, right) 
     139            )) 
     140 
  • checklistplugin/0.11/trac_checklist/updater.py

    r3344 r3345  
    6262            if isinstance(fields, basestring): 
    6363                fields = (fields,) 
     64            updates =[] 
    6465            for name in set(fields): 
    6566                value = bool(args.get(name)) and 'on' or '' 
    6667                oldvalue = bool(args.get('old:' + name)) and 'on' or '' 
     68                can_set = args.get('can-set:' + name) or args.get('can-set:*') 
     69                can_get = args.get('can-get:' + name) or args.get('can-get:*') 
     70                can_change = args.get('can-change:' + name) \ 
     71                    or args.get('can-change:*') 
    6772                if value != oldvalue: 
    68                     self.updateField(context, name, value, who) 
     73                    if value: 
     74                        perm = can_set or can_change 
     75                    else: 
     76                        perm = can_get or can_change 
     77                    perm = str(perm) 
     78                    if perm and not req.perm.has_permission(perm): 
     79                        raise PermissionDenied( 
     80                            'You must have %r to do this.' % perm) 
     81                    updates.append((context, name, value, who)) 
     82                self.updateFields(updates) 
    6983        except Exception, e: 
    7084            code = getattr(e, '__http_status__', 500) 
     
    88102            req.write('OK') 
    89103 
    90     def updateField(self, context, name, value, who): 
     104    def updateFields(self, updates): 
    91105        # Broadcast the updates. 
    92106        for observer in self.clobservers: 
    93             observer.checklist_setValue(context, name, value, who
     107            observer.checklist_updateFields(updates
    94108