Changeset 3818

Show
Ignore:
Timestamp:
06/10/08 15:29:10 (7 months ago)
Author:
k0s
Message:

reverbify syntax to universalize between .ini file, JS, and someday the web interface; see http://trac-hacks.org/ticket/3129

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ticketsubmitpolicyplugin/0.11/ticketsubmitpolicy/ticketsubmitpolicy.py

    r3817 r3818  
    11# Plugin for trac 0.11 
     2 
     3import re 
    24 
    35from genshi.builder import tag  
    46from genshi.filters import Transformer 
    5  
    67 
    78from trac.core import * 
     
    910from trac.web import ITemplateStreamFilter 
    1011 
    11  
     12def camelCase(string): 
     13    """returns the camelCase representation of a string""" 
     14 
     15    args = string.split() 
     16    args = [args[0]] + [ i.capitalize() for i in args[1:] ] 
     17    return ''.join(args) 
     18 
     19 
     20### policies 
    1221 
    1322class ITicketSubmitPolicy(Interface): 
     
    4756var field=getValue("field-" + requiredfield); 
    4857 
    49 if (! comparitor(val, value)) 
     58if (comparitor(val, value)) 
    5059{ 
    5160 
     
    6978 
    7079    def onsubmit(self, field, comparitor, value, requiredfield): 
    71         requires = "requires('%s', %s, '%s', '%s');" % (field, comparitor, value, requiredfield) 
     80        requires = "requires('%s', %s, %s, '%s');" % (field, comparitor, value, requiredfield) 
    7281        return requires 
    7382 
     
    8089 
    8190    def filter_stream(self, stream, field, comparitor, value, excludedfield): 
    82         exclude = "exclude('%s', %s, '%s', '%s')" % ( field, comparitor, value, excludedfield ) 
     91        exclude = "exclude('%s', %s, %s, '%s')" % ( field, comparitor, value, excludedfield ) 
    8392        stream |= Transformer("//select[@id='field-%s']" % field).attr('onchange', exclude) 
    8493        return stream 
     
    92101if (comparitor(val, value)) 
    93102{ 
     103element.style.display="none"; 
     104} 
     105else 
     106{ 
    94107element.style.display=""; 
    95108} 
    96 else 
    97 { 
    98 element.style.display="none"; 
    99 } 
    100109 
    101110} 
     
    103112 
    104113    def onload(self, field, comparitor, value, excludedfield): 
    105         return "exclude('%s', %s, '%s', '%s');" % ( field, comparitor, value, excludedfield ) 
     114        return "exclude('%s', %s, %s, '%s');" % ( field, comparitor, value, excludedfield ) 
    106115 
    107116    def onsubmit(self, field, comparitor, value, excludedfield): 
     
    132141    policies = ExtensionPoint(ITicketSubmitPolicy) 
    133142 
    134     comparitors =  {'!=': 'is',  
    135                     '==': 'isNot', 
    136                     'in': 'isIn', 
    137                     'not in': 'isNotIn' } 
     143#     comparitors =  {'!=': 'is',  
     144#                     '==': 'isNot', 
     145#                     'in': 'isIn', 
     146#                     'not in': 'isNotIn' } 
     147 
     148    comparitors = { 'is': 1, 
     149                    'is not': 1, 
     150                    'is in': 'Array', 
     151                    'is not in': 'Array' } 
    138152 
    139153    def policy_dict(self): 
     
    147161        parse the [ticket-submit-policy] section of the config for policy rules 
    148162        """ 
     163 
     164        # XXX wtf? 
    149165        section = dict([i for i in self.config.options('ticket-submit-policy')]) 
     166 
     167 
    150168        policies = {} # XXX this should probably be a real class, not an abused dict 
    151169        for key in section: 
     
    160178            if action == 'condition': 
    161179                condition = section[key] 
    162                 for comparitor in self.comparitors: 
    163                     if comparitor in condition: 
    164                         field, value = [i.strip() for i in condition.split(comparitor)] 
    165                         policies[name]['condition'] = dict(field=field,value=value,comparitor=comparitor) 
    166                         break 
     180 
     181                # look for longest match to prevent substring matching 
     182                comparitors = sorted(self.comparitors.keys(), key=lambda x: len(x), reverse=True) 
     183                match = re.match('.* (%s) .*' % '|'.join(comparitors), condition) 
     184                if match: 
     185                    comparitor = match.groups()[0] 
     186                    field, value = [i.strip() for i in condition.split(comparitor, 1)] 
     187                    if self.comparitors[comparitor] == 'Array': 
     188                        value = ', '.join(["'%s'" % i.strip()  
     189                                           for i in value.split(',')]) 
     190                        value = '[%s]' % value 
     191                    else: 
     192                        value = "'%s'" % value 
     193                    comparitor = camelCase(comparitor) 
     194                    policies[name]['condition'] = dict(field=field,value=value,comparitor=comparitor) 
     195 
    167196                else: 
    168197                    self.log.error("Invalid condition: %s" % condition) 
     198                                         
    169199                continue 
    170200 
     
    199229 
    200230            policies = self.parse() 
     231             
    201232            for key, policy in policies.items(): 
    202233 
     
    204235                field = policy['condition']['field'] 
    205236                comparitor = policy['condition']['comparitor'] 
    206                 comparitor = self.comparitors[comparitor] 
    207237                value = policy['condition']['value'] 
    208238