def submission_create(form_id): form = services.forms.get_or_404(pk=form_id, form_type='INCIDENT') edit_form_class = generate_submission_edit_form_class(form) page_title = _('Add Submission') template_name = 'frontend/incident_add.html' if request.method == 'GET': submission_form = edit_form_class() return render_template( template_name, page_title=page_title, form=form, submission_form=submission_form ) else: submission_form = edit_form_class(request.form) # a small hack since we're not using modelforms, # these fields are required for creating a new incident if not submission_form.validate(): # really should redisplay the form again return redirect(url_for( 'submissions.submission_list', form_id=unicode(form.pk))) submission = services.submissions.new() submission_form.populate_obj(submission) # properly populate all fields submission.created = datetime.utcnow() submission.deployment = g.deployment submission.event = g.event submission.form = form submission.submission_type = 'O' submission.contributor = submission_form.contributor.data submission.location = submission_form.location.data if not submission.location: submission.location = submission.contributor.location submission.save() return redirect( url_for('submissions.submission_list', form_id=unicode(form.pk)))
def submission_edit(submission_id): submission = services.submissions.get_or_404(pk=submission_id) edit_form_class = generate_submission_edit_form_class(submission.form) page_title = _('Edit Submission') readonly = not g.deployment.allow_observer_submission_edit location_types = services.location_types.find(is_administrative=True) template_name = 'frontend/submission_edit.html' comments = services.submission_comments.find(submission=submission) if request.method == 'GET': submission_form = edit_form_class( obj=submission, prefix=unicode(submission.pk) ) sibling_forms = [ edit_form_class( obj=sibling, prefix=unicode(sibling.pk) ) for sibling in submission.siblings ] master_form = edit_form_class( obj=submission.master, prefix=unicode(submission.master.pk) ) if submission.master else None return render_template( template_name, page_title=page_title, submission=submission, submission_form=submission_form, sibling_forms=sibling_forms, master_form=master_form, readonly=readonly, location_types=location_types, comments=comments ) else: if submission.form.form_type == 'INCIDENT': # no master or sibling submission here submission_form = edit_form_class( request.form, prefix=unicode(submission.pk) ) if submission_form.validate(): with signals.post_save.connected_to( update_submission_version, sender=services.submissions.__model__ ): form_fields = submission_form.data.keys() changed = False for form_field in form_fields: if ( getattr(submission, form_field, None) != submission_form.data.get(form_field) ): setattr( submission, form_field, submission_form.data.get(form_field)) changed = True if changed: submission.save() if request.form.get('next'): return redirect(request.form.get('next')) else: return redirect(url_for( 'submissions.submission_list', form_id=unicode(submission.form.pk))) else: return render_template( template_name, page_title=page_title, submission=submission, submission_form=submission_form, location_types=location_types ) else: master_form = edit_form_class( request.form, prefix=unicode(submission.master.pk) ) if submission.master else None submission_form = edit_form_class( request.form, obj=submission, prefix=unicode(submission.pk) ) sibling_forms = [ edit_form_class( obj=sibling, prefix=unicode(sibling.pk)) for sibling in submission.siblings ] no_error = True selection = request.form.get('submission_selection', None) if not selection and readonly: selection = 'ps' elif not selection and not readonly: selection = 'obs' # if the user is allowed to edit participant submissions, # everything has to be valid at one go. no partial update if master_form and selection == 'ps': if master_form.validate(): with signals.post_save.connected_to( update_submission_version, sender=services.submissions.__model__ ): form_fields = master_form.data.keys() changed = False for form_field in form_fields: if ( getattr(submission.master, form_field, None) != master_form.data.get(form_field) ): if ( not master_form.data.get(form_field) and isinstance(master_form.data.get( form_field), list) ): setattr( submission.master, form_field, None) else: setattr( submission.master, form_field, master_form.data.get(form_field)) if ( form_field not in ["quarantine_status", "verification_status"] ): submission.master.overridden_fields.append( form_field) changed = True if changed: submission.master.overridden_fields = list(set( submission.master.overridden_fields)) submission.master.save() else: no_error = False if selection == 'obs': if submission_form.validate(): changed = False # update the quarantine status if it was set if ( 'quarantine_status' in submission_form.data.keys() and submission_form.data.get('quarantine_status') != submission.quarantine_status ): submission.quarantine_status = \ submission_form.data.get('quarantine_status') submission.save(clean=False) changed = True # update the verification status if it was set if ( 'verification_status' in submission_form.data.keys() and submission_form.data.get('verification_status') != submission.verification_status ): submission.verification_status = \ submission_form.data.get('verification_status') submission.save(clean=False) changed = True with signals.post_save.connected_to( update_submission_version, sender=services.submissions.__model__ ): form_fields = submission_form.data.keys() for form_field in form_fields: if ( getattr(submission, form_field, None) != submission_form.data.get(form_field) ): if ( not submission_form.data.get( form_field) and isinstance(submission_form.data.get( form_field), list) ): setattr( submission, form_field, None) else: setattr( submission, form_field, submission_form.data.get(form_field)) changed = True if changed: submission.save() # submission is for a checklist form, update # contributor completion rating update_participant_completion_rating( submission.contributor) else: no_error = False if no_error: if request.form.get('next'): return redirect(request.form.get('next')) else: return redirect(url_for( 'submissions.submission_list', form_id=unicode(submission.form.pk) )) else: return render_template( template_name, page_title=page_title, submission=submission, submission_form=submission_form, master_form=master_form, sibling_forms=sibling_forms, readonly=readonly, location_types=location_types, comments=comments )