From 7753c98f4315fb8e74c6c389169401e197af96d7 Mon Sep 17 00:00:00 2001 From: Jon Date: Sat, 7 Jun 2025 19:55:52 +0930 Subject: [PATCH] revert(access): revert model inheriteance work ref: #804 #792 --- app/access/models/team_user.py | 57 +++-- app/access/serializers/teams.py | 2 +- ...alizer.py => test_team_user_serializer.py} | 0 .../tests/unit/team_user/team_user_api_v2.py | 2 +- .../unit/team_user/test_team_user_api_v2.py | 219 ++++++++++++++++++ ...r_viewset.py => test_team_user_viewset.py} | 2 +- ..._model.py => test_unit_team_user_model.py} | 0 app/access/urls_api.py | 6 +- app/itam/urls_api.py | 2 +- app/tests/fixtures/__init__.py | 2 +- app/tests/fixtures/model_teamuser.py | 8 +- 11 files changed, 274 insertions(+), 26 deletions(-) rename app/access/tests/functional/team_user/{team_user_serializer.py => test_team_user_serializer.py} (100%) create mode 100644 app/access/tests/unit/team_user/test_team_user_api_v2.py rename app/access/tests/unit/team_user/{team_user_viewset.py => test_team_user_viewset.py} (94%) rename app/access/tests/unit/team_user/{unit_team_user_model.py => test_unit_team_user_model.py} (100%) diff --git a/app/access/models/team_user.py b/app/access/models/team_user.py index 43f72374..aacb213b 100644 --- a/app/access/models/team_user.py +++ b/app/access/models/team_user.py @@ -4,28 +4,24 @@ from django.conf import settings from django.db import models from django.contrib.auth.models import Group +from rest_framework.reverse import reverse + from access.fields import ( + AutoCreatedField, AutoLastModifiedField ) from access.models.tenant import Tenant from access.models.team import Team -from core.models.centurion import CenturionModel +from core.lib.feature_not_used import FeatureNotUsed +from core.mixin.history_save import SaveHistory User = django.contrib.auth.get_user_model() -class TeamUsers( - CenturionModel -): - - _audit_enabled = False - - _notes_enabled = False - - organization = None # Dont add organization field +class TeamUsers(SaveHistory): class Meta: @@ -35,6 +31,15 @@ class TeamUsers( verbose_name_plural = "Team Users" + + id = models.AutoField( + blank=False, + help_text = 'ID of this Team User', + primary_key=True, + unique=True, + verbose_name = 'ID' + ) + team = models.ForeignKey( Team, blank = False, @@ -61,6 +66,8 @@ class TeamUsers( verbose_name='manager', ) + created = AutoCreatedField() + modified = AutoLastModifiedField() page_layout: list = [] @@ -70,6 +77,11 @@ class TeamUsers( 'manager' ] + history_app_label: str = None + history_model_name: str = None + kb_model_name: str = None + note_basename: str = None + def delete(self, using=None, keep_parents=False): """ Delete Team @@ -91,16 +103,27 @@ class TeamUsers( return self.team.organization - def get_url_kwargs(self, many = False) -> dict: + def get_url( self, request = None ) -> str: - kwargs = super().get_url_kwargs() - - kwargs.update({ + url_kwargs: dict = { 'organization_id': self.team.organization.id, - 'team_id': self.team.id - }) + 'team_id': self.team.id, + 'pk': self.id + } - return kwargs + print(f'url kwargs are: {url_kwargs}') + + + if request: + + return reverse(f"v2:_api_v2_organization_team_user-detail", request=request, kwargs = url_kwargs ) + + return reverse(f"v2:_api_v2_organization_team_user-detail", kwargs = url_kwargs ) + + + def get_url_kwargs_notes(self): + + return FeatureNotUsed def save(self, *args, **kwargs): diff --git a/app/access/serializers/teams.py b/app/access/serializers/teams.py index 46c5a1b7..d581b572 100644 --- a/app/access/serializers/teams.py +++ b/app/access/serializers/teams.py @@ -65,7 +65,7 @@ class TeamModelSerializer( get_url.update({ 'users': reverse( - 'v2:_api_teamuser-list', + 'v2:_api_v2_organization_team_user-list', request=self.context['view'].request, kwargs={ 'organization_id': item.organization.id, diff --git a/app/access/tests/functional/team_user/team_user_serializer.py b/app/access/tests/functional/team_user/test_team_user_serializer.py similarity index 100% rename from app/access/tests/functional/team_user/team_user_serializer.py rename to app/access/tests/functional/team_user/test_team_user_serializer.py diff --git a/app/access/tests/unit/team_user/team_user_api_v2.py b/app/access/tests/unit/team_user/team_user_api_v2.py index ad46bbe6..8d0d0fa8 100644 --- a/app/access/tests/unit/team_user/team_user_api_v2.py +++ b/app/access/tests/unit/team_user/team_user_api_v2.py @@ -27,7 +27,7 @@ class TeamUserAPI( app_namespace = 'v2' - url_name = '_api_teamuser' + url_name = '_api_v2_organization_team_user' @classmethod def setUpTestData(self): diff --git a/app/access/tests/unit/team_user/test_team_user_api_v2.py b/app/access/tests/unit/team_user/test_team_user_api_v2.py new file mode 100644 index 00000000..8d0d0fa8 --- /dev/null +++ b/app/access/tests/unit/team_user/test_team_user_api_v2.py @@ -0,0 +1,219 @@ +import django +import pytest + +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +from django.shortcuts import reverse +from django.test import Client, TestCase + +from rest_framework.relations import Hyperlink + +from access.models.tenant import Tenant as Organization +from access.models.team import Team +from access.models.team_user import TeamUsers + +from api.tests.abstract.api_fields import APICommonFields + +User = django.contrib.auth.get_user_model() + + + +class TeamUserAPI( + TestCase, + APICommonFields +): + + model = TeamUsers + + app_namespace = 'v2' + + url_name = '_api_v2_organization_team_user' + + @classmethod + def setUpTestData(self): + """Setup Test + + 1. Create the object + 2. create view user + 3. add user as org manager + 4. make api request + """ + + organization = Organization.objects.create(name='test_org') + + self.organization = organization + + different_organization = Organization.objects.create(name='test_different_organization') + + + view_permissions = Permission.objects.get( + codename = 'view_' + self.model._meta.model_name, + content_type = ContentType.objects.get( + app_label = self.model._meta.app_label, + model = self.model._meta.model_name, + ) + ) + + view_team = Team.objects.create( + team_name = 'view_team', + organization = organization, + ) + + view_team.permissions.set([view_permissions]) + + + self.view_user = User.objects.create_user(username="test_user_view", password="password") + + + self.item = TeamUsers.objects.create( + team = view_team, + user = self.view_user + ) + + self.url_view_kwargs = {'organization_id': self.organization.id, 'team_id': view_team.id, 'pk': self.item.id} + + self.url_kwargs = {'organization_id': self.organization.id, 'team_id': view_team.id} + + + client = Client() + url = reverse(self.app_namespace + ':' + self.url_name + '-detail', kwargs=self.url_view_kwargs) + + + client.force_login(self.view_user) + response = client.get(url) + + self.api_data = response.data + + + + + def test_api_field_exists_manager(self): + """ Test for existance of API Field + + manager field must exist + """ + + assert 'manager' in self.api_data + + + def test_api_field_type_manager(self): + """ Test for type for API Field + + manager field must be bool + """ + + assert type(self.api_data['manager']) is bool + + + + def test_api_field_exists_created(self): + """ Test for existance of API Field + + created field must exist + """ + + assert 'created' in self.api_data + + + def test_api_field_type_created(self): + """ Test for type for API Field + + created field must be str + """ + + assert type(self.api_data['created']) is str + + + + def test_api_field_exists_modified(self): + """ Test for existance of API Field + + modified field must exist + """ + + assert 'modified' in self.api_data + + + def test_api_field_type_modified(self): + """ Test for type for API Field + + modified field must be str + """ + + assert type(self.api_data['modified']) is str + + + + + # def test_api_field_exists_permissions(self): + # """ Test for existance of API Field + + # permissions field must exist + # """ + + # assert 'permissions' in self.api_data + + + # def test_api_field_type_permissions(self): + # """ Test for type for API Field + + # url field must be list + # """ + + # assert type(self.api_data['permissions']) is list + + + + # def test_api_field_exists_permissions_id(self): + # """ Test for existance of API Field + + # permissions.id field must exist + # """ + + # assert 'id' in self.api_data['permissions'][0] + + + # def test_api_field_type_permissions_id(self): + # """ Test for type for API Field + + # permissions.id field must be int + # """ + + # assert type(self.api_data['permissions'][0]['id']) is int + + + # def test_api_field_exists_permissions_display_name(self): + # """ Test for existance of API Field + + # permissions.display_name field must exist + # """ + + # assert 'display_name' in self.api_data['permissions'][0] + + + # def test_api_field_type_permissions_display_name(self): + # """ Test for type for API Field + + # permissions.display_name field must be str + # """ + + # assert type(self.api_data['permissions'][0]['display_name']) is str + + + + # def test_api_field_exists_permissions_url(self): + # """ Test for existance of API Field + + # permissions.url field must exist + # """ + + # assert 'url' in self.api_data['permissions'][0] + + + # def test_api_field_type_permissions_url(self): + # """ Test for type for API Field + + # permissions.url field must be str + # """ + + # assert type(self.api_data['permissions'][0]['url']) is Hyperlink diff --git a/app/access/tests/unit/team_user/team_user_viewset.py b/app/access/tests/unit/team_user/test_team_user_viewset.py similarity index 94% rename from app/access/tests/unit/team_user/team_user_viewset.py rename to app/access/tests/unit/team_user/test_team_user_viewset.py index 90a3eefc..dec75e2e 100644 --- a/app/access/tests/unit/team_user/team_user_viewset.py +++ b/app/access/tests/unit/team_user/test_team_user_viewset.py @@ -16,7 +16,7 @@ class TeamUserViewsetList( viewset = ViewSet - route_name = 'API:_api_teamuser' + route_name = 'API:_api_v2_organization_team_user' @classmethod diff --git a/app/access/tests/unit/team_user/unit_team_user_model.py b/app/access/tests/unit/team_user/test_unit_team_user_model.py similarity index 100% rename from app/access/tests/unit/team_user/unit_team_user_model.py rename to app/access/tests/unit/team_user/test_unit_team_user_model.py diff --git a/app/access/urls_api.py b/app/access/urls_api.py index ba0e04d3..62601744 100644 --- a/app/access/urls_api.py +++ b/app/access/urls_api.py @@ -8,7 +8,7 @@ from access.viewsets import ( organization as organization_v2, role, team, - team_user, + team_user as team_user_v2 ) entity_type_names = '' @@ -76,8 +76,8 @@ router.register( router.register( prefix = 'access/tenant/(?P[0-9]+)/team/(?P[0-9]+)/user', - viewset = team_user.ViewSet, - basename = '_api_teamuser' + viewset = team_user_v2.ViewSet, + basename = '_api_v2_organization_team_user' ) router.register( diff --git a/app/itam/urls_api.py b/app/itam/urls_api.py index a6a4d096..0f970409 100644 --- a/app/itam/urls_api.py +++ b/app/itam/urls_api.py @@ -47,7 +47,7 @@ router.register( basename = '_api_v2_device_operating_system') router.register( prefix = 'device/(?P[0-9]+)/software', viewset = device_software_v2.ViewSet, - basename = '_api_v2_device_software' + basename = '_api_devicesoftware' ) router.register( prefix = 'device/(?P[0-9]+)/service', viewset = service_device_v2.ViewSet, diff --git a/app/tests/fixtures/__init__.py b/app/tests/fixtures/__init__.py index 982f15c8..1d3ac74b 100644 --- a/app/tests/fixtures/__init__.py +++ b/app/tests/fixtures/__init__.py @@ -122,7 +122,7 @@ from .model_team import ( ) from .model_teamuser import ( - model_teamuser, + model_teamusers, ) from .model_tenancyabstract import ( diff --git a/app/tests/fixtures/model_teamuser.py b/app/tests/fixtures/model_teamuser.py index 8ba8e8cd..4df85bc5 100644 --- a/app/tests/fixtures/model_teamuser.py +++ b/app/tests/fixtures/model_teamuser.py @@ -4,6 +4,12 @@ from access.models.team_user import TeamUsers @pytest.fixture( scope = 'class') -def model_teamuser(request): +def model_teamusers(request): + + yield TeamUsers + + +@pytest.fixture( scope = 'class') +def kwargs_teamusers(request): yield TeamUsers