mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-05-01 19:32:26 +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)
|
articles_nb = models.PositiveIntegerField(default=0)
|
||||||
price = models.DecimalField(max_digits=10, decimal_places=2, 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
|
def __str__(self): # pragma: no cover
|
||||||
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
|
||||||
|
|
||||||
|
|
||||||
class Item(models.Model):
|
class Item(models.Model):
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
grouped_order = models.ForeignKey(
|
grouped_order = models.ForeignKey(GroupedOrder, on_delete=models.CASCADE)
|
||||||
GroupedOrder, on_delete=models.CASCADE
|
|
||||||
) # à transformer en manytomany quand il y aura un catalogue
|
|
||||||
price = models.DecimalField(max_digits=10, decimal_places=2)
|
price = models.DecimalField(max_digits=10, decimal_places=2)
|
||||||
max_limit = models.PositiveSmallIntegerField(null=True, blank=True)
|
max_limit = models.PositiveSmallIntegerField(null=True, blank=True)
|
||||||
|
|
||||||
ordered_nb = models.IntegerField(default=0)
|
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):
|
def get_total_price(self):
|
||||||
"""Returns the price of all orders on this item"""
|
"""Returns the price of all orders on this item"""
|
||||||
return self.price * self.ordered_nb
|
return self.price * self.ordered_nb
|
||||||
|
|
|
@ -267,6 +267,7 @@ class TestGroupedOrderDetailView:
|
||||||
order = Order.objects.first()
|
order = Order.objects.first()
|
||||||
assert order.ordered_items.count() == 2
|
assert order.ordered_items.count() == 2
|
||||||
assert order.articles_nb == 5
|
assert order.articles_nb == 5
|
||||||
|
assert order.price == 9
|
||||||
|
|
||||||
def test_order_item__no_articles_ordered(self, client, other_user):
|
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:
|
if int(quantity) > 0:
|
||||||
item = grouped_order.item_set.get(pk=key.split("_")[1])
|
item = grouped_order.item_set.get(pk=key.split("_")[1])
|
||||||
OrderedItem.objects.create(nb=quantity, order=order, item=item)
|
OrderedItem.objects.create(nb=quantity, order=order, item=item)
|
||||||
compute_ordered_nb(item)
|
item.compute_ordered_nb()
|
||||||
compute_order_articles_nb(order)
|
order.compute_order_articles_nb()
|
||||||
if order.articles_nb == 0:
|
if order.articles_nb == 0:
|
||||||
# Redisplay the order form for this grouped order.
|
# Redisplay the order form for this grouped order.
|
||||||
return render(
|
return render(
|
||||||
|
@ -162,7 +162,7 @@ def order(request, grouped_order_id):
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
compute_order_price(order)
|
order.compute_order_price()
|
||||||
# Always return an HttpResponseRedirect after successfully dealing
|
# Always return an HttpResponseRedirect after successfully dealing
|
||||||
# with POST data. This prevents data from being posted twice if a
|
# with POST data. This prevents data from being posted twice if a
|
||||||
# user hits the Back button.
|
# 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):
|
class OrderDetailView(generic.DetailView):
|
||||||
"""Confirmation page after a user orders"""
|
"""Confirmation page after a user orders"""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue