def details(request, addon_id, addon): # Name, Slug, Summary, Description, Privacy Policy, # Homepage URL, Support URL, Support Email. form_basic = AppDetailsBasicForm(request.POST or None, instance=addon, request=request) form_cats = CategoryForm(request.POST or None, product=addon, request=request) form_devices = DeviceTypeForm(request.POST or None, addon=addon) form_icon = AppFormMedia(request.POST or None, request.FILES or None, instance=addon, request=request) form_previews = PreviewFormSet(request.POST or None, prefix='files', queryset=addon.get_previews()) # For empty webapp-locale (or no-locale) fields that have # form-locale values, duplicate them to satisfy the requirement. form_locale = request.COOKIES.get("current_locale", "") app_locale = to_language(addon.default_locale) for name, value in request.POST.items(): if value: if name.endswith(form_locale): basename = name[:-len(form_locale)] else: basename = name + '_' othername = basename + app_locale if not request.POST.get(othername, None): request.POST[othername] = value forms = { 'form_basic': form_basic, 'form_devices': form_devices, 'form_cats': form_cats, 'form_icon': form_icon, 'form_previews': form_previews, } if request.POST and all(f.is_valid() for f in forms.itervalues()): addon = form_basic.save(addon) form_devices.save(addon) form_cats.save() form_icon.save(addon) for preview in form_previews.forms: preview.save(addon) tasks.generate_image_assets.delay(addon) checklist = AppSubmissionChecklist.objects.get(addon=addon) if waffle.switch_is_active('disabled-payments'): checklist.update(details=True, payments=True) addon.mark_done() return redirect('submit.app.done', addon.app_slug) else: checklist.update(details=True) return redirect('submit.app.payments', addon.app_slug) ctx = { 'step': 'details', 'addon': addon, } ctx.update(forms) return jingo.render(request, 'submit/details.html', ctx)
def details(request, addon_id, addon): # Name, Slug, Summary, Description, Privacy Policy, # Homepage URL, Support URL, Support Email. form_basic = AppDetailsBasicForm(request.POST or None, instance=addon, request=request) form_cats = CategoryForm(request.POST or None, product=addon, request=request) form_devices = DeviceTypeForm(request.POST or None, addon=addon) form_icon = AppFormMedia(request.POST or None, request.FILES or None, instance=addon, request=request) form_previews = PreviewFormSet(request.POST or None, prefix='files', queryset=addon.get_previews()) # For empty webapp-locale (or no-locale) fields that have # form-locale values, duplicate them to satisfy the requirement. form_locale = request.COOKIES.get("current_locale", "") app_locale = to_language(addon.default_locale) for name, value in request.POST.items(): if value: if name.endswith(form_locale): basename = name[:-len(form_locale)] else: basename = name + '_' othername = basename + app_locale if not request.POST.get(othername, None): request.POST[othername] = value forms = { 'form_basic': form_basic, 'form_devices': form_devices, 'form_cats': form_cats, 'form_icon': form_icon, 'form_previews': form_previews, } if request.POST and all(f.is_valid() for f in forms.itervalues()): addon = form_basic.save(addon) form_devices.save(addon) form_cats.save() form_icon.save(addon) for preview in form_previews.forms: preview.save(addon) tasks.generate_image_assets.delay(addon) AppSubmissionChecklist.objects.get(addon=addon).update(details=True) addon.mark_done() return redirect('submit.app.done', addon.app_slug) ctx = { 'step': 'details', 'addon': addon, } ctx.update(forms) return jingo.render(request, 'submit/details.html', ctx)
def obj_update(self, bundle, request, **kwargs): data = bundle.data try: obj = self.get_object_list(bundle.request).get(**kwargs) except Webapp.DoesNotExist: raise ImmediateHttpResponse(response=http.HttpNotFound()) if not AppOwnerAuthorization().is_authorized(request, object=obj): raise ImmediateHttpResponse(response=http.HttpForbidden()) data['slug'] = data.get('slug', obj.app_slug) data.update(self.formset(data)) data.update(self.devices(data)) forms = [ AppDetailsBasicForm(data, instance=obj, request=request), DeviceTypeForm(data, addon=obj), CategoryFormSet(data, addon=obj, request=request) ] valid = all([f.is_valid() for f in forms]) if not valid: raise self.form_errors(forms) forms[0].save(obj) forms[1].save(obj) forms[2].save() log.info('App updated: %s' % obj.pk) bundle.obj = obj return bundle
def test_device_types(self): dtype = DeviceType.objects.create(name='fligphone', class_name='phone') webapp = Webapp.objects.get(id=337141) addondt = AddonDeviceType.objects.create(addon=webapp, device_type=dtype) types = DeviceType.objects.values_list('id', flat=True) form = DeviceTypeForm(addon=webapp) eq_(webapp.device_types, [addondt.device_type]) eq_(list(form.initial['device_types']), list(types))
def details(request, addon_id, addon): # Name, Slug, Summary, Description, Privacy Policy, # Homepage URL, Support URL, Support Email. form_basic = AppDetailsBasicForm(request.POST or None, instance=addon, request=request) form_cats = CategoryFormSet(request.POST or None, addon=addon, request=request) form_devices = DeviceTypeForm(request.POST or None, addon=addon) form_icon = AddonFormMedia(request.POST or None, request.FILES or None, instance=addon, request=request) form_previews = PreviewFormSet(request.POST or None, prefix='files', queryset=addon.previews.all()) forms = { 'form_basic': form_basic, 'form_devices': form_devices, 'form_cats': form_cats, 'form_icon': form_icon, 'form_previews': form_previews, } if request.POST and all(f.is_valid() for f in forms.itervalues()): addon = form_basic.save(addon) form_devices.save(addon) form_cats.save() form_icon.save(addon) for preview in form_previews.forms: preview.save(addon) AppSubmissionChecklist.objects.get(addon=addon).update(details=True) return redirect('submit.app.payments', addon.app_slug) ctx = { 'step': 'details', 'addon': addon, } ctx.update(forms) return jingo.render(request, 'submit/details.html', ctx)
def addons_section(request, addon_id, addon, section, editable=False, webapp=False): basic = AppFormBasic if webapp else addon_forms.AddonFormBasic models = {'basic': basic, 'media': AppFormMedia, 'details': AppFormDetails, 'support': AppFormSupport, 'technical': addon_forms.AddonFormTechnical, 'admin': forms.AdminSettingsForm} if section not in models: raise http.Http404() tags = image_assets = previews = restricted_tags = [] cat_form = device_type_form = region_form = None if section == 'basic': tags = addon.tags.not_blacklisted().values_list('tag_text', flat=True) cat_form = CategoryForm(request.POST or None, product=addon, request=request) restricted_tags = addon.tags.filter(restricted=True) device_type_form = DeviceTypeForm(request.POST or None, addon=addon) elif section == 'media': image_assets = ImageAssetFormSet( request.POST or None, prefix='images', app=addon) previews = PreviewFormSet( request.POST or None, prefix='files', queryset=addon.get_previews()) elif section == 'details' and settings.REGION_STORES: region_form = RegionForm(request.POST or None, product=addon) elif (section == 'admin' and not acl.action_allowed(request, 'Apps', 'Configure') and not acl.action_allowed(request, 'Apps', 'ViewConfiguration')): return http.HttpResponseForbidden() # Get the slug before the form alters it to the form data. valid_slug = addon.app_slug if editable: if request.method == 'POST': if (section == 'admin' and not acl.action_allowed(request, 'Apps', 'Configure')): return http.HttpResponseForbidden() form = models[section](request.POST, request.FILES, instance=addon, request=request) if (form.is_valid() and (not previews or previews.is_valid()) and (not region_form or region_form.is_valid()) and (not image_assets or image_assets.is_valid())): if region_form: region_form.save() addon = form.save(addon) if 'manifest_url' in form.changed_data: addon.update( app_domain=addon.domain_from_url(addon.manifest_url)) update_manifests([addon.pk]) if previews: for preview in previews.forms: preview.save(addon) if image_assets: image_assets.save() editable = False if section == 'media': amo.log(amo.LOG.CHANGE_ICON, addon) else: amo.log(amo.LOG.EDIT_PROPERTIES, addon) valid_slug = addon.app_slug if cat_form: if cat_form.is_valid(): cat_form.save() addon.save() else: editable = True if device_type_form: if device_type_form.is_valid(): device_type_form.save(addon) addon.save() else: editable = True else: form = models[section](instance=addon, request=request) else: form = False data = {'addon': addon, 'webapp': webapp, 'form': form, 'editable': editable, 'tags': tags, 'restricted_tags': restricted_tags, 'image_sizes': APP_IMAGE_SIZES, 'cat_form': cat_form, 'preview_form': previews, 'image_asset_form': image_assets, 'valid_slug': valid_slug, 'device_type_form': device_type_form, 'region_form': region_form} return jingo.render(request, 'developers/apps/edit/%s.html' % section, data)
def addons_section(request, addon_id, addon, section, editable=False, webapp=False): basic = AppFormBasic if webapp else addon_forms.AddonFormBasic models = { "basic": basic, "media": AppFormMedia, "details": AppFormDetails, "support": AppFormSupport, "technical": addon_forms.AddonFormTechnical, "admin": forms.AdminSettingsForm, } if section not in models: raise http.Http404() tags = previews = restricted_tags = [] cat_form = device_type_form = region_form = None if section == "basic": tags = addon.tags.not_blacklisted().values_list("tag_text", flat=True) cat_form = CategoryForm(request.POST or None, product=addon, request=request) restricted_tags = addon.tags.filter(restricted=True) device_type_form = DeviceTypeForm(request.POST or None, addon=addon) elif section == "media": previews = PreviewFormSet(request.POST or None, prefix="files", queryset=addon.get_previews()) elif section == "details" and settings.REGION_STORES: region_form = RegionForm(request.POST or None, product=addon) elif ( section == "admin" and not acl.action_allowed(request, "Apps", "Configure") and not acl.action_allowed(request, "Apps", "ViewConfiguration") ): return http.HttpResponseForbidden() # Get the slug before the form alters it to the form data. valid_slug = addon.app_slug if editable: if request.method == "POST": if section == "admin" and not acl.action_allowed(request, "Apps", "Configure"): return http.HttpResponseForbidden() form = models[section](request.POST, request.FILES, instance=addon, request=request) if ( form.is_valid() and (not previews or previews.is_valid()) and (not region_form or region_form.is_valid()) ): if region_form: region_form.save() addon = form.save(addon) if "manifest_url" in form.changed_data: addon.update(app_domain=addon.domain_from_url(addon.manifest_url)) update_manifests([addon.pk]) if previews: for preview in previews.forms: preview.save(addon) editable = False if section == "media": amo.log(amo.LOG.CHANGE_ICON, addon) else: amo.log(amo.LOG.EDIT_PROPERTIES, addon) valid_slug = addon.app_slug if cat_form: if cat_form.is_valid(): cat_form.save() addon.save() else: editable = True if device_type_form: if device_type_form.is_valid(): device_type_form.save(addon) addon.save() else: editable = True else: form = models[section](instance=addon, request=request) else: form = False data = { "addon": addon, "webapp": webapp, "form": form, "editable": editable, "tags": tags, "restricted_tags": restricted_tags, "cat_form": cat_form, "preview_form": previews, "valid_slug": valid_slug, "device_type_form": device_type_form, "region_form": region_form, } return jingo.render(request, "developers/apps/edit/%s.html" % section, data)