first commit
This commit is contained in:
commit
3e4574dcdd
163 files changed
+3559
No files matched your search
Whitespace-only changes.
@@ -0,0 +1,9 @@
|
||||
from django.contrib import admin
|
||||
from apps.order.models import Order as OrderModel
|
||||
# Register your models here.
|
||||
|
||||
|
||||
@admin.register(OrderModel)
|
||||
class OrderAdmin(admin.ModelAdmin):
|
||||
list_filter = ['status']
|
||||
search_fields = ['name', 'cuser_mojri__name_family']
|
||||
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class OrderConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'apps.order'
|
||||
@@ -0,0 +1,35 @@
|
||||
# Generated by Django 4.2.1 on 2024-03-27 19:53
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('product', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Order',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('name', models.CharField(max_length=30)),
|
||||
('desc', models.CharField(blank=True, max_length=30, null=True)),
|
||||
('price', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('emtiyaz', models.PositiveIntegerField()),
|
||||
('cuser_mojri', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
|
||||
('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='product.product')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.1 on 2024-04-28 07:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='order',
|
||||
name='code',
|
||||
field=models.TextField(blank=True, null=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.1 on 2024-04-28 07:46
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0002_order_code'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='order',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('waiting', 'در انتظار برسی'), ('approve', 'تایید شد'), ('canceled', 'رد شده')], default='waiting', max_length=30),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 4.2.1 on 2024-04-30 05:08
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0003_order_status'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='order',
|
||||
options={'ordering': ['-created_at']},
|
||||
),
|
||||
]
|
||||
Whitespace-only changes.
@@ -0,0 +1,40 @@
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.db import models
|
||||
from utils.base_model import BaseModel
|
||||
from apps.product.models import Product as ProductModel
|
||||
# Create your models here.
|
||||
CUserModel = get_user_model()
|
||||
|
||||
|
||||
class Order(BaseModel):
|
||||
|
||||
STATUS_CHOICES = (
|
||||
('waiting', 'در انتظار برسی'),
|
||||
('approve', 'تایید شد'),
|
||||
('canceled', 'رد شده'),
|
||||
)
|
||||
product = models.ForeignKey(ProductModel, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
name = models.CharField(max_length=30, null=False, blank=False)
|
||||
desc = models.CharField(max_length=30, null=True, blank=True)
|
||||
code = models.TextField(null=True, blank=True)
|
||||
price = models.PositiveIntegerField(null=True, blank=True)
|
||||
emtiyaz = models.PositiveIntegerField(null=False, blank=False)
|
||||
status = models.CharField(max_length=30, choices=STATUS_CHOICES, default='waiting')
|
||||
cuser_mojri = models.ForeignKey(CUserModel, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
cuser_name = getattr(self.cuser_mojri, 'name_family', None)
|
||||
cuser_username = getattr(self.cuser_mojri, 'username', None)
|
||||
product_name = getattr(self.product, 'name', None)
|
||||
|
||||
if cuser_name and product_name:
|
||||
return f'{cuser_name} - {product_name} - {cuser_username}'
|
||||
elif cuser_name:
|
||||
return f'{ cuser_name } - {cuser_username}'
|
||||
elif product_name:
|
||||
return f'{product_name} - {cuser_username}'
|
||||
|
||||
|
||||
class Meta:
|
||||
ordering = ['-created_at']
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
from apps.order.models import Order as OrderModel
|
||||
from rest_framework.exceptions import ValidationError
|
||||
|
||||
|
||||
def retrieve_order(order_id: int) -> OrderModel:
|
||||
try:
|
||||
order = OrderModel.objects.get(id=order_id)
|
||||
return order
|
||||
except OrderModel.DoesNotExist:
|
||||
raise ValidationError(f"Order with id {order_id} does not exist")
|
||||
except Exception as e:
|
||||
raise ValidationError(f"Error retrieving order: {e}")
|
||||
@@ -0,0 +1,46 @@
|
||||
import time
|
||||
|
||||
from apps.product.models import Product as ProductModel
|
||||
from apps.order.models import Order as OrderModel
|
||||
from apps.emtiyazat.selector import get_emtiyaz_mojri
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from apps.order.models import Order as OrderModel
|
||||
from apps.emtiyazat.services import decrease_emtiyaz
|
||||
from config.celery import app
|
||||
from celery import shared_task
|
||||
from utils.services.sms_task import task_send_sms
|
||||
#from apps.projectcode.task import generate_code
|
||||
|
||||
|
||||
def create_order(product_id: int, cuser) -> OrderModel:
|
||||
|
||||
try:
|
||||
product = ProductModel.objects.get(id=product_id)
|
||||
product_emtiyaz = product.get_emtiyaz
|
||||
emtiyaz_mojri = get_emtiyaz_mojri(cuser)
|
||||
|
||||
#generate_code.delay(count=20)
|
||||
|
||||
if emtiyaz_mojri >= product_emtiyaz:
|
||||
|
||||
decrease_emtiyaz(product_emtiyaz, desc=product.name, cuser=cuser)
|
||||
|
||||
order = OrderModel.objects.create(
|
||||
cuser_mojri=cuser,
|
||||
product=product,
|
||||
emtiyaz=product_emtiyaz,
|
||||
name=product.name,
|
||||
desc=product.desc,
|
||||
price=product.price
|
||||
)
|
||||
|
||||
message = f'لوله گستر گلپایگان: مجری محترم درخواست شما ثبت و درحال برسی است'
|
||||
task_send_sms.delay(message=message, mobile=cuser.mobile)
|
||||
|
||||
return order
|
||||
else:
|
||||
raise ValidationError({'error': 'emtiyaz mojri not enough'})
|
||||
|
||||
except Exception as exp:
|
||||
raise ValidationError({'error': f'error in create order {exp}'})
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -0,0 +1,8 @@
|
||||
from django.urls import path
|
||||
from apps.order.views import CreateOrderApiView, RetrieveOrderApiView, ListOrderApiView
|
||||
|
||||
urlpatterns = [
|
||||
path('create/', CreateOrderApiView.as_view(), name='create_order'),
|
||||
path('list/', ListOrderApiView.as_view(), name='list_order'),
|
||||
path('<int:order_id>/', RetrieveOrderApiView.as_view(), name='retrieve_order'),
|
||||
]
|
||||
@@ -0,0 +1,88 @@
|
||||
from django.shortcuts import render
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.generics import ListAPIView
|
||||
from rest_framework import serializers
|
||||
from rest_framework import response
|
||||
from rest_framework import status
|
||||
from apps.order.models import Order as OrderModel
|
||||
from apps.order.services import create_order
|
||||
from apps.order.selector import retrieve_order
|
||||
from utils.tools.inline_serializer import inline_serializer
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from utils.standard_pagination import StandardPagination
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class ListOrderApiView(ListAPIView):
|
||||
class OutputSerializer(serializers.ModelSerializer):
|
||||
|
||||
product = inline_serializer(many=False, fields={
|
||||
'id': serializers.IntegerField(),
|
||||
'desc': serializers.CharField(),
|
||||
'name': serializers.CharField(),
|
||||
'emtiyaz': serializers.IntegerField(),
|
||||
'price': serializers.IntegerField(),
|
||||
'image': serializers.ImageField(),
|
||||
})
|
||||
|
||||
status_text = serializers.CharField(source='get_status_display', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = OrderModel
|
||||
fields = '__all__'
|
||||
|
||||
permission_classes = (IsAuthenticated,)
|
||||
serializer_class = OutputSerializer
|
||||
pagination_class = StandardPagination
|
||||
|
||||
def get_queryset(self):
|
||||
user = self.request.user
|
||||
return OrderModel.objects.filter(cuser_mojri=user)
|
||||
|
||||
|
||||
class RetrieveOrderApiView(APIView):
|
||||
permission_classes = (IsAuthenticated,)
|
||||
|
||||
class OutputSerializer(serializers.ModelSerializer):
|
||||
|
||||
product = inline_serializer(many=False, fields={
|
||||
'id': serializers.IntegerField(),
|
||||
'desc': serializers.CharField(),
|
||||
'name': serializers.CharField(),
|
||||
'emtiyaz': serializers.IntegerField(),
|
||||
'price': serializers.IntegerField(),
|
||||
'image': serializers.ImageField(),
|
||||
})
|
||||
|
||||
status_text = serializers.CharField(source='get_status_display', read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = OrderModel
|
||||
fields = '__all__'
|
||||
|
||||
def get(self, request, order_id):
|
||||
order = retrieve_order(order_id=order_id)
|
||||
serializer = self.OutputSerializer(order)
|
||||
return response.Response(data=serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
class CreateOrderApiView(APIView):
|
||||
permission_classes = (IsAuthenticated, )
|
||||
|
||||
class InputSerializer(serializers.Serializer):
|
||||
product_id = serializers.IntegerField()
|
||||
|
||||
def post(self, request):
|
||||
serializer = self.InputSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
user = request.user
|
||||
|
||||
order = create_order(**serializer.validated_data, cuser=user)
|
||||
|
||||
return response.Response(data={'order': order.id}, status=status.HTTP_201_CREATED)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user