Skip to content

Commit 40331aa

Browse files
committed
Added aliases to the entity entries API
1 parent 4f7afc3 commit 40331aa

File tree

6 files changed

+66
-69
lines changed

6 files changed

+66
-69
lines changed

entry/api_v2/serializers.py

+16-22
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from airone.lib.types import AttrDefaultValue, AttrType
2424
from entity.api_v2.serializers import EntitySerializer
2525
from entity.models import Entity, EntityAttr
26-
from entry.models import Attribute, AttributeValue, Entry, AliasEntry
26+
from entry.models import AliasEntry, Attribute, AttributeValue, Entry
2727
from entry.settings import CONFIG as CONFIG_ENTRY
2828
from group.models import Group
2929
from job.models import Job, JobStatus
@@ -214,6 +214,16 @@ class AttrTypeField(serializers.IntegerField):
214214
schema = EntityAttributeTypeSerializer()
215215

216216

217+
class EntryAliasSerializer(serializers.ModelSerializer):
218+
class Meta:
219+
model = AliasEntry
220+
fields = [
221+
"id",
222+
"name",
223+
"entry",
224+
]
225+
226+
217227
class EntryBaseSerializer(serializers.ModelSerializer):
218228
# This attribute toggle privileged mode that allow user to CRUD Entry without
219229
# considering permission. This must not change from program, but declare in a
@@ -222,6 +232,7 @@ class EntryBaseSerializer(serializers.ModelSerializer):
222232

223233
schema = EntitySerializer(read_only=True)
224234
deleted_user = UserBaseSerializer(read_only=True, allow_null=True)
235+
aliases = EntryAliasSerializer(many=True, read_only=True)
225236

226237
class Meta:
227238
model = Entry
@@ -233,6 +244,7 @@ class Meta:
233244
"deleted_user",
234245
"deleted_time",
235246
"updated_time",
247+
"aliases",
236248
]
237249
extra_kwargs = {
238250
"id": {"read_only": True},
@@ -296,6 +308,9 @@ def _validate(self, schema: Entity, name: str, attrs: list[dict[str, Any]]):
296308
"validate_entry", schema.name, user, schema.name, name, attrs, self.instance
297309
)
298310

311+
def get_aliases(self, obj: Entry):
312+
return obj.aliases.all()
313+
299314

300315
@extend_schema_field({})
301316
class AttributeValueField(serializers.Field):
@@ -1318,24 +1333,3 @@ def save(self, **kwargs) -> None:
13181333
params=self.validated_data,
13191334
)
13201335
job.run()
1321-
1322-
1323-
class EntryAliasRetrieveSerializer(serializers.ModelSerializer):
1324-
entry = EntryRetrieveSerializer()
1325-
1326-
class Meta:
1327-
model = Entry
1328-
fields = [
1329-
"id",
1330-
"name",
1331-
"entry",
1332-
]
1333-
1334-
class EntryAliasUpdateSerializer(serializers.ModelSerializer):
1335-
class Meta:
1336-
model = AliasEntry
1337-
fields = [
1338-
"id",
1339-
"name",
1340-
"entry",
1341-
]

entry/api_v2/urls.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"<int:pk>/histories/",
4242
views.EntryAPI.as_view(
4343
{
44-
"get": "list",
44+
"get": "list_histories",
4545
}
4646
),
4747
),
@@ -55,15 +55,15 @@
5555
),
5656
path(
5757
"alias/",
58-
views.AliasUpdateAPI.as_view(
58+
views.EntryAliasAPI.as_view(
5959
{
6060
"post": "create",
6161
}
6262
),
6363
),
6464
path(
6565
"alias/<int:pk>",
66-
views.AliasUpdateAPI.as_view(
66+
views.EntryAliasAPI.as_view(
6767
{
6868
"delete": "destroy",
6969
}

entry/api_v2/views.py

+8-29
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from django.conf import settings
66
from django.db.models import Prefetch, Q
7-
from django.http.response import JsonResponse
87
from drf_spectacular.types import OpenApiTypes
98
from drf_spectacular.utils import OpenApiParameter, extend_schema
109
from rest_framework import generics, serializers, status, viewsets
@@ -34,9 +33,8 @@
3433
AdvancedSearchResultExportSerializer,
3534
AdvancedSearchResultSerializer,
3635
AdvancedSearchSerializer,
36+
EntryAliasSerializer,
3737
EntryAttributeValueRestoreSerializer,
38-
EntryAliasRetrieveSerializer,
39-
EntryAliasUpdateSerializer,
4038
EntryBaseSerializer,
4139
EntryCopySerializer,
4240
EntryExportSerializer,
@@ -46,7 +44,7 @@
4644
EntryUpdateSerializer,
4745
GetEntryAttrReferralSerializer,
4846
)
49-
from entry.models import Attribute, AttributeValue, Entry, AliasEntry
47+
from entry.models import AliasEntry, Attribute, AttributeValue, Entry
5048
from entry.services import AdvancedSearchService
5149
from entry.settings import CONFIG
5250
from entry.settings import CONFIG as ENTRY_CONFIG
@@ -66,7 +64,8 @@ def has_object_permission(self, request: Request, view, obj) -> bool:
6664
"destroy": ACLType.Writable,
6765
"restore": ACLType.Writable,
6866
"copy": ACLType.Writable,
69-
"list": ACLType.Readable, # histories
67+
"list_histories": ACLType.Readable, # histories
68+
"list_alias": ACLType.Readable,
7069
}
7170

7271
if not user.has_permission(obj, permisson.get(view.action)):
@@ -86,7 +85,7 @@ def get_serializer_class(self):
8685
"update": serializers.Serializer,
8786
"copy": EntryCopySerializer,
8887
"list": EntryHistoryAttributeValueSerializer,
89-
"list_alias": AliasListAPI,
88+
"list_alias": EntryAliasSerializer,
9089
}
9190
return serializer.get(self.action, EntryBaseSerializer)
9291

@@ -177,16 +176,13 @@ def copy(self, request: Request, *args, **kwargs) -> Response:
177176
return Response({}, status=status.HTTP_200_OK)
178177

179178
def list_alias(self, request: Request, *args, **kwargs) -> Response:
180-
print("[onix/view.list_alias(00)]")
181-
user: User = self.request.user
182179
entry: Entry = self.get_object()
183180

184181
self.queryset = AliasEntry.objects.filter(entry=entry, entry__is_active=True)
185182

186183
return super(EntryAPI, self).list(request, *args, **kwargs)
187184

188-
# histories view
189-
def list(self, request: Request, *args, **kwargs) -> Response:
185+
def list_histories(self, request: Request, *args, **kwargs) -> Response:
190186
user: User = self.request.user
191187
entry: Entry = self.get_object()
192188

@@ -840,25 +836,8 @@ def delete(self, request: Request, *args, **kwargs) -> Response:
840836
return Response(status=status.HTTP_204_NO_CONTENT)
841837

842838

843-
class AliasListAPI(viewsets.ModelViewSet):
844-
permission_classes = [IsAuthenticated & EntryPermission]
845-
pagination_class = LimitOffsetPagination
846-
serializer_class = EntryAliasRetrieveSerializer
847-
848-
def get_queryset(self, *args, **kwargs):
849-
# get all aliasentry items that are associated with specified entryid
850-
return aliasentry.objects.filter(entry__id=self.kwargs["pk"])
851-
852-
class AliasUpdateAPI(viewsets.ModelViewSet):
853-
# permission_classes = [IsAuthenticated & EntryPermission]
839+
class EntryAliasAPI(viewsets.ModelViewSet):
854840
permission_classes = [IsAuthenticated]
855841
pagination_class = LimitOffsetPagination
842+
serializer_class = EntryAliasSerializer
856843
queryset = AliasEntry.objects.filter(entry__is_active=True)
857-
858-
def get_serializer_class(self):
859-
print("[onix/view/get_serializer_class(00)] action: %s" % str(self.action))
860-
serializer = {
861-
"create": EntryAliasUpdateSerializer,
862-
"destroy": EntryAliasUpdateSerializer,
863-
}
864-
return serializer.get(self.action, EntryAliasRetrieveSerializer)

entry/tests/test_api_v2_alias.py

+37-12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import json
22

33
from airone.lib.test import AironeViewTest
4-
from entity.models import Entity, EntityAttr
5-
from entry.models import Attribute, AttributeValue, Entry, AliasEntry
4+
from entry.models import AliasEntry
65
from user.models import User
76

87

@@ -15,6 +14,30 @@ def setUp(self):
1514
self.model = self.create_entity(self.user, "TestModel")
1615
self.item = self.add_entry(self.user, "Item", self.model)
1716

17+
def test_entry_alias_list(self):
18+
# initialize Aliases to be listed
19+
[self.item.add_alias(x) for x in ["foo", "bar", "baz"]]
20+
21+
item2 = self.add_entry(self.user, "Item2", self.model)
22+
item2.add_alias("hoge")
23+
24+
# create another Model, Item and Aliases to test to get only Aliases
25+
# that are associated with specified Item in the URL parameter.
26+
another_model = self.create_entity(self.user, "AnotherModel")
27+
another_item = self.add_entry(self.user, "Item", another_model)
28+
another_item.add_alias("hoge")
29+
30+
# send request to list aliases
31+
resp = self.client.get("/entity/api/v2/%d/entries/?is_active=true" % self.model.id)
32+
self.assertEqual(resp.status_code, 200)
33+
34+
# check this returned only Aliases that are associated with self.item
35+
self.assertEqual(resp.json()["count"], 2)
36+
self.assertEqual(
37+
[x["name"] for x in resp.json()["results"][0]["aliases"]], ["foo", "bar", "baz"]
38+
)
39+
self.assertEqual([x["name"] for x in resp.json()["results"][1]["aliases"]], ["hoge"])
40+
1841
def test_list(self):
1942
# initialize Aliases to be listed
2043
[self.item.add_alias(x) for x in ["foo", "bar", "baz"]]
@@ -32,13 +55,19 @@ def test_list(self):
3255
# check this returned only Aliases that are associated with self.item
3356
self.assertEqual(resp.json()["count"], 3)
3457
self.assertEqual([x["name"] for x in resp.json()["results"]], ["foo", "bar", "baz"])
35-
self.assertTrue(all([x["entry"]["id"] == self.item.id for x in resp.json()["results"]]))
58+
self.assertTrue(all([x["entry"] == self.item.id for x in resp.json()["results"]]))
3659

3760
def test_create(self):
38-
resp = self.client.post("/entry/api/v2/alias/", json.dumps({
39-
"name": "NewAlias",
40-
"entry": self.item.id,
41-
}), "application/json")
61+
resp = self.client.post(
62+
"/entry/api/v2/alias/",
63+
json.dumps(
64+
{
65+
"name": "NewAlias",
66+
"entry": self.item.id,
67+
}
68+
),
69+
"application/json",
70+
)
4271
self.assertEqual(resp.status_code, 201)
4372
self.assertEqual(resp.json()["name"], "NewAlias")
4473
self.assertEqual(resp.json()["entry"], self.item.id)
@@ -51,11 +80,7 @@ def test_delete(self):
5180
alias = self.item.add_alias("Deleting Alias")
5281

5382
# send request to list aliases
54-
resp = self.client.delete(
55-
"/entry/api/v2/alias/%s" % alias.id,
56-
None,
57-
"application/json"
58-
)
83+
resp = self.client.delete("/entry/api/v2/alias/%s" % alias.id, None, "application/json")
5984
self.assertEqual(resp.status_code, 204)
6085

6186
# check specified Alias was deleted actually

entry/tests/test_model.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from airone.lib.test import AironeTestCase
1212
from airone.lib.types import AttrType
1313
from entity.models import Entity, EntityAttr
14-
from entry.models import Attribute, AttributeValue, Entry, AliasEntry
14+
from entry.models import Attribute, AttributeValue, Entry
1515
from entry.services import AdvancedSearchService
1616
from entry.settings import CONFIG
1717
from group.models import Group
@@ -5018,4 +5018,4 @@ def test_max_entries(self):
50185018
settings.MAX_ENTRIES = None
50195019
Entry.objects.create(
50205020
name=f"entry-{max_entries}", created_user=self._user, schema=self._entity
5021-
)
5021+
)

entry/tests/test_model_alias.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from airone.lib.test import AironeTestCase
22
from entry.models import AliasEntry
3-
from user.models import User
43

54

65
class ModelTest(AironeTestCase):

0 commit comments

Comments
 (0)