def version_edit()

in src/olympia/devhub/views.py [0:0]


def version_edit(request, addon_id, addon, version_id):
    version = get_object_or_404(addon.versions.all(), pk=version_id)
    posting = request.method == 'POST'
    static_theme = addon.type == amo.ADDON_STATICTHEME
    version_form = (
        forms.VersionForm(
            request.POST or None,
            request.FILES or None,
            instance=version,
        )
        if not static_theme
        else None
    )

    data = {}

    has_source = version_form and version_form['source'].data
    if version_form:
        data['version_form'] = version_form
        if has_source and posting:
            timer = StopWatch('devhub.views.version_edit.')
            timer.start()
            log.info(
                'version_edit, form populated, addon.slug: %s, version.id: %s',
                addon.slug,
                version.id,
            )
            timer.log_interval('1.form_populated')

    is_admin = acl.action_allowed_for(request.user, amo.permissions.REVIEWS_ADMIN)

    if not static_theme and addon.can_set_compatibility:
        qs = version.apps.all().select_related('min', 'max')
        compat_form = forms.CompatFormSet(
            request.POST or None, queryset=qs, form_kwargs={'version': version}
        )
        data['compat_form'] = compat_form

    if request.method == 'POST' and all([form.is_valid() for form in data.values()]):
        if has_source:
            log.info(
                'version_edit, form validated, addon.slug: %s, version.id: %s',
                addon.slug,
                version.id,
            )
            timer.log_interval('2.form_validated')
        if 'compat_form' in data:
            for compat in data['compat_form'].save(commit=False):
                if data['compat_form'].has_changed():
                    compat.originated_from = amo.APPVERSIONS_ORIGINATED_FROM_DEVELOPER
                    compat.version = version
                    compat.save()

            for compat in data['compat_form'].deleted_objects:
                compat.delete()

            for form in data['compat_form'].forms:
                if isinstance(form, forms.CompatForm) and 'max' in form.changed_data:
                    _log_max_version_change(addon, version, form.instance)

        if 'version_form' in data:
            data['version_form'].save()
            if has_source:
                log.info(
                    'version_edit, form saved, addon.slug: %s, version.id: %s',
                    addon.slug,
                    version.id,
                )
                timer.log_interval('3.form_saved')

            if 'approval_notes' in version_form.changed_data:
                ActivityLog.objects.create(
                    amo.LOG.NOTES_FOR_REVIEWERS_CHANGED, addon, version, request.user
                )

            if (
                'source' in version_form.changed_data
                and version_form.cleaned_data['source']
            ):
                version.flag_if_sources_were_provided(request.user)

        messages.success(request, gettext('Changes successfully saved.'))
        result = redirect('devhub.versions.edit', addon.slug, version_id)
        if has_source:
            log.info(
                'version_edit, redirecting to next view, '
                + 'addon.slug: %s, version.id: %s',
                addon.slug,
                version.id,
            )
            timer.log_interval('4.redirecting_to_next_view')

        return result

    data.update(
        {
            'addon': addon,
            'version': version,
            'is_admin': is_admin,
            'choices': File.STATUS_CHOICES,
            'files': (version.file,),
        }
    )

    if has_source and posting:
        log.info(
            'version_edit, validation failed, re-displaying the template, '
            + 'addon.slug: %s, version.id: %s',
            addon.slug,
            version.id,
        )
        timer.log_interval('5.validation_failed_re-displaying_the_template')
    return TemplateResponse(request, 'devhub/versions/edit.html', context=data)