Changeset 2144


Ignore:
Timestamp:
Jan 24, 2008 1:45:54 PM (11 years ago)
Author:
hazmat
Message:

add redirect action, assorted cleanups

Location:
ore.wizard/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ore.wizard/trunk/setup.py

    r2142 r2144  
    44    name="ore.wizard", 
    55    version="0.2", 
    6     install_requires=['setuptools',  
    7                       'zope.publisher', 
    8                       'zope.formlib', 
    9                       'zope.contentprovider'], 
     6    install_requires=['setuptools'], # use in plone means bad requires spec 
    107    dependency_links=['http://download.zope.org/distribution/',], 
    118    packages=find_packages('src', exclude=["*.tests", "*.ftests"]), 
  • ore.wizard/trunk/src/ore/wizard/_wizard.py

    r2142 r2144  
    11from zope import interface, schema, component 
    2 from zope.publisher.interfaces import IBrowserView 
     2from zope.publisher.browser import IBrowserView 
    33from zope.formlib import form 
    44 
     
    77class Wizard( object ): 
    88 
    9     interface.implements( interfaces.IWizard  ) 
     9    interface.implements( interfaces.IWizard, IBrowserView  ) 
    1010     
    1111    def __init__( self, context, request ): 
     
    4646        self._state[k] = v 
    4747         
     48    def get( self, k ): 
     49        return self._state.get( k ) 
     50         
    4851    def update( self ): 
    4952        """ 
    5053        """ 
    5154        self._extractRequestVariables() 
    52  
     55         
     56    def reset( self ): 
     57        """ certain state operations like resetting the form variables are useful when resetting the form 
     58        under error conditions to reset the step 
     59        """ 
     60        # not meaningful in a form request scenario, a redirect will destroy state, but useful for impl 
     61        # that use persistent server state 
     62        self._state = {} 
     63         
    5364    @property 
    5465    def form_state( self ): 
     
    6980        if self._adapters: 
    7081            return self._adapters 
    71         self._adapters = self._extractDataManagers() 
     82        self._adapters, self._fields = self._extractDataManagers() 
     83        return self._adapters 
     84         
     85    @property 
     86    def fields( self ): 
     87        if self._fields is not None: 
     88            return self._fields 
     89        self._adapters, self._fields = self._extractDataManagers() 
     90        return self._fields 
    7291         
    7392    def _extractDataManagers( self ): 
     
    7594        # conveinent use by any step. 
    7695        data_adapters = {} 
     96        fields = form.Fields() 
    7797        for step in self.controller.getTraversedFormSteps(): 
    7898            if not interfaces.IWizardFormStep.providedBy( step ): 
    7999                continue 
    80100            data_adapters.update( step.getSchemaAdapters() ) 
     101             
    81102            widgets = form.setUpEditWidgets( 
    82103                step.form_fields, 
     104                step.prefix, 
    83105                step.context, 
    84106                step.request, 
     
    86108                ignore_request = False 
    87109                ) 
     110            fields += step.form_fields  
    88111            data = {} 
    89112            form.getWidgetsData( widgets, step.prefix, data ) 
     
    92115            # their state. 
    93116            self._restoreAdapterValues( data, data_adapters ) 
    94              
    95         return data_adapters 
    96  
     117         
     118        return data_adapters, fields 
     119         
    97120    def _restoreAdapterValues( self, data, adapters ): 
    98121        for iface, adapter in adapters.items(): 
     
    112135            ignore.append( "%s.%s"%( step.prefix, f.__name__) ) 
    113136             
    114         for k, v in step.request.form.items(): 
     137        for k in step.request.form.keys(): 
    115138            # all multi element widgets need to use the same field prefix 
    116139            next = False 
     
    120143                    break 
    121144            if next: 
    122                 continue                 
    123             passed[ k ] = v 
     145                continue 
     146            # grabs from request not form to allow overriding by components 
     147            passed[ k ] = step.request[ k ]  
    124148        self._state.update( passed ) 
    125149         
     
    166190        raise NotImplemented 
    167191     
     192    def reset( self ): 
     193        self.transitionTo( self.getStartStepName() ) 
     194         
    168195    def transitionTo( self, step_name ): 
    169196        # transition to a new step 
    170197        self.current_step = self.getStep( step_name ) 
    171         self.wizard.data['cur_step'] = step_name 
     198        self.current_step.wizard = self.wizard 
     199        self.wizard.data_manager['cur_step'] = step_name 
    172200 
    173201    def getCurrentStepName( self ): 
    174         cur_step_name = self.wizard.data.get('cur_step') or \ 
    175                         self.request.get('cur_step') or \ 
    176                         self.getStartStep() 
     202        cur_step_name = self.wizard.data_manager.get('cur_step') or \ 
     203                        self.wizard.request.get('cur_step') or \ 
     204                        self.getStartStepName() 
    177205        return cur_step_name 
    178206     
     
    183211            return self.current_step 
    184212        cur_step_name = self.getCurrentStepName() 
    185         current_step = self.getStep( cur_step_name ) 
    186         assert current_step is not None 
    187         return current_step 
     213        self.current_step = self.getStep( cur_step_name ) 
     214        self.current_step.wizard = self.wizard 
     215        assert self.current_step is not None 
     216        return self.current_step 
    188217 
    189218    def update( self ): 
     
    193222        current_step = self.getCurrentStep() 
    194223        current_step.update() 
    195         next_step_name = self.getNextStepName( current_step ) 
     224        next_step_name = self.getNextStepName( step_name ) 
    196225        if next_step_name == step_name: 
    197             self.current_step = current_step 
    198226            return 
     227         
     228        elif next_step_name == interfaces.WIZARD_REDIRECT: 
     229            return 
     230         
    199231        self.transitionTo( next_step_name ) 
    200      
     232        self.getCurrentStep().update() 
     233         
    201234    def getActions( self ): 
    202235        """ 
     
    206239         
    207240        if self.hasPreviousStep(): 
    208             previous_action = form.action(_(u"Back"), name="back") 
     241            previous_action = form.action(u"Back", name="back") 
    209242            yield previous_action, 0 
    210243 
    211244        if self.hasNextStep(): 
    212             next_action = form.action(_(u"Continue"), name="continue") 
     245            next_action = form.action(u"Continue", name="continue") 
    213246            yield next_action, -1 
    214247 
     
    218251        step = component.getMultiAdapter(  
    219252                    ( self.wizard.context, self.wizard.request ), 
    220                     interface=IBrowserView, 
    221253                    name=step_name 
    222254                    ) 
    223255        return step 
    224256         
    225 class ListViewController( ViewControllerMixin ): 
     257class ListViewController( ViewControllerBase ): 
    226258    """ 
    227259    controller which gets steps from a sequence of view names 
     
    241273        return self.steps[0] 
    242274         
    243     def getNextStepName( self, step ): 
    244         current_step = self.getCurrentStepName() 
    245          
     275    def getNextStepName( self, step_name ): 
     276        step = self.getCurrentStep() 
    246277        if step.next_step_name == interfaces.WIZARD_NEXT_STEP: 
    247             idx = self.steps.index( current_step ) + 1 
     278            idx = self.steps.index( step_name ) + 1 
    248279            return self.steps[ idx ] 
    249              
    250280        elif step.next_step_name == interfaces.WIZARD_PREVIOUS_STEP: 
    251             idx = self.steps.index( current_step ) - 1 
     281            idx = self.steps.index( step_name ) - 1 
    252282            return self.steps[ idx ] 
    253      
     283        elif step.next_step_name == interfaces.WIZARD_REDIRECT: 
     284            return step.next_step_name 
     285        return step_name 
     286         
    254287    def getTraversedFormSteps( self ): 
    255288        step_name = self.getCurrentStepName() 
  • ore.wizard/trunk/src/ore/wizard/interfaces.py

    r2142 r2144  
    22from zope.contentprovider.interfaces import IContentProvider 
    33 
    4  
     4WIZARD_REDIRECT = object() # breaking out of the wizard 
    55WIZARD_NEXT_STEP = object() 
    66WIZARD_PREVIOUS_STEP = object() 
Note: See TracChangeset for help on using the changeset viewer.