Exemplo n.º 1
0
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)))
Exemplo n.º 2
0
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
                )