Skip to content

Commit

Permalink
modified order/orderitem models
Browse files Browse the repository at this point in the history
  • Loading branch information
miclemabasie committed Dec 27, 2023
1 parent 4fa1622 commit a8bffd5
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 7 deletions.
6 changes: 6 additions & 0 deletions src/LMA/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@
"""
from django.contrib import admin
from django.urls import path, include
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

urlpatterns = [
path("admin/", admin.site.urls),
path("__debug__/", include("debug_toolbar.urls")),
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
]
43 changes: 43 additions & 0 deletions src/apps/core/management/commands/init_db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from typing import Any
import faker
import random

from django.core.management.base import BaseCommand, CommandParser
from django.contrib.auth import get_user_model


User = get_user_model()

faker = faker.Faker()


class Command(BaseCommand):
def add_arguments(self, parser: CommandParser) -> None:
parser.add_argument("quantity", help="Number of items per model", default=10)
return super().add_arguments(parser)

def handle(self, *args: Any, **options: Any) -> str | None:
print(options.get("quantity"))

self.stdout.write(
self.style.SUCCESS(f"Creating elements for the database."),
)

def create_customers_data(self):
"""Create fake customer data"""

def craete_orders_data(self):
"""Create data for order and orderitems"""

def create_users_data(self, quantity):
"""Create data for users"""
for _ in range(quantity):
user = User.objects.create(
username=faker.user_name(),
email=faker.email(),
first_name=faker.first_name(),
last_name=faker.last_name(),
)
password = faker.password()
user.set_password(password)
user.save()
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 5.0 on 2023-12-26 20:58

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("orders", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AddField(
model_name="order",
name="sales_man",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="orders_performed",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AddField(
model_name="order",
name="total_price",
field=models.DecimalField(
decimal_places=2,
default=0.0,
max_digits=10,
verbose_name="Total Order Price",
),
),
migrations.AddField(
model_name="order",
name="transaction_id",
field=models.CharField(default=True, max_length=15, null=True),
),
]
55 changes: 54 additions & 1 deletion src/apps/orders/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import uuid

from collections.abc import Iterable
from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.common.models import TimeStampedUUIDModel
Expand All @@ -15,6 +18,14 @@ class OrderSatus(models.TextChoices):


class Order(TimeStampedUUIDModel):
sales_man = models.ForeignKey(
User,
related_name="orders_performed",
on_delete=models.SET_NULL,
null=True,
blank=True,
)
transaction_id = models.CharField(null=True, default=True, max_length=15)
customer = models.ForeignKey(
User, related_name="orders", on_delete=models.SET_NULL, null=True
)
Expand All @@ -24,16 +35,58 @@ class Order(TimeStampedUUIDModel):
choices=OrderSatus.choices,
default=OrderSatus.NEW,
)
total_price = models.DecimalField(
verbose_name=_("Total Order Price"),
max_digits=10,
decimal_places=2,
default=0.0,
)
validated = models.BooleanField(null=True, blank=True, defaul=False)

def save(self) -> None:
self.transaction_id = str(uuid.uuid4())[-12:]
# get all orderitems for this order
if self.validated:
order_items = OrderItem.objects.filter(order__pkid=self.pkid)
self.total_price
if len(order_items) > 0:
for order_item in order_items:
self.total_price += order_item.price
return super().save()


class OrderItem(TimeStampedUUIDModel):
order = models.ForeignKey(
Order, related_name="orderitems", on_delete=models.CASCADE
)
name = models.CharField(verbose_name=_("Item Name"), max_length=50)
item_type = models.CharField(verbose_name=_("Item Name"), max_length=50)
description = models.TextField(
verbose_name=_("Item Description"), null=True, blank=True
)
quantity = models.PositiveIntegerField(null=True, blank=True, default=1)
price_per_item = models.DecimalField(
verbose_name=_("Price Per Item"),
max_digits=10,
decimal_places=2,
default=0.0,
null=True,
blank=True,
)
total_price = models.DecimalField(
verbose_name=_("Total Orderitem Price"),
max_digits=10,
decimal_places=2,
default=0.0,
null=True,
blank=True,
)
special_instructions = models.TextField(null=True, blank=True)

def __str__(self):
return f"OrderItem -> {self.name} part of orderID: {self.order.pkid}"

def save(self) -> None:
self.transaction_id = str(uuid.uuid4())[-12:]
# get all orderitems for this order
self.total_price = self.quantity * self.price
return super().save()
23 changes: 17 additions & 6 deletions src/apps/users/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,44 @@ class UserSerializer(serializers.ModelSerializer):
gender = serializers.CharField(source="profile.gender")
phone_number = PhoneNumberField(source="profile.phone_number")
profile_photo = serializers.ImageField(source="profile.profile_photo")
country=CountryField(source="profile.country")
country = CountryField(source="profile.country")
city = serializers.CharField(source="profile.city")
top_seller=serializers.BooleanField(source="profile.top_seller")
first_name = serializers.SerializerMethodField()
lat_name = serializers.SerializerMethodField()
full_name = serializers.SerializerMethodField(source="get_full_name")

class Meta:
model = User
fields = ["id", "username", "email", "first_name", "last_name", "full_name", "gender", "phone_number", "profile_photo", "country", "city", "top_seller"]
fields = [
"id",
"username",
"email",
"first_name",
"last_name",
"full_name",
"gender",
"phone_number",
"profile_photo",
"country",
"city",
"top_seller",
]

def get_first_name(self, obj):
return obj.first_name.title()

def get_last_name(self, obj):
return obj.last_name.title()


def to_representation(self, instance):
represention = super(UserSerializer, self).to_representation(instance)
if instance.is_superuser:
represention['admin'] = True
represention["admin"] = True

return represention


class CreateUserSerializer(UserCreateSerializer):
class Meta(UserCreateSerializer.Meta):
model = User
fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password']
fields = ["id", "username", "email", "first_name", "last_name", "password"]

0 comments on commit a8bffd5

Please sign in to comment.