diff --git a/djangoldp/models.py b/djangoldp/models.py index 08452c91dbdbbac178b25d00503f270293f0b1a3..10a420e4fb798b6ce9e16b49e332d59cbbe15f7d 100644 --- a/djangoldp/models.py +++ b/djangoldp/models.py @@ -1,4 +1,3 @@ -import validators from urllib.parse import urlparse from django.conf import settings from django.contrib.auth import get_user_model @@ -189,10 +188,11 @@ def auto_urlid(sender, instance, **kwargs): if 'djangoldp_account' not in settings.DJANGOLDP_PACKAGES: def webid(self): - # hack : We user webid as username for external user (since it's an uniq identifier too) - if validators.url(self.username): - webid = self.username - # unable to use username, so use user-detail URL with primary key + # an external user should have urlid set + webid = getattr(self, 'urlid', None) + if webid is not None and urlparse(settings.BASE_URL).netloc != urlparse(webid).netloc: + webid = self.urlid + # local user use user-detail URL with primary key else: webid = '{0}{1}'.format(settings.BASE_URL, reverse_lazy('user-detail', kwargs={'pk': self.pk})) return webid diff --git a/djangoldp/serializers.py b/djangoldp/serializers.py index a7b4d9a9c852809654e19c407982c170f9e4498f..c4e52fc7e76a6b9044730919058c8b16affea815 100644 --- a/djangoldp/serializers.py +++ b/djangoldp/serializers.py @@ -1,10 +1,10 @@ +import uuid from collections import OrderedDict, Mapping, Iterable from typing import Any from urllib import parse from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.auth.models import AbstractUser from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ValidationError as DjangoValidationError, FieldDoesNotExist from django.core.urlresolvers import get_resolver, resolve, get_script_prefix, Resolver404 @@ -491,13 +491,14 @@ class LDPSerializer(HyperlinkedModelSerializer): return serializer def to_internal_value(self, data): - user_case = self.Meta.model is get_user_model() and '@id' in data and not data['@id'].startswith( + is_user_and_external = self.Meta.model is get_user_model() and '@id' in data and not data['@id'].startswith( settings.BASE_URL) - if user_case: + if is_user_and_external: data['username'] = 'external' ret = super().to_internal_value(data) - if user_case: - ret['username'] = data['@id'] + if is_user_and_external: + ret['urlid'] = data['@id'] + ret.pop('username') return ret def get_value(self, dictionary): @@ -562,8 +563,8 @@ class LDPSerializer(HyperlinkedModelSerializer): field_name in validated_data) and not field_name is None: many_to_many.append((field_name, validated_data.pop(field_name))) validated_data = self.remove_empty_value(validated_data) - if model is get_user_model() and 'urlid' in validated_data and not 'username' in validated_data: - validated_data['username'] = validated_data.pop('urlid') + if model is get_user_model() and not 'username' in validated_data: + validated_data['username'] = uuid.uuid4() instance = model.objects.create(**validated_data) for field_name, value in many_to_many: diff --git a/djangoldp/tests/runner.py b/djangoldp/tests/runner.py index 12162f6ca6982d39eaed40ec630d3a340d34de19..87acd84f09773fece84b8e7a38e225c346639bd0 100644 --- a/djangoldp/tests/runner.py +++ b/djangoldp/tests/runner.py @@ -37,6 +37,7 @@ settings.configure(DEBUG=False, } }, AUTH_USER_MODEL='tests.User', + ANONYMOUS_USER_NAME = None, AUTHENTICATION_BACKENDS=( 'django.contrib.auth.backends.ModelBackend', 'guardian.backends.ObjectPermissionBackend'), ROOT_URLCONF='djangoldp.urls',