diff --git a/src/core/migrations/0027_order_subscription.py b/src/core/migrations/0027_order_subscription.py new file mode 100644 index 0000000..0eab2a9 --- /dev/null +++ b/src/core/migrations/0027_order_subscription.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.2 on 2022-12-30 16:04 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0026_orderline_product'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='subscription', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='orders', to='core.subscription'), + ), + ] diff --git a/src/core/models.py b/src/core/models.py index 19504f5..92e8da8 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -382,6 +382,13 @@ class Order(models.Model): blank=True, null=True ) + subscription = models.ForeignKey( + 'Subscription', + related_name='orders', + editable=False, + null=True, + on_delete=models.SET_NULL + ) created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True) @@ -548,13 +555,59 @@ class Subscription(models.Model): created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True) + def convert_int_to_decimal(self, price): + return Decimal(str(price)[:-2] + '.' + str(price)[-2:]) + + def format_product(self, data): + return { + 'product': Product.objects.get(pk=data['pk']), + 'quantity': data['quantity'] + } + + def deserialize_subscription(self, data): + subscription = {} + + for x in data: + if 'products_and_quantities' in x['metadata']: + subscription['unit_price'] = self.convert_int_to_decimal(x['price']['unit_amount']) + + if 'Shipping' in x['description']: + subscription['shipping_cost'] = self.convert_int_to_decimal(x['amount']) + + return subscription + def create_order(self, data_object): - pass + subscription = self.deserialize_subscription(data_object['lines']['data']) + subscription['items'] = map(self.format_product, self.metadata['products_and_quantities']) + subscription['customer_note'] = f"Grind: {self.metadata['grind']}" + + order = Order.objects.create( + customer=self.customer, + status=OrderStatus.UNFULFILLED, + shipping_address=self.shipping_address, + subtotal_amount=self.convert_int_to_decimal(data_object['subtotal']), + shipping_total=subscription['shipping_cost'], + total_amount=self.convert_int_to_decimal(data_object['total']), + weight=self.total_weight, + subscription=self + ) + + bulk_lines = [OrderLine( + order=order, + product=item['product'], + quantity=item['quantity'], + customer_note=subscription['customer_note'], + unit_price=subscription['unit_price'] + ) for item in subscription['items']] + OrderLine.objects.bulk_create(bulk_lines) def format_metadata(self): metadata = {} for key, value in self.metadata.items(): - metadata[key] = json.dumps(value) + if 'products_and_quantities' in key: + metadata[key] = json.dumps(value) + else: + metadata[key] = value metadata['subscription_pk'] = self.pk return metadata diff --git a/src/core/subscription_utils.py b/src/core/subscription_utils.py index c38a9cc..9b05fb1 100644 --- a/src/core/subscription_utils.py +++ b/src/core/subscription_utils.py @@ -28,38 +28,28 @@ def format_product(data, unit_price): } -def find_products(data): - for x in data: - if 'products_and_quantities' in x['metadata']: - return map(format_product, x['metadata']['products_and_quantities']) - break - else: - continue - - -shipping_cost = None -unit_price = None -items = None -customer_note = '' - - def deserialize_subscription(data): + sub_data = {} + for x in data: if 'products_and_quantities' in x['metadata']: - customer_note = f"Grind: {x['metadata']['grind']}" - unit_price = convert_int_to_decimal(x['price']['unit_amount']) - items = map(format_product, x['metadata']['products_and_quantities']) + sub_data['customer_note'] = f"Grind: {x['metadata']['grind']}" + sub_data['unit_price'] = convert_int_to_decimal(x['price']['unit_amount']) + sub_data['items'] = map(format_product, x['metadata']['products_and_quantities']) + sub_data['total_weight'] = x['metadata']['total_weight'] if x['description'] == 'Shipping': - shipping_cost = convert_int_to_decimal(x['amount']) + sub_data['shipping_cost'] = convert_int_to_decimal(x['amount']) continue + return sub_data + # shipping_cost = find_shipping_cost(data_object['lines']['data']) # items = find_products(data_object['lines']['data']) # unit_price = find_unit_price(data_object['lines']['data']) -deserialize_subscription(data_object['lines']['data']) +sub_data = deserialize_subscription(data_object['lines']['data']) order = Order.objects.create( customer=, @@ -76,9 +66,9 @@ order.lines.add( [OrderLine( product=item['product'], quantity=item['quantity'], - customer_note='Grind: ', - unit_price=unit_price - ) for item in items] + customer_note=sub_data['customer_note'], + unit_price=sub_data['unit_price'] + ) for item in sub_data['items']] ) order.save() diff --git a/src/dashboard/templates/dashboard/order_detail.html b/src/dashboard/templates/dashboard/order_detail.html index 3326809..bdb4a43 100644 --- a/src/dashboard/templates/dashboard/order_detail.html +++ b/src/dashboard/templates/dashboard/order_detail.html @@ -23,20 +23,37 @@ {% for item in order.lines.all %}
No items in order yet.
@@ -114,15 +131,26 @@ -PayPal transaction ID: {{order.transaction.paypal_id}}
- Status: {{order.transaction.get_status_display}}
-
{{ order.subscription.stripe_id }}
+PayPal transaction ID: {{order.transaction.paypal_id}}
+ Status: {{order.transaction.get_status_display}}
+
| Subscription # | +Status | +|
|---|---|---|
| {{ subscription.id }} | +{{ subscription.status }} | +manage subscription ↗ | +
|
- {% if item.variant.image %}
- |
-
- {{ item.variant }} - {{item.customer_note}} - |
- {{item.quantity}} | -${{item.unit_price}} | -${{item.get_total}} | - {% endwith %} + {% if item.variant %} + {% with product=item.variant.product %} +
+ {% if item.variant.image %}
+ |
+
+ {{ item.variant }} + {{item.customer_note}} + |
+ {{item.quantity}} | +${{item.unit_price}} | +${{item.get_total}} | + {% endwith %} + {% elif item.product %} + {% with product=item.product %} +
+ {% if item.variant.image %}
+ |
+
+ {{ item.product }} + {{item.customer_note}} + |
+ {{item.quantity}} | +${{item.unit_price}} | +${{item.get_total}} | + {% endwith %} + {% endif %}