diff options
Diffstat (limited to 'restaurant_orders/core/models.py')
| -rw-r--r-- | restaurant_orders/core/models.py | 90 |
1 files changed, 90 insertions, 0 deletions
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 @@ | |||
| 1 | from django.db import models | ||
| 2 | from django.contrib.auth.models import User | ||
| 3 | from django.shortcuts import Http404, get_object_or_404 | ||
| 4 | |||
| 5 | from datetime import datetime | ||
| 6 | |||
| 7 | |||
| 8 | class Restaurant(models.Model): | ||
| 9 | name = models.CharField(max_length=50) | ||
| 10 | users = models.ManyToManyField(User) | ||
| 11 | |||
| 12 | wordpress_url = models.URLField(max_length=50, unique=True) | ||
| 13 | woocommerce_consumer_key = models.CharField(max_length=50) | ||
| 14 | woocommerce_consumer_secret = models.CharField(max_length=50) | ||
| 15 | woocommerce_webhook_secret = models.CharField(max_length=50) | ||
| 16 | |||
| 17 | @classmethod | ||
| 18 | def get_user_restaurants(cls, user: User): | ||
| 19 | return cls.objects.filter(users=user) | ||
| 20 | |||
| 21 | @classmethod | ||
| 22 | def get_user_restaurant_or_404(cls, pk, user: User): | ||
| 23 | return get_object_or_404(cls, pk=pk, users=user) | ||
| 24 | |||
| 25 | def __str__(self): | ||
| 26 | return self.name | ||
| 27 | |||
| 28 | |||
| 29 | class Order(models.Model): | ||
| 30 | WP_STATES = ( | ||
| 31 | ('pending', 'Oczekujace'), | ||
| 32 | ('processing', 'Przetwarzane'), | ||
| 33 | ('on-hold', 'Wstrzymane'), | ||
| 34 | ('completed', 'Zakonczone'), | ||
| 35 | ('cancelled', 'Anulowane'), | ||
| 36 | ('refunded', 'Zwrocone'), | ||
| 37 | ('failed', 'Nie powiodlo sie'), | ||
| 38 | ('trash', 'Usuniete') | ||
| 39 | ) | ||
| 40 | |||
| 41 | wp_id = models.IntegerField(editable=False) | ||
| 42 | wp_status = models.CharField(max_length=30, choices=WP_STATES) | ||
| 43 | wp_order_key = models.CharField(max_length=50, editable=False) | ||
| 44 | date_created = models.DateField(editable=False) | ||
| 45 | date_modified = models.DateField() | ||
| 46 | line_items = models.JSONField() | ||
| 47 | billing = models.JSONField() | ||
| 48 | restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) | ||
| 49 | can_display = models.BooleanField(default=True) | ||
| 50 | |||
| 51 | @classmethod | ||
| 52 | def update_or_create_from_response(cls, response, restaurant_model): | ||
| 53 | try: | ||
| 54 | obj = cls.objects.update_or_create( | ||
| 55 | wp_id=response['id'], | ||
| 56 | wp_order_key=response['order_key'], | ||
| 57 | restaurant=restaurant_model, | ||
| 58 | defaults={ | ||
| 59 | 'wp_status': response['status'], | ||
| 60 | 'date_created': datetime.strptime(response['date_created'], '%Y-%m-%dT%H:%M:%S'), | ||
| 61 | 'date_modified': datetime.strptime(response['date_modified'], '%Y-%m-%dT%H:%M:%S'), | ||
| 62 | 'line_items': response['line_items'], | ||
| 63 | 'billing': response['billing'], | ||
| 64 | } | ||
| 65 | ) | ||
| 66 | return obj | ||
| 67 | except KeyError: | ||
| 68 | return None | ||
| 69 | |||
| 70 | |||
| 71 | @classmethod | ||
| 72 | def create_from_response_disable_view(cls, response, restaurant_model): | ||
| 73 | obj, _ = cls.update_or_create_from_response(response, restaurant_model) | ||
| 74 | obj.can_display = False | ||
| 75 | obj.save() | ||
| 76 | return obj | ||
| 77 | |||
| 78 | @classmethod | ||
| 79 | def get_order(cls, pk, user: User): | ||
| 80 | try: | ||
| 81 | return cls.objects.get( | ||
| 82 | pk=pk, | ||
| 83 | can_display=True, | ||
| 84 | restaurant__users=user | ||
| 85 | ) | ||
| 86 | except cls.DoesNotExist: | ||
| 87 | raise Http404 | ||
| 88 | |||
| 89 | def __str__(self): | ||
| 90 | return f'{self.wp_order_key} - {self.date_created}' | ||
