def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super(FontForm, self).__init__(*args, **kwargs) self.fields["woff"].widget = FileDnDUploaderWidget(upload_path="/admin_typography/", clearable=True) self.fields["woff2"].widget = FileDnDUploaderWidget(upload_path="/admin_typography/", clearable=True) self.fields["ttf"].widget = FileDnDUploaderWidget(upload_path="/admin_typography/", clearable=True) self.fields["svg"].widget = FileDnDUploaderWidget(upload_path="/admin_typography/", clearable=True) self.fields["eot"].widget = FileDnDUploaderWidget(upload_path="/admin_typography/", clearable=True)
def __init__(self, **kwargs): super(ShuupAdminForm, self).__init__(**kwargs) for field in self.fields: if issubclass(self.fields[field].widget.__class__, AdminFileWidget): self.fields[field].widget = FileDnDUploaderWidget( upload_path="/default", kind="images", clearable=True)
def test_bound_file_dnd_uploader_widget(): f = File.objects.create(name="file") widget_html = FileDnDUploaderWidget( upload_path="/test", kind="foo", dropzone_attrs={ "max-filesize": 10, "retry-chunks-limit": 100, "clickable": "false", }, ).render(name="foo", value=f.pk) soup = BeautifulSoup(widget_html) assert soup.select("#dropzone-dropzone"), "widget has id" assert soup.select("input")[0]["name"] == "foo" assert soup.select("input")[0]["value"] == str(f.pk) assert soup.select("[data-upload_path]")[0]["data-upload_path"] == "/test" assert soup.select("[data-dropzone]")[0]["data-dropzone"] == "true" assert soup.select("[data-kind]")[0]["data-kind"] == "foo" assert soup.select("[data-id]")[0]["data-id"] == str(f.pk) assert soup.select("[data-name]")[0]["data-name"] == f.name assert soup.select( "[data-dz_max-filesize]")[0]["data-dz_max-filesize"] == "10" assert soup.select("[data-dz_retry-chunks-limit]" )[0]["data-dz_retry-chunks-limit"] == "100" assert soup.select( "[data-dz_clickable]")[0]["data-dz_clickable"] == "false" assert not soup.select("[data-thumbnail]")
def __init__(self, **kwargs): self.carousel = kwargs.pop("carousel") super(SlideForm, self).__init__(**kwargs) self.empty_permitted = False self.fields["product_link"].widget = ProductChoiceWidget(clearable=True) for lang in self.languages: image_field = "image__%s" % lang self.fields[image_field].widget = FileDnDUploaderWidget( kind="images", upload_path="/carousel", clearable=True) if lang == self.default_language: self.fields[image_field].widget = FileDnDUploaderWidget( kind="images", upload_path="/carousel", clearable=False) self.fields[image_field].required = True self.fields[image_field].widget.is_required = True if not self.fields["available_from"].initial: self.fields["available_from"].initial = now()
def test_bound_file_dnd_uploader_widget(): f = File.objects.create(name="file") widget_html = FileDnDUploaderWidget(upload_path="/test", kind="foo").render(name="foo", value=f.pk) soup = BeautifulSoup(widget_html) assert soup.select("#dropzone-dropzone"), "widget has id" assert soup.select("input")[0]["name"] == "foo" assert soup.select("input")[0]["value"] == str(f.pk) assert soup.select("[data-upload_path]")[0]["data-upload_path"] == "/test" assert soup.select("[data-dropzone]")[0]["data-dropzone"] == "true" assert soup.select("[data-kind]")[0]["data-kind"] == "foo" assert soup.select("[data-id]")[0]["data-id"] == str(f.pk) assert soup.select("[data-name]")[0]["data-name"] == f.name assert not soup.select("[data-thumbnail]")
def __init__(self, **kwargs): self.carousel = kwargs.pop("carousel") self.request = kwargs.pop("request") super(SlideForm, self).__init__(**kwargs) self.empty_permitted = False shop = get_shop(self.request) self.fields["category_link"].queryset = Category.objects.all_except_deleted( shop=self.request.shop).prefetch_related('translations') self.fields["cms_page_link"].queryset = Page.objects.filter(shop=shop) self.fields["product_link"].widget = ProductChoiceWidget(clearable=True) for lang in self.languages: image_field = "image__%s" % lang self.fields[image_field].widget = FileDnDUploaderWidget( kind="images", upload_path="/carousel", clearable=True) if lang == self.default_language: self.fields[image_field].widget = FileDnDUploaderWidget( kind="images", upload_path="/carousel", clearable=False) self.fields[image_field].required = True self.fields[image_field].widget.is_required = True if not self.fields["available_from"].initial: self.fields["available_from"].initial = now()
def test_unbound_file_dnd_uploader_widget(): soup = BeautifulSoup(FileDnDUploaderWidget().render(name="foo", value="")) assert soup.select("#dropzone-dropzone"), "widget has id" assert soup.select("input")[0]["name"] == "foo" assert not soup.select("input")[0].get("value") assert soup.select("[data-upload_path]")[0]["data-upload_path"] == "/" assert soup.select("[data-dropzone]")[0]["data-dropzone"] == "true" assert not soup.select("[data-kind]") assert not soup.select("[data-id]") assert not soup.select("[data-name]") assert not soup.select("[data-size]") assert not soup.select("[data-url]") assert not soup.select("[data-thumbnail]") assert not soup.select("[data-date]")
def init_fields(self): self.fields["groups"] = forms.ModelMultipleChoiceField( queryset=ContactGroup.objects.all_except_defaults(), initial=(self.instance.groups.all_except_defaults() if self.instance.pk else ()), required=False, widget=QuickAddContactGroupMultiSelect( attrs={"data-model": "shuup.ContactGroup"}), label=_("Contact Groups"), help_text= _("The contact groups this contact belongs to. Contact groups are defined in Contacts - Contact Groups " "and are used to configure sales, campaigns, and product pricing tailored for a set of users." ), ) if "account_manager" in self.fields: self.fields["account_manager"].widget = PersonContactChoiceWidget( clearable=True) if "picture" in self.fields: self.fields["picture"].widget = FileDnDUploaderWidget( upload_path="/contacts", kind="images", clearable=True) if not self.request or (self.request and self.request.user.is_superuser): shops_qs = Shop.objects.all() else: shops_qs = Shop.objects.filter( staff_members__in=[self.request.user]) if "tax_group" in self.fields: self.fields["tax_group"].widget = QuickAddTaxGroupSelect( editable_model="shuup.CustomerTaxGroup") if self.instance and self.instance.tax_group: self.fields["tax_group"].widget.choices = [ (self.instance.tax_group.id, self.instance.tax_group.name) ] self.fields["shops"] = forms.ModelMultipleChoiceField( queryset=shops_qs, initial=(self.instance.shops.all() if self.instance.pk else ()), required=False, widget=forms.SelectMultiple(), label=_("Shops"), help_text=_("The shops this contact belongs to"), )
class ProductBaseForm(MultiLanguageModelForm): file = forms.CharField( label=_("Primary Product Image"), widget=FileDnDUploaderWidget(kind="images", upload_path="/products/images"), help_text=_("The main product image. You can add additional images on the Product Images tab."), required=False ) class Meta: model = Product fields = ( "accounting_identifier", "barcode", "cost_center", "depth", "gross_weight", "gtin", "height", "manufacturer", "net_weight", "profit_center", "sales_unit", "shipping_mode", "sku", "stock_behavior", "tax_class", "type", "width", # I18n "description", "short_description", "keywords", "name", "slug", "variation_name", ) widgets = { "keywords": forms.TextInput(), "sales_unit": QuickAddSalesUnitSelect(editable_model="shuup.SalesUnit"), "tax_class": QuickAddTaxClassSelect(editable_model="shuup.TaxClass"), "type": QuickAddProductTypeSelect(editable_model="shuup.ProductType"), "manufacturer": QuickAddManufacturerSelect(editable_model="shuup.Manufacturer"), "description": TextEditorWidget(), "short_description": forms.TextInput(), } def __init__(self, **kwargs): self.request = kwargs.pop('request', None) super(ProductBaseForm, self).__init__(**kwargs) self.fields["sales_unit"].required = True # TODO: Move this to model if self.instance.pk: del self.fields["file"] def clean_sku(self): sku = self.cleaned_data["sku"] sku_unique_qs = Product.objects.filter(sku=sku) if self.instance: sku_unique_qs = sku_unique_qs.exclude(pk=self.instance.pk) # Make sure sku is unique and raise proper validation error if not if sku_unique_qs.exists(): raise ValidationError( _("Given value is already in use, please use unique SKU and try again."), code="sku_not_unique") return sku def save(self): instance = super(ProductBaseForm, self).save() if self.cleaned_data.get("file"): image = ProductMedia.objects.create( product=instance, file_id=self.cleaned_data["file"], kind=ProductMediaKind.IMAGE, ) shop = self.request.shop image.shops.add(shop) instance.primary_image = image instance.save() return instance def clean(self): form_pre_clean.send( Product, instance=self.instance, cleaned_data=self.cleaned_data) super(ProductBaseForm, self).clean() form_post_clean.send( Product, instance=self.instance, cleaned_data=self.cleaned_data)
class ProductBaseForm(MultiLanguageModelForm): file = forms.CharField( label=_("Primary Product Image"), widget=FileDnDUploaderWidget(kind="images", upload_path="/products/images"), help_text=_("The main product image. You can add additional images in the `Product Images` tab."), required=False ) class Meta: model = Product fields = ( "accounting_identifier", "barcode", "cost_center", "depth", "gross_weight", "gtin", "height", "manufacturer", "net_weight", "profit_center", "sales_unit", "shipping_mode", "sku", "tax_class", "type", "width", # I18n "description", "short_description", "keywords", "name", "slug", "variation_name", ) widgets = { "keywords": forms.TextInput(), "sales_unit": QuickAddSalesUnitSelect(editable_model="shuup.SalesUnit"), "tax_class": QuickAddTaxClassSelect(editable_model="shuup.TaxClass"), "description": (TextEditorWidget() if settings.SHUUP_ADMIN_ALLOW_HTML_IN_PRODUCT_DESCRIPTION else forms.Textarea(attrs={"rows": 5})), "short_description": forms.TextInput(), } def __init__(self, **kwargs): self.request = kwargs.pop('request', None) super(ProductBaseForm, self).__init__(**kwargs) self.fields["sales_unit"].required = True # TODO: Move this to model self.fields["type"].required = True if self.instance.pk: del self.fields["file"] self.fields["manufacturer"] = Select2ModelField( required=False, initial=(self.instance.manufacturer if self.instance.pk else None), model=Manufacturer, widget=QuickAddManufacturerSelect( initial=(self.instance.manufacturer if self.instance.pk else None), editable_model="shuup.Manufacturer", attrs={"data-placeholder": ugettext("Select a manufacturer")} ) ) if self.instance.pk: initial_type = self.instance.type else: initial_type = kwargs.get("initial", {}).get("type") self.fields["type"] = Select2ModelField( label=_("Product type"), initial=initial_type, model=ProductType, widget=QuickAddProductTypeSelect( editable_model="shuup.ProductType", initial=initial_type ) ) def clean_sku(self): sku = self.cleaned_data["sku"] sku_unique_qs = Product.objects.filter(sku=sku) if self.instance: sku_unique_qs = sku_unique_qs.exclude(pk=self.instance.pk) # Make sure sku is unique and raise proper validation error if not if sku_unique_qs.exists(): raise ValidationError( _("Given value is already in use, please use unique SKU and try again."), code="sku_not_unique") return sku def save(self): instance = super(ProductBaseForm, self).save() if self.cleaned_data.get("file"): image = ProductMedia.objects.create( product=instance, file_id=self.cleaned_data["file"], kind=ProductMediaKind.IMAGE, ) shop = self.request.shop image.shops.add(shop) instance.primary_image = image instance.save() return instance def clean(self): form_pre_clean.send( Product, instance=self.instance, cleaned_data=self.cleaned_data) super(ProductBaseForm, self).clean() if not settings.SHUUP_ADMIN_ALLOW_HTML_IN_PRODUCT_DESCRIPTION: for key, value in self.cleaned_data.items(): if key.startswith("description__"): self.cleaned_data[key] = bleach.clean(value, tags=[]) form_post_clean.send( Product, instance=self.instance, cleaned_data=self.cleaned_data)
def test_default_url_works(): widget = FileDnDUploaderWidget() assert widget.upload_url == reverse_lazy("shuup_admin:media.upload")
def test_lazy_url_not_evaluated_on_init(): widget = FileDnDUploaderWidget(upload_url=reverse_lazy("not:evaluated")) assert widget