From 22cf0d403eb7e53e7b02de72f6724b050d62cebe Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 21 Oct 2020 18:21:40 +0200 Subject: [PATCH 1/5] Permet d'archiver un tirage --- bda/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bda/models.py b/bda/models.py index 80790746..10468b07 100644 --- a/bda/models.py +++ b/bda/models.py @@ -31,6 +31,7 @@ class Tirage(models.Model): "Tirage à afficher dans le catalogue", default=False ) enable_do_tirage = models.BooleanField("Le tirage peut être lancé", default=False) + archived = models.BooleanField("Archivé", default=False) def __str__(self): return "%s - %s" % ( From 84dab59c724de1521e008c52c4a99cd5bacc13fa Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 21 Oct 2020 18:22:05 +0200 Subject: [PATCH 2/5] =?UTF-8?q?Ordre=20des=20participants=20+=20unicit?= =?UTF-8?q?=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bda/models.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bda/models.py b/bda/models.py index 10468b07..578f235c 100644 --- a/bda/models.py +++ b/bda/models.py @@ -198,7 +198,9 @@ class Participant(models.Model): attributions = models.ManyToManyField( Spectacle, through="Attribution", related_name="attributed_to" ) - tirage = models.ForeignKey(Tirage, on_delete=models.CASCADE) + tirage = models.ForeignKey( + Tirage, on_delete=models.CASCADE, limit_choices_to={"archived": False} + ) accepte_charte = models.BooleanField("A accepté la charte BdA", default=False) choicesrevente = models.ManyToManyField( Spectacle, related_name="subscribed", blank=True @@ -209,6 +211,12 @@ class Participant(models.Model): def __str__(self): return "%s - %s" % (self.user, self.tirage.title) + class Meta: + ordering = ("-tirage", "user__last_name", "user__first_name") + constraints = [ + models.UniqueConstraint(fields=("tirage", "user"), name="unique_tirage"), + ] + DOUBLE_CHOICES = ( ("1", "1 place"), From d535cf24a3bb455e4efc5fa022ba492d86b498b0 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 21 Oct 2020 18:22:19 +0200 Subject: [PATCH 3/5] Migration --- bda/migrations/0018_auto_20201021_1818.py | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 bda/migrations/0018_auto_20201021_1818.py diff --git a/bda/migrations/0018_auto_20201021_1818.py b/bda/migrations/0018_auto_20201021_1818.py new file mode 100644 index 00000000..88a56c39 --- /dev/null +++ b/bda/migrations/0018_auto_20201021_1818.py @@ -0,0 +1,38 @@ +# Generated by Django 2.2.12 on 2020-10-21 16:18 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bda", "0017_participant_accepte_charte"), + ] + + operations = [ + migrations.AlterModelOptions( + name="participant", + options={"ordering": ("-tirage", "user__last_name", "user__first_name")}, + ), + migrations.AddField( + model_name="tirage", + name="archived", + field=models.BooleanField(default=False, verbose_name="Archivé"), + ), + migrations.AlterField( + model_name="participant", + name="tirage", + field=models.ForeignKey( + limit_choices_to={"archived": False}, + on_delete=django.db.models.deletion.CASCADE, + to="bda.Tirage", + ), + ), + migrations.AddConstraint( + model_name="participant", + constraint=models.UniqueConstraint( + fields=("tirage", "user"), name="unique_tirage" + ), + ), + ] From 147b8514efb82d9191d6b20c15db5d91db6e7ac7 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 21 Oct 2020 18:22:48 +0200 Subject: [PATCH 4/5] =?UTF-8?q?Limite=20les=20select=20au=20tirage=20conce?= =?UTF-8?q?rn=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bda/admin.py | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/bda/admin.py b/bda/admin.py index 2aec82c9..4ba2763d 100644 --- a/bda/admin.py +++ b/bda/admin.py @@ -94,9 +94,12 @@ class WithoutListingAttributionInline(AttributionInline): class ParticipantAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["choicesrevente"].queryset = Spectacle.objects.select_related( - "location" - ) + queryset = Spectacle.objects.select_related("location") + + if self.instance.pk is not None: + queryset = queryset.filter(tirage=self.instance.tirage) + + self.fields["choicesrevente"].queryset = queryset class ParticipantPaidFilter(admin.SimpleListFilter): @@ -202,17 +205,6 @@ class ParticipantAdmin(ReadOnlyMixin, admin.ModelAdmin): class AttributionAdminForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if "spectacle" in self.fields: - self.fields["spectacle"].queryset = Spectacle.objects.select_related( - "location" - ) - if "participant" in self.fields: - self.fields["participant"].queryset = Participant.objects.select_related( - "user", "tirage" - ) - def clean(self): cleaned_data = super().clean() participant = cleaned_data.get("participant") @@ -225,6 +217,12 @@ class AttributionAdminForm(forms.ModelForm): ) return cleaned_data + class Meta: + widgets = { + "participant": ModelSelect2(url="bda-participant-autocomplete"), + "spectacle": ModelSelect2(url="bda-spectacle-autocomplete"), + } + class AttributionAdmin(ReadOnlyMixin, admin.ModelAdmin): @@ -284,15 +282,20 @@ class SalleAdmin(admin.ModelAdmin): class SpectacleReventeAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields["confirmed_entry"].queryset = Participant.objects.select_related( - "user", "tirage" - ) - self.fields["seller"].queryset = Participant.objects.select_related( - "user", "tirage" - ) - self.fields["soldTo"].queryset = Participant.objects.select_related( - "user", "tirage" - ) + confirmed_entry_qset = Participant.objects.select_related("user", "tirage") + seller_qset = Participant.objects.select_related("user", "tirage") + soldTo_qset = Participant.objects.select_related("user", "tirage") + + if self.instance.pk is not None: + confirmed_entry_qset = confirmed_entry_qset.filter( + tirage=self.instance.seller.tirage + ) + seller_qset = seller_qset.filter(tirage=self.instance.seller.tirage) + soldTo_qset = soldTo_qset.filter(tirage=self.instance.seller.tirage) + + self.fields["confirmed_entry"].queryset = confirmed_entry_qset + self.fields["seller"].queryset = seller_qset + self.fields["soldTo"].queryset = soldTo_qset class SpectacleReventeAdmin(admin.ModelAdmin): From f88795a60efb9f413df98926f735825c2edec6dd Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Thu, 22 Oct 2020 19:34:59 +0200 Subject: [PATCH 5/5] Use same qset for every field --- bda/admin.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/bda/admin.py b/bda/admin.py index 4ba2763d..55b0475f 100644 --- a/bda/admin.py +++ b/bda/admin.py @@ -282,20 +282,14 @@ class SalleAdmin(admin.ModelAdmin): class SpectacleReventeAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - confirmed_entry_qset = Participant.objects.select_related("user", "tirage") - seller_qset = Participant.objects.select_related("user", "tirage") - soldTo_qset = Participant.objects.select_related("user", "tirage") + qset = Participant.objects.select_related("user", "tirage") if self.instance.pk is not None: - confirmed_entry_qset = confirmed_entry_qset.filter( - tirage=self.instance.seller.tirage - ) - seller_qset = seller_qset.filter(tirage=self.instance.seller.tirage) - soldTo_qset = soldTo_qset.filter(tirage=self.instance.seller.tirage) + qset = qset.filter(tirage=self.instance.seller.tirage) - self.fields["confirmed_entry"].queryset = confirmed_entry_qset - self.fields["seller"].queryset = seller_qset - self.fields["soldTo"].queryset = soldTo_qset + self.fields["confirmed_entry"].queryset = qset + self.fields["seller"].queryset = qset + self.fields["soldTo"].queryset = qset class SpectacleReventeAdmin(admin.ModelAdmin):