This commit is contained in:
javad committed 2024-01-22 13:01:42 +03:30
commit 89a5d70512
284 files changed
+8364

No files matched your search

View File
Whitespace-only changes.
+11
View File
@@ -0,0 +1,11 @@
from django.contrib import admin
from apps.reminder.models import *
# Register your models here.
# Register your models here.
@admin.register(Reminder)
class ReminderAdmin(admin.ModelAdmin):
pass
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ReminderConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.reminder'
+34
View File
@@ -0,0 +1,34 @@
# Generated by Django 4.2.1 on 2024-01-13 10:31
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('workspace', '0003_alter_workspace_uuid'),
('cuser', '0005_smsopt'),
]
operations = [
migrations.CreateModel(
name='Reminder',
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)),
('type', models.CharField(choices=[('LE', 'LEAD'), ('UN', 'UNKNOWN'), ('NO', 'NOTE'), ('CU', 'CUSTOMER')], default='UN', max_length=2)),
('id_type', models.PositiveBigIntegerField(blank=True, null=True)),
('datetime', models.DateTimeField()),
('desc', models.CharField(blank=True, max_length=200, null=True)),
('cuser_role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cuser.cuserrole')),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
],
options={
'abstract': False,
},
),
]
@@ -0,0 +1,26 @@
# Generated by Django 4.2.1 on 2024-01-13 10:35
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('customer', '0006_alter_customernote_options'),
('reminder', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='reminder',
name='customer',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='customer_Reminder', to='customer.customer'),
preserve_default=False,
),
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('UN', 'UNKNOWN'), ('LE', 'LEAD'), ('NO', 'NOTE'), ('CU', 'CUSTOMER')], default='UN', max_length=2),
),
]
@@ -0,0 +1,31 @@
# Generated by Django 4.2.1 on 2024-01-13 15:42
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('customer', '0006_alter_customernote_options'),
('lead', '0010_alter_lead_status'),
('reminder', '0002_reminder_customer_alter_reminder_type'),
]
operations = [
migrations.AddField(
model_name='reminder',
name='lead',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='lead_reminder', to='lead.lead'),
),
migrations.AddField(
model_name='reminder',
name='note',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='note_reminder', to='customer.customernote'),
),
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('NO', 'NOTE'), ('LE', 'LEAD'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,31 @@
# Generated by Django 4.2.1 on 2024-01-13 15:45
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('lead', '0011_alter_lead_status'),
('customer', '0006_alter_customernote_options'),
('reminder', '0003_reminder_lead_reminder_note_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='lead',
field=models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='lead_reminder', to='lead.lead'),
),
migrations.AlterField(
model_name='reminder',
name='note',
field=models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='note_reminder', to='customer.customernote'),
),
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('LE', 'LEAD'), ('UN', 'UNKNOWN'), ('NO', 'NOTE')], default='UN', max_length=2),
),
]
@@ -0,0 +1,22 @@
# Generated by Django 4.2.1 on 2024-01-18 08:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0004_alter_reminder_lead_alter_reminder_note_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='reminder',
options={'ordering': ('-created_at',)},
),
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('LE', 'LEAD'), ('NO', 'NOTE'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-20 07:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0005_alter_reminder_options_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('NO', 'NOTE'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN'), ('LE', 'LEAD')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0006_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('UN', 'UNKNOWN'), ('NO', 'NOTE'), ('LE', 'LEAD')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0007_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('LE', 'LEAD'), ('NO', 'NOTE'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0008_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('NO', 'NOTE'), ('UN', 'UNKNOWN'), ('CU', 'CUSTOMER'), ('LE', 'LEAD')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0009_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('UN', 'UNKNOWN'), ('NO', 'NOTE'), ('LE', 'LEAD')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 09:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0010_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('NO', 'NOTE'), ('LE', 'LEAD'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 09:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0011_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('LE', 'LEAD'), ('NO', 'NOTE'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0012_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('UN', 'UNKNOWN'), ('LE', 'LEAD'), ('NO', 'NOTE'), ('CU', 'CUSTOMER')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0013_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('NO', 'NOTE'), ('LE', 'LEAD'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0014_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('NO', 'NOTE'), ('UN', 'UNKNOWN'), ('LE', 'LEAD')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0015_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('NO', 'NOTE'), ('LE', 'LEAD'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN')], default='UN', max_length=2),
),
]
Whitespace-only changes.
+31
View File
@@ -0,0 +1,31 @@
from django.db import models
from utils.base_model import BaseModel
from apps.workspace.models import Workspace as WorkspaceModel
from apps.cuser.models import CuserRole as CuserRoleModel
from apps.customer.models import Customer as CustomerModel
from apps.lead.models import Lead as LeadModel
from apps.customer.models import CustomerNote as CustomerNoteModel
# Create your models here.
class Reminder(BaseModel):
TYPE_CHOICES = {
("LE", "LEAD"),
("CU", "CUSTOMER"),
("NO", "NOTE"),
("UN", "UNKNOWN"),
}
type = models.CharField(max_length=2, choices=TYPE_CHOICES, null=False, blank=False, default='UN')
customer = models.ForeignKey(CustomerModel, on_delete=models.CASCADE, null=False, blank=False, related_name='customer_Reminder')
lead = models.OneToOneField(LeadModel, on_delete=models.CASCADE, null=True, blank=True, default=None, related_name='lead_reminder')
note = models.OneToOneField(CustomerNoteModel, on_delete=models.CASCADE, null=True, blank=True, default=None, related_name='note_reminder')
id_type = models.PositiveBigIntegerField(null=True, blank=True)
datetime = models.DateTimeField(null=False, blank=False)
desc = models.CharField(max_length=200, null=True, blank=True)
cuser_role = models.ForeignKey(CuserRoleModel, on_delete=models.SET_NULL, null=True, blank=True)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
class Meta:
ordering = ('-created_at', )
+16
View File
@@ -0,0 +1,16 @@
from apps.reminder.models import Reminder as ReminderModel
from utils.get_cuser_role import get_cuser_role_uuid
from utils.get_user_workspace import get_user_workspace_uuid
import datetime
def reminder_list(request) -> ReminderModel:
workspace_uuid = get_user_workspace_uuid(request)
cuser_role_uuid = get_cuser_role_uuid(request)
nowdt = datetime.datetime.now()
reminders = ReminderModel.objects.filter(datetime__lte=nowdt,
sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid).order_by('-datetime')[:30]
return reminders
+48
View File
@@ -0,0 +1,48 @@
from apps.reminder.models import Reminder as ReminderModel
from apps.lead.models import Lead as LeadModel
from rest_framework import exceptions
from utils.get_user_workspace import get_user_workspace
from utils.get_cuser_role import get_cuser_role
def create_or_edit_reminder_lead(request, lead_id: int, datetime: str, desc: str = None) -> ReminderModel:
try:
workspace = get_user_workspace(request)
cuser_role = get_cuser_role(request)
lead = LeadModel.objects.get(id=lead_id)
customer = lead.customer
try:
reminder = ReminderModel.objects.get(type='LE', lead=lead, customer=customer, sys_ws=workspace, cuser_role=cuser_role)
except Exception as exp:
reminder = ReminderModel(lead=lead)
reminder.type = 'LE'
reminder.customer = customer
reminder.datetime = datetime
reminder.sys_ws = workspace
reminder.cuser_role = cuser_role
if desc:
reminder.desc = desc
reminder.save()
return reminder
except Exception as exp:
message = f'Error Creating or Update reminder for lead: {exp}'
raise exceptions.ValidationError({'error': message})
def delete_reminder_lead(request, lead_id: int) -> ReminderModel:
try:
workspace = get_user_workspace(request)
cuser_role = get_cuser_role(request)
reminder = ReminderModel.objects.get(type='LE', lead_id=lead_id, sys_ws=workspace, cuser_role=cuser_role).delete()
return reminder
except Exception as exp:
message = f'Error Delete reminder for lead: {exp}'
raise exceptions.ValidationError({'error': message})
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+9
View File
@@ -0,0 +1,9 @@
from django.urls import path, include
from apps.reminder.views import *
urlpatterns = [
path('list/', ReminderListApiView.as_view(), name='reminder-list'),
path('lead/create-update/', ReminderLeadCreateUpdateApiView.as_view(), name='reminder-lead-create-update'),
path('lead/<int:lead_id>/delete/', ReminderLeadDeleteApiView.as_view(), name='reminder-lead-delete'),
]
+66
View File
@@ -0,0 +1,66 @@
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
from rest_framework import status
from apps.reminder.models import Reminder as ReminderModel
from apps.reminder.services import create_or_edit_reminder_lead, delete_reminder_lead
from utils.tools import inline_serializer
from apps.reminder.selectors import reminder_list
# Create your views here.
class ReminderListApiView(APIView):
class OutputSerializer(serializers.ModelSerializer):
customer = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
})
lead = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'title': serializers.CharField(),
})
note = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'desc': serializers.CharField(),
})
class Meta:
model = ReminderModel
fields = '__all__'
def get(self, request):
reminders = reminder_list(request=request)
output = self.OutputSerializer(reminders, many=True)
return Response(data=output.data, status=status.HTTP_200_OK)
class ReminderLeadCreateUpdateApiView(APIView):
class InputSerializers(serializers.Serializer):
lead_id = serializers.IntegerField(required=True)
datetime = serializers.DateTimeField(required=True)
desc = serializers.CharField(required=False, allow_null=True)
def post(self, request):
serializer = self.InputSerializers(data=request.data)
serializer.is_valid(raise_exception=True)
output = create_or_edit_reminder_lead(request, **serializer.validated_data)
return Response(data={'id': output.id}, status=status.HTTP_201_CREATED)
class ReminderLeadDeleteApiView(APIView):
def delete(self, request, lead_id):
output = delete_reminder_lead(request, lead_id=lead_id)
return Response(data={'status': 'removed'}, status=status.HTTP_200_OK)