web_AI-5/django/didgeridoo/webshop/models.py

161 lines
4.9 KiB
Python
Raw Normal View History

from decimal import Decimal
from django.core.validators import MinValueValidator
2017-11-12 21:35:59 +01:00
from django.db import models
2017-11-13 22:55:20 +01:00
from django.contrib.auth.models import User
from django.utils import timezone
2018-02-03 20:11:00 +01:00
from currencies.models import ExchangeRate
2017-11-18 09:18:06 +01:00
2017-11-13 22:55:20 +01:00
class Option(models.Model):
name = models.CharField(max_length=200, unique=True)
description = models.CharField(max_length=200, unique=True)
2017-11-13 22:55:20 +01:00
value = models.IntegerField(default=5)
enabled = models.BooleanField(default=False)
def __str__(self):
return self.name
2017-11-13 22:55:20 +01:00
class ArticleStatus(models.Model):
name = models.CharField(max_length=50, unique=True)
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
return self.name
2017-11-13 22:55:20 +01:00
class Category(models.Model):
name = models.CharField(max_length=200, unique=True)
parent_category = models.ForeignKey('self', null=True, blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Categories"
2017-11-13 22:55:20 +01:00
class Article(models.Model):
name = models.CharField(max_length=200)
category = models.ForeignKey(Category, null=True)
description = models.TextField(max_length=2000)
2017-11-13 22:55:20 +01:00
stock = models.FloatField(max_length=5)
2017-11-14 21:26:44 +01:00
status = models.ForeignKey(ArticleStatus)
price_in_chf = models.DecimalField(max_digits=19,
decimal_places=2,
validators=[MinValueValidator(
Decimal('0.00'))])
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
return self.name
class OrderStatus(models.Model):
""" Warehouse Items have Status like ordered or out of Stock """
2017-11-14 21:26:44 +01:00
name = models.CharField(max_length=200, unique=True)
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
return self.name
2017-11-13 22:55:20 +01:00
class OrderOfGoods(models.Model):
""" Warehouse operations """
2017-11-14 21:26:44 +01:00
article = models.ForeignKey(Article)
amount = models.FloatField(max_length=5)
2017-11-13 22:55:20 +01:00
delivery_date = models.DateField()
order_date = models.DateTimeField(auto_now_add=True)
2017-11-14 21:26:44 +01:00
order_status = models.ForeignKey(OrderStatus)
2017-11-13 22:55:20 +01:00
2017-11-26 21:24:17 +01:00
class Meta:
verbose_name_plural = "Order of Goods"
2017-11-13 22:55:20 +01:00
class Picture(models.Model):
""" Pictures in relationship to Articles """
name = models.CharField(max_length=200)
article = models.ForeignKey(Article)
image = models.ImageField(upload_to="images")
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
return self.name
2017-11-13 22:55:20 +01:00
class Order(models.Model):
""" Submitted Orders """
user = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.ForeignKey(OrderStatus)
date = models.DateTimeField(default=timezone.now)
exchange_rate = models.ForeignKey(ExchangeRate, null=True)
2018-02-26 19:56:45 +01:00
def __str__(self):
return str(self.id)
class OrderPosition(models.Model):
""" Items in Submitted Orders"""
article = models.ForeignKey(Article, on_delete=models.CASCADE)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
amount = models.FloatField(max_length=5)
price_in_chf = models.DecimalField(max_digits=19,
decimal_places=2,
validators=[MinValueValidator(
Decimal('0.00'))])
2018-02-27 22:01:39 +01:00
def calculate_position_price(self):
decimal_amount = Decimal.from_float(self.amount)
self.position_price = decimal_amount * self.article.price_in_chf
2017-11-13 22:55:20 +01:00
class ShoppingCart(models.Model):
""" Cart to User Relationships """
2018-02-04 18:32:54 +01:00
name = models.CharField(max_length=200, null=True)
2017-11-14 21:26:44 +01:00
user = models.ForeignKey(User, on_delete=models.CASCADE)
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
2018-02-18 21:58:46 +01:00
return str(self.id)
2017-11-13 22:55:20 +01:00
class CartPosition(models.Model):
""" Items in Cart """
article = models.ForeignKey(Article, on_delete=models.CASCADE)
amount = models.FloatField(max_length=5)
2018-02-04 18:58:21 +01:00
cart = models.ForeignKey(ShoppingCart, on_delete=models.CASCADE)
2018-02-11 21:56:53 +01:00
position_price = models.DecimalField(max_digits=19,
decimal_places=2,
validators=[MinValueValidator(
Decimal('0.00'))],
null=True)
def calculate_position_price(self):
decimal_amount = Decimal.from_float(self.amount)
self.position_price = decimal_amount * self.article.price_in_chf
2017-11-13 22:55:20 +01:00
class City(models.Model):
2017-11-18 09:18:06 +01:00
name = models.CharField(max_length=200)
zip_code = models.PositiveSmallIntegerField()
def __str__(self):
return '{} {}'.format(self.zip_code, self.name)
2017-11-13 22:55:20 +01:00
2017-11-26 21:24:17 +01:00
class Meta:
verbose_name_plural = "Cities"
2017-12-20 19:51:49 +01:00
ordering = ['zip_code']
2017-11-26 21:24:17 +01:00
2017-11-13 22:55:20 +01:00
2017-11-14 21:26:44 +01:00
class Salutation(models.Model):
2017-11-13 22:55:20 +01:00
name = models.CharField(max_length=20)
2017-11-19 22:22:40 +01:00
def __str__(self):
return self.name
2017-11-13 22:55:20 +01:00
class Person(models.Model):
2017-11-14 21:26:44 +01:00
salutation = models.ForeignKey(Salutation)
city = models.ForeignKey(City)
2017-11-13 22:55:20 +01:00
street_name = models.CharField(max_length=200)
street_number = models.CharField(max_length=4)
2017-11-14 21:26:44 +01:00
user = models.OneToOneField(User, on_delete=models.CASCADE)
2017-11-18 09:18:06 +01:00
2017-11-14 21:26:44 +01:00
def __str__(self):
return self.user.username