From ce46b324c787b7dae597c3bc1a05b56dd22e50cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 19 Jul 2022 11:55:39 +0200 Subject: [PATCH] pricing: add label & slug on AgendaPricingModel (#67196) --- lingo/pricing/forms.py | 22 ++++++++- .../0007_agenda_pricing_slug_and_label.py | 21 ++++++++ .../0008_agenda_pricing_slug_and_label.py | 24 ++++++++++ lingo/pricing/models.py | 23 ++++++--- .../manager_agenda_pricing_detail.html | 15 +++++- .../pricing/manager_agenda_pricing_list.html | 7 ++- .../lingo/pricing/manager_pricing_list.html | 5 +- lingo/pricing/views.py | 3 +- tests/pricing/manager/test_agenda_pricing.py | 17 ++++++- tests/pricing/test_import_export.py | 3 ++ tests/pricing/test_models.py | 48 +++++++++++++++++++ 11 files changed, 173 insertions(+), 15 deletions(-) create mode 100644 lingo/pricing/migrations/0007_agenda_pricing_slug_and_label.py create mode 100644 lingo/pricing/migrations/0008_agenda_pricing_slug_and_label.py diff --git a/lingo/pricing/forms.py b/lingo/pricing/forms.py index 1583cdb..a712026 100644 --- a/lingo/pricing/forms.py +++ b/lingo/pricing/forms.py @@ -119,10 +119,10 @@ class PricingCriteriaCategoryEditForm(forms.Form): self.initial['criterias'] = self.pricing.criterias.filter(category=self.category) -class AgendaPricingForm(forms.ModelForm): +class NewAgendaPricingForm(forms.ModelForm): class Meta: model = AgendaPricing - fields = ['pricing', 'date_start', 'date_end'] + fields = ['label', 'pricing', 'date_start', 'date_end'] widgets = { 'date_start': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'), 'date_end': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'), @@ -146,6 +146,24 @@ class AgendaPricingForm(forms.ModelForm): return cleaned_data +class AgendaPricingForm(NewAgendaPricingForm): + class Meta: + model = AgendaPricing + fields = ['label', 'slug', 'pricing', 'date_start', 'date_end'] + widgets = { + 'date_start': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'), + 'date_end': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'), + } + + def clean_slug(self): + slug = self.cleaned_data['slug'] + + if AgendaPricing.objects.filter(slug=slug).exclude(pk=self.instance.pk).exists(): + raise ValidationError(_('Another pricing exists with the same identifier.')) + + return slug + + class PricingMatrixForm(forms.Form): def __init__(self, *args, **kwargs): matrix = kwargs.pop('matrix') diff --git a/lingo/pricing/migrations/0007_agenda_pricing_slug_and_label.py b/lingo/pricing/migrations/0007_agenda_pricing_slug_and_label.py new file mode 100644 index 0000000..5466d2a --- /dev/null +++ b/lingo/pricing/migrations/0007_agenda_pricing_slug_and_label.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pricing', '0006_agenda_pricing_m2m'), + ] + + operations = [ + migrations.AddField( + model_name='agendapricing', + name='label', + field=models.CharField(max_length=150, null=True, verbose_name='Label'), + ), + migrations.AddField( + model_name='agendapricing', + name='slug', + field=models.SlugField(max_length=160, null=True, verbose_name='Identifier'), + ), + ] diff --git a/lingo/pricing/migrations/0008_agenda_pricing_slug_and_label.py b/lingo/pricing/migrations/0008_agenda_pricing_slug_and_label.py new file mode 100644 index 0000000..bf4f3bd --- /dev/null +++ b/lingo/pricing/migrations/0008_agenda_pricing_slug_and_label.py @@ -0,0 +1,24 @@ +from django.db import migrations +from django.utils.text import slugify + +from lingo.utils.misc import generate_slug + + +def forwards(apps, schema_editor): + AgendaPricing = apps.get_model('pricing', 'AgendaPricing') + for agenda_pricing in AgendaPricing.objects.all(): + agenda_pricing.label = agenda_pricing.pricing.label + agenda_pricing.base_slug = slugify(agenda_pricing.label) + agenda_pricing.slug = generate_slug(agenda_pricing) + agenda_pricing.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('pricing', '0007_agenda_pricing_slug_and_label'), + ] + + operations = [ + migrations.RunPython(forwards, reverse_code=migrations.RunPython.noop), + ] diff --git a/lingo/pricing/models.py b/lingo/pricing/models.py index c8cc693..95dd5aa 100644 --- a/lingo/pricing/models.py +++ b/lingo/pricing/models.py @@ -336,6 +336,8 @@ class PricingMatrix: class AgendaPricing(models.Model): + label = models.CharField(_('Label'), max_length=150, null=True) + slug = models.SlugField(_('Identifier'), max_length=160, null=True) agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE, null=True, related_name='old_agendapricings') agendas = models.ManyToManyField(Agenda, related_name='agendapricings') pricing = models.ForeignKey(Pricing, on_delete=models.CASCADE) @@ -343,8 +345,22 @@ class AgendaPricing(models.Model): date_end = models.DateField() pricing_data = JSONField(null=True) + def __str__(self): + return self.label or self.pricing.label + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = generate_slug(self) + super().save(*args, **kwargs) + + @property + def base_slug(self): + return slugify(self.label or self.pricing.label) + def export_json(self): return { + 'label': self.label, + 'slug': self.slug, 'pricing': self.pricing.slug, 'date_start': self.date_start.strftime('%Y-%m-%d'), 'date_end': self.date_end.strftime('%Y-%m-%d'), @@ -368,12 +384,7 @@ class AgendaPricing(models.Model): except Pricing.DoesNotExist: raise AgendaImportError(_('Missing "%s" pricing model') % data['pricing']) - agenda_pricing, created = cls.objects.update_or_create( - pricing=data['pricing'], - date_start=data['date_start'], - date_end=data['date_end'], - defaults=data, - ) + agenda_pricing, created = cls.objects.update_or_create(slug=data['slug'], defaults=data) if overwrite and not created: agenda_pricing.agendas.clear() agenda_pricing.agendas.add(*agendas) diff --git a/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_detail.html b/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_detail.html index bcc24c2..908d499 100644 --- a/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_detail.html +++ b/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_detail.html @@ -3,12 +3,13 @@ {% block breadcrumb %} {{ block.super }} -{{ object.pricing }} +{{ object }} {% endblock %} {% block appbar %}

- {{ object.pricing }} ({{ object.date_start|date:'d/m/Y' }} - {{ object.date_end|date:'d/m/Y' }}) + {{ object }} + [{% trans "identifier:" %} {{ object.slug }}]

@@ -20,6 +21,16 @@ {% endblock %} {% block content %} +
+

{% trans "Options" %}

+
+
    +
  • {% trans "Pricing model:" %} {{ object.pricing }}
  • +
  • {% blocktrans with start=object.date_start|date:'d/m/Y' end=object.date_end|date:'d/m/Y' %}From {{ start }} to {{ end }}{% endblocktrans %}
  • +
+
+
+

{% trans "Test tool" %}

diff --git a/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_list.html b/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_list.html index 3261f82..6ec6937 100644 --- a/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_list.html +++ b/lingo/pricing/templates/lingo/pricing/manager_agenda_pricing_list.html @@ -22,7 +22,12 @@