232 |
232 |
return True
|
233 |
233 |
return False
|
234 |
234 |
|
|
235 |
def has_draft_support(self):
|
|
236 |
if self.edit_mode:
|
|
237 |
return False
|
|
238 |
if self.formdef.enable_tracking_codes:
|
|
239 |
return True
|
|
240 |
session = get_session()
|
|
241 |
return session.has_user()
|
|
242 |
|
235 |
243 |
def step(self, step_no, current_page):
|
236 |
244 |
get_logger().info('form %s - step %s' % (self.formdef.name, step_no))
|
237 |
245 |
|
... | ... | |
284 |
292 |
magictoken = get_request().form.get('magictoken')
|
285 |
293 |
if magictoken:
|
286 |
294 |
form_data = session.get_by_magictoken(magictoken, {})
|
287 |
|
if self.formdef.enable_tracking_codes and not self.edit_mode:
|
|
295 |
if self.has_draft_support():
|
288 |
296 |
form.attrs['data-has-draft'] = 'yes'
|
289 |
297 |
else:
|
290 |
298 |
form_data = {}
|
... | ... | |
398 |
406 |
form.add_hidden('page_id', page.id)
|
399 |
407 |
|
400 |
408 |
form.add_submit('cancel', _('Cancel'), css_class = 'cancel')
|
401 |
|
if self.formdef.enable_tracking_codes and not self.edit_mode:
|
|
409 |
if self.has_draft_support():
|
402 |
410 |
form.add_submit('savedraft', _('Save Draft'), css_class = 'save-draft',
|
403 |
411 |
attrs={'style': 'display: none'})
|
404 |
412 |
|
... | ... | |
408 |
416 |
'form_side': lambda: self.form_side(0, page, data=data, magictoken=magictoken),
|
409 |
417 |
'steps': lambda: self.step(0, page),
|
410 |
418 |
}
|
411 |
|
if self.formdef.enable_tracking_codes and data:
|
|
419 |
if self.has_draft_support() and data:
|
412 |
420 |
context['tracking_code_box'] = lambda: self.tracking_code_box(data, magictoken)
|
413 |
421 |
|
414 |
422 |
return template.QommonTemplateResponse(
|
... | ... | |
420 |
428 |
(tracking code and steps).'''
|
421 |
429 |
r = TemplateIO(html=True)
|
422 |
430 |
r += htmltext('<div id="side">')
|
423 |
|
if self.formdef.enable_tracking_codes and data:
|
|
431 |
if self.has_draft_support() and data:
|
424 |
432 |
# display tracking code box if they are enabled and there's some
|
425 |
433 |
# data (e.g. the user is not on a insufficient authenticiation
|
426 |
434 |
# context page)
|
... | ... | |
431 |
439 |
|
432 |
440 |
def tracking_code_box(self, data, magictoken):
|
433 |
441 |
'''Create the tracking code box, it displays the current tracking code
|
434 |
|
and a 'remove draft' button if the current form is a draft that has
|
435 |
|
been recalled.'''
|
|
442 |
if enabled, and a 'remove draft' button if the current form is a draft
|
|
443 |
that has been recalled.'''
|
436 |
444 |
r = TemplateIO(html=True)
|
437 |
445 |
r += htmltext('<div id="tracking-code">')
|
438 |
|
r += htmltext('<h3>%s</h3>') % _('Tracking code')
|
|
446 |
if self.formdef.enable_tracking_codes:
|
|
447 |
r += htmltext('<div class="tracking-code-part">')
|
|
448 |
r += htmltext('<h3>%s</h3>') % _('Tracking code')
|
439 |
449 |
|
440 |
|
tracking_code = None
|
441 |
|
draft_formdata_id = data.get('draft_formdata_id')
|
442 |
|
if draft_formdata_id:
|
443 |
|
formdata = self.formdef.data_class().get(draft_formdata_id)
|
444 |
|
tracking_code = formdata.tracking_code
|
445 |
|
else:
|
446 |
|
tracking_code = data.get('future_tracking_code')
|
|
450 |
tracking_code = None
|
|
451 |
draft_formdata_id = data.get('draft_formdata_id')
|
|
452 |
if draft_formdata_id:
|
|
453 |
formdata = self.formdef.data_class().get(draft_formdata_id)
|
|
454 |
tracking_code = formdata.tracking_code
|
|
455 |
else:
|
|
456 |
tracking_code = data.get('future_tracking_code')
|
447 |
457 |
|
448 |
|
if tracking_code:
|
449 |
|
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'popup.js'])
|
450 |
|
r += htmltext('<a rel="popup" href="%s">%s</a>') % (
|
451 |
|
'code/%s/' % tracking_code, tracking_code)
|
452 |
|
r += TextsDirectory.get_html_text('tracking-code-short-text')
|
|
458 |
if tracking_code:
|
|
459 |
get_response().add_javascript(['jquery.js', 'jquery-ui.js', 'popup.js'])
|
|
460 |
r += htmltext('<a rel="popup" href="%s">%s</a>') % (
|
|
461 |
'code/%s/' % tracking_code, tracking_code)
|
|
462 |
r += TextsDirectory.get_html_text('tracking-code-short-text')
|
|
463 |
r += htmltext('</div>') # <!-- .tracking-code-part -->
|
453 |
464 |
|
454 |
465 |
if data.get('is_recalled_draft'):
|
455 |
466 |
r += htmltext('<form action="removedraft" method="POST">')
|
... | ... | |
557 |
568 |
# [session_var_id] is available on the first page.
|
558 |
569 |
session.force()
|
559 |
570 |
|
560 |
|
if self.formdef.enable_tracking_codes:
|
|
571 |
if self.has_draft_support():
|
561 |
572 |
if get_request().form.get('_ajax_form_token'):
|
562 |
573 |
# _ajax_form_token is immediately removed, this prevents
|
563 |
574 |
# late autosave() to overwrite data after the user went to a
|
... | ... | |
590 |
601 |
# first hit on first page, if tracking code are enabled and we
|
591 |
602 |
# are not editing an existing formdata, generate a new tracking
|
592 |
603 |
# code.
|
593 |
|
if not self.edit_mode and self.formdef.enable_tracking_codes and not get_request().form.has_key('mt'):
|
|
604 |
if not self.edit_mode and self.has_draft_support() and not get_request().form.has_key('mt'):
|
594 |
605 |
tracking_code = get_publisher().tracking_code_class()
|
595 |
606 |
tracking_code.store()
|
596 |
607 |
token = randbytes(8)
|
... | ... | |
620 |
631 |
form.add_hidden('magictoken', '-1')
|
621 |
632 |
form.add_submit('cancel')
|
622 |
633 |
|
623 |
|
if self.formdef.enable_tracking_codes:
|
|
634 |
if self.has_draft_support():
|
624 |
635 |
form.add_submit('removedraft')
|
625 |
636 |
form.add_submit('savedraft')
|
626 |
637 |
|
... | ... | |
721 |
732 |
displayed_fields=submitted_fields,
|
722 |
733 |
transient_formdata=transient_formdata)
|
723 |
734 |
form.add_submit('previous')
|
724 |
|
if self.formdef.enable_tracking_codes:
|
|
735 |
if self.has_draft_support():
|
725 |
736 |
form.add_submit('removedraft')
|
726 |
737 |
form.add_submit('savedraft')
|
727 |
738 |
form.add_submit('submit')
|
728 |
739 |
if page_no > 0 and form.get_submit() == 'previous':
|
729 |
740 |
return self.previous_page(page_no, magictoken)
|
730 |
741 |
|
731 |
|
if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
|
|
742 |
if self.has_draft_support() and form.get_submit() == 'removedraft':
|
732 |
743 |
return self.removedraft()
|
733 |
744 |
|
734 |
745 |
form_data = session.get_by_magictoken(magictoken, {})
|
735 |
746 |
data = self.formdef.get_data(form)
|
736 |
747 |
form_data.update(data)
|
737 |
748 |
|
738 |
|
if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
|
|
749 |
if self.has_draft_support() and form.get_submit() == 'savedraft':
|
739 |
750 |
filled = self.save_draft(form_data, page_no)
|
740 |
751 |
return redirect(filled.get_url().rstrip('/'))
|
741 |
752 |
|
... | ... | |
794 |
805 |
get_session().message = ('error', _('This form has already been submitted.'))
|
795 |
806 |
return redirect(get_publisher().get_backoffice_url() + '/submission/')
|
796 |
807 |
return template.error_page(_('This form has already been submitted.'))
|
797 |
|
elif self.formdef.enable_tracking_codes and not self.edit_mode:
|
798 |
|
# if there's no draft yet and tracking codes are enabled, create one
|
|
808 |
elif self.has_draft_support():
|
|
809 |
# if there's no draft yet and drafts are supported, create one
|
799 |
810 |
filled = self.save_draft(form_data, page_no)
|
800 |
811 |
|
801 |
812 |
# the page has been successfully submitted, maybe new pages
|
... | ... | |
826 |
837 |
form.add_hidden('page', '-1')
|
827 |
838 |
form.add_hidden('magictoken', '-1')
|
828 |
839 |
form.add_submit('cancel')
|
829 |
|
if self.formdef.enable_tracking_codes:
|
|
840 |
if self.has_draft_support():
|
830 |
841 |
form.add_submit('removedraft')
|
831 |
842 |
form.add_submit('savedraft')
|
832 |
843 |
|
... | ... | |
861 |
872 |
if form.get_submit() == 'previous':
|
862 |
873 |
return self.previous_page(len(self.pages), magictoken)
|
863 |
874 |
|
864 |
|
if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
|
|
875 |
if self.has_draft_support() and form.get_submit() == 'removedraft':
|
865 |
876 |
return self.removedraft()
|
866 |
877 |
|
867 |
|
if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
|
|
878 |
if self.has_draft_support() and form.get_submit() == 'savedraft':
|
868 |
879 |
filled = self.save_draft(form_data, page_no = -1)
|
869 |
880 |
return redirect(filled.get_url().rstrip('/'))
|
870 |
881 |
|
... | ... | |
1110 |
1121 |
return redirect(url)
|
1111 |
1122 |
|
1112 |
1123 |
def set_tracking_code(self, formdata, magictoken_data=None):
|
1113 |
|
if not self.formdef.enable_tracking_codes:
|
|
1124 |
if not self.has_draft_support():
|
1114 |
1125 |
return
|
1115 |
1126 |
if formdata.tracking_code:
|
1116 |
1127 |
return
|
... | ... | |
1181 |
1192 |
form.add_submit('previous', _('Previous'))
|
1182 |
1193 |
form.add_submit('cancel', _('Cancel'), css_class = 'cancel')
|
1183 |
1194 |
session = get_session()
|
1184 |
|
if self.formdef.enable_tracking_codes:
|
|
1195 |
if self.has_draft_support():
|
1185 |
1196 |
form.add_submit('savedraft', _('Save Draft'), css_class = 'save-draft',
|
1186 |
1197 |
attrs={'style': 'display: none'})
|
1187 |
1198 |
form.add_hidden('step', '2')
|
... | ... | |
1195 |
1206 |
magictoken=magictoken),
|
1196 |
1207 |
'steps': lambda: self.step(1, None),
|
1197 |
1208 |
}
|
1198 |
|
if self.formdef.enable_tracking_codes and data:
|
|
1209 |
if self.has_draft_support() and data:
|
1199 |
1210 |
context['tracking_code_box'] = lambda: self.tracking_code_box(data, magictoken)
|
1200 |
1211 |
|
1201 |
1212 |
return template.QommonTemplateResponse(
|
... | ... | |
1230 |
1241 |
return redirect(get_publisher().get_backoffice_url() + '/submission/')
|
1231 |
1242 |
return PublicFormStatusPage(self.formdef, filled)
|
1232 |
1243 |
|
1233 |
|
if not (get_request().is_in_backoffice() or filled.formdef.enable_tracking_codes):
|
|
1244 |
if not (get_request().is_in_backoffice() or self.has_draft_support()):
|
1234 |
1245 |
# don't allow restoring drafts if drafts are no longer enabled for
|
1235 |
1246 |
# this form.
|
1236 |
1247 |
raise errors.AccessForbiddenError()
|