def addons_section()

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


def addons_section(request, addon_id, addon, section, editable=False):
    show_listed = addon.has_listed_versions()
    static_theme = addon.type == amo.ADDON_STATICTHEME
    models = {}
    content_waffle = waffle.switch_is_active('content-optimization')
    if show_listed:
        models.update(
            {
                'describe': (
                    forms.DescribeForm
                    if not content_waffle
                    else forms.DescribeFormContentOptimization
                ),
                'additional_details': forms.AdditionalDetailsForm,
                'technical': forms.AddonFormTechnical,
            }
        )
        if not static_theme and addon.status != amo.STATUS_DISABLED:
            models.update({'media': forms.AddonFormMedia})
    else:
        models.update(
            {
                'describe': (
                    forms.DescribeFormUnlisted
                    if not content_waffle
                    else forms.DescribeFormUnlistedContentOptimization
                ),
                'additional_details': forms.AdditionalDetailsFormUnlisted,
                'technical': forms.AddonFormTechnicalUnlisted,
            }
        )

    if section not in models:
        raise http.Http404()

    tags, previews = [], []
    cat_form = dependency_form = whiteboard_form = None
    whiteboard = None

    if section == 'describe' and show_listed:
        cat_form = forms.CategoryForm(
            request.POST if request.method == 'POST' else None,
            addon=addon,
            request=request,
        )

    elif section == 'additional_details':
        tags = addon.tags.values_list('tag_text', flat=True)

    elif section == 'media':
        previews = forms.PreviewFormSet(
            request.POST or None, prefix='files', queryset=addon.previews.all()
        )

    if section == 'technical':
        try:
            whiteboard = Whiteboard.objects.get(pk=addon.pk)
        except Whiteboard.DoesNotExist:
            whiteboard = Whiteboard(pk=addon.pk)

        whiteboard_form = PublicWhiteboardForm(
            request.POST or None, instance=whiteboard, prefix='whiteboard'
        )

    # Get the slug before the form alters it to the form data.
    valid_slug = addon.slug
    if editable:
        if request.method == 'POST':
            main_form = models[section](
                request.POST, request.FILES, instance=addon, request=request
            )

            if main_form.is_valid() and (not previews or previews.is_valid()):
                addon = main_form.save(addon)

                if previews:
                    for preview in previews.forms:
                        preview.save(addon)

                editable = False
                if section == 'media':
                    ActivityLog.objects.create(amo.LOG.CHANGE_MEDIA, addon)
                else:
                    ActivityLog.objects.create(amo.LOG.EDIT_PROPERTIES, addon)

                if valid_slug != addon.slug:
                    ActivityLog.objects.create(
                        amo.LOG.ADDON_SLUG_CHANGED, addon, valid_slug, addon.slug
                    )
                valid_slug = addon.slug

            if cat_form:
                if cat_form.is_valid():
                    cat_form.save()
                else:
                    editable = True
            if dependency_form:
                if dependency_form.is_valid():
                    dependency_form.save()
                else:
                    editable = True
            if whiteboard_form:
                if whiteboard_form.is_valid():
                    whiteboard_form.save()
                else:
                    editable = True

        else:
            main_form = models[section](instance=addon, request=request)
    else:
        main_form = False

    data = {
        'addon': addon,
        'whiteboard': whiteboard,
        'show_listed_fields': show_listed,
        'main_form': main_form,
        'editable': editable,
        'tags': tags,
        'cat_form': cat_form,
        'preview_form': previews,
        'dependency_form': dependency_form,
        'whiteboard_form': whiteboard_form,
        'valid_slug': valid_slug,
        'supported_image_types': amo.SUPPORTED_IMAGE_TYPES,
    }

    return TemplateResponse(
        request, 'devhub/addons/edit/%s.html' % section, context=data
    )