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.
+13
View File
@@ -0,0 +1,13 @@
from django.contrib import admin
from apps.projectcode.models import ProjectCode as ProjectCodeModel, ProjectCodeHead as ProjectCodeHeadModel
# Register your models here.
@admin.register(ProjectCodeHeadModel)
class ProjectCodeHeadAdmin(admin.ModelAdmin):
pass
@admin.register(ProjectCodeModel)
class ProjectCodeAdmin(admin.ModelAdmin):
pass
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ProjectcodeConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.projectcode'
@@ -0,0 +1,46 @@
# Generated by Django 4.2.1 on 2024-04-30 05:08
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),
]
operations = [
migrations.CreateModel(
name='ProjectCodeHead',
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)),
('title', models.CharField(max_length=300)),
('count', models.IntegerField()),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='ProjectCode',
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)),
('code', models.CharField(max_length=20)),
('is_active', models.BooleanField(default=True)),
('is_used', models.BooleanField(default=False)),
('mojri_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('project_code_head', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projectcode.projectcodehead')),
],
options={
'abstract': False,
},
),
]
@@ -0,0 +1,21 @@
# Generated by Django 4.2.1 on 2024-04-30 06:30
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('projectcode', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='projectcode',
name='mojri_user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
@@ -0,0 +1,21 @@
# Generated by Django 4.2.1 on 2024-05-02 06:39
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('projectcode', '0002_alter_projectcode_mojri_user'),
]
operations = [
migrations.AlterModelOptions(
name='projectcode',
options={'ordering': ['-created_at']},
),
migrations.AlterModelOptions(
name='projectcodehead',
options={'ordering': ['-created_at']},
),
]
Whitespace-only changes.
+30
View File
@@ -0,0 +1,30 @@
from django.contrib.auth import get_user_model
from django.db import models
from utils.base_model import BaseModel
# Create your models here.
CUserModel = get_user_model()
class ProjectCodeHead(BaseModel):
title = models.CharField(max_length=300, null=False, blank=False)
count = models.IntegerField(null=False, blank=False)
def __str__(self):
return self.title
class Meta:
ordering = ['-created_at']
class ProjectCode(BaseModel):
project_code_head = models.ForeignKey(ProjectCodeHead, on_delete=models.CASCADE)
code = models.CharField(max_length=20, null=False, blank=False)
is_active = models.BooleanField(default=True)
is_used = models.BooleanField(default=False)
mojri_user = models.ForeignKey(CUserModel, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.code
class Meta:
ordering = ['-created_at']
+43
View File
@@ -0,0 +1,43 @@
from apps.projectcode.models import ProjectCodeHead as ProjectCodeHeadModel, ProjectCode as ProjectCodeModel
from rest_framework.validators import ValidationError
def update_project_code_used(code: str, user):
try:
project_code = ProjectCodeModel.objects.get(code=code, is_used=False)
project_code.is_used = True
project_code.mojri_user = user
project_code.save()
return project_code
except Exception as e:
raise ValidationError(e)
def project_code_validation(code):
try:
return ProjectCodeModel.objects.get(code=code, is_used=False, is_active=True)
except Exception as e:
raise ValidationError(e)
def project_code_head_list():
try:
return ProjectCodeHeadModel.objects.all()
except Exception as e:
raise ValidationError(e)
def project_code_list(id: int, is_used: str):
try:
base_filter = {
'project_code_head_id': id,
}
if is_used == 'true':
base_filter['is_used'] = True
return ProjectCodeModel.objects.filter(**base_filter)
except Exception as e:
raise ValidationError(e)
+23
View File
@@ -0,0 +1,23 @@
from apps.projectcode.models import ProjectCodeHead as ProjectCodeHeadModel, ProjectCode as ProjectCodeModel
from apps.projectcode.task import generate_code
from rest_framework.validators import ValidationError
from django.db import transaction
@transaction.atomic
def create_project_code(title: str, count: int) -> ProjectCodeHeadModel:
try:
project_code_head = ProjectCodeHeadModel.objects.create(
title=title,
count=count
)
generate_code.delay(count=count, project_code_head_id=project_code_head.id)
return project_code_head
except Exception as e:
raise ValidationError(e)
+28
View File
@@ -0,0 +1,28 @@
from celery import shared_task
import random
from apps.projectcode.models import ProjectCode as ProjectCodeModel, ProjectCodeHead as ProjectCodeHeadModel
from django.db import transaction
@shared_task
@transaction.atomic
def generate_code(count: int, project_code_head_id):
codes = []
#code_head = ProjectCodeHeadModel.objects.create(title='مقدسی', count=count)
code_head = project_code_head_id
project_codes = []
for i in range(count):
chars = 'abcdefghijklmnopqrstuvwxyz'
char1 = random.choice(chars)
char2 = random.choice(chars)
char4 = random.choice(chars)
num = random.randint(10000000, 99999999)
code = f'{char1}{char2}{char4}{num}'
codes.append(code)
project_code = ProjectCodeModel(project_code_head_id=code_head, code=code)
project_codes.append(project_code)
ProjectCodeModel.objects.bulk_create(project_codes)
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+11
View File
@@ -0,0 +1,11 @@
from django.urls import path
from apps.projectcode.views import (ProjectCodeHeadView, ProjectCodeView, CreateProjectCodeView,
ProjectCodeValidationView, ProjectCodeExcelExportView)
urlpatterns = [
path('list/', ProjectCodeHeadView.as_view(), name='projectcode_head_list'),
path('list/<int:id>/', ProjectCodeView.as_view(), name='projectcode_list'),
path('excel/<int:id>/', ProjectCodeExcelExportView.as_view(), name='projectcode_excel'),
path('create/', CreateProjectCodeView.as_view(), name='projectcode_create'),
path('validation/<str:code>/', ProjectCodeValidationView.as_view(), name='projectcode_validation'),
]
+89
View File
@@ -0,0 +1,89 @@
from io import BytesIO
from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.views import APIView
from apps.projectcode.selector import project_code_head_list, project_code_list, project_code_validation
from apps.projectcode.services import create_project_code
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import serializers
from apps.projectcode.models import ProjectCodeHead as ProjectCodeHeadModel, ProjectCode as ProjectCodeModel
from rest_framework import status
import pandas as pd
# Create your views here.
class ProjectCodeExcelExportView(APIView):
#permission_classes = (IsAuthenticated,)
def get(self, request, id: int):
# export to excel and send excel file to response
project_code = project_code_list(id=id, is_used='false')
excel_file = BytesIO()
order_df = pd.DataFrame(project_code.values('id', 'code','is_used'))
order_df.to_excel(excel_file, engine='xlsxwriter', index=False)
excel_file.seek(0)
response = HttpResponse(excel_file.read(), content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename="output.xlsx"'
return response
class ProjectCodeValidationView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request, code):
project_code = project_code_validation(code)
return Response({'project_code_id': project_code.id}, status=status.HTTP_200_OK)
class CreateProjectCodeView(APIView):
permission_classes = (IsAuthenticated,)
class InputSerializer(serializers.Serializer):
title = serializers.CharField(max_length=200)
count = serializers.IntegerField()
def post(self, request):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
project_code_head = create_project_code(**serializer.validated_data)
return Response({'projectcode_id': project_code_head.id}, status=status.HTTP_201_CREATED)
class ProjectCodeView(APIView):
permission_classes = (IsAuthenticated,)
class OutputSerializer(serializers.ModelSerializer):
project_code_head = serializers.StringRelatedField()
class Meta:
model = ProjectCodeModel
fields = '__all__'
def get(self, request, id):
is_used = request.query_params.get('is_used', 'false')
codes = project_code_list(id=id, is_used=is_used)
output = self.OutputSerializer(codes, many=True)
return Response(output.data, status=status.HTTP_200_OK)
class ProjectCodeHeadView(APIView):
permission_classes = (IsAuthenticated,)
class OutputSerializer(serializers.ModelSerializer):
class Meta:
model = ProjectCodeHeadModel
fields = '__all__'
def get(self, request):
code_head = project_code_head_list()
output = self.OutputSerializer(code_head, many=True)
return Response(output.data, status=status.HTTP_200_OK)