diff --git a/Rasaddam_Backend/settings.py b/Rasaddam_Backend/settings.py index 9983d2a..861855d 100644 --- a/Rasaddam_Backend/settings.py +++ b/Rasaddam_Backend/settings.py @@ -34,6 +34,7 @@ ALLOWED_HOSTS = [ 'https://localhost:9200', 'https://api.rasadyaar.net', 'https://api.dam.rasadyaar.net', + 'https://dam.rasadyar.net/' 'http://localhost:3000', 'http://192.168.88.130:3000', 'https://rasaddam-front.liara.run' @@ -291,7 +292,8 @@ CORS_ALLOWED_ORIGINS = ( 'http://localhost:3000', 'http://192.168.88.130:3000', 'https://rasadyar.net', - 'https://rasaddam-front.liara.run' + 'https://rasaddam-front.liara.run', + 'https://dam.rasadyar.net/' ) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') diff --git a/apps/authorization/api/v1/api.py b/apps/authorization/api/v1/api.py index d290a81..622fab4 100644 --- a/apps/authorization/api/v1/api.py +++ b/apps/authorization/api/v1/api.py @@ -5,6 +5,7 @@ from apps.authorization.api.v1.serializers import ( PermissionSerializer, UserRelationSerializer ) +from rest_framework.decorators import action from rest_framework.response import Response from apps.authorization.models import ( Role, @@ -12,6 +13,7 @@ from apps.authorization.models import ( UserRelations ) from rest_framework import viewsets +from django.db import transaction class RoleViewSet(viewsets.ModelViewSet): @@ -27,6 +29,17 @@ class PermissionViewSet(viewsets.ModelViewSet): queryset = Permissions.objects.all() serializer_class = PermissionSerializer + @action( + methods=['get'], + detail=False, + url_path='get_user_permissions', + url_name='get_user_permissions', + name='get_user_permissions' + ) + @transaction.atomic + def get_user_permissions(self, request): + pass + class UserRelationViewSet(viewsets.ModelViewSet): """ Crud Operations for User Relations """ diff --git a/apps/authorization/api/v1/serializers.py b/apps/authorization/api/v1/serializers.py index 7e0eb06..f60ec15 100644 --- a/apps/authorization/api/v1/serializers.py +++ b/apps/authorization/api/v1/serializers.py @@ -14,9 +14,17 @@ class PermissionSerializer(serializers.ModelSerializer): fields = [ 'id', 'name', - 'description' + 'description', + 'category', + 'page' ] + def to_representation(self, instance): + representation = super().to_representation(instance) + representation['name'] = 'Hello' + + return representation + class RoleSerializer(serializers.ModelSerializer): class Meta: @@ -63,7 +71,14 @@ class UserRelationSerializer(serializers.ModelSerializer): if instance.role: representation['role'] = RoleSerializer(instance.role).data if instance.permissions: - representation['permissions'] = PermissionSerializer(instance.permissions, many=True).data + permissions = instance.permissions.all() + pages = {} + for permission in permissions: + if permission.page.name not in pages.keys(): + pages.update({ + f'{permission.page.name}': permission.page.permission_page.all().values('name') + }) + representation['perms'] = pages return representation diff --git a/apps/authorization/migrations/0015_permissions_category_permissions_meta_page_and_more.py b/apps/authorization/migrations/0015_permissions_category_permissions_meta_page_and_more.py new file mode 100644 index 0000000..2008524 --- /dev/null +++ b/apps/authorization/migrations/0015_permissions_category_permissions_meta_page_and_more.py @@ -0,0 +1,49 @@ +# Generated by Django 5.0 on 2025-05-31 12:01 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authorization', '0014_permissions_creator_info_permissions_modifier_info_and_more'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='permissions', + name='category', + field=models.CharField(choices=[('api', 'Api'), ('page', 'Page َAccess'), ('element', 'UI Element'), ('feature', 'Feature / Action')], default='api', max_length=50), + ), + migrations.AddField( + model_name='permissions', + name='meta', + field=models.JSONField(default=dict), + ), + migrations.CreateModel( + name='Page', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('code', models.CharField(max_length=100, unique=True)), + ('name', models.CharField(max_length=255)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='permissions', + name='page', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='permission_page', to='authorization.page'), + ), + ] diff --git a/apps/authorization/models.py b/apps/authorization/models.py index d55f16e..385af2d 100644 --- a/apps/authorization/models.py +++ b/apps/authorization/models.py @@ -5,9 +5,42 @@ from apps.core.models import BaseModel # Create your models here. +class Page(BaseModel): + """ every front-end page on system """ + + code = models.CharField(max_length=100, unique=True) + name = models.CharField(max_length=255) + + def __str__(self): + return f'{self.name}-{self.code}' + + def save(self, *args, **kwargs): + super(Page, self).save(*args, **kwargs) + + class Permissions(BaseModel): + """ permission level of users """ + name = models.CharField(max_length=50) description = models.TextField(max_length=500) + category_choices = ( + ('api', 'Api'), + ('page', 'Page َAccess'), + ('element', 'UI Element'), + ('feature', 'Feature / Action') + ) + category = models.CharField( + max_length=50, + choices=category_choices, + default='api' + ) + meta = models.JSONField(default=dict) + page = models.ForeignKey( + Page, + on_delete=models.CASCADE, + related_name='permission_page', + null=True + ) def __str__(self): return f'{self.name}-{self.description}' diff --git a/apps/tag/migrations/0022_alter_tagassignment_status.py b/apps/tag/migrations/0022_alter_tagassignment_status.py new file mode 100644 index 0000000..7ba9720 --- /dev/null +++ b/apps/tag/migrations/0022_alter_tagassignment_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-05-31 12:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tag', '0021_allocatedtags_species_code'), + ] + + operations = [ + migrations.AlterField( + model_name='tagassignment', + name='status', + field=models.CharField(choices=[('A', 'Accept'), ('W', 'Waiting'), ('C', 'Cancel'), ('E', 'Exited')], default='W', max_length=1), + ), + ]