From c21f4b3dacd597a15a5ec39d525df1dfe1b70376 Mon Sep 17 00:00:00 2001 From: jdlugosz963 Date: Mon, 17 Jul 2023 01:47:57 +0200 Subject: Add project. --- restaurant_orders/core/models.py | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 restaurant_orders/core/models.py (limited to 'restaurant_orders/core/models.py') diff --git a/restaurant_orders/core/models.py b/restaurant_orders/core/models.py new file mode 100644 index 0000000..91147d2 --- /dev/null +++ b/restaurant_orders/core/models.py @@ -0,0 +1,90 @@ +from django.db import models +from django.contrib.auth.models import User +from django.shortcuts import Http404, get_object_or_404 + +from datetime import datetime + + +class Restaurant(models.Model): + name = models.CharField(max_length=50) + users = models.ManyToManyField(User) + + wordpress_url = models.URLField(max_length=50, unique=True) + woocommerce_consumer_key = models.CharField(max_length=50) + woocommerce_consumer_secret = models.CharField(max_length=50) + woocommerce_webhook_secret = models.CharField(max_length=50) + + @classmethod + def get_user_restaurants(cls, user: User): + return cls.objects.filter(users=user) + + @classmethod + def get_user_restaurant_or_404(cls, pk, user: User): + return get_object_or_404(cls, pk=pk, users=user) + + def __str__(self): + return self.name + + +class Order(models.Model): + WP_STATES = ( + ('pending', 'Oczekujace'), + ('processing', 'Przetwarzane'), + ('on-hold', 'Wstrzymane'), + ('completed', 'Zakonczone'), + ('cancelled', 'Anulowane'), + ('refunded', 'Zwrocone'), + ('failed', 'Nie powiodlo sie'), + ('trash', 'Usuniete') + ) + + wp_id = models.IntegerField(editable=False) + wp_status = models.CharField(max_length=30, choices=WP_STATES) + wp_order_key = models.CharField(max_length=50, editable=False) + date_created = models.DateField(editable=False) + date_modified = models.DateField() + line_items = models.JSONField() + billing = models.JSONField() + restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) + can_display = models.BooleanField(default=True) + + @classmethod + def update_or_create_from_response(cls, response, restaurant_model): + try: + obj = cls.objects.update_or_create( + wp_id=response['id'], + wp_order_key=response['order_key'], + restaurant=restaurant_model, + defaults={ + 'wp_status': response['status'], + 'date_created': datetime.strptime(response['date_created'], '%Y-%m-%dT%H:%M:%S'), + 'date_modified': datetime.strptime(response['date_modified'], '%Y-%m-%dT%H:%M:%S'), + 'line_items': response['line_items'], + 'billing': response['billing'], + } + ) + return obj + except KeyError: + return None + + + @classmethod + def create_from_response_disable_view(cls, response, restaurant_model): + obj, _ = cls.update_or_create_from_response(response, restaurant_model) + obj.can_display = False + obj.save() + return obj + + @classmethod + def get_order(cls, pk, user: User): + try: + return cls.objects.get( + pk=pk, + can_display=True, + restaurant__users=user + ) + except cls.DoesNotExist: + raise Http404 + + def __str__(self): + return f'{self.wp_order_key} - {self.date_created}' -- cgit v1.2.3