Changeset 7811 for main/waeup.kofa/trunk/src/waeup/kofa/accesscodes
- Timestamp:
- 8 Mar 2012, 19:00:51 (13 years ago)
- Location:
- main/waeup.kofa/trunk/src/waeup/kofa/accesscodes
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/__init__.py
r7137 r7811 4 4 5 5 Main content components are defined in 6 :mod:`waeup. sirp.accesscodes.accesscode`. This subpackage also6 :mod:`waeup.kofa.accesscodes.accesscode`. This subpackage also 7 7 provides a _catalog_ to lookup any access code quickly and a 8 8 _workflow_ to guarantee consistent states and transitions when dealing … … 11 11 We also provide UI components to generate, archive, import and 12 12 reimport access codes or batches thereof. These parts are defined in 13 :mod:`waeup. sirp.accesscodes.browser`.13 :mod:`waeup.kofa.accesscodes.browser`. 14 14 15 15 The interfaces of this subpackage are defined in 16 :mod:`waeup. sirp.accesscodes.interfaces`.16 :mod:`waeup.kofa.accesscodes.interfaces`. 17 17 """ 18 from waeup. sirp.accesscodes.accesscode import (18 from waeup.kofa.accesscodes.accesscode import ( 19 19 get_access_code, invalidate_accesscode, disable_accesscode, 20 20 reenable_accesscode, create_accesscode, -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/accesscode.py
r7747 r7811 31 31 from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState 32 32 from random import SystemRandom as random 33 from waeup. sirp.interfaces import ISIRPPluggable, IObjectHistory34 from waeup. sirp.utils.logger import Logger35 from waeup. sirp.accesscodes.interfaces import (33 from waeup.kofa.interfaces import IKOFAPluggable, IObjectHistory 34 from waeup.kofa.utils.logger import Logger 35 from waeup.kofa.accesscodes.interfaces import ( 36 36 IAccessCode, IAccessCodeBatch, IAccessCodeBatchContainer 37 37 ) 38 from waeup. sirp.accesscodes.workflow import DISABLED, USED, ac_states_dict38 from waeup.kofa.accesscodes.workflow import DISABLED, USED, ac_states_dict 39 39 40 40 class AccessCode(grok.Model): … … 42 42 43 43 Implements 44 :class:`waeup. sirp.accesscodes.interfaces.IAccessCode`. :class:`AccessCode`44 :class:`waeup.kofa.accesscodes.interfaces.IAccessCode`. :class:`AccessCode` 45 45 instances are normally part of an :class:`AccessCodeBatch` so 46 46 their representation (or code) is built with the containing batch … … 68 68 The state of an access code is something like 'used', 'disabled', 69 69 etc. and determined by the workflow defined in 70 :mod:`waeup. sirp.accesscodes.workflow`. This also means that70 :mod:`waeup.kofa.accesscodes.workflow`. This also means that 71 71 instead of setting the status of an access code directly (you 72 72 can't do that easily, and yes, that's intentionally), you have to 73 73 trigger a transition (that might fail, if the transition is not 74 74 allowed in terms of logic or permissions). See 75 :mod:`waeup. sirp.accesscodes.workflow` for details.75 :mod:`waeup.kofa.accesscodes.workflow` for details. 76 76 77 77 """ … … 139 139 @property 140 140 def history(self): 141 """A :class:`waeup. sirp.objecthistory.ObjectHistory` instance.141 """A :class:`waeup.kofa.objecthistory.ObjectHistory` instance. 142 142 """ 143 143 history = IObjectHistory(self) … … 285 285 If the path does not exist yet, it is created. The path is 286 286 normally ``accesscodes/imports`` below the datacenter storage 287 path (see :data:`waeup. sirp.accesscodes.Datacenter.storage`).287 path (see :data:`waeup.kofa.accesscodes.Datacenter.storage`). 288 288 """ 289 289 site = grok.getSite() … … 403 403 return 404 404 405 logger_name = 'waeup. sirp.${sitename}.accesscodes'405 logger_name = 'waeup.kofa.${sitename}.accesscodes' 406 406 logger_filename = 'accesscodes.log' 407 407 … … 415 415 class AccessCodePlugin(grok.GlobalUtility): 416 416 grok.name('accesscodes') 417 grok.implements(I SIRPPluggable)417 grok.implements(IKOFAPluggable) 418 418 419 419 def setup(self, site, name, logger): … … 481 481 `arg` tells what kind of transition to trigger. This will be a 482 482 transition id like ``'use'`` or ``'init'``, or some transition 483 target like :data:`waeup. sirp.accesscodes.workflow.INITIALIZED`.483 target like :data:`waeup.kofa.accesscodes.workflow.INITIALIZED`. 484 484 485 485 If `toward` is ``False`` (the default) you have to pass a -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/accesscode.txt
r7321 r7811 1 :mod:`waeup. sirp.accesscodes.accesscode` -- access codes (aka PINs)1 :mod:`waeup.kofa.accesscodes.accesscode` -- access codes (aka PINs) 2 2 ******************************************************************* 3 3 4 .. module:: waeup. sirp.accesscodes.accesscode4 .. module:: waeup.kofa.accesscodes.accesscode 5 5 6 6 Components that represent access codes and related. 7 7 8 8 .. :NOdoctest: 9 .. :NOlayer: waeup. sirp.testing.SIRPUnitTestLayer9 .. :NOlayer: waeup.kofa.testing.KOFAUnitTestLayer 10 10 11 11 About access-codes … … 28 28 unique random number of 10 digits. 29 29 30 For the generation of the random number :mod:`waeup. sirp` requires a30 For the generation of the random number :mod:`waeup.kofa` requires a 31 31 'urandom' entropy provider which is available with most standard 32 32 Unix/Linux systems. This makes the generated numbers relatively … … 57 57 58 58 The class implements 59 :mod:`waeup. sirp.accesscodes.interfaces.IAccessCode`:60 61 >>> from waeup. sirp.accesscodes.interfaces import IAccessCode62 >>> from waeup. sirp.accesscodes.accesscodes import AccessCode59 :mod:`waeup.kofa.accesscodes.interfaces.IAccessCode`: 60 61 >>> from waeup.kofa.accesscodes.interfaces import IAccessCode 62 >>> from waeup.kofa.accesscodes.accesscodes import AccessCode 63 63 >>> from zope.interface.verify import verifyClass 64 64 >>> verifyClass(IAccessCode, AccessCode) … … 150 150 151 151 A persistent :class:`grok.Model`. It implements 152 :class:`waeup. sirp.accesscodes.interfaces.IAccessCodeBatch`.152 :class:`waeup.kofa.accesscodes.interfaces.IAccessCodeBatch`. 153 153 154 154 When creating a batch, all entries (access-codes) are generated as … … 306 306 :class:`AccessCodeBatch` implements :class:`IAccessCodeBatch`: 307 307 308 >>> from waeup. sirp.accesscodes.interfaces import IAccessCodeBatch309 >>> from waeup. sirp.accesscodes.accesscodes import AccessCodeBatch308 >>> from waeup.kofa.accesscodes.interfaces import IAccessCodeBatch 309 >>> from waeup.kofa.accesscodes.accesscodes import AccessCodeBatch 310 310 >>> from zope.interface.verify import verifyClass 311 311 >>> verifyClass(IAccessCodeBatch, AccessCodeBatch) … … 317 317 318 318 >>> import datetime 319 >>> from waeup. sirp.accesscodes.accesscodes import AccessCodeBatch319 >>> from waeup.kofa.accesscodes.accesscodes import AccessCodeBatch 320 320 >>> batch = AccessCodeBatch( 321 321 ... datetime.datetime(2009, 12, 23), 'Fred','APP', 12.12, 3, num=10) … … 331 331 332 332 >>> [x for x in batch.entries()] 333 [<waeup. sirp...AccessCode object at 0x...>, ...]333 [<waeup.kofa...AccessCode object at 0x...>, ...] 334 334 335 335 Getting a single entry from the batch: … … 338 338 >>> ac = batch.getAccessCode(ac_id) 339 339 >>> ac 340 <waeup. sirp...AccessCode object at 0x...>340 <waeup.kofa...AccessCode object at 0x...> 341 341 342 342 >>> ac is list(batch.entries())[0] … … 374 374 # 375 375 # >>> batch.getAccessCodeForStudentId('some_user_id') 376 # <waeup. sirp...AccessCode object at 0x...>376 # <waeup.kofa...AccessCode object at 0x...> 377 377 # 378 378 #Non-existent values will cause a :exc:`KeyError`: … … 440 440 >>> result = batch.search(0, 'serial') 441 441 >>> result 442 [<waeup. sirp...AccessCode object at 0x...>]442 [<waeup.kofa...AccessCode object at 0x...>] 443 443 444 444 >>> result[0].batch_serial … … 545 545 Creating a batch container: 546 546 547 >>> from waeup. sirp.accesscodes.accesscodes import (547 >>> from waeup.kofa.accesscodes.accesscodes import ( 548 548 ... AccessCodeBatchContainer) 549 549 >>> container = AccessCodeBatchContainer() … … 561 561 562 562 >>> container.search(1, 'serial') 563 [<waeup. sirp...AccessCode object at 0x...>,564 <waeup. sirp...AccessCode object at 0x...>]563 [<waeup.kofa...AccessCode object at 0x...>, 564 <waeup.kofa...AccessCode object at 0x...>] 565 565 566 566 >>> container.search('not-a-number', 'serial') … … 569 569 >>> result = container.search('1', 'serial') 570 570 >>> result 571 [<waeup. sirp...AccessCode object at 0x...>,572 <waeup. sirp...AccessCode object at 0x...>]571 [<waeup.kofa...AccessCode object at 0x...>, 572 <waeup.kofa...AccessCode object at 0x...>] 573 573 574 574 Searching for ACs: … … 576 576 >>> ac = result[0] 577 577 >>> container.search(ac.representation, 'pin') 578 [<waeup. sirp...AccessCode object at 0x...>]578 [<waeup.kofa...AccessCode object at 0x...>] 579 579 580 580 Searching for student IDs: … … 583 583 # ... ac.representation, 'some_user') 584 584 # >>> container.search('some_user', 'stud_id') 585 # [<waeup. sirp...AccessCode object at 0x...>]585 # [<waeup.kofa...AccessCode object at 0x...>] 586 586 587 587 … … 591 591 .. class:: AccessCodePlugin 592 592 593 A `waeup. sirp` plugin that updates existing SIRPuniversity593 A `waeup.kofa` plugin that updates existing KOFA university 594 594 instances so that they provide support for access-codes. 595 595 596 .. attribute:: grok.implements(I SIRPPluggable)596 .. attribute:: grok.implements(IKOFAPluggable) 597 597 .. attribute:: grok.name('accesscodes') 598 598 … … 608 608 609 609 The AccessCodePlugin is available as a global named utility for the 610 I SIRPPluggable interface named ``accesscodes``.610 IKOFAPluggable interface named ``accesscodes``. 611 611 612 612 It is looked up by a university instance when created, so that this … … 615 615 616 616 >>> from zope.component import getUtility 617 >>> from waeup. sirp.interfaces import ISIRPPluggable618 >>> plugin = getUtility(I SIRPPluggable, name='accesscodes')617 >>> from waeup.kofa.interfaces import IKOFAPluggable 618 >>> plugin = getUtility(IKOFAPluggable, name='accesscodes') 619 619 >>> plugin 620 <waeup. sirp.accesscodes.accesscodes.AccessCodePlugin object at 0x...>620 <waeup.kofa.accesscodes.accesscodes.AccessCodePlugin object at 0x...> 621 621 622 622 It provides a `setup()` and an `update()` method. Both have to be -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/api.txt
r6408 r7811 1 :mod:`waeup. sirp.accesscodes` -- Access Codes1 :mod:`waeup.kofa.accesscodes` -- Access Codes 2 2 ********************************************* 3 3 4 .. module:: waeup. sirp.accesscodes4 .. module:: waeup.kofa.accesscodes 5 5 6 6 Components that represent access codes and related components. … … 9 9 ========== 10 10 11 The :mod:`waeup. sirp.accesscodes` module provides the following submodules:11 The :mod:`waeup.kofa.accesscodes` module provides the following submodules: 12 12 13 13 .. toctree:: -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.py
r7747 r7811 21 21 from datetime import datetime 22 22 from hurry.workflow.interfaces import InvalidTransitionError 23 from waeup. sirp.browser.resources import datatable24 from waeup. sirp.browser import SIRPPage, SIRPAddFormPage, NullValidator25 from waeup. sirp.browser.breadcrumbs import Breadcrumb26 from waeup. sirp.browser.viewlets import (23 from waeup.kofa.browser.resources import datatable 24 from waeup.kofa.browser import KOFAPage, KOFAAddFormPage, NullValidator 25 from waeup.kofa.browser.breadcrumbs import Breadcrumb 26 from waeup.kofa.browser.viewlets import ( 27 27 AdminTask, AddActionButton, SearchActionButton, BatchOpButton, ManageLink) 28 from waeup. sirp.interfaces import ISIRPObject29 from waeup. sirp.interfaces import MessageFactory as _30 from waeup. sirp.accesscodes.interfaces import (28 from waeup.kofa.interfaces import IKOFAObject 29 from waeup.kofa.interfaces import MessageFactory as _ 30 from waeup.kofa.accesscodes.interfaces import ( 31 31 IAccessCodeBatchContainer, IAccessCodeBatch, 32 32 ) 33 from waeup. sirp.accesscodes.catalog import search34 from waeup. sirp.browser.layout import action35 36 grok.context(I SIRPObject)37 38 class BatchContainerPage( SIRPPage):33 from waeup.kofa.accesscodes.catalog import search 34 from waeup.kofa.browser.layout import action 35 36 grok.context(IKOFAObject) 37 38 class BatchContainerPage(KOFAPage): 39 39 grok.name('index') 40 40 grok.context(IAccessCodeBatchContainer) … … 55 55 if isinstance(batches, basestring): 56 56 batches = [batches] 57 ob_class = self.__implemented__.__name__.replace('waeup. sirp.','')57 ob_class = self.__implemented__.__name__.replace('waeup.kofa.','') 58 58 for name in batches: 59 59 batch = self.context[name] … … 70 70 self.context.logger_info(ob_class, message) 71 71 72 class AddBatchPage( SIRPAddFormPage):72 class AddBatchPage(KOFAAddFormPage): 73 73 grok.name('add') 74 74 grok.context(IAccessCodeBatchContainer) … … 92 92 mapping = {'a':data['entry_num']})) 93 93 self.flash(_('Data written to ${a}', mapping = {'a':csv_file})) 94 ob_class = self.__implemented__.__name__.replace('waeup. sirp.','')94 ob_class = self.__implemented__.__name__.replace('waeup.kofa.','') 95 95 message = 'created: %s (%d, %f)' % ( 96 96 csv_file, data['entry_num'], data['cost']) … … 103 103 self.redirect(self.url(self.context)) 104 104 105 class ReimportBatchPage( SIRPPage):105 class ReimportBatchPage(KOFAPage): 106 106 """Screen for reimporting AC batches. 107 107 """ … … 139 139 self.flash(_('Successfully reimported: ${a}', 140 140 mapping = {'a':filename})) 141 ob_class = self.__implemented__.__name__.replace('waeup. sirp.','')141 ob_class = self.__implemented__.__name__.replace('waeup.kofa.','') 142 142 message = 'reimported: %s' % filename 143 143 self.context.logger_info(ob_class, message) 144 144 self.redirect(self.url(self.context)) 145 145 146 class BatchContainerSearchPage( SIRPPage):146 class BatchContainerSearchPage(KOFAPage): 147 147 grok.name('search') 148 148 grok.context(IAccessCodeBatchContainer) … … 174 174 if isinstance(entries, basestring): 175 175 entries = [entries] 176 ob_class = self.__implemented__.__name__.replace('waeup. sirp.','')176 ob_class = self.__implemented__.__name__.replace('waeup.kofa.','') 177 177 for entry in entries: 178 178 if 'disable' in form: -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser.txt
r7748 r7811 1 :mod:`waeup. sirp.accesscodes.browser` -- UI components for access-codes1 :mod:`waeup.kofa.accesscodes.browser` -- UI components for access-codes 2 2 *********************************************************************** 3 3 4 .. module:: waeup. sirp.accesscodes.browser5 6 Here we visit the access-code related parts of a SIRPsite using4 .. module:: waeup.kofa.accesscodes.browser 5 6 Here we visit the access-code related parts of a KOFA site using 7 7 a virtual browser. 8 8 … … 20 20 >>> root = getRootFolder() 21 21 22 >>> from waeup. sirp.app import University22 >>> from waeup.kofa.app import University 23 23 >>> u = University() 24 24 >>> root['myuniversity'] = u -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/batchcontainer.pt
r7719 r7811 1 <form i18n:domain="waeup. sirp" method="POST">1 <form i18n:domain="waeup.kofa" method="POST"> 2 2 <p i18n:translate=""> 3 3 The following batches are available: -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/reimportbatchpage.pt
r7719 r7811 1 <p i18n:domain="waeup. sirp">1 <p i18n:domain="waeup.kofa"> 2 2 Please select the files to reimport. Please note, that batches with 3 3 same name have to be deleted before. 4 4 </p> 5 <form method="POST" i18n:domain="waeup. sirp">5 <form method="POST" i18n:domain="waeup.kofa"> 6 6 <table> 7 7 <thead> -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/browser_templates/searchpage.pt
r7754 r7811 1 <form method="POST" i18n:domain="waeup. sirp">1 <form method="POST" i18n:domain="waeup.kofa"> 2 2 <br /> 3 3 <input type="submit" class="btn primary" name="search" -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/catalog.py
r7754 r7811 23 23 from hurry.query.query import Query 24 24 from zope.index.text.parsetree import ParseError 25 from waeup. sirp.interfaces import IUniversity, IQueryResultItem26 from waeup. sirp.accesscodes.interfaces import IAccessCode25 from waeup.kofa.interfaces import IUniversity, IQueryResultItem 26 from waeup.kofa.accesscodes.interfaces import IAccessCode 27 27 28 28 class AccessCodeIndexes(grok.Indexes): -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/interfaces.py
r7745 r7811 20 20 from zope import schema 21 21 from zope.interface import Interface 22 from waeup. sirp.interfaces import ISIRPObject23 from waeup. sirp.interfaces import MessageFactory as _22 from waeup.kofa.interfaces import IKOFAObject 23 from waeup.kofa.interfaces import MessageFactory as _ 24 24 25 class IAccessCode(I SIRPObject):25 class IAccessCode(IKOFAObject): 26 26 """An access code. 27 27 """ … … 92 92 ) 93 93 94 class IAccessCodeBatchContainer(I SIRPObject):94 class IAccessCodeBatchContainer(IKOFAObject): 95 95 """A container for access code batches. 96 96 """ -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/tests/test_accesscode.py
r7719 r7811 28 28 from zope.interface.verify import verifyObject, verifyClass 29 29 from zope.testing import renormalizing 30 from waeup. sirp.app import University31 from waeup. sirp.interfaces import IObjectHistory, ISIRPPluggable32 from waeup. sirp.testing import (30 from waeup.kofa.app import University 31 from waeup.kofa.interfaces import IObjectHistory, IKOFAPluggable 32 from waeup.kofa.testing import ( 33 33 FunctionalLayer, FunctionalTestCase, setUp, tearDown, getRootFolder) 34 from waeup. sirp.accesscodes.accesscode import (34 from waeup.kofa.accesscodes.accesscode import ( 35 35 AccessCodeBatch, get_access_code, invalidate_accesscode, AccessCode, 36 36 disable_accesscode, reenable_accesscode, fire_transition, 37 37 AccessCodeBatchContainer, AccessCodePlugin) 38 from waeup. sirp.accesscodes.interfaces import (38 from waeup.kofa.accesscodes.interfaces import ( 39 39 IAccessCode, IAccessCodeBatch, IAccessCodeBatchContainer,) 40 from waeup. sirp.accesscodes.workflow import INITIALIZED, USED, DISABLED40 from waeup.kofa.accesscodes.workflow import INITIALIZED, USED, DISABLED 41 41 42 42 … … 412 412 def test_iface(self): 413 413 plugin = AccessCodePlugin() 414 assert verifyObject(I SIRPPluggable, plugin)415 assert verifyClass(I SIRPPluggable, AccessCodePlugin)414 assert verifyObject(IKOFAPluggable, plugin) 415 assert verifyClass(IKOFAPluggable, AccessCodePlugin) 416 416 417 417 def test_update_w_ac_container(self): -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/tests/test_catalog.py
r7195 r7811 22 22 from zope.component.hooks import setSite 23 23 from zope.interface.verify import verifyClass, verifyObject 24 from waeup. sirp.app import University25 from waeup. sirp.interfaces import IQueryResultItem26 from waeup. sirp.testing import FunctionalLayer, FunctionalTestCase27 from waeup. sirp.accesscodes.accesscode import (24 from waeup.kofa.app import University 25 from waeup.kofa.interfaces import IQueryResultItem 26 from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase 27 from waeup.kofa.accesscodes.accesscode import ( 28 28 AccessCodeBatch, invalidate_accesscode, disable_accesscode) 29 from waeup. sirp.accesscodes.workflow import INITIALIZED, USED, DISABLED30 from waeup. sirp.accesscodes.catalog import AccessCodeQueryResultItem, search29 from waeup.kofa.accesscodes.workflow import INITIALIZED, USED, DISABLED 30 from waeup.kofa.accesscodes.catalog import AccessCodeQueryResultItem, search 31 31 32 32 class CatalogTestSetup(FunctionalTestCase): -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/tests/test_workflow.py
r7195 r7811 18 18 import shutil 19 19 import tempfile 20 from waeup. sirp.testing import FunctionalLayer, FunctionalTestCase21 from waeup. sirp.accesscodes.workflow import (20 from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase 21 from waeup.kofa.accesscodes.workflow import ( 22 22 invalidate_action, disable_used_action, disable_unused_action, 23 23 reenable_action, -
main/waeup.kofa/trunk/src/waeup/kofa/accesscodes/workflow.py
r7723 r7811 25 25 from hurry.workflow.workflow import Transition, WorkflowState, NullCondition 26 26 from hurry.workflow.interfaces import IWorkflowState, IWorkflowTransitionEvent 27 from waeup. sirp.accesscodes.interfaces import IAccessCode28 from waeup. sirp.interfaces import IObjectHistory, ISIRPWorkflowInfo29 from waeup. sirp.interfaces import MessageFactory as _30 from waeup. sirp.workflow import SIRPWorkflow, SIRPWorkflowInfo27 from waeup.kofa.accesscodes.interfaces import IAccessCode 28 from waeup.kofa.interfaces import IObjectHistory, IKOFAWorkflowInfo 29 from waeup.kofa.interfaces import MessageFactory as _ 30 from waeup.kofa.workflow import KOFAWorkflow, KOFAWorkflowInfo 31 31 32 32 INITIALIZED = 'initialized' … … 113 113 ) 114 114 115 accesscode_workflow = SIRPWorkflow(ACCESSCODE_TRANSITIONS)115 accesscode_workflow = KOFAWorkflow(ACCESSCODE_TRANSITIONS) 116 116 117 117 class AccessCodeWorkflowState(WorkflowState, grok.Adapter): … … 122 122 state_id = 'wf.accesscode.id' 123 123 124 class AccessCodeWorkflowInfo( SIRPWorkflowInfo, grok.Adapter):124 class AccessCodeWorkflowInfo(KOFAWorkflowInfo, grok.Adapter): 125 125 grok.context(IAccessCode) 126 grok.provides(I SIRPWorkflowInfo)126 grok.provides(IKOFAWorkflowInfo) 127 127 128 128 def __init__(self, context):
Note: See TracChangeset for help on using the changeset viewer.