diff --git a/djangoldp/models.py b/djangoldp/models.py index 00c63943ff4acad55f91ef8c1ee5de8f8103fa84..f63ffd4b353cfe20a4f157ebb477cbce7549d56c 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -21,7 +21,7 @@ class Model(models.Model): 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)) + return "{}{}".format(cls.container_id(instance), getattr(instance, slug_field)) @classmethod def container_id(cls, instance): @@ -29,19 +29,44 @@ class Model(models.Model): path = instance.container_path else: view_name = '{}-list'.format(instance._meta.object_name.lower()) - path = '/{}'.format(get_resolver().reverse_dict[view_name][0][0][0]) + path = get_resolver().reverse(view_name) - if not path.startswith("/"): - path = "/{}".format(path) - - if not path.endswith("/"): - path = "{}/".format(path) + path = cls.__clean_path(path) return path class Meta: abstract = True + @classmethod + def resolve_id(cls, id): + id = cls.__clean_path(id) + view, args, kwargs = get_resolver().resolve(id) + return view.initkwargs['model'].objects.get(**kwargs) + + @classmethod + def resolve_container(cls, path): + path = cls.__clean_path(path) + view, args, kwargs = get_resolver().resolve(path) + return view.initkwargs['model'] + + @classmethod + def resolve(cls, path): + container = cls.resolve_container(path) + try: + resolve_id = cls.resolve_id(path) + except: + resolve_id = None + return container, resolve_id + + @classmethod + def __clean_path(cls, path): + if not path.startswith("/"): + path = "/{}".format(path) + if not path.endswith("/"): + path = "{}/".format(path) + return path + class LDPSource(models.Model): container = models.URLField() diff --git a/djangoldp/tests/tests_ldp_model.py b/djangoldp/tests/tests_ldp_model.py index 8a17c88f853a004a8fb520cacdc4350ef5d3c7ff..56bbe55206c0d95c7c90e998ecbda3ad49eb326b 100644 --- a/djangoldp/tests/tests_ldp_model.py +++ b/djangoldp/tests/tests_ldp_model.py @@ -20,6 +20,14 @@ class LDPModelTest(TestCase): self.assertEquals("/ldp-dummys/", Model.container_id(dummy)) self.assertEquals("/ldp-dummys/{}".format(dummy.pk), Model.resource_id(dummy)) + def test_from_resolve_id(self): + saved_instance = Dummy.objects.create(some="text") + result = Model.resolve_id("/dummys/{}".format(saved_instance.pk)) + self.assertEquals(saved_instance, result) + + def test_resolve_container(self): + result = Model.resolve_container("/dummys/") + self.assertEquals(Dummy, result) @unittest.skip("futur feature: avoid urls.py on apps") def test_auto_url(self):