mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 11:22:24 +02:00
move methods from views to models
This commit is contained in:
parent
53a7d04597
commit
9e76ef80d4
4 changed files with 57 additions and 33 deletions
|
@ -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",
|
||||
),
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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"""
|
||||
|
||||
|
|
Loading…
Reference in a new issue