-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
141 lines (117 loc) · 4.87 KB
/
models.py
File metadata and controls
141 lines (117 loc) · 4.87 KB
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from django.contrib import admin
from django.conf import settings
from django.core.validators import MinValueValidator
from django.db import models
from uuid import uuid4
# Create your models here.
class Promotion(models.Model):
description = models.CharField(max_length=255)
discount = models.FloatField()
class Collection(models.Model):
title = models.CharField(max_length=255)
featured_product = models.ForeignKey(
'Product', on_delete=models.SET_NULL, null=True, related_name='+')
# Return a string representation of the object in Site Admin
def __str__(self):
return self.title
# Sort Collection objects by title in ascending order
class Meta:
ordering = ['title']
class Product(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField()
description = models.TextField(null=True, blank=True)
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
inventory = models.IntegerField()
last_update = models.DateTimeField(auto_now=True)
collection = models.ForeignKey(Collection, on_delete=models.PROTECT, related_name='products')
promotions = models.ManyToManyField(Promotion, blank=True)
def __str__(self):
return self.title
class Meta:
ordering = ['title']
class Customer(models.Model):
MEMBERSHIP_BRONZE = 'B'
MEMBERSHIP_SILVER = 'S'
MEMBERSHIP_GOLD = 'G'
MEMBERSHIP_CHOICES = [
(MEMBERSHIP_BRONZE, 'Bronze'),
(MEMBERSHIP_SILVER, 'Silver'),
(MEMBERSHIP_GOLD, 'Gold'),
]
# first_name = models.CharField(max_length=255)
# last_name = models.CharField(max_length=255)
# email = models.EmailField(unique=True)
phone = models.CharField(max_length=20)
birth_date = models.DateField(null=True)
membership = models.CharField(
max_length=1, choices=MEMBERSHIP_CHOICES, default=MEMBERSHIP_BRONZE)
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
def __str__(self):
# return self.first_name
# return f'{self.first_name} {self.last_name}'
return f'{self.user.first_name} {self.user.last_name}'
@admin.display(ordering='user__first_name')
def first_name(self):
return self.user.first_name
@admin.display(ordering='user__last_name')
def last_name(self):
return self.user.last_name
class Meta:
# ordering = ['first_name']
ordering = ['user__first_name', 'user__last_name']
# ordering = ['first_name', 'last_name']
# class Meta:
# db_table = 'store_customers'
# indexes = [
# models.Index(fields=['last_name', 'first_name'])
# ]
# unique_together = ['first_name', 'last_name']
class Order(models.Model):
PAYMENT_PENDING = 'P'
PAYMENT_COMPLETE = 'C'
PAYMENT_FAILED = 'F'
PAYMENT_STATUS_CHOICES = [
(PAYMENT_PENDING, 'Pending'),
(PAYMENT_COMPLETE, 'Complete'),
(PAYMENT_FAILED, 'Failed'),
]
payment_status = models.CharField(
max_length=1,choices=PAYMENT_STATUS_CHOICES, default=PAYMENT_PENDING)
placed_at = models.DateTimeField(auto_now_add=True)
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
# def __str__(self):
# return self.first_name
class Meta:
permissions = [
('cancel_order', 'Can cancel order')
]
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.PROTECT, related_name='items')
product = models.ForeignKey(Product, on_delete=models.PROTECT, related_name='orderitems')
quantity = models.PositiveSmallIntegerField()
unit_price = models.DecimalField(max_digits=6, decimal_places=2)
class Address(models.Model):
street = models.CharField(max_length=255)
city = models.CharField(max_length=255)
# OneToOneField is used to create a one-to-one relationship between two models.
# customer = models.OneToOneField(Customer, on_delete=models.CASCADE, primary_key=True)
# ForeignKey is used to create a one-to-many relationship between two models.
customer = models.ForeignKey(
Customer, on_delete=models.CASCADE)
class Cart(models.Model):
id = models.UUIDField(primary_key=True, default=uuid4)
created_at = models.DateTimeField(auto_now_add=True)
class CartItem(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveSmallIntegerField(
validators=[MinValueValidator(1)]
)
class Meta:
unique_together = [['cart', 'product']]
class Review(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='reviews')
name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
date = models.DateField(auto_now_add=True)