first commit
This commit is contained in:
commit
3e4574dcdd
163 files changed
+3559
No files matched your search
Whitespace-only changes.
@@ -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
|
||||
@@ -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.
@@ -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']
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@@ -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'),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user