From 9ed012911dba50263c4b57fa50d433e8dffe02c3 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste <bleme@pm.me>
Date: Tue, 19 Feb 2019 16:10:03 +0100
Subject: [PATCH] feature: add LDPModel class to manage instance path
 resolution

---
 djangoldp/models.py               | 35 +++++++++++++++++++++++++------
 djangoldp/resolver.py             | 17 ---------------
 djangoldp/tests/tests_resolver.py | 20 +++++++-----------
 3 files changed, 36 insertions(+), 36 deletions(-)
 delete mode 100644 djangoldp/resolver.py

diff --git a/djangoldp/models.py b/djangoldp/models.py
index bcb62f61..abd9ea79 100644
--- a/djangoldp/models.py
+++ b/djangoldp/models.py
@@ -5,19 +5,41 @@ from django.db import models
 class LDPModel(models.Model):
     ldp_path = None
 
-    def full_path(self):
-        return "{}/{}".format(self.container_path(), self.pk)
+    def get_resource_path(self):
+        return LDPModel.resource_path(self)
 
-    def container_path(self):
-        return self.ldp_path
+    def get_container_path(self):
+        return LDPModel.container_path(self)
+
+    @classmethod
+    def resource_path(cls, instance):
+        return "{}{}".format(LDPModel.container_path(instance), instance.pk)
+
+    @classmethod
+    def container_path(cls, instance):
+        if isinstance(instance, cls):
+            path = instance.ldp_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)
+
+        if not path.startswith("/"):
+            path = "/{}".format(path)
+
+        if not path.endswith("/"):
+            path = "{}/".format(path)
+
+        return path
 
     class Meta:
         abstract = True
 
+
 class LDPSource(models.Model):
     container = models.URLField()
     federation = models.CharField(max_length=255)
-    
+
     class Meta:
         rdf_type = 'sib:source'
         ordering = ('federation',)
@@ -25,7 +47,7 @@ class LDPSource(models.Model):
             ('view_source', 'acl:Read'),
             ('control_source', 'acl:Control'),
         )
-    
+
     def __str__(self):
         return "{}: {}".format(self.federation, self.container)
 
@@ -37,6 +59,7 @@ class LDNotification(models.Model):
     type = models.CharField(max_length=255)
     summary = models.TextField()
     date = models.DateTimeField(auto_now_add=True)
+
     class Meta:
         permissions = (
             ('view_todo', 'Read'),
diff --git a/djangoldp/resolver.py b/djangoldp/resolver.py
deleted file mode 100644
index 949ae3f1..00000000
--- a/djangoldp/resolver.py
+++ /dev/null
@@ -1,17 +0,0 @@
-class LDPResolver:
-
-    @classmethod
-    def resource_url(cls, dummy):
-        pass
-
-    @classmethod
-    def container_url(cls, dummy):
-        pass
-
-    @classmethod
-    def resource_path(cls, dummy):
-        pass
-
-    @classmethod
-    def container_path(cls, dummy):
-        pass
diff --git a/djangoldp/tests/tests_resolver.py b/djangoldp/tests/tests_resolver.py
index 55818f6d..96b1be0f 100644
--- a/djangoldp/tests/tests_resolver.py
+++ b/djangoldp/tests/tests_resolver.py
@@ -1,6 +1,6 @@
 from django.test import TestCase
 
-from djangoldp.resolver import LDPResolver
+from djangoldp.models import LDPModel
 from djangoldp.tests.models import Dummy, LDPDummy
 
 
@@ -8,18 +8,12 @@ class UrlUtils(TestCase):
 
     def test_class_not_inheriting_ldp_model(self):
         dummy = Dummy.objects.create(some="text")
-        self.assertEquals("http://localhost/dummys/{}".format(dummy.pk), LDPResolver.resource_url(dummy))
-        self.assertEquals("/dummys/{}".format(dummy.pk), LDPResolver.resource_path(dummy))
-        self.assertEquals("http://localhost/dummys", LDPResolver.container_url(dummy))
-        self.assertEquals("/dummys", LDPResolver.container_path(dummy))
+        self.assertEquals("/dummys/", LDPModel.container_path(dummy))
+        self.assertEquals("/dummys/{}".format(dummy.pk), LDPModel.resource_path(dummy))
 
     def test_class_inheriting_ldp_model(self):
         dummy = LDPDummy.objects.create(some="text")
-        self.assertEquals("http://localhost/ldp-dummys/{}".format(dummy.pk), LDPResolver.resource_url(dummy))
-        self.assertEquals("/ldp-dummys/{}".format(dummy.pk), LDPResolver.resource_path(dummy))
-        self.assertEquals("http://localhost/ldp-dummys/{}".format(dummy.pk), dummy.resource_url())
-        self.assertEquals("/ldp-dummys/{}".format(dummy.pk), dummy.resource_path())
-        self.assertEquals("http://localhost/ldp-dummys", LDPResolver.container_url(dummy))
-        self.assertEquals("/ldp-dummys", LDPResolver.container_path(dummy))
-        self.assertEquals("http://localhost/dummys/", dummy.container_url())
-        self.assertEquals("/ldp-dummys", dummy.container_path())
+        self.assertEquals("/ldp-dummys/", dummy.get_container_path())
+        self.assertEquals("/ldp-dummys/{}".format(dummy.pk), dummy.get_resource_path())
+        self.assertEquals("/ldp-dummys/", LDPModel.container_path(dummy))
+        self.assertEquals("/ldp-dummys/{}".format(dummy.pk), LDPModel.resource_path(dummy))
-- 
GitLab