From 9ee2a8502c3f3bc6fa5405797b9ab1db21a83c6d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste <bleme@pm.me> Date: Tue, 19 Feb 2019 17:35:38 +0100 Subject: [PATCH] update: manage slug on custom model --- djangoldp/models.py | 13 ++++++++++--- djangoldp/serializers.py | 2 +- djangoldp/tests/urls.py | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/djangoldp/models.py b/djangoldp/models.py index 61d746a8..00c63943 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -1,10 +1,14 @@ from django.conf import settings from django.db import models +from django.urls import get_resolver class Model(models.Model): container_path = None + def get_container_path(self): + return self.container_path + def get_absolute_url(self): return Model.resource_id(self) @@ -13,16 +17,19 @@ class Model(models.Model): @classmethod def resource_id(cls, instance): - return "{}{}".format(Model.container_id(instance), instance.pk) + view_name = '{}-detail'.format(instance._meta.object_name.lower()) + slug_field = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][1][0]) + if slug_field.startswith('/'): + slug_field = slug_field[1:] + return "{}{}".format(Model.container_id(instance), getattr(instance, slug_field)) @classmethod def container_id(cls, instance): if isinstance(instance, cls): path = instance.container_path else: - from django.urls import get_resolver view_name = '{}-list'.format(instance._meta.object_name.lower()) - path = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0], instance.pk) + path = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0]) if not path.startswith("/"): path = "/{}".format(path) diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index 815be906..a2d0f6dc 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -41,7 +41,7 @@ class LDListMixin: try: object_list = dictionary["@graph"] view_name = '{}-list'.format(self.parent.Meta.model._meta.object_name.lower()) - part_id = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0], self.parent.instance.pk) + part_id = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0]) obj = next(filter(lambda o: part_id in o['@id'], object_list)) list = super().get_value(obj) try: diff --git a/djangoldp/tests/urls.py b/djangoldp/tests/urls.py index 8e1cbc86..392b0e2b 100644 --- a/djangoldp/tests/urls.py +++ b/djangoldp/tests/urls.py @@ -1,6 +1,6 @@ from django.conf import settings -from djangoldp.tests.models import Skill, JobOffer, Message, Thread, Dummy +from djangoldp.tests.models import Skill, JobOffer, Message, Thread, Dummy, LDPDummy from djangoldp.views import LDPViewSet from django.conf.urls import url @@ -12,4 +12,5 @@ urlpatterns = [ url(r'^threads/', LDPViewSet.urls(model=Thread, nested_fields=["message_set"], permission_classes=())), url(r'^users/', LDPViewSet.urls(model=settings.AUTH_USER_MODEL, permission_classes=[])), url(r'^dummys/', LDPViewSet.urls(model=Dummy, permission_classes=[])), + url(r'^ldp-dummys/', LDPViewSet.urls(model=LDPDummy, permission_classes=[])), ] \ No newline at end of file -- GitLab