From d04b855cce34b46445b16bc96b1a987419aa164a Mon Sep 17 00:00:00 2001 From: Mira Weller Date: Fri, 21 Jun 2024 18:03:01 +0200 Subject: [PATCH] category_type refactoring --- src/pretix/base/models/items.py | 20 ++++++++++++++----- src/pretix/control/forms/item.py | 11 ++-------- .../pretixcontrol/items/categories.html | 6 +----- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index aa4f6f9c2e..ef55f50e5c 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -220,21 +220,31 @@ class ItemCategory(LoggedModel): def __str__(self): name = self.internal_name or self.name - if self.is_addon: - return _('{category} (Add-On products)').format(category=str(name)) - if self.cross_selling_mode is not None: - return _('{category} ({category_type})').format(category=str(name), category_type=self.get_cross_selling_mode_display()) + category_type = self.get_category_type_display() + if category_type: + return _('{category} ({category_type})').format(category=str(name), category_type=category_type) return str(name) def get_category_type_display(self): if self.is_addon: return _('Add-On products') + elif self.cross_selling_mode: + return self.get_cross_selling_mode_display() else: return None @property def category_type(self): - return 'addon' if self.is_addon else 'normal' + return 'addon' if self.is_addon else self.cross_selling_mode or 'normal' + + @category_type.setter + def category_type(self, new_value): + if new_value == 'addon': + self.is_addon = True + self.cross_selling_mode = None + else: + self.is_addon = False + self.cross_selling_mode = None if new_value == 'normal' else new_value def delete(self, *args, **kwargs): super().delete(*args, **kwargs) diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 956d10a30e..75634e3240 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -106,7 +106,7 @@ class CategoryForm(I18nModelForm): _('Combined category'), _('Products in this category are regular products displayed on the front page, ' 'but are additionally shown in the cross-selling step, according to the configuration below.'))),), )) - self.fields['category_type'].initial = 'addon' if self.instance.is_addon else (self.instance.cross_selling_mode or 'normal') + self.fields['category_type'].initial = self.instance.category_type self.fields['cross_selling_condition'].widget.attrs['data-display-dependency'] = '#id_category_type_2,#id_category_type_3' self.fields['cross_selling_condition'].widget.attrs['data-disable-dependent'] = 'true' @@ -131,14 +131,7 @@ class CategoryForm(I18nModelForm): if d.get('category_type') == 'only' or d.get('category_type') == 'both': if not d.get('cross_selling_condition'): raise ValidationError({'cross_selling_condition': [_('This field is required')]}) - self.instance.cross_selling_mode = d.get('category_type') - else: - self.instance.cross_selling_mode = None - if d.get('category_type') == 'only' or d.get('category_type') == 'both' or d.get('category_type') == 'normal': - self.instance.is_addon = False - elif d.get('category_type') == 'addon': - self.instance.is_addon = True - d['category_type'] = 'normal' + self.instance.category_type = d.get('category_type') return d diff --git a/src/pretix/control/templates/pretixcontrol/items/categories.html b/src/pretix/control/templates/pretixcontrol/items/categories.html index 0078a2832e..dc0035d6b7 100644 --- a/src/pretix/control/templates/pretixcontrol/items/categories.html +++ b/src/pretix/control/templates/pretixcontrol/items/categories.html @@ -42,11 +42,7 @@ {{ c.internal_name|default:c.name }} - {% if c.is_addon %}{% trans "Add-on product category" %} - {% elif c.cross_selling_mode is None %}{% trans "Normal category" %} - {% elif c.cross_selling_mode == 'both' %}{% trans "Combined category" %} - {% elif c.cross_selling_mode == 'only' %}{% trans "Cross-selling category" %} - {% endif %} + {{ c.get_category_type_display }}