Skip to content

Commit

Permalink
Separate flwo and view sites
Browse files Browse the repository at this point in the history
  • Loading branch information
kmmbvnr committed Aug 12, 2014
1 parent 9b3fac8 commit 656d856
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 118 deletions.
4 changes: 2 additions & 2 deletions tests/examples/helloworld/flows.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from viewflow import flow
from viewflow.base import this, Flow
from viewflow.site import flowsite
from viewflow.site import viewsite
from viewflow.views import StartView, ProcessView
from viewflow.lock import select_for_update_lock

Expand Down Expand Up @@ -40,4 +40,4 @@ class HelloWorldFlow(Flow):
end = flow.End()


flowsite.register(HelloWorldFlow)
viewsite.register(HelloWorldFlow)
150 changes: 75 additions & 75 deletions tests/examples/shipment/flows.py
Original file line number Diff line number Diff line change
@@ -1,75 +1,75 @@
from viewflow import flow
from viewflow.base import this, Flow
from viewflow.site import flowsite
from viewflow.views import ProcessView
from viewflow.lock import select_for_update_lock

from . import views
from .models import ShipmentProcess, ShipmentTask


class ShipmentFlow(Flow):
"""
Shipment delivery process
"""
process_cls = ShipmentProcess
task_cls = ShipmentTask
lock_impl = select_for_update_lock

start = flow.Start(views.StartView) \
.Permission('shipment.can_start_request') \
.Next(this.split_clerk_warehouse)

# clerk
split_clerk_warehouse = flow.Split() \
.Next(this.shipment_type) \
.Next(this.package_goods)

shipment_type = flow.View(views.ShipmentView, fields=["carrier"]) \
.Next(this.delivery_mode) \
.Assign(lambda p: p.created_by)

delivery_mode = flow.If(cond=lambda p: p.is_normal_post()) \
.OnTrue(this.check_insurance) \
.OnFalse(this.request_quotes)

request_quotes = flow.View(views.ShipmentView, fields=["carrier_quote"]) \
.Next(this.join_clerk_warehouse) \
.Assign(lambda p: p.created_by)

check_insurance = flow.View(views.ShipmentView, fields=["need_insurance"]) \
.Next('split_on_insurance') \
.Assign(lambda p: p.created_by)

split_on_insurance = flow.Split() \
.Next(this.take_extra_insurance, cond=lambda p: p.need_extra_insurance()) \
.Always(this.fill_post_label)

fill_post_label = flow.View(views.ShipmentView, fields=["post_label"]) \
.Next(this.join_on_insurance) \
.Assign(lambda p: p.created_by)

join_on_insurance = flow.Join() \
.Next(this.join_clerk_warehouse)

# Logistic manager
take_extra_insurance = flow.View(views.InsuranceView) \
.Next(this.join_on_insurance) \
.Permission('shipment.can_take_extra_insurance')

# Warehouse worker
package_goods = flow.View(ProcessView.as_view()) \
.Next(this.join_clerk_warehouse) \
.Permission('shipment.can_package_goods')

join_clerk_warehouse = flow.Join() \
.Next(this.move_package)

move_package = flow.View(ProcessView.as_view()) \
.Next(this.end) \
.Assign(this.package_goods.owner)

end = flow.End()


flowsite.register(ShipmentFlow)
from viewflow import flow
from viewflow.base import this, Flow
from viewflow.site import viewsite
from viewflow.views import ProcessView
from viewflow.lock import select_for_update_lock

from . import views
from .models import ShipmentProcess, ShipmentTask


class ShipmentFlow(Flow):
"""
Shipment delivery process
"""
process_cls = ShipmentProcess
task_cls = ShipmentTask
lock_impl = select_for_update_lock

start = flow.Start(views.StartView) \
.Permission('shipment.can_start_request') \
.Next(this.split_clerk_warehouse)

# clerk
split_clerk_warehouse = flow.Split() \
.Next(this.shipment_type) \
.Next(this.package_goods)

shipment_type = flow.View(views.ShipmentView, fields=["carrier"]) \
.Next(this.delivery_mode) \
.Assign(lambda p: p.created_by)

delivery_mode = flow.If(cond=lambda p: p.is_normal_post()) \
.OnTrue(this.check_insurance) \
.OnFalse(this.request_quotes)

request_quotes = flow.View(views.ShipmentView, fields=["carrier_quote"]) \
.Next(this.join_clerk_warehouse) \
.Assign(lambda p: p.created_by)

check_insurance = flow.View(views.ShipmentView, fields=["need_insurance"]) \
.Next('split_on_insurance') \
.Assign(lambda p: p.created_by)

split_on_insurance = flow.Split() \
.Next(this.take_extra_insurance, cond=lambda p: p.need_extra_insurance()) \
.Always(this.fill_post_label)

fill_post_label = flow.View(views.ShipmentView, fields=["post_label"]) \
.Next(this.join_on_insurance) \
.Assign(lambda p: p.created_by)

join_on_insurance = flow.Join() \
.Next(this.join_clerk_warehouse)

# Logistic manager
take_extra_insurance = flow.View(views.InsuranceView) \
.Next(this.join_on_insurance) \
.Permission('shipment.can_take_extra_insurance')

# Warehouse worker
package_goods = flow.View(ProcessView.as_view()) \
.Next(this.join_clerk_warehouse) \
.Permission('shipment.can_package_goods')

join_clerk_warehouse = flow.Join() \
.Next(this.move_package)

move_package = flow.View(ProcessView.as_view()) \
.Next(this.end) \
.Assign(this.package_goods.owner)

end = flow.End()


viewsite.register(ShipmentFlow)
4 changes: 2 additions & 2 deletions tests/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.views.generic.base import TemplateView
from viewflow.site import flowsite
from viewflow.site import viewsite
from unit.views import TestFormView


Expand All @@ -10,7 +10,7 @@

urlpatterns = patterns('', # NOQA
url(r'^$', TemplateView.as_view(template_name='index.html')),
url(r'^flows/', include(flowsite.urls)),
url(r'^flows/', include(viewsite.urls)),
url(r'^viewflow/$', TemplateView.as_view(template_name='viewflow/process_index.html')),
url(r'^admin/', include(admin.site.urls)),
url(r'^examples/form/$', TestFormView.as_view()),
Expand Down
2 changes: 1 addition & 1 deletion viewflow/site/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
LayoutMixin)


flowsite = ViewSite()
viewsite = ViewSite()
80 changes: 46 additions & 34 deletions viewflow/site/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,36 @@
from . import views


class FlowSite(object):
process_list_view = staticmethod(views.ProcessListView.as_view())
process_detail_view = staticmethod(views.process_detail_view)
task_list_view = staticmethod(views.task_list_view)
queue_view = staticmethod(views.queue_view)

def __init__(self, view_site, flow_cls):
self.view_site = view_site
self.flow_cls = flow_cls

@property
def urls(self):
flow_patterns, namespace, app_name = self.flow_cls.instance.urls

list_patterns = patterns(
'',
url('^$', self.process_list_view,
{'flow_site': self, 'flow_cls': self.flow_cls}, name='index'),
url('^tasks/$', self.task_list_view,
{'flow_site': self, 'flow_cls': self.flow_cls}, name='tasks'),
url('^queues/$', self.queue_view,
{'flow_site': self, 'flow_cls': self.flow_cls}, name='queue')
)

return patterns(
'',
url('^{}/'.format(self.flow_cls._meta.flow_label),
include(list_patterns + flow_patterns, app_name, namespace)))


class ViewSite(object):
login_view = staticmethod(views.LoginView.as_view())
logout_view = staticmethod(views.LogoutView.as_view())
Expand All @@ -12,50 +42,32 @@ class ViewSite(object):
tasks_list_view = staticmethod(views.tasks_list_view)
queues_view = staticmethod(views.queues_view)

# per-process views
process_list_view = staticmethod(views.ProcessListView.as_view())
process_detail_view = staticmethod(views.process_detail_view)
task_list_view = staticmethod(views.task_list_view)
queue_view = staticmethod(views.queue_view)

def __init__(self, app_name='viewsite_default'):
self.app_name = app_name
self.flows = []
self.flow_sites = {}

@property
def urls(self):
site_patterns = patterns(
'',
url('^$', self.processes_list_view, {'flow_site': self}, name="index"),
url('^login/$', self.login_view, {'flow_site': self}, name="login"),
url('^logout/$', self.logout_view, {'flow_site': self}, name="logout"),
url('^tasks/$', self.tasks_list_view, {'flow_site': self}, name="tasks"),
url('^queues/$', self.queues_view, {'flow_site': self}, name="queues"),
url('^$', self.processes_list_view, {'view_site': self}, name="index"),
url('^login/$', self.login_view, {'view_site': self}, name="login"),
url('^logout/$', self.logout_view, {'view_site': self}, name="logout"),
url('^tasks/$', self.tasks_list_view, {'view_site': self}, name="tasks"),
url('^queues/$', self.queues_view, {'view_site': self}, name="queues"),
)

urls = [
url('', include(site_patterns, self.app_name, 'viewflow_site'))
]

for flow_cls in self.flows:
flow_patterns, namespace, app_name = flow_cls.instance.urls
result = patterns('', url('', include(site_patterns, self.app_name, 'viewflow_site')))

list_patterns = patterns(
'',
url('^$', self.process_list_view,
{'flow_site': self, 'flow_cls': flow_cls}, name='index'),
url('^tasks/$', self.task_list_view,
{'flow_site': self, 'flow_cls': flow_cls}, name='tasks'),
url('^queues/$', self.queue_view,
{'flow_site': self, 'flow_cls': flow_cls}, name='queue')
)
for flow_cls, flow_site in self.flow_sites.items():
site = flow_site(view_site=self, flow_cls=flow_cls)
result += site.urls

urls.append(
url('^{}/'.format(flow_cls._meta.flow_label),
include(list_patterns + flow_patterns, app_name, namespace)))
return result

return patterns('', *urls)
def register(self, flow_cls, flow_site=None):
if flow_cls not in self.flow_sites:
if flow_site is None:
flow_site = FlowSite

def register(self, flow_cls):
if flow_cls not in self.flows:
self.flows.append(flow_cls)
self.flow_sites[flow_cls] = flow_site
10 changes: 6 additions & 4 deletions viewflow/site/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ class FlowSiteMixin(object):
flow_site = None

def dispatch(self, request, *args, **kwargs):
if 'view_site' in kwargs:
self.view_site = kwargs['view_site']
if 'flow_site' in kwargs:
self.flow_site = kwargs['flow_site']
if 'flow_cls' in kwargs:
Expand All @@ -25,7 +27,7 @@ class LoginView(FlowSiteMixin, generic.FormView):
template_name = 'viewflow/login.html'

def get_success_url(self):
return reverse('viewflow_site:index', current_app=self.flow_site.app_name)
return reverse('viewflow_site:index', current_app=self.view_site.app_name)

def form_valid(self, form):
auth_login(self.request, form.get_user())
Expand All @@ -34,7 +36,7 @@ def form_valid(self, form):

class LogoutView(FlowSiteMixin, generic.View):
def get_success_url(self):
return reverse('viewflow_site:login', current_app=self.flow_site.app_name)
return reverse('viewflow_site:login', current_app=self.view_site.app_name)

def get(self, request, *args, **kwargs):
auth_logout(request)
Expand Down Expand Up @@ -63,8 +65,8 @@ def queues_view(request, flow_site=None):


class ProcessListView(FlowSiteMixin, generic.ListView):
paginate_by = 3
paginate_orphans = 0
paginate_by = 15
paginate_orphans = 5
context_object_name = 'process_list'

def get_template_names(self):
Expand Down

0 comments on commit 656d856

Please sign in to comment.