Ignore:
Timestamp:
2 Oct 2012, 06:43:52 (12 years ago)
Author:
Henrik Bettermann
Message:

Repair and optimize AccessCodeProcessor?. AC states and transitions can now be imported in create and update mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/batching.py

    r9265 r9266  
    2020"""
    2121import grok
    22 from hurry.workflow.interfaces import IWorkflowState
     22from hurry.workflow.interfaces import IWorkflowState, IWorkflowInfo
    2323from zope.interface import Interface
    24 from waeup.kofa.interfaces import IBatchProcessor, IGNORE_MARKER, IObjectHistory
     24from waeup.kofa.interfaces import (
     25    IBatchProcessor, IGNORE_MARKER, IObjectHistory, IObjectConverter)
    2526from waeup.kofa.utils.batching import BatchProcessor
    2627from waeup.kofa.accesscodes.interfaces import IAccessCodeBatch, IAccessCode
     28from waeup.kofa.accesscodes.workflow import INITIALIZED, USED, DISABLED
     29
     30IMPORTABLE_TRANSITIONS = (
     31    'init', 'use', 'disable_used', 'disable_used', 'reeanble')
     32
     33IMPORTABLE_STATES = (INITIALIZED, USED, DISABLED)
    2734
    2835class AccessCodeBatchProcessor(BatchProcessor):
     
    98105                    self.location_fields + [
    99106                        'random_num', 'owner', 'cost',
    100                         'state', 'batch_serial',
    101                         'history',]
     107                        'state', 'batch_serial',]
    102108                    )))
    103109
    104110    @property
    105111    def required_fields(self):
    106         return ['random_num', 'state', 'batch_serial', 'history',]
     112        return ['random_num', 'batch_serial', 'history',]
    107113
    108114    def parentsExist(self, row, site):
     
    133139        parent[row['representation']] = obj
    134140        return
     141
     142    def checkConversion(self, row, mode='create'):
     143        """Validates all values in row.
     144        """
     145        converter = IObjectConverter(self.iface)
     146        errs, inv_errs, conv_dict =  converter.fromStringDict(
     147            row, self.factory_name, mode=mode)
     148        if row.has_key('transition') and row.has_key('state'):
     149            if row['transition'] not in (IGNORE_MARKER, '') and \
     150                row['state'] not in (IGNORE_MARKER, ''):
     151                errs.append(('workflow','not allowed'))
     152                return errs, inv_errs, conv_dict
     153        if row.has_key('transition'):
     154            if row['transition'] not in IMPORTABLE_TRANSITIONS:
     155                if row['transition'] not in (IGNORE_MARKER, ''):
     156                    errs.append(('transition','not allowed'))
     157        if row.has_key('state'):
     158            if row['state'] not in IMPORTABLE_STATES:
     159                if row['state'] not in (IGNORE_MARKER, ''):
     160                    errs.append(('state','not allowed'))
     161                else:
     162                    # State is an attribute of AccessCode and must not
     163                    # be changed if empty.
     164                    conv_dict['state'] = IGNORE_MARKER
     165        return errs, inv_errs, conv_dict
     166
     167    def checkUpdateRequirements(self, obj, row, site):
     168        """Checks requirements the object must fulfill when being updated.
     169
     170        This method is not used in case of deleting or adding objects.
     171
     172        Returns error messages as strings in case of requirement
     173        problems.
     174        """
     175        transition = row.get('transition', IGNORE_MARKER)
     176        if transition not in (IGNORE_MARKER, ''):
     177            allowed_transitions = IWorkflowInfo(obj).getManualTransitionIds()
     178            if transition not in allowed_transitions:
     179                return 'Transition not allowed.'
     180        return None
    135181
    136182    def updateEntry(self, obj, row, site):
     
    147193                IWorkflowState(obj).setState(value)
    148194                items_changed += ('%s=%s, ' % ('state', state))
     195                msg = "state '%s' set" % state
     196                IObjectHistory(obj).addMessage(msg)
    149197            row.pop('state')
    150         # Update history
    151         if row.has_key('history'):
    152             history = row.get('history', IGNORE_MARKER)
    153             if history not in (IGNORE_MARKER, ''):
    154                 values = row['history'].split('||')
    155                 for value in values:
    156                     IObjectHistory(obj).addMessage(value)
    157                 items_changed += ('%s=%s, ' % ('history', history))
    158             row.pop('history')
     198        # Fire transition
     199        if row.has_key('transition'):
     200            transition = row.get('transition', IGNORE_MARKER)
     201            if transition not in (IGNORE_MARKER, ''):
     202                value = row['transition']
     203                IWorkflowInfo(obj).fireTransition(value)
     204                items_changed += ('%s=%s, ' % ('transition', transition))
     205            row.pop('transition')
    159206
    160207        # In import files we can use the hash symbol at the end of a
    161208        # random_num string to avoid annoying automatic number transformation
    162209        # by Excel or Calc
    163         row['random_num'] = row['random_num'].strip('#')
     210        if row.has_key('random_num'):
     211            random_num = row.get('random_num', IGNORE_MARKER)
     212            if random_num not in (IGNORE_MARKER, ''):
     213                row['random_num'] = random_num.strip('#')
    164214
    165215        items_changed += super(AccessCodeProcessor, self).updateEntry(
Note: See TracChangeset for help on using the changeset viewer.