first commit

This commit is contained in:
javad committed 2026-06-15 10:57:28 +03:30
commit 3e4574dcdd
163 files changed
+3559

No files matched your search

View File
Whitespace-only changes.
+9
View File
@@ -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']
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class OrderConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.order'
+35
View File
@@ -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,
},
),
]
+18
View File
@@ -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']},
),
]
View File
Whitespace-only changes.
+40
View File
@@ -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']
+12
View File
@@ -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}")
+46
View File
@@ -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}'})
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+8
View File
@@ -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'),
]
+88
View File
@@ -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)