#Django ecommerce create_order() doesnt work!

5 messages · Page 1 of 1 (latest)

plush flicker
#
    invoice = create_invoice(order, email)
    if invoice and invoice.send():
        return invoice.id
    return None

def create_order(user, shipping_address, cart_items):
    logger.debug("Creating order for user: %s", user)
    order = Order.objects.create(
        user=user,
        shipping_address=shipping_address,
        order_date=timezone.now(),
        total_cost=sum(item.size.price * item.quantity for item in cart_items)
    )
    for item in cart_items:
        size = get_object_or_404(ProductSize, id=item.size_id)
        order_item = OrderItem.objects.create(
            order=order,
            product=item.product,
            size=size,
            quantity=item.quantity
        )
        order.items.add(order_item)
    logger.info("Order created: %s", order.id)
    return order

@login_required
def logged_in_checkout_view(request):
    logger.debug("Logged-in user attempting to check out")
    if request.method == 'POST':
        form = CheckoutForm(request.POST)
        address_form = DeliveryAddressForm(request.POST)
        logger.debug("CheckoutForm and DeliveryAddressForm received")

        if form.is_valid() and address_form.is_valid():
            logger.debug("Forms are valid")
            shipping_address = address_form.save(commit=False)
            shipping_address.user = request.user
            shipping_address.save()
            logger.debug("Shipping address saved")

            cart_items = Cart.objects.filter(user=request.user)
            if not cart_items.exists():
                logger.error("No cart items found for user")
                return redirect('cart:cart')

            order = create_order(request.user, shipping_address, cart_items)
            logger.info(f"Order created: {order.id}")

            invoice_id = create_invoice_view(request, order, request.user.email)
            if invoice_id:
                logger.info(f"Invoice ID: {invoice_id}")
                order.ref_code = invoice_id
                order.save()
            else:
                logger.error("Invoice creation failed")

            cart_items.delete()
            request.session['order_id'] = str(order.id)
            request.session['total_price'] = str(order.total_cost())
            return redirect('cart:payment_done')
        else:
            logger.error("Form validation failed")
            if not form.is_valid():
                logger.error("CheckoutForm errors: %s", form.errors)
            if not address_form.is_valid():
                logger.error("DeliveryAddressForm errors: %s", address_form.errors)
    else:
        form = CheckoutForm()
        address_form = DeliveryAddressForm()
        cart_items = Cart.objects.filter(user=request.user)
        total_price = sum(item.size.price * item.quantity for item in cart_items)
        logger.debug("Displaying checkout form")

    return render(request, 'cart/checkout.html', {
        'form': form,
        'address_form': address_form,
        'total_price': total_price,
        'PAYPAL_CLIENT_ID': settings.PAYPAL_CLIENT_ID,
        'user': request.user
    })```
#

Tried Debugging it with a logger.

it seems like the create_order function never gets called or gets pass. I was thinking it might be the form affecting it

#

from django import forms
from .models import DeliveryAddress
from user.models import Order

class CheckoutForm(forms.Form):
    first_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
    last_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
    use_default_shipping = forms.BooleanField(required=False, widget=forms.CheckboxInput())
    use_default_billing = forms.BooleanField(required=False, widget=forms.CheckboxInput())
    same_billing_address = forms.BooleanField(required=False, widget=forms.CheckboxInput())

class GuestCheckoutForm(forms.Form):
    first_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
    last_name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'class': 'form-control'}))
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'}))
    use_default_shipping = forms.BooleanField(required=False, widget=forms.CheckboxInput())
    use_default_billing = forms.BooleanField(required=False, widget=forms.CheckboxInput())
    same_billing_address = forms.BooleanField(required=False, widget=forms.CheckboxInput())

class DeliveryAddressForm(forms.ModelForm):
    class Meta:
        model = DeliveryAddress
        fields = ['address_line1', 'address_line2', 'city', 'state', 'postal_code', 'country', 'phone_number']
        widgets = {
            'address_line1': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Street address, P.O. box, company name, c/o'}),
            'address_line2': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Apartment, suite, unit, building, floor, etc.'}),
            'city': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'City'}),
            'state': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'State / Province / Region'}),
            'postal_code': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'ZIP / Postal Code'}),
            'country': forms.Select(attrs={'class': 'form-control'}, choices=[
                ('US', 'United States'),
                ('GB', 'United Kingdom'),
                # Add other countries as needed
            ]),
            'phone_number': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Phone Number'}),
        }

class OrderStatusForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['status']
#

this is my Models.py for the Order

from django.contrib.auth.models import AbstractUser
from django.utils import timezone

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.username

class UserProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='profile')
    bio = models.TextField(blank=True)
    shipping_address = models.TextField(blank=True, null=True)

    def __str__(self):
        return f"{self.user.username}'s Profile"

class Order(models.Model):
    STATUS_CHOICES = [
        ('PENDING', 'Pending'),
        ('SHIPPED', 'Shipped'),
        ('DELIVERED', 'Delivered'),
        ('CANCELLED', 'Cancelled'),
    ]

    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='orders', null=True, blank=True)
    guest_email = models.EmailField(null=True, blank=True)
    order_date = models.DateTimeField(default=timezone.now)
    ordered_date = models.DateTimeField(default=timezone.now)  # Added ordered_date field
    shipping_address = models.TextField()
    paypal_invoice_id = models.CharField(max_length=255, blank=True, null=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='PENDING')

    def __str__(self):
        return f"Order {self.id} by {self.user.username if self.user else self.guest_email}"

    def total_cost(self):
        return sum(item.total_cost() for item in self.items.all())

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
    product = models.ForeignKey('products.Products', on_delete=models.CASCADE)
    size = models.ForeignKey('products.ProductSize', on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.product.title} - {self.size.size}"

    def total_cost(self):
        return self.size.price * self.quantity
#

Django ecommerce create_order() doesnt work!