move methods from views to models

This commit is contained in:
Laetitia Getti 2023-05-17 10:28:58 +02:00
parent 53a7d04597
commit 9e76ef80d4
4 changed files with 57 additions and 33 deletions

View file

@ -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",
),
),
]

View file

@ -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

View file

@ -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):
"""

View file

@ -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"""