generated from Code-Institute-Org/gitpod-full-template
-
Notifications
You must be signed in to change notification settings - Fork 4
/
01-checkout-models.txt
121 lines (104 loc) · 4.52 KB
/
01-checkout-models.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Check results
=============
Code
=============
'''Models for checkout app'''
# pylint: disable=no-member
import uuid
from django.db import models
from django.db.models import Sum
from django.conf import settings
from trees.models import Tree
from profiles.models import UserProfile
class Order(models.Model):
"""
order model
"""
order_number = models.CharField(max_length=32, null=False, editable=False)
user_profile = models.ForeignKey(
UserProfile, on_delete=models.SET_NULL,
null=True, blank=True, related_name='orders')
full_name = models.CharField(max_length=50, null=False, blank=False)
email = models.EmailField(max_length=254, null=False, blank=False)
phone_number = models.CharField(max_length=20, null=False, blank=False)
# set to GB
country = models.CharField(default='GB', max_length=2,
null=False, blank=False)
postcode = models.CharField(max_length=20, null=True, blank=True)
town_or_city = models.CharField(max_length=40, null=False, blank=False)
street_address1 = models.CharField(max_length=80, null=False, blank=False)
street_address2 = models.CharField(max_length=80, null=True, blank=True)
county = models.CharField(max_length=80, null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
delivery_cost = models.DecimalField(max_digits=6, decimal_places=2,
null=False, default=0)
order_total = models.DecimalField(max_digits=10, decimal_places=2,
null=False, default=0)
grand_total = models.DecimalField(max_digits=10, decimal_places=2,
null=False, default=0)
# in case if customer makes the same purchase twice
original_trolley = models.TextField(null=False, blank=False, default='')
stripe_pid = models.CharField(max_length=254,
null=False, blank=False, default='')
def _generate_order_number(self):
"""
Generate a random, unique order number using UUID
_ before name means it is private method
to be used only inside this class
"""
return uuid.uuid4().hex.upper()
def update_total(self):
"""
Update grand total each time a line item is added,
accounting for delivery costs.
"""
# or 0 is to prevent setting order_total to none if we manually
# delete all orders from the database
self.order_total = self.lineitems.aggregate(
Sum('lineitem_total'))['lineitem_total__sum'] or 0
if self.order_total < settings.FREE_DELIVERY_THRESHOLD:
self.delivery_cost = self.order_total * (
settings.STANDARD_DELIVERY_PERCENTAGE / 100)
else:
self.delivery_cost = 0
self.grand_total = self.order_total + self.delivery_cost
self.save()
def save(self, *args, **kwargs):
"""
Override the original save method to set the order number
if it hasn't been set already.
"""
if not self.order_number:
self.order_number = self._generate_order_number()
super().save(*args, **kwargs)
def __str__(self):
return self.order_number
class OrderLineItem(models.Model):
"""
individual shopping bag item, relating to specific order from the
order model total cost for this specific item the function will
iterate through order and get each item as a seperate line item
this one will update delivery cost, order total and grand total
"""
order = models.ForeignKey(
Order, null=False, blank=False,
on_delete=models.CASCADE,
related_name="lineitems",
)
tree = models.ForeignKey(
Tree, null=False, blank=False,
on_delete=models.CASCADE
)
quantity = models.IntegerField(null=False, blank=False, default=0)
lineitem_total = models.DecimalField(
max_digits=6, decimal_places=2, null=False, blank=False, editable=False
)
def save(self, *args, **kwargs):
"""
Override the original save method to set the lineitem total
and update the order total.
"""
self.lineitem_total = self.tree.price * self.quantity
super().save(*args, **kwargs)
def __str__(self):
return f'Slug {self.tree.slug} on order {self.order.order_number}'