Creating Orders apps for Order processing - lhmisho/django-eCommerce GitHub Wiki

Create Order Apps

myProj/

django-admin startapp orders

Register Apps to settings

myProj/settings.py

INSTALLED_APPS = [
    ..............
    'orders',
    ............
]

Create Order model

orders/models.py

from django.db import models
from django.db.models.signals import pre_save
from eshop.utils import unique_order_id_generator
from carts.models import Cart
# Create your models here.

ORDER_STATUS_CHOICE = (
    ('created', 'CREATED'),
    ('paid', 'PAID'),
    ('shipped', 'SHIPPING'),
    ('refounded', 'REFOUNDED')
)

class Order(models.Model):
    order_id = models.CharField(max_length=120, blank=True)
    #billing_profile     =
    #shipping_address    =
    #billing_address     =
    cart    = models.ForeignKey(Cart, on_delete=models.CASCADE)
    status  = models.CharField(max_length=120, default='created', choices=ORDER_STATUS_CHOICE)
    shipping_total = models.DecimalField(default=5.99, max_digits=100, decimal_places=2)
    total   = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)


    def __str__(self):
        return self.order_id

# using pre_save singnals with unique_order_generator for saving the unique order id
def pre_save_order_id(sender, instance, *args, **kewarg):
    if not instance.order_id:
        instance.order_id = unique_order_id_generator(instance)

pre_save.connect(pre_save_order_id , sender=Order)

Register your model on admin

orders/admin.py

from django.contrib import admin
from .models import Order
# Register your models here.

admin.site.register(Order)

Create Unique Id generator for unique id generate

myProj/utils.py In my case it's eshop/utils.py

# link for slug generator:- https://www.codingforentrepreneurs.com/blog/a-unique-slug-generator-for-django/
# link for random string generator:- https://www.codingforentrepreneurs.com/blog/random-string-generator-in-python/
import random
import string
from django.utils.text import slugify

#################### this portion for generating unique random string #############################
def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))
################## Main portion for generating unique order_id #################################
# creating unique order id for order apps
def unique_order_id_generator(instance):
    """
    This is for generating unique order_id for order processing on orders/models.py
    """
    new_order_id = random_string_generator().upper() # key : 1DSWA3FG somthing like that

    Klass = instance.__class__
    qs_exists = Klass.objects.filter(order_id=new_order_id).exists()
    if qs_exists:
        return unique_slug_generator(instance)
    return new_order_id
##############################################################################################

############## This portion for generating unique slug for products section ###########################
def unique_slug_generator(instance, new_slug=None):
    """
    This is for django project with and it's assume that your
    instance has a model with a slug field and title character (char) field
    """
    if new_slug is not None:
        slug = new_slug
    else:
        slug = slugify(instance.title)

    Klass = instance.__class__
    qs_exists = Klass.objects.filter(slug=slug).exists()
    if qs_exists:
        new_slug = "{slug}-{randstr}".format(
                    slug=slug,
                    randstr=random_string_generator(size=4)
                )
        return unique_slug_generator(instance, new_slug=new_slug)
    return slug