Initial support for mobile ordering
plus various other changes required for that
This commit is contained in:
parent
5afa832684
commit
65c63dad3e
12 changed files with 289 additions and 30 deletions
|
@ -95,8 +95,10 @@ class MasterView(View):
|
|||
rows_bulk_deletable = False
|
||||
rows_default_pagesize = 20
|
||||
|
||||
mobile_rows_creatable = False
|
||||
mobile_rows_filterable = False
|
||||
mobile_rows_viewable = False
|
||||
mobile_rows_editable = False
|
||||
|
||||
@property
|
||||
def Session(self):
|
||||
|
@ -472,7 +474,12 @@ class MasterView(View):
|
|||
fieldset = self.make_fieldset(row)
|
||||
self.preconfigure_mobile_row_fieldset(fieldset)
|
||||
self.configure_mobile_row_fieldset(fieldset)
|
||||
kwargs.setdefault('session', self.Session())
|
||||
kwargs.setdefault('creating', self.creating)
|
||||
kwargs.setdefault('editing', self.editing)
|
||||
kwargs.setdefault('action_url', self.request.current_route_url(_query=None))
|
||||
if 'cancel_url' not in kwargs:
|
||||
kwargs['cancel_url'] = self.get_action_url('view', self.get_parent(row), mobile=True)
|
||||
factory = kwargs.pop('factory', forms.AlchemyForm)
|
||||
form = factory(self.request, fieldset, **kwargs)
|
||||
form.readonly = self.viewing
|
||||
|
@ -508,11 +515,16 @@ class MasterView(View):
|
|||
"""
|
||||
self.viewing = True
|
||||
row = self.get_row_instance()
|
||||
parent = self.get_parent(row)
|
||||
form = self.make_mobile_row_form(row)
|
||||
context = {
|
||||
'row': row,
|
||||
'parent_instance': parent,
|
||||
'parent_title': self.get_instance_title(parent),
|
||||
'parent_url': self.get_action_url('view', parent, mobile=True),
|
||||
'instance': row,
|
||||
'instance_title': self.get_row_instance_title(row),
|
||||
'instance_editable': self.row_editable(row),
|
||||
'parent_model_title': self.get_model_title(),
|
||||
'form': form,
|
||||
}
|
||||
|
@ -945,6 +957,8 @@ class MasterView(View):
|
|||
context.update(self.template_kwargs(**context))
|
||||
if hasattr(self, 'template_kwargs_{}'.format(template)):
|
||||
context.update(getattr(self, 'template_kwargs_{}'.format(template))(**context))
|
||||
if hasattr(self, 'mobile_template_kwargs_{}'.format(template)):
|
||||
context.update(getattr(self, 'mobile_template_kwargs_{}'.format(template))(**context))
|
||||
|
||||
# First try the template path most specific to the view.
|
||||
if mobile:
|
||||
|
@ -1327,8 +1341,30 @@ class MasterView(View):
|
|||
def after_create_row(self, row_object):
|
||||
pass
|
||||
|
||||
def redirect_after_create_row(self, row):
|
||||
return self.redirect(self.get_action_url('view', self.get_parent(row)))
|
||||
def redirect_after_create_row(self, row, mobile=False):
|
||||
return self.redirect(self.get_row_action_url('view', row, mobile=mobile))
|
||||
|
||||
def mobile_create_row(self):
|
||||
"""
|
||||
Mobile view for creating a new row object
|
||||
"""
|
||||
self.creating = True
|
||||
parent = self.get_instance()
|
||||
instance_url = self.get_action_url('view', parent, mobile=True)
|
||||
form = self.make_mobile_row_form(self.model_row_class, cancel_url=instance_url)
|
||||
if self.request.method == 'POST':
|
||||
if form.validate():
|
||||
self.before_create_row(form)
|
||||
# let save() return alternate object if necessary
|
||||
obj = self.save_create_row_form(form) or form.fieldset.model
|
||||
self.after_create_row(obj)
|
||||
return self.redirect_after_create_row(obj, mobile=True)
|
||||
return self.render_to_response('create_row', {
|
||||
'instance_title': self.get_instance_title(parent),
|
||||
'instance_url': instance_url,
|
||||
'parent_object': parent,
|
||||
'form': form,
|
||||
}, mobile=True)
|
||||
|
||||
def view_row(self):
|
||||
"""
|
||||
|
@ -1359,6 +1395,14 @@ class MasterView(View):
|
|||
"""
|
||||
return True
|
||||
|
||||
def row_editable(self, row):
|
||||
"""
|
||||
Returns boolean indicating whether or not the given row can be
|
||||
considered "editable". Returns ``True`` by default; override as
|
||||
necessary.
|
||||
"""
|
||||
return True
|
||||
|
||||
def edit_row(self):
|
||||
"""
|
||||
View for editing an existing model record.
|
||||
|
@ -1376,14 +1420,39 @@ class MasterView(View):
|
|||
return self.render_to_response('edit_row', {
|
||||
'instance': row,
|
||||
'row_parent': parent,
|
||||
'parent_title': self.get_instance_title(parent),
|
||||
'parent_url': self.get_action_url('view', parent),
|
||||
'parent_instance': parent,
|
||||
'instance_title': self.get_row_instance_title(row),
|
||||
'instance_deletable': self.row_deletable(row),
|
||||
'index_url': self.get_action_url('view', parent),
|
||||
'index_title': '{} {}'.format(
|
||||
self.get_model_title(),
|
||||
self.get_instance_title(parent)),
|
||||
'form': form})
|
||||
|
||||
def mobile_edit_row(self):
|
||||
"""
|
||||
Mobile view for editing a row object
|
||||
"""
|
||||
self.editing = True
|
||||
row = self.get_row_instance()
|
||||
instance_url = self.get_row_action_url('view', row, mobile=True)
|
||||
form = self.make_mobile_row_form(row)
|
||||
|
||||
if self.request.method == 'POST':
|
||||
if form.validate():
|
||||
self.save_edit_row_form(form)
|
||||
return self.redirect_after_edit_row(row, mobile=True)
|
||||
|
||||
parent = self.get_parent(row)
|
||||
return self.render_to_response('edit_row', {
|
||||
'instance': row,
|
||||
'instance_title': self.get_row_instance_title(row),
|
||||
'instance_url': instance_url,
|
||||
'instance_deletable': self.row_deletable(row),
|
||||
'parent_instance': parent,
|
||||
'parent_title': self.get_instance_title(parent),
|
||||
'parent_url': self.get_action_url('view', parent, mobile=True),
|
||||
'form': form},
|
||||
mobile=True)
|
||||
|
||||
def save_edit_row_form(self, form):
|
||||
self.save_row_form(form)
|
||||
self.after_edit_row(form.fieldset.model)
|
||||
|
@ -1396,16 +1465,8 @@ class MasterView(View):
|
|||
Event hook, called just after an existing row object is saved.
|
||||
"""
|
||||
|
||||
def redirect_after_edit_row(self, row):
|
||||
return self.redirect(self.get_action_url('view', self.get_parent(row)))
|
||||
|
||||
def row_editable(self, row):
|
||||
"""
|
||||
Returns boolean indicating whether or not the given row can be
|
||||
considered "editable". Returns ``True`` by default; override as
|
||||
necessary.
|
||||
"""
|
||||
return True
|
||||
def redirect_after_edit_row(self, row, mobile=False):
|
||||
return self.redirect(self.get_row_action_url('view', row, mobile=True))
|
||||
|
||||
def row_deletable(self, row):
|
||||
"""
|
||||
|
@ -1617,12 +1678,18 @@ class MasterView(View):
|
|||
### sub-rows stuff follows
|
||||
|
||||
# create row
|
||||
if cls.has_rows and cls.rows_creatable:
|
||||
config.add_route('{}.create_row'.format(route_prefix), '{}/{{{}}}/new-row'.format(url_prefix, model_key))
|
||||
config.add_view(cls, attr='create_row', route_name='{}.create_row'.format(route_prefix),
|
||||
permission='{}.create_row'.format(permission_prefix))
|
||||
config.add_tailbone_permission(permission_prefix, '{}.create_row'.format(permission_prefix),
|
||||
"Create new {} rows".format(model_title))
|
||||
if cls.has_rows:
|
||||
if cls.rows_creatable or cls.mobile_rows_creatable:
|
||||
config.add_tailbone_permission(permission_prefix, '{}.create_row'.format(permission_prefix),
|
||||
"Create new {} rows".format(model_title))
|
||||
if cls.rows_creatable:
|
||||
config.add_route('{}.create_row'.format(route_prefix), '{}/{{{}}}/new-row'.format(url_prefix, model_key))
|
||||
config.add_view(cls, attr='create_row', route_name='{}.create_row'.format(route_prefix),
|
||||
permission='{}.create_row'.format(permission_prefix))
|
||||
if cls.mobile_rows_creatable:
|
||||
config.add_route('mobile.{}.create_row'.format(route_prefix), '/mobile{}/{{{}}}/new-row'.format(url_prefix, model_key))
|
||||
config.add_view(cls, attr='mobile_create_row', route_name='mobile.{}.create_row'.format(route_prefix),
|
||||
permission='{}.create_row'.format(permission_prefix))
|
||||
|
||||
# view row
|
||||
if cls.has_rows:
|
||||
|
@ -1636,12 +1703,18 @@ class MasterView(View):
|
|||
permission='{}.view'.format(permission_prefix))
|
||||
|
||||
# edit row
|
||||
if cls.has_rows and cls.rows_editable:
|
||||
config.add_route('{}.edit'.format(row_route_prefix), '{}/{{uuid}}/edit'.format(row_url_prefix))
|
||||
config.add_view(cls, attr='edit_row', route_name='{}.edit'.format(row_route_prefix),
|
||||
permission='{}.edit_row'.format(permission_prefix))
|
||||
config.add_tailbone_permission(permission_prefix, '{}.edit_row'.format(permission_prefix),
|
||||
"Edit individual {} rows".format(model_title))
|
||||
if cls.has_rows:
|
||||
if cls.rows_editable or cls.mobile_rows_editable:
|
||||
config.add_tailbone_permission(permission_prefix, '{}.edit_row'.format(permission_prefix),
|
||||
"Edit individual {} rows".format(model_title))
|
||||
if cls.rows_editable:
|
||||
config.add_route('{}.edit'.format(row_route_prefix), '{}/{{uuid}}/edit'.format(row_url_prefix))
|
||||
config.add_view(cls, attr='edit_row', route_name='{}.edit'.format(row_route_prefix),
|
||||
permission='{}.edit_row'.format(permission_prefix))
|
||||
if cls.mobile_rows_editable:
|
||||
config.add_route('mobile.{}.edit'.format(row_route_prefix), '/mobile{}/{{uuid}}/edit'.format(row_url_prefix))
|
||||
config.add_view(cls, attr='mobile_edit_row', route_name='mobile.{}.edit'.format(row_route_prefix),
|
||||
permission='{}.edit_row'.format(permission_prefix))
|
||||
|
||||
# delete row
|
||||
if cls.has_rows and cls.rows_deletable:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue