Exemple #1
0
 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)
Exemple #2
0
 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)
Exemple #3
0
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]")
Exemple #4
0
    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()
Exemple #5
0
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]")
Exemple #6
0
    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()
Exemple #7
0
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]")
Exemple #8
0
    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"),
        )
Exemple #9
0
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)
Exemple #10
0
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)
Exemple #11
0
def test_default_url_works():
    widget = FileDnDUploaderWidget()
    assert widget.upload_url == reverse_lazy("shuup_admin:media.upload")
Exemple #12
0
def test_lazy_url_not_evaluated_on_init():
    widget = FileDnDUploaderWidget(upload_url=reverse_lazy("not:evaluated"))
    assert widget