add - limitation of organization by is_repeatable org_type
This commit is contained in:
@@ -4,7 +4,8 @@ from django.contrib.auth.hashers import make_password
|
|||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from apps.authentication.exceptions import UserExistException, OrganizationNationalUniqueIDException
|
from apps.authentication.exceptions import UserExistException, OrganizationNationalUniqueIDException, \
|
||||||
|
OrganizationTypeRepeatableException
|
||||||
from apps.authentication.models import (
|
from apps.authentication.models import (
|
||||||
User,
|
User,
|
||||||
City,
|
City,
|
||||||
@@ -231,6 +232,8 @@ class OrganizationSerializer(serializers.ModelSerializer):
|
|||||||
@ validate national_unique_code to be unique
|
@ validate national_unique_code to be unique
|
||||||
@ validate to organization type field
|
@ validate to organization type field
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# check national_unique_id
|
||||||
national_unique_id = attrs['national_unique_id']
|
national_unique_id = attrs['national_unique_id']
|
||||||
|
|
||||||
if not self.instance:
|
if not self.instance:
|
||||||
@@ -241,6 +244,31 @@ class OrganizationSerializer(serializers.ModelSerializer):
|
|||||||
if self.Meta.model.objects.filter(national_unique_id=national_unique_id).exists():
|
if self.Meta.model.objects.filter(national_unique_id=national_unique_id).exists():
|
||||||
raise OrganizationNationalUniqueIDException()
|
raise OrganizationNationalUniqueIDException()
|
||||||
|
|
||||||
|
# check organization type field
|
||||||
|
# if is repeatable of type, organization will not be recreating
|
||||||
|
org_type = attrs['type']
|
||||||
|
if not org_type.is_repeatable:
|
||||||
|
if org_type.org_type_field == 'PR' and self.Meta.model.objects.filter(
|
||||||
|
type=org_type,
|
||||||
|
province=attrs['province']
|
||||||
|
).exists():
|
||||||
|
raise OrganizationTypeRepeatableException()
|
||||||
|
|
||||||
|
if org_type.org_type_field == 'CI' and self.Meta.model.objects.filter(
|
||||||
|
type=org_type,
|
||||||
|
city=attrs['city']
|
||||||
|
).exists():
|
||||||
|
raise OrganizationTypeRepeatableException()
|
||||||
|
|
||||||
|
if org_type.org_type_field == 'CO' and self.Meta.model.objects.filter(
|
||||||
|
type=org_type,
|
||||||
|
province=attrs['province'],
|
||||||
|
city=attrs['city']
|
||||||
|
).exists():
|
||||||
|
raise OrganizationTypeRepeatableException()
|
||||||
|
|
||||||
|
return attrs
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
""" Custom output """
|
""" Custom output """
|
||||||
representation = super().to_representation(instance)
|
representation = super().to_representation(instance)
|
||||||
|
|||||||
@@ -27,6 +27,14 @@ class OrganizationNationalUniqueIDException(APIException):
|
|||||||
default_code = 'organization_unique_id_exist'
|
default_code = 'organization_unique_id_exist'
|
||||||
|
|
||||||
|
|
||||||
|
class OrganizationTypeRepeatableException(APIException):
|
||||||
|
""" if organization type is repeatable """
|
||||||
|
|
||||||
|
status_code = status.HTTP_403_FORBIDDEN
|
||||||
|
default_detail = _('این نوع سازمان قابلیت تکرار ندارد و از قبل وجود دارد') # noqa
|
||||||
|
default_code = 'organization_type_repeatable'
|
||||||
|
|
||||||
|
|
||||||
class UserExistException(APIException):
|
class UserExistException(APIException):
|
||||||
""" if user exist """
|
""" if user exist """
|
||||||
|
|
||||||
|
|||||||
@@ -461,3 +461,115 @@ AttributeError: 'NoneType' object has no attribute 'get'
|
|||||||
[2025-10-29 09:51:33,813] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
[2025-10-29 09:51:33,813] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
[2025-10-29 09:51:47,218] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
[2025-10-29 09:51:47,218] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
[2025-10-29 09:51:47,219] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
[2025-10-29 09:51:47,219] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
||||||
|
[2025-10-29 10:00:27,432] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:00:29,717] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:03:41,269] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:03:43,232] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:04:47,365] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:04:50,277] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:09:32,639] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:09:34,437] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:21:27,175] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:21:29,082] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:23:50,014] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:23:50,040] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
||||||
|
[2025-10-29 10:23:59,952] ERROR django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Internal Server Error: /auth/api/v1/organization/
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||||||
|
response = get_response(request)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||||||
|
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||||||
|
return view_func(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||||||
|
return self.dispatch(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||||||
|
response = self.handle_exception(exc)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 472, in handle_exception
|
||||||
|
response = exception_handler(exc, context)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||||||
|
response = handler(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\python-3.12.0\Lib\contextlib.py", line 81, in inner
|
||||||
|
return func(*args, **kwds)
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Project\Rasaddam_Backend\apps\authentication\api\v1\api.py", line 265, in create
|
||||||
|
if serializer.is_valid():
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\serializers.py", line 225, in is_valid
|
||||||
|
self._validated_data = self.run_validation(self.initial_data)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\serializers.py", line 447, in run_validation
|
||||||
|
value = self.validate(value)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py", line 251, in validate
|
||||||
|
if not org_type.is_repeatable():
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
TypeError: 'bool' object is not callable
|
||||||
|
[2025-10-29 10:24:00,000] ERROR django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 500 130816
|
||||||
|
[2025-10-29 10:24:19,306] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:24:21,579] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:24:29,252] ERROR django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Internal Server Error: /auth/api/v1/organization/
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||||||
|
response = get_response(request)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||||||
|
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||||||
|
return view_func(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||||||
|
return self.dispatch(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||||||
|
response = self.handle_exception(exc)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 472, in handle_exception
|
||||||
|
response = exception_handler(exc, context)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||||||
|
response = handler(request, *args, **kwargs)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\python-3.12.0\Lib\contextlib.py", line 81, in inner
|
||||||
|
return func(*args, **kwds)
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Project\Rasaddam_Backend\apps\authentication\api\v1\api.py", line 265, in create
|
||||||
|
if serializer.is_valid():
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\serializers.py", line 225, in is_valid
|
||||||
|
self._validated_data = self.run_validation(self.initial_data)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
File "D:\Software\env\Lib\site-packages\rest_framework\serializers.py", line 448, in run_validation
|
||||||
|
assert value is not None, '.validate() should return the validated data'
|
||||||
|
AssertionError: .validate() should return the validated data
|
||||||
|
[2025-10-29 10:24:29,650] ERROR django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 500 124810
|
||||||
|
[2025-10-29 10:24:49,594] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:24:51,318] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:24:57,607] INFO django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 201 368
|
||||||
|
[2025-10-29 10:25:07,658] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:25:07,659] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
||||||
|
[2025-10-29 10:25:14,562] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:25:14,562] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 126
|
||||||
|
[2025-10-29 10:25:17,922] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:25:17,924] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 126
|
||||||
|
[2025-10-29 10:26:26,233] INFO django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 201 365
|
||||||
|
[2025-10-29 10:26:28,588] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:26:28,589] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
||||||
|
[2025-10-29 10:26:33,037] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:26:33,038] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 126
|
||||||
|
[2025-10-29 10:27:09,481] INFO django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 201 375
|
||||||
|
[2025-10-29 10:27:11,414] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:27:11,414] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 86
|
||||||
|
[2025-10-29 10:27:16,016] WARNING django.request | IP: 127.0.0.1 | Path: /auth/api/v1/organization/ | Forbidden: /auth/api/v1/organization/
|
||||||
|
[2025-10-29 10:27:16,017] WARNING django.server | IP: - | Path: - | "POST /auth/api/v1/organization/ HTTP/1.1" 403 126
|
||||||
|
[2025-10-29 10:30:41,225] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
[2025-10-29 10:30:44,066] INFO django.utils.autoreload | IP: - | Path: - | Watching for file changes with StatReloader
|
||||||
|
[2025-10-29 10:32:34,721] INFO django.utils.autoreload | IP: - | Path: - | D:\Project\Rasaddam_Backend\apps\authentication\api\v1\serializers\serializer.py changed, reloading.
|
||||||
|
|||||||
Reference in New Issue
Block a user