From bc322f7c707ad3d04a1d52b3188ecec7e73d8693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 19 Sep 2015 18:08:43 +0200 Subject: [PATCH] general: keep submission context additional details (#8306) --- wcs/api.py | 2 ++ wcs/backoffice/management.py | 31 +++++++++++++++++++++++++++++++ wcs/backoffice/submission.py | 27 +++++++++++++++++++-------- wcs/formdata.py | 1 + wcs/forms/root.py | 5 ++++- wcs/qommon/static/css/dc2/admin.css | 9 +++++++++ wcs/sql.py | 19 ++++++++++++++++--- 7 files changed, 82 insertions(+), 12 deletions(-) diff --git a/wcs/api.py b/wcs/api.py index 85be02b..30dcbcc 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -202,6 +202,8 @@ class ApiFormdefDirectory(Directory): formdata.backoffice_submission = True else: formdata.user_id = user.id + if json_input.get('context'): + formdata.extra_submission_context = json_input['context'] formdata.store() if self.formdef.enable_tracking_codes: code = get_publisher().tracking_code_class() diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index 9e46438..ebf7e92 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -1100,8 +1100,39 @@ class FormBackOfficeStatusPage(FormStatusPage): return html_top('management', title) def _q_index(self): + get_response().filter['sidebar'] = self.get_sidebar() return self.status() + def get_sidebar(self): + return self.get_extra_context_bar() + + def get_extra_context_bar(self): + formdata = self.filled + if not formdata.extra_submission_context: + return '' + + r = TemplateIO(html=True) + extra_context = formdata.extra_submission_context or {} + r += htmltext('
') + if extra_context.get('channel'): + channel_labels = { + 'mail': _('Mail'), + } + r += htmltext('

%s

') % '%s: %s' % ( + _('Channel'), channel_labels.get(extra_context.get('channel'), '?')) + if extra_context.get('thumbnail_url'): + r += htmltext('

' + ) % extra_context.get('thumbnail_url') + if extra_context.get('user_id'): + r += htmltext('

%s

') % _('Associated User') + r += htmltext('

%s

') % get_publisher().user_class.get( + extra_context.get('user_id')).display_name + if extra_context.get('comments'): + r += htmltext('

%s

') % _('Comments') + r += htmltext('

%s

') % extra_context.get('comments') + r += htmltext('
') + return r.getvalue() + class FakeField(object): def __init__(self, id, type_, label): diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 8a0678e..5b17811 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -25,6 +25,8 @@ from wcs.formdef import FormDef from wcs.categories import Category from wcs.forms.root import FormPage as PublicFormFillPage +from .management import FormBackOfficeStatusPage + class FormFillPage(PublicFormFillPage): def html_top(self, *args, **kwargs): @@ -42,19 +44,21 @@ class FormFillPage(PublicFormFillPage): def get_sidebar(self, data): r = TemplateIO(html=True) + formdata = None + draft_formdata_id = data.get('draft_formdata_id') + if draft_formdata_id: + formdata = self.formdef.data_class().get(draft_formdata_id) if self.formdef.enable_tracking_codes: - draft_formdata_id = data.get('draft_formdata_id') r += htmltext('

%s

') % _('Tracking Code') - tracking_code = None - if draft_formdata_id: - formdata = self.formdef.data_class().get(draft_formdata_id) - if formdata.tracking_code: - tracking_code = formdata.tracking_code - if tracking_code: - r += htmltext('

%s

') % tracking_code + if formdata and formdata.tracking_code: + tracking_code = formdata.tracking_code + r += htmltext('

%s

') % formdata.tracking_code else: r += htmltext('

-

') + if formdata and formdata.extra_submission_context: + r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar() + return r.getvalue() def form_side(self, step_no, page_no=0, log_detail=None, data=None, editing=None): @@ -72,6 +76,13 @@ class FormFillPage(PublicFormFillPage): filled.backoffice_submission = True filled.store() + magictoken = get_request().form.get('magictoken') + form_data = get_session().get_by_magictoken(magictoken, {}) + draft_formdata_id = form_data.get('draft_formdata_id') + if draft_formdata_id: + old_draft_formdata = self.formdef.data_class().get(draft_formdata_id) + filled.extra_submission_context = old_draft_formdata.extra_submission_context + self.keep_tracking_code(filled) get_session().remove_magictoken(get_request().form.get('magictoken')) diff --git a/wcs/formdata.py b/wcs/formdata.py index 5d477c8..d31bd76 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -158,6 +158,7 @@ class FormData(StorableObject): editable_by = None tracking_code = None backoffice_submission = False + extra_submission_context = None workflow_data = None workflow_roles = None diff --git a/wcs/forms/root.py b/wcs/forms/root.py index 9e10fe0..8f287cd 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -509,7 +509,10 @@ class FormPage(Directory): if get_request().form.has_key('mt'): magictoken = get_request().form['mt'] data = session.get_by_magictoken(magictoken, {}) - session.remove_magictoken(magictoken) + if not get_request().is_in_backoffice(): + # don't remove magictoken as the backoffice agent may get + # the page reloaded. + session.remove_magictoken(magictoken) if data: # create a new one since the other has been exposed in a url magictoken = randbytes(8) diff --git a/wcs/qommon/static/css/dc2/admin.css b/wcs/qommon/static/css/dc2/admin.css index d2944ea..4da9596 100644 --- a/wcs/qommon/static/css/dc2/admin.css +++ b/wcs/qommon/static/css/dc2/admin.css @@ -1089,6 +1089,15 @@ div.admin-permissions tbody tr:nth-child(even) { background: #eee; } +div.extra-context p.thumbnail { + text-align: center; +} + +div.extra-context p.thumbnail img { + box-shadow: 0 0 3px black; + transform: rotate(2deg); +} + @media print { div#sidebar { display: none; diff --git a/wcs/sql.py b/wcs/sql.py index 815178b..cecd53f 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -307,7 +307,8 @@ def do_formdef_tables(formdef, conn=None, cur=None, rebuild_views=False, rebuild 'status', 'workflow_data', 'id_display', 'fts', 'page_no', 'anonymised', 'workflow_roles', 'workflow_roles_array', 'concerned_roles_array', 'tracking_code', - 'actions_roles_array', 'backoffice_submission']) + 'actions_roles_array', 'backoffice_submission', + 'extra_submission_context']) # migrations if not 'fts' in existing_fields: @@ -336,6 +337,9 @@ def do_formdef_tables(formdef, conn=None, cur=None, rebuild_views=False, rebuild if not 'backoffice_submission' in existing_fields: cur.execute('''ALTER TABLE %s ADD COLUMN backoffice_submission boolean''' % table_name) + if not 'extra_submission_context' in existing_fields: + cur.execute('''ALTER TABLE %s ADD COLUMN extra_submission_context bytea''' % table_name) + # add new fields for field in formdef.fields: assert field.id is not None @@ -926,6 +930,7 @@ class SqlFormData(SqlMixin, wcs.formdata.FormData): ('actions_roles_array', 'text[]'), ('tracking_code', 'varchar'), ('backoffice_submission', 'boolean'), + ('extra_submission_context', 'bytea'), ] def __init__(self, id=None): @@ -1018,6 +1023,7 @@ class SqlFormData(SqlMixin, wcs.formdata.FormData): 'anonymised': self.anonymised, 'tracking_code': self.tracking_code, 'backoffice_submission': self.backoffice_submission, + 'extra_submission_context': self.extra_submission_context, } if self.receipt_time: sql_dict['receipt_time'] = datetime.datetime.fromtimestamp(time.mktime(self.receipt_time)), @@ -1029,6 +1035,10 @@ class SqlFormData(SqlMixin, wcs.formdata.FormData): else: sql_dict['workflow_roles'] = None sql_dict['workflow_roles_array'] = None + if self.extra_submission_context: + sql_dict['extra_submission_context'] = bytearray(cPickle.dumps(self.extra_submission_context)) + else: + sql_dict['extra_submission_context'] = None sql_dict['concerned_roles_array'] = [str(x) for x in self.concerned_roles if x] sql_dict['actions_roles_array'] = [str(x) for x in self.actions_roles if x] @@ -1133,6 +1143,8 @@ class SqlFormData(SqlMixin, wcs.formdata.FormData): o.workflow_data = cPickle.loads(str(o.workflow_data)) if o.workflow_roles: o.workflow_roles = cPickle.loads(str(o.workflow_roles)) + if o.extra_submission_context: + o.extra_submission_context = cPickle.loads(str(o.extra_submission_context)) o.data = cls._row2obdata(row, cls._formdef) return o _row2ob = classmethod(_row2ob) @@ -1658,7 +1670,7 @@ def get_yearly_totals(period_start=None, period_end=None, criterias=None): return result -SQL_LEVEL = 7 +SQL_LEVEL = 8 def migrate_global_views(conn, cur): cur.execute('''SELECT COUNT(*) FROM information_schema.tables @@ -1707,8 +1719,9 @@ def migrate(): migrate_views(conn, cur) for formdef in FormDef.select(): formdef.data_class().rebuild_security() - if sql_level < 7: + if sql_level < 8: # 7: add backoffice_submission to tables and views + # 8: add extra_submission_context to tables migrate_views(conn, cur) cur.execute('''UPDATE wcs_meta SET value = %s WHERE key = %s''', ( -- 2.5.3