first base of project-changed apps: Herd-livestock-tag-log-elasticsearch-

This commit is contained in:
2025-05-24 15:01:55 +03:30
parent eab40af15d
commit 90a46e493c
129 changed files with 3844 additions and 187 deletions

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.20 on 2025-05-10 08:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('authentication', '0008_remove_organization_type_organizationtype'),
('tag', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='tag',
name='city',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tag_city', to='authentication.city'),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.20 on 2025-05-17 06:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tag', '0002_tag_city'),
]
operations = [
migrations.RemoveField(
model_name='tag',
name='created_by',
),
migrations.RemoveField(
model_name='tag',
name='modified_by',
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.20 on 2025-05-17 06:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tag', '0003_remove_tag_created_by_remove_tag_modified_by'),
]
operations = [
migrations.AddField(
model_name='tag',
name='created_by',
field=models.CharField(max_length=50, null=True),
),
migrations.AddField(
model_name='tag',
name='modified_by',
field=models.CharField(max_length=50, null=True),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.20 on 2025-05-17 06:27
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('tag', '0004_tag_created_by_tag_modified_by'),
]
operations = [
migrations.RemoveField(
model_name='tag',
name='created_by',
),
migrations.RemoveField(
model_name='tag',
name='modified_by',
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.20 on 2025-05-17 06:29
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),
('tag', '0005_remove_tag_created_by_remove_tag_modified_by'),
]
operations = [
migrations.AddField(
model_name='tag',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='tag',
name='modified_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.20 on 2025-05-17 06:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tag', '0006_tag_created_by_tag_modified_by'),
]
operations = [
migrations.AddField(
model_name='tag',
name='creator_info',
field=models.CharField(max_length=100, null=True),
),
migrations.AddField(
model_name='tag',
name='modifier_info',
field=models.CharField(max_length=100, null=True),
),
]

View File

@@ -1,25 +1,35 @@
from rest_framework import permissions
from apps.core import permissions
# example Code
class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission):
edit_methods = ("PUT", "PATCH")
class TagCreatePermission(permissions.BasePermission):
""" permission to create tag """
def has_permission(self, request, view):
if request.user.is_authenticated:
user_level_info = self.get_user_permissions(request, view)
if 'tag_create' in user_level_info['permissions']:
return True
def has_object_permission(self, request, view, obj):
if request.user.is_superuser:
class TagUpdatePermission(permissions.BasePermission):
""" permission to update tag """
def has_permission(self, request, view):
user_level_info = self.get_user_permissions(request, view)
if 'tag_update' in user_level_info['permissions']:
return True
if request.method in permissions.SAFE_METHODS:
class TagTrashPermission(permissions.BasePermission):
""" permission to trash tag """
def has_permission(self, request, view):
user_level_info = self.get_user_permissions(request, view)
if 'tag_trash' in user_level_info['permissions']:
return True
if obj.author == request.user:
return True
if request.user.is_staff and request.method not in self.edit_methods:
class TagDeletePermission(permissions.BasePermission):
""" permission to delete trash """
def has_permission(self, request, view):
user_level_info = self.get_user_permissions(request, view)
if 'tag_trash' in user_level_info['permissions']:
return True
return False

View File

@@ -1 +1,5 @@
# Your urls go here
from django.urls import path, include
urlpatterns = [
path('web/api/', include('apps.tag.web.api.v1.urls'))
]

View File

@@ -0,0 +1,58 @@
from rest_framework import viewsets
from apps.tag import models as tag_models
from rest_framework import status
from rest_framework.response import Response
from .serializers import TagSerializer
from rest_framework.decorators import action
from django.db import transaction
from rest_framework.exceptions import APIException
from apps.tag import permissions as tag_permissions
def trash(queryset, pk):
""" sent object to trash """
obj = queryset.get(id=pk)
obj.trash = True
obj.save()
def delete(queryset, pk):
""" full delete object """
obj = queryset.get(id=pk)
obj.delete()
class TagViewSet(viewsets.ModelViewSet):
queryset = tag_models.Tag.objects.all()
serializer_class = TagSerializer
@action(
methods=['put'],
detail=True,
url_path='trash',
url_name='trash',
name='trash',
)
@transaction.atomic
def trash(self, request, pk=None):
""" Sent Tag to trash """
try:
trash(self.queryset, pk)
except APIException as e:
return Response(e, status.HTTP_204_NO_CONTENT)
@action(
methods=['post'],
detail=True,
url_name='delete',
url_path='delete',
name='delete'
)
@transaction.atomic
def delete(self, request, pk=None):
""" Full delete of Tag object """
try:
delete(self.queryset, pk)
return Response(status=status.HTTP_200_OK)
except APIException as e:
return Response(e, status=status.HTTP_204_NO_CONTENT)

View File

@@ -0,0 +1,27 @@
from rest_framework import serializers
from apps.tag import models as tag_models
from apps.authentication.api.v1.serializers import serializer as auth_serializers
class TagSerializer(serializers.ModelSerializer):
""" Tag Model Serializer """
class Meta:
model = tag_models.Tag
fields = [
'id',
'code',
'province',
'city',
'organization',
'status',
]
def to_representation(self, instance):
""" Customize output of serializer """
representation = super().to_representation(instance)
if isinstance(instance, tag_models.Tag):
representation['province'] = auth_serializers.ProvinceSerializer(instance.province).data
representation['city'] = auth_serializers.CitySerializer(instance.city).data
representation['organization'] = auth_serializers.OrganizationSerializer(instance.organization).data
return representation

View File

@@ -0,0 +1,10 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .api import TagViewSet
router = DefaultRouter()
router.register(r'tag', TagViewSet, basename='tag')
urlpatterns = [
path('v1/', include(router.urls))
]