first base of project-changed apps: Herd-livestock-tag-log-elasticsearch-
This commit is contained in:
20
apps/tag/migrations/0002_tag_city.py
Normal file
20
apps/tag/migrations/0002_tag_city.py
Normal 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'),
|
||||
),
|
||||
]
|
||||
@@ -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',
|
||||
),
|
||||
]
|
||||
23
apps/tag/migrations/0004_tag_created_by_tag_modified_by.py
Normal file
23
apps/tag/migrations/0004_tag_created_by_tag_modified_by.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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',
|
||||
),
|
||||
]
|
||||
26
apps/tag/migrations/0006_tag_created_by_tag_modified_by.py
Normal file
26
apps/tag/migrations/0006_tag_created_by_tag_modified_by.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
# Your urls go here
|
||||
from django.urls import path, include
|
||||
|
||||
urlpatterns = [
|
||||
path('web/api/', include('apps.tag.web.api.v1.urls'))
|
||||
]
|
||||
|
||||
58
apps/tag/web/api/v1/api.py
Normal file
58
apps/tag/web/api/v1/api.py
Normal 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)
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user