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
)