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
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
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)
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")
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')