From 9e76ef80d4fed3091b1d9c737a8dd1d62e070ba8 Mon Sep 17 00:00:00 2001 From: Laetitia Getti Date: Wed, 17 May 2023 10:28:58 +0200 Subject: [PATCH] move methods from views to models --- ...derauthor_email_alter_orderauthor_phone.py | 28 ++++++++++++++++ la_chariotte/order/models.py | 28 ++++++++++++++-- la_chariotte/order/tests/test_views.py | 1 + la_chariotte/order/views.py | 33 ++----------------- 4 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 la_chariotte/order/migrations/0021_alter_orderauthor_email_alter_orderauthor_phone.py diff --git a/la_chariotte/order/migrations/0021_alter_orderauthor_email_alter_orderauthor_phone.py b/la_chariotte/order/migrations/0021_alter_orderauthor_email_alter_orderauthor_phone.py new file mode 100644 index 0000000..1e836a9 --- /dev/null +++ b/la_chariotte/order/migrations/0021_alter_orderauthor_email_alter_orderauthor_phone.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2 on 2023-05-17 08:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("order", "0020_groupedorder_total_price_alter_orderauthor_email"), + ] + + operations = [ + migrations.AlterField( + model_name="orderauthor", + name="email", + field=models.CharField( + help_text="Pour que l'organisateur·ice vous contacte en cas de besoin", + verbose_name="Adresse mail", + ), + ), + migrations.AlterField( + model_name="orderauthor", + name="phone", + field=models.CharField( + help_text="Pour que l'organisateur·ice vous contacte en cas de besoin", + verbose_name="Numéro de téléphone", + ), + ), + ] diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index 0dc5310..31748a3 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -90,20 +90,42 @@ class Order(models.Model): articles_nb = models.PositiveIntegerField(default=0) price = models.DecimalField(max_digits=10, decimal_places=2, default=0) + def compute_order_articles_nb(self): + """Computes the number of articles in this order""" + articles_nb = 0 + for ord_item in self.ordered_items.all(): + articles_nb += ord_item.nb + self.articles_nb = articles_nb + self.save() + + def compute_order_price(self): + """Computes the total price of the order""" + price = 0 + for ord_item in self.ordered_items.all(): + price += ord_item.get_price() + self.price = price + self.save() + def __str__(self): # pragma: no cover return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" class Item(models.Model): name = models.CharField(max_length=100) - grouped_order = models.ForeignKey( - GroupedOrder, on_delete=models.CASCADE - ) # à transformer en manytomany quand il y aura un catalogue + grouped_order = models.ForeignKey(GroupedOrder, on_delete=models.CASCADE) price = models.DecimalField(max_digits=10, decimal_places=2) max_limit = models.PositiveSmallIntegerField(null=True, blank=True) ordered_nb = models.IntegerField(default=0) + def compute_ordered_nb(self): + """Computes the number of ordered articles for this item (in this grouped order)""" + ordered_nb = 0 + for order in self.orders.all(): + ordered_nb += order.nb + self.ordered_nb = ordered_nb + self.save() + def get_total_price(self): """Returns the price of all orders on this item""" return self.price * self.ordered_nb diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index c341071..7a5a5ce 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -267,6 +267,7 @@ class TestGroupedOrderDetailView: order = Order.objects.first() assert order.ordered_items.count() == 2 assert order.articles_nb == 5 + assert order.price == 9 def test_order_item__no_articles_ordered(self, client, other_user): """ diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index fd8dde8..cfda76b 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -149,8 +149,8 @@ def order(request, grouped_order_id): if int(quantity) > 0: item = grouped_order.item_set.get(pk=key.split("_")[1]) OrderedItem.objects.create(nb=quantity, order=order, item=item) - compute_ordered_nb(item) - compute_order_articles_nb(order) + item.compute_ordered_nb() + order.compute_order_articles_nb() if order.articles_nb == 0: # Redisplay the order form for this grouped order. return render( @@ -162,7 +162,7 @@ def order(request, grouped_order_id): }, ) else: - compute_order_price(order) + order.compute_order_price() # Always return an HttpResponseRedirect after successfully dealing # with POST data. This prevents data from being posted twice if a # user hits the Back button. @@ -171,33 +171,6 @@ def order(request, grouped_order_id): ) -def compute_ordered_nb(item): - """Computes the number of ordered articles for this item in this grouped order""" - ordered_nb = 0 - for order in item.orders.all(): - ordered_nb += order.nb - item.ordered_nb = ordered_nb - item.save() - - -def compute_order_articles_nb(order): - """Computes the number of articles in a given order""" - articles_nb = 0 - for ord_item in order.ordered_items.all(): - articles_nb += ord_item.nb - order.articles_nb = articles_nb - order.save() - - -def compute_order_price(order): - """Computes the total price of the order""" - price = 0 - for ord_item in order.ordered_items.all(): - price += ord_item.get_price() - order.price = price - order.save() - - class OrderDetailView(generic.DetailView): """Confirmation page after a user orders"""