Thanks a lot for the write-up! - C
On 2/15/10 2:02 AM, Srikanth T wrote: > Hi all > > I want to share a documentation on how we added a work for our application. > > > > *How to create Workflow for a repoze.BFG application* > > Let us see , how we can create a workflow for a bfg application. > > To add a workflow add a file named workflow.py at the root of your site. > you can name it as you like. > Add methods related to the states and transitions as per your requirement. > > For Example, > workflow.py > > > > from repoze.bfg.security import Allow > from repoze.bfg.security import Deny > from repoze.bfg.security import Everyone > from repoze.bfg.traversal import find_interface > from repoze.bfg.traversal import model_path > > from project.security_policies.policy import ADMINISTRATOR_PERMS > from project.security_policies.policy import GUEST_PERMS > from project.security_policies.policy import MODERATOR_PERMS > from project.security_policies.policy import MEMBER_PERMS > from project.security_policies.policy import CREATE > from project.security_policies.policy import NO_INHERIT > from project.security_policies.workflow import postorder > from project.security_policies.workflow import acl_diff > from project.security_policies.workflow import reset_security_workflow > > > def find_showEvent(context): > return find_interface(context, IshowEvent) > > def ts(*args): > return '\t'.join([str(x) for x in args]) > > #------------------------------------------------------------------------------ > # Electors > #------------------------------------------------------------------------------ > > > def not_intranets_containment(context): > return not intranets_containment(context) > > def intranets_containment(context): > return False > > def private_showEvent_containment(context): > if not_intranets_containment(context): > showEvent = find_showEvent(context) > if showEvent is None: > return False > return getattr(showEvent, > 'seproject.security_policies.policycurity_state', None) == 'private' > return False > > def public_showEvent_containment(context): > if not_intranets_containment(context): > showEvent = find_showEvent(context) > if showEvent is None: > return False > return getattr(showEvent, 'security_state', None) == 'public' > return False > > > #------------------------------------------------------------------------------ > # Workflow for showEvent > #------------------------------------------------------------------------------ > > > def showEvent_to_private(ob, info): > showEvent = find_showEvent(ob) > acl = [] > moderators_group_name = showEvent.moderators_group_name > members_group_name = showEvent.members_group_name > acl.append((Allow, 'group.KarlAdmin', ADMINISTRATOR_PERMS)) > acl.append((Allow, moderators_group_name, MODERATOR_PERMS)) > acl.append((Allow, members_group_name, MEMBER_PERMS)) > acl.append(NO_INHERIT) > msg = None > added, removed = acl_diff(showEvent, acl) > if added or removed: > showEvent.__acl__ = acl > msg = ts('showEvent-private', model_path(showEvent), added, > removed) > _reindex(showEvent) > return msg > > def showEvent_to_public(ob, info): > showEvent = find_showEvent(ob) > acl = [] > moderators_group_name = showEvent.moderators_group_name > members_group_name = showEvent.members_group_name > acl.append((Allow, 'group.KarlAdmin', ADMINISTRATOR_PERMS)) > acl.append((Allow, members_group_name, GUEST_PERMS)) > acl.append((Allow, 'group.KarlStaff', GUEST_PERMS)) > acl.append(NO_INHERIT) > msg = None > added, removed = acl_diff(showEvent, acl) > if added or removed: > showEvent.__acl__ = acl > msg = ts('showEvent-public', model_path(showEvent), added, removed) > _reindex(showEvent) > return msg > > > def showEvent_to_pending(ob, info): > showEvent = find_showEvent(ob) > acl = [] > moderators_group_name = showEvent.moderators_group_name > members_group_name = showEvent.members_group_name > acl.append((Allow, 'group.KarlAdmin', ADMINISTRATOR_PERMS)) > acl.append((Allow, members_group_name, GUEST_PERMS)) #When the > showEvent is pending user cannot delete,create, edit > acl.append((Allow, 'group.KarlStaff', GUEST_PERMS)) > acl.append(NO_INHERIT) > msg = None > added, removed = acl_diff(showEvent, acl) > if added or removed: > showEvent.__acl__ = acl > msg = ts('showEvent-pending', model_path(showEvent), added, > removed) > _reindex(showEvent) > return msg > > > def showEvent_to_rejected(ob,info): > showEvent = find_showEvent(ob) > acl = [] > moderators_group_name = showEvent.moderators_group_name > members_group_name = showEvent.members_group_name > acl.append((Allow, 'group.KarlAdmin', ADMINISTRATOR_PERMS)) > #acl.append((Allow, moderators_group_name, MODERATOR_PERMS)) > #Creator or member is the part of default member group > acl.append((Allow, members_group_name, GUEST_PERMS)) > acl.append((Allow, 'group.KarlStaff', GUEST_PERMS)) > acl.append(NO_INHERIT) #temp > msg = None > added, removed = acl_diff(showEvent, acl) > if added or removed: > showEvent.__acl__ = acl > msg = ts('showEvent-pending', model_path(showEvent), added, > removed) > _reindex(showEvent) > return msg > > > In workflow.py permissions were imported from policy file. Below is the > policy file of security_policies of project. > > > from BTrees.IFBTree import multiunion > from BTrees.IFBTree import IFSet > > from repoze.bfg.security import Allow > from repoze.bfg.security import Deny > from repoze.bfg.security import Everyone > from repoze.bfg.security import AllPermissionsList > > > VIEW = 'view' > EDIT = 'edit' > CREATE = 'create' > DELETE = 'delete' > MODERATE = 'moderate' > ADMINISTER = 'administer' > COMMENT = 'comment' > > GUEST_PERMS = (VIEW, COMMENT) > MEMBER_PERMS = GUEST_PERMS + (EDIT, CREATE, DELETE) > MODERATOR_PERMS = MEMBER_PERMS + (MODERATE,) > ADMINISTRATOR_PERMS = MODERATOR_PERMS + (ADMINISTER,) > > ALL = AllPermissionsList() > NO_INHERIT = (Deny, Everyone, ALL) > > > Add workflow.zcml and declare the states and transitions as follows. > > > <configure xmlns="http://namespaces.repoze.org/bfg"> > <include package="repoze.workflow" file="meta.zcml"/> > > <workflow type="security" > name="showEvent" > description="WF for showEvent" > elector="project.workflow.not_intranets_containment" > content_types="project.interfaces.IshowEvent" > initial_state="private" > state_attr="security_state" > permission_checker="repoze.bfg.security.has_permission" > > > > <state name="public" title="Public" > callback="project.workflow.showEvent_to_public"> > > </state> > > <state name="private" title="Private" > callback="project.workflow.showEvent_to_private"> > <alias name="initial"/> > </state> > > <state name="pending" title="Pending"ar > callback="project.workflow.showEvent_to_pending"> > </state> > > <state name="rejected" title="Rejected" > callback="project.workflow.showEvent_to_rejected"> > <alias name="initial"/> <!-- b/c --> > </state> > > <transition name="submit" > to_state="pending" > from_state="private"/> > > <transition name="approve" > to_state="public" > from_state="pending"/> > > <transition name="retract" > to_state="private" > from_state="pending"/> > > > <transition name="reject" > to_state="rejected" > from_state="pending"/> > > <transition name="unapprove" > to_state="pending" > from_state="public"/> > > </workflow> > > </configure> > > > Now register the workflow , by declaring it in configure.zcml file. > > > <configure xmlns="http://namespaces.repoze.org/bfg"> > > <!-- this must be included for the view declarations to work --> > > <include package="repoze.bfg.includes" /> > <include package="project.security_policies" /> > <include package="project.views" /> > <include package="project" file="workflow.zcml" /> > > </configure> > > > This way, we were able to create a workflow for our project. > > -- > Thanks & Regards, > Srikanth.T > > > > _______________________________________________ > Repoze-dev mailing list > Repoze-dev@lists.repoze.org > http://lists.repoze.org/listinfo/repoze-dev -- Chris McDonough Agendaless Consulting, Fredericksburg VA The repoze.bfg Web Application Framework Book: http://bfg.repoze.org/book _______________________________________________ Repoze-dev mailing list Repoze-dev@lists.repoze.org http://lists.repoze.org/listinfo/repoze-dev