Example #1
0
class ThemeSettings(models.Model):
    theme_identifier = models.CharField(max_length=64, db_index=True, verbose_name=_("theme identifier"))
    shop = models.ForeignKey("shuup.Shop", related_name="themes_settings", null=True)
    active = models.BooleanField(db_index=True, default=False, verbose_name=_("active"))
    data = TaggedJSONField(db_column="data", default=dict, verbose_name=_("data"))

    class Meta:
        unique_together = ("theme_identifier", "shop")

    def activate(self):
        self.__class__.objects.filter(shop=self.shop).update(active=False)
        self.active = True
        self.save()

    def get_setting(self, key, default=None):
        return self.data.setdefault("settings", {}).get(key, default)

    def get_settings(self):
        return self.data.get("settings", {}).copy()

    def update_settings(self, update_values):
        self.data.setdefault("settings", {}).update(update_values)
        self.save()

    def __str__(self):
        return _("Theme configuration for %s") % self.theme_identifier
Example #2
0
class ThemeSettings(models.Model):
    theme_identifier = models.CharField(max_length=64,
                                        db_index=True,
                                        unique=True,
                                        verbose_name=_("theme identifier"))
    active = models.BooleanField(db_index=True,
                                 default=False,
                                 verbose_name=_("active"))
    data = TaggedJSONField(db_column="data",
                           default=dict,
                           verbose_name=_("data"))

    def activate(self):
        self.__class__.objects.all().update(active=False)
        self.active = True
        self.save()

    def get_setting(self, key, default=None):
        return self.data.setdefault("settings", {}).get(key, default)

    def get_settings(self):
        return self.data.get("settings", {}).copy()

    def update_settings(self, update_values):
        self.data.setdefault("settings", {}).update(update_values)
        self.save()

    def __str__(self):
        return _("Theme configuration for %s") % self.theme_identifier
Example #3
0
class SavedViewConfig(models.Model):
    theme_identifier = models.CharField(max_length=64,
                                        db_index=True,
                                        verbose_name=_("theme identifier"))
    shop = models.ForeignKey("shuup.Shop",
                             related_name="saved_views_config",
                             null=True)
    view_name = models.CharField(max_length=64,
                                 db_index=True,
                                 verbose_name=_("view name"))
    created_on = models.DateTimeField(auto_now_add=True,
                                      verbose_name=_("created on"))
    status = EnumIntegerField(SavedViewConfigStatus,
                              db_index=True,
                              verbose_name=_("status"))
    _data = TaggedJSONField(db_column="data",
                            default=dict,
                            verbose_name=_("internal data"))
    objects = SavedViewConfigQuerySet.as_manager()

    @property
    def draft(self):
        return self.status == SavedViewConfigStatus.CURRENT_DRAFT

    def publish(self):
        if not self.draft:
            raise ValueError(
                "Unable to publish a non-draft view configuration")
        self.__class__.objects.filter(
            shop=self.shop,
            theme_identifier=self.theme_identifier,
            view_name=self.view_name).update(
                status=SavedViewConfigStatus.OLD_VERSION)
        self.status = SavedViewConfigStatus.PUBLIC
        self.save()

    def revert(self):
        if not self.draft:
            raise ValueError("Unable to revert a non-draft view configuration")
        if self.pk:
            self.delete()

    def set_layout_data(self, layout_data_key, layout):
        if not layout:  # pragma: no cover
            self._data.setdefault("layouts", {}).pop(layout_data_key, None)
            return None
        if not self.draft:
            raise ValueError("Unable to save things in non-draft mode!")
        if hasattr(layout, "serialize"):
            layout = layout.serialize()
        assert isinstance(layout, dict)
        self._data.setdefault("layouts", {})[layout_data_key] = layout

    def get_layout_data(self, layout_data_key):
        return self._data.get("layouts", {}).get(layout_data_key)

    def clear_layout_data(self, placeholder_name):
        if not self.draft:
            raise ValueError("Unable to save things in non-draft mode!")
        self._data.setdefault("layouts", {}).pop(placeholder_name, None)
Example #4
0
class Basket(MoneyPropped, models.Model):
    # A combination of the PK and key is used to retrieve a basket for session situations.
    key = models.CharField(max_length=32, default=generate_key, verbose_name=_("key"), unique=True, db_index=True)

    shop = models.ForeignKey(on_delete=models.CASCADE, to="Shop", verbose_name=_("shop"))

    customer = models.ForeignKey(
        on_delete=models.CASCADE,
        to="Contact",
        blank=True,
        null=True,
        related_name="customer_core_baskets",
        verbose_name=_("customer"),
    )
    orderer = models.ForeignKey(
        on_delete=models.CASCADE,
        to="PersonContact",
        blank=True,
        null=True,
        related_name="orderer_core_baskets",
        verbose_name=_("orderer"),
    )
    creator = models.ForeignKey(
        on_delete=models.CASCADE,
        to=settings.AUTH_USER_MODEL,
        blank=True,
        null=True,
        related_name="core_baskets_created",
        verbose_name=_("creator"),
    )

    created_on = models.DateTimeField(auto_now_add=True, db_index=True, editable=False, verbose_name=_("created on"))
    updated_on = models.DateTimeField(auto_now=True, db_index=True, editable=False, verbose_name=_("updated on"))
    persistent = models.BooleanField(db_index=True, default=False, verbose_name=_("persistent"))
    deleted = models.BooleanField(db_index=True, default=False, verbose_name=_("deleted"))
    finished = models.BooleanField(db_index=True, default=False, verbose_name=_("finished"))
    title = models.CharField(max_length=64, blank=True, verbose_name=_("title"))
    data = TaggedJSONField(verbose_name=_("data"))

    # For statistics etc., as `data` is opaque:
    taxful_total_price = TaxfulPriceProperty("taxful_total_price_value", "currency")
    taxless_total_price = TaxlessPriceProperty("taxless_total_price_value", "currency")

    taxless_total_price_value = MoneyValueField(default=0, null=True, blank=True, verbose_name=_("taxless total price"))
    taxful_total_price_value = MoneyValueField(default=0, null=True, blank=True, verbose_name=_("taxful total price"))
    currency = CurrencyField(verbose_name=_("currency"))
    prices_include_tax = models.BooleanField(verbose_name=_("prices include tax"))

    product_count = models.IntegerField(default=0, verbose_name=_("product_count"))
    products = ManyToManyField("Product", blank=True, verbose_name=_("products"))

    class Meta:
        verbose_name = _("basket")
        verbose_name_plural = _("baskets")
Example #5
0
class StoredBasket(MoneyPropped, models.Model):
    # A combination of the PK and key is used to retrieve a basket for session situations.
    key = models.CharField(max_length=32, default=generate_key, verbose_name=_('key'))

    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, verbose_name=_('shop'))

    customer = models.ForeignKey(
        Contact, blank=True, null=True,
        on_delete=models.CASCADE,
        related_name="customer_baskets",
        verbose_name=_('customer')
    )
    orderer = models.ForeignKey(
        PersonContact, blank=True, null=True,
        on_delete=models.CASCADE,
        related_name="orderer_baskets",
        verbose_name=_('orderer')
    )
    creator = models.ForeignKey(
        settings.AUTH_USER_MODEL, blank=True, null=True,
        on_delete=models.CASCADE,
        related_name="baskets_created",
        verbose_name=_('creator')
    )

    created_on = models.DateTimeField(auto_now_add=True, db_index=True, editable=False, verbose_name=_('created on'))
    updated_on = models.DateTimeField(auto_now=True, db_index=True, editable=False, verbose_name=_('updated on'))
    persistent = models.BooleanField(db_index=True, default=False, verbose_name=_('persistent'))
    deleted = models.BooleanField(db_index=True, default=False, verbose_name=_('deleted'))
    finished = models.BooleanField(db_index=True, default=False, verbose_name=_('finished'))
    title = models.CharField(max_length=64, blank=True, verbose_name=_('title'))
    data = TaggedJSONField(verbose_name=_('data'))

    # For statistics etc., as `data` is opaque:
    taxful_total_price = TaxfulPriceProperty('taxful_total_price_value', 'currency')
    taxless_total_price = TaxlessPriceProperty('taxless_total_price_value', 'currency')

    taxless_total_price_value = MoneyValueField(default=0, null=True, blank=True, verbose_name=_('taxless total price'))
    taxful_total_price_value = MoneyValueField(default=0, null=True, blank=True, verbose_name=_('taxful total price'))
    currency = CurrencyField(verbose_name=_('currency'))
    prices_include_tax = models.BooleanField(verbose_name=_('prices include tax'))

    product_count = models.IntegerField(default=0, verbose_name=_('product_count'))
    products = ManyToManyField(Product, blank=True, verbose_name=_('products'))

    class Meta:
        app_label = "shuup_front"
        verbose_name = _('stored basket')
        verbose_name_plural = _('stored baskets')