Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1732 | URL registry | fixing namespace and …
Browse files Browse the repository at this point in the history
…uniq clauses
  • Loading branch information
snyaggarwal committed Jan 15, 2024
1 parent 1e88723 commit 6c5b4eb
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 74 deletions.
82 changes: 32 additions & 50 deletions core/integration_tests/tests_url_registries.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def test_post_global_registry(self):
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, organization__isnull=True, user__isnull=True, url='https://foo.bar.com',
namespace__isnull=True
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 1)
Expand Down Expand Up @@ -83,19 +82,44 @@ def test_post_global_registry(self):
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, organization__isnull=True, user__isnull=True, url='https://foo.bar.1.com',
namespace__isnull=True
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 2)

response = self.client.post(
'/url-registry/',
{
'name': 'GlobalRegistry',
'namespace': user.uri,
'url': 'https://foo.bar.2.com',
},
HTTP_AUTHORIZATION=f"Token {user.get_token()}",
format='json',
)

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], user.uri)
self.assertFalse(
URLRegistry.objects.filter(
is_active=True, user=user, url='https://foo.bar.2.com'
).exists()
)
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, user__isnull=True, url='https://foo.bar.2.com', namespace=user.uri
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 3)

def test_post_org_registry(self):
org = OrganizationFactory()
user = org.created_by
response = self.client.post(
org.uri + 'url-registry/',
{
'name': 'GlobalRegistry',
'namespace': 'Foobar', # will be set correctly
'namespace': 'Foobar',
'url': 'https://foo.bar.com',
},
HTTP_AUTHORIZATION=f"Token {user.get_token()}",
Expand All @@ -104,7 +128,7 @@ def test_post_org_registry(self):

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], org.uri)
self.assertEqual(response.data['namespace'], 'Foobar')
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, organization=org, url='https://foo.bar.com'
Expand Down Expand Up @@ -142,42 +166,21 @@ def test_post_org_registry(self):

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], org.uri)
self.assertEqual(response.data['namespace'], None)
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, organization=org, url='https://foo.bar.1.com'
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 2)

response = self.client.post(
'/url-registry/',
{
'name': 'GlobalRegistry',
'namespace': org.uri,
'url': 'https://foo.bar.2.com',
},
HTTP_AUTHORIZATION=f"Token {user.get_token()}",
format='json',
)

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], org.uri)
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, organization=org, url='https://foo.bar.2.com'
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 3)

def test_post_user_registry(self):
user = UserProfileFactory()
response = self.client.post(
user.uri + 'url-registry/',
{
'name': 'GlobalRegistry',
'namespace': 'Foobar', # will be set correctly
'namespace': 'Foobar',
'url': 'https://foo.bar.com',
},
HTTP_AUTHORIZATION=f"Token {user.get_token()}",
Expand All @@ -186,7 +189,7 @@ def test_post_user_registry(self):

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], user.uri)
self.assertEqual(response.data['namespace'], 'Foobar')
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, user=user, url='https://foo.bar.com'
Expand Down Expand Up @@ -224,35 +227,14 @@ def test_post_user_registry(self):

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], user.uri)
self.assertEqual(response.data['namespace'], None)
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, user=user, url='https://foo.bar.1.com'
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 2)

response = self.client.post(
'/url-registry/',
{
'name': 'GlobalRegistry',
'namespace': user.uri,
'url': 'https://foo.bar.2.com',
},
HTTP_AUTHORIZATION=f"Token {user.get_token()}",
format='json',
)

self.assertEqual(response.status_code, 201)
self.assertIsNotNone(response.data['id'])
self.assertEqual(response.data['namespace'], user.uri)
self.assertTrue(
URLRegistry.objects.filter(
is_active=True, user=user, url='https://foo.bar.2.com'
).exists()
)
self.assertEqual(URLRegistry.objects.count(), 3)

def test_get(self):
global_registry = GlobalURLRegistryFactory(name='global')
org_registry = OrganizationURLRegistryFactory(name='org')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.4 on 2024-01-15 02:56

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('url_registry', '0001_initial'),
]

operations = [
migrations.RemoveConstraint(
model_name='urlregistry',
name='global_url_unique',
),
migrations.AddConstraint(
model_name='urlregistry',
constraint=models.UniqueConstraint(condition=models.Q(('is_active', True), ('organization__isnull', True), ('user__isnull', True)), fields=('url',), name='global_url_unique'),
),
]
31 changes: 8 additions & 23 deletions core/url_registry/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.db import models
from pydash import get

from core.common.models import BaseModel

Expand All @@ -17,6 +18,7 @@ class URLRegistry(BaseModel):
)
public_access = None
uri = None
OBJECT_TYPE = 'URLRegistry'

es_fields = {
'name': {'sortable': False, 'filterable': True, 'exact': True},
Expand All @@ -41,31 +43,11 @@ class Meta:
fields=('organization', 'url'), name='org_url_unique'
),
models.UniqueConstraint(
condition=models.Q(is_active=True, namespace__isnull=True),
condition=models.Q(is_active=True, organization__isnull=True, user__isnull=True),
fields=('url',), name='global_url_unique'
),
]

def _set_owner_from_uri(self):
if '/orgs/' in self.namespace:
from core.orgs.models import Organization
self.organization = Organization.objects.filter(uri=self.namespace).first()
elif '/users/' in self.namespace:
from core.users.models import UserProfile
self.user = UserProfile.objects.filter(uri=self.namespace).first()

def clean(self):
self.clean_namespace()

def clean_namespace(self):
owner = self.owner
if owner:
self.namespace = owner.uri
if not owner and self.namespace:
self._set_owner_from_uri()
if not self.owner:
self.namespace = None

def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)
Expand All @@ -74,8 +56,11 @@ def save(self, *args, **kwargs):
def owner(self):
return self.organization or self.user

@property
def owner_type(self):
return get(self.owner, 'resource_type') or None

def is_uniq(self):
self.clean_namespace()
return not self.get_active_entries().filter(url=self.url).exists()

def get_active_entries(self):
Expand All @@ -86,6 +71,6 @@ def get_active_entries(self):
elif self.user:
queryset = queryset.filter(user=self.user)
else:
queryset = queryset.filter(namespace__isnull=True)
queryset = queryset.filter(organization__isnull=True, user__isnull=True)

return queryset
9 changes: 8 additions & 1 deletion core/url_registry/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,16 @@


class URLRegistryBaseSerializer(ModelSerializer):
owner = CharField(read_only=True, source='owner.mnemonic')

class Meta:
model = URLRegistry
fields = ['id', 'name', 'url', 'namespace']
fields = ['id', 'name', 'url', 'namespace', 'owner', 'owner_type', 'type']

def to_representation(self, instance):
data = super().to_representation(instance)
data['type'] = URLRegistry.OBJECT_TYPE
return data


class URLRegistryDetailSerializer(URLRegistryBaseSerializer):
Expand Down
20 changes: 20 additions & 0 deletions core/url_registry/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from core.common.tests import OCLTestCase
from core.orgs.models import Organization
from core.url_registry.models import URLRegistry
from core.users.models import UserProfile


class URLRegistryTest(OCLTestCase):
def test_owner(self):
org = Organization()
user = UserProfile()
self.assertEqual(URLRegistry().owner, None)
self.assertEqual(URLRegistry(organization=org).owner, org)
self.assertEqual(URLRegistry(user=user).owner, user)

def test_owner_type(self):
org = Organization()
user = UserProfile()
self.assertEqual(URLRegistry().owner_type, None)
self.assertEqual(URLRegistry(organization=org).owner_type, 'Organization')
self.assertEqual(URLRegistry(user=user).owner, 'User')

0 comments on commit 6c5b4eb

Please sign in to comment.