diff --git a/djangoldp/models.py b/djangoldp/models.py index 477d8d942b26888d3a67f50722ea0d57a95d406e..ca8bb3f3cf20c89cb7233498e98314484f78976d 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -1,10 +1,9 @@ -from django.conf import settings -from django.contrib.auth.models import AnonymousUser, User +from django.contrib.auth.models import User from django.db import models from django.db.models.base import ModelBase from django.urls import get_resolver from django.utils.decorators import classonlymethod -from guardian.shortcuts import get_perms + from djangoldp.permissions import LDPPermissions User._meta.rdf_type = "foaf:user" diff --git a/djangoldp/tests/runner.py b/djangoldp/tests/runner.py index 740948df72e9c93b96148e6343fb5717df2186a3..86c7a99b153cba2d2442f32d034f85e9e297c8a7 100644 --- a/djangoldp/tests/runner.py +++ b/djangoldp/tests/runner.py @@ -1,15 +1,16 @@ -import django import sys + +import django from django.conf import settings settings.configure(DEBUG=False, - ALLOWED_HOSTS = ["*"], + ALLOWED_HOSTS=["*"], DATABASES={ 'default': { 'ENGINE': 'django.db.backends.sqlite3', } }, - LDP_RDF_CONTEXT = { + LDP_RDF_CONTEXT={ "@context": { "@vocab": "http://happy-dev.fr/owl/#", "foaf": "http://xmlns.com/foaf/0.1/", @@ -35,7 +36,8 @@ settings.configure(DEBUG=False, "control": "acl:Control" } }, - AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'guardian.backends.ObjectPermissionBackend'), + AUTHENTICATION_BACKENDS=( + 'django.contrib.auth.backends.ModelBackend', 'guardian.backends.ObjectPermissionBackend'), ROOT_URLCONF='djangoldp.urls', DJANGOLDP_PACKAGES=['djangoldp.tests'], INSTALLED_APPS=('django.contrib.auth', @@ -46,10 +48,9 @@ settings.configure(DEBUG=False, 'djangoldp', 'djangoldp.tests', ), - SITE_URL = 'http://happy-dev.fr', + SITE_URL='http://happy-dev.fr', ) - django.setup() from django.test.runner import DiscoverRunner @@ -64,9 +65,9 @@ failures = test_runner.run_tests([ 'djangoldp.tests.tests_auto_author', 'djangoldp.tests.tests_get', 'djangoldp.tests.tests_delete', + 'djangoldp.tests.tests_sources', # 'djangoldp.tests.tests_temp' ]) if failures: sys.exit(failures) - diff --git a/djangoldp/tests/tests_sources.py b/djangoldp/tests/tests_sources.py new file mode 100644 index 0000000000000000000000000000000000000000..9720db2a8b8886a4fa41c201c879e9dc45abccb8 --- /dev/null +++ b/djangoldp/tests/tests_sources.py @@ -0,0 +1,18 @@ +from rest_framework.test import APIRequestFactory, APIClient, APITestCase + +from djangoldp.models import LDPSource + + +class TestSource(APITestCase): + + def setUp(self): + self.factory = APIRequestFactory() + self.client = APIClient() + + def tearDown(self): + pass + + def test_get_resource(self): + source = LDPSource.objects.create(federation="source_name", container="http://bar.foo/") + response = self.client.get('/sources/{}/'.format(source.federation), content_type='application/ld+json') + self.assertEqual(response.status_code, 200) diff --git a/djangoldp/views.py b/djangoldp/views.py index eab36c445b2e15bc101adfea8bf5ef20bd2e9076..eb8ecad93c8bb35808d9a99c29c697d7ebd429a0 100644 --- a/djangoldp/views.py +++ b/djangoldp/views.py @@ -1,21 +1,25 @@ +import sys +from importlib import reload + from django.apps import apps from django.conf import settings from django.conf.urls import url, include from django.contrib.auth import get_user_model from django.core.exceptions import FieldDoesNotExist from django.core.urlresolvers import get_resolver +from django.db.models.signals import post_save, post_delete from django.db.utils import OperationalError, ProgrammingError +from django.dispatch import receiver from django.shortcuts import get_object_or_404 +from django.urls import clear_url_caches from django.utils.decorators import classonlymethod -from guardian.shortcuts import get_objects_for_user from pyld import jsonld from rest_framework import status from rest_framework.authentication import SessionAuthentication from rest_framework.parsers import JSONParser from rest_framework.renderers import JSONRenderer -from rest_framework.viewsets import ModelViewSet from rest_framework.response import Response - +from rest_framework.viewsets import ModelViewSet from djangoldp.models import LDPSource, Model from djangoldp.permissions import LDPPermissions @@ -133,7 +137,8 @@ class LDPViewSet(LDPViewSetGenerator): meta_args['exclude'] = self.exclude or () meta_class = type('Meta', (), meta_args) from djangoldp.serializers import LDPSerializer - return type(LDPSerializer)(self.model._meta.object_name.lower() + name_prefix + 'Serializer', (LDPSerializer,), {'Meta': meta_class}) + return type(LDPSerializer)(self.model._meta.object_name.lower() + name_prefix + 'Serializer', (LDPSerializer,), + {'Meta': meta_class}) def create(self, request, *args, **kwargs): serializer = self.get_write_serializer(data=request.data) @@ -255,7 +260,7 @@ class LDPNestedViewSet(LDPViewSet): nested_related_name = related_field.remote_field.name return cls.urls( - lookup_field= Model.get_meta(related_field.related_model, 'lookup_field', 'pk'), + lookup_field=Model.get_meta(related_field.related_model, 'lookup_field', 'pk'), model=related_field.related_model, exclude=(nested_related_name,) if related_field.one_to_many else (), parent_model=cls.get_model(**kwargs), @@ -283,3 +288,14 @@ class LDPSourceViewSet(LDPViewSet): def get_queryset(self, *args, **kwargs): return super().get_queryset(*args, **kwargs).filter(federation=self.federation) + + +@receiver([post_save, post_delete], sender=LDPSource) +def reload_sources_module(sender, instance, **kwargs): + urlconf = settings.ROOT_URLCONF + clear_url_caches() + + if 'djangoldp.urls' in sys.modules: + reload(sys.modules['djangoldp.urls']) + if urlconf in sys.modules: + reload(sys.modules[urlconf])