From f66067778c1f34213a3f5904422f002c889e6b13 Mon Sep 17 00:00:00 2001 From: Mojtaba-z Date: Mon, 1 Dec 2025 10:25:27 +0330 Subject: [PATCH] fix - update page access - v3 --- apps/authorization/api/v1/api.py | 113 ++++++++++++------ .../migrations/0023_alter_page_code.py | 18 +++ apps/authorization/models.py | 2 +- ...onquotastats_free_sale_balance_and_more.py | 23 ++++ ..._quota_stat_quotapresaleitem_quota_stat.py | 25 ++++ 5 files changed, 144 insertions(+), 37 deletions(-) create mode 100644 apps/authorization/migrations/0023_alter_page_code.py create mode 100644 apps/product/migrations/0099_organizationquotastats_free_sale_balance_and_more.py create mode 100644 apps/warehouse/migrations/0046_extrasale_quota_stat_quotapresaleitem_quota_stat.py diff --git a/apps/authorization/api/v1/api.py b/apps/authorization/api/v1/api.py index 427acff..b719d72 100644 --- a/apps/authorization/api/v1/api.py +++ b/apps/authorization/api/v1/api.py @@ -45,14 +45,14 @@ class UpdatePageAccessViewSet(BaseViewSet, SoftDeleteMixin, viewsets.ModelViewSe """ sync update page & access on development version with production """ - url = 'https://api.tdam.rasadyar.com/auth/api/v1/update_access/' + dev_url = 'https://api.tdam.rasadyar.com/auth/api/v1/update_access/' # get data page & permissions data from development - req = requests.get(url) - response = req.json() + dev_req = requests.get(dev_url) + dev_data = dev_req.json() - url = 'https://api.dam.rasadyar.com/auth/api/v1/update_access/update_page_access/' - updated_response = requests.post(url=url, json=response) + prod_url = 'http://127.0.0.1:8000/auth/api/v1/update_access/update_page_access/' + updated_response = requests.post(url=prod_url, json=dev_data) return Response(updated_response.json()) @@ -61,38 +61,79 @@ class UpdatePageAccessViewSet(BaseViewSet, SoftDeleteMixin, viewsets.ModelViewSe """ Sync page & permissions in development with production """ - # if page or permission exists in production, don't create just update - for page in request.data: - page_obj = Page.objects.filter(code=page['code']) - permissions = page.pop('permissions') # remove permissions from data - if not page_obj.exists(): - page_obj = Page.objects.create(**page) - else: - obj = page_obj.first() - obj.update( - name=page['name'], - code=page['code'], - is_active=page['is_active'], - ) + dev_data = request.data + dev_pages_name = [p['name'] for p in dev_data] + dev_perms_name = [] + for item in dev_data: + for perm in item['permissions']: + dev_perms_name.append(perm['name']) - for permission in permissions: - permission.pop('page') # remove page from data - perm = Permissions.objects.filter(page=page_obj, name=permission['name']) - if perm.exists(): - perm.first().update( - name=permission['name'], - description=permission['description'], - category=permission['category'], - page=page_obj, - is_active=permission['is_active'], - modify_state=permission['modify_state'], - ) - else: - Permissions.objects.create( - **permission, - page=page_obj, - ) - return Response(request.data) + pages_to_delete = Page.objects.exclude(name__in=dev_pages_name) + # pages_to_delete.delete() + print(pages_to_delete) + page_map = {} + + for page in dev_data: + page_obj, _ = Page.objects.filter().update_or_create( + code=page['code'], # keep dev page codes in prod + defaults={ + 'name': page['name'], + 'is_active': page['is_active'], + } + ) + page_map[page['name']] = page_obj.id + + permissions_to_delete = Permissions.objects.exclude(name__in=dev_perms_name) + # permissions_to_delete.delete() + print(permissions_to_delete) + + # for perm in dev_data['permissions']: + # permission_obj, _ = Permissions.objects.update_or_create( + # id=perm['id'], # keep dev permission ids in prod + # defaults={ + # 'name': perm['name'], + # 'description': perm['description'], + # 'category': perm['category'], + # 'page_id': page_map[perm['page']], + # 'is_active': perm['is_active'], + # 'modify_state': perm['modify_state'], + # } + # ) + + return Response(dev_data) + + # # if page or permission exists in production, don't create just update + # for page in request.data: + # page_obj = Page.objects.filter(code=page['code']) + # permissions = page.pop('permissions') # remove permissions from data + # if not page_obj.exists(): + # page_obj = Page.objects.create(**page) + # else: + # obj = page_obj.first() + # if obj: + # obj.code = page['code'] + # obj.name = page['name'] + # obj.is_active = page['is_active'] + # page_obj = obj.save() + # + # for permission in permissions: + # permission.pop('page') # remove page from data + # perm = Permissions.objects.filter(page=page_obj, name=permission['name']) + # if perm.exists(): + # perm.update_or_create( + # name=permission['name'], + # description=permission['description'], + # category=permission['category'], + # page=page_obj, + # is_active=permission['is_active'], + # modify_state=permission['modify_state'], + # ) + # else: + # Permissions.objects.create( + # **permission, + # page_id=page.id, + # ) + # return Response(request.data) class RoleViewSet(BaseViewSet, SoftDeleteMixin, viewsets.ModelViewSet): diff --git a/apps/authorization/migrations/0023_alter_page_code.py b/apps/authorization/migrations/0023_alter_page_code.py new file mode 100644 index 0000000..f9b17fd --- /dev/null +++ b/apps/authorization/migrations/0023_alter_page_code.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-12-01 06:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authorization', '0022_alter_role_description'), + ] + + operations = [ + migrations.AlterField( + model_name='page', + name='code', + field=models.CharField(max_length=100), + ), + ] diff --git a/apps/authorization/models.py b/apps/authorization/models.py index 55a14db..b3bf375 100644 --- a/apps/authorization/models.py +++ b/apps/authorization/models.py @@ -9,7 +9,7 @@ from apps.core.models import BaseModel class Page(BaseModel): """ every front-end page on system """ - code = models.CharField(max_length=100, unique=True) + code = models.CharField(max_length=100) name = models.CharField(max_length=255) is_active = models.BooleanField(default=True) diff --git a/apps/product/migrations/0099_organizationquotastats_free_sale_balance_and_more.py b/apps/product/migrations/0099_organizationquotastats_free_sale_balance_and_more.py new file mode 100644 index 0000000..65d6807 --- /dev/null +++ b/apps/product/migrations/0099_organizationquotastats_free_sale_balance_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0 on 2025-12-01 06:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0098_quotausage_quota_stat'), + ] + + operations = [ + migrations.AddField( + model_name='organizationquotastats', + name='free_sale_balance', + field=models.PositiveBigIntegerField(default=0), + ), + migrations.AddField( + model_name='organizationquotastats', + name='pre_sale_balance', + field=models.PositiveBigIntegerField(default=0), + ), + ] diff --git a/apps/warehouse/migrations/0046_extrasale_quota_stat_quotapresaleitem_quota_stat.py b/apps/warehouse/migrations/0046_extrasale_quota_stat_quotapresaleitem_quota_stat.py new file mode 100644 index 0000000..29f472a --- /dev/null +++ b/apps/warehouse/migrations/0046_extrasale_quota_stat_quotapresaleitem_quota_stat.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0 on 2025-12-01 06:53 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0099_organizationquotastats_free_sale_balance_and_more'), + ('warehouse', '0045_inventoryquotasaleitem_quota_stat'), + ] + + operations = [ + migrations.AddField( + model_name='extrasale', + name='quota_stat', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='extra_sales', to='product.organizationquotastats'), + ), + migrations.AddField( + model_name='quotapresaleitem', + name='quota_stat', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pre_sales', to='product.organizationquotastats'), + ), + ]