From 776aa0797c897130024f867580de9e7a92983406 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 20 Sep 2016 15:59:38 +0200 Subject: [PATCH] add Attribute.disabled field (fixed #13234) Also raise needed django-model-utils version to >=2.4. --- setup.py | 2 +- src/authentic2/managers.py | 14 +++++++++----- src/authentic2/migrations/0016_attribute_disabled.py | 20 ++++++++++++++++++++ src/authentic2/models.py | 6 +++++- src/authentic2/saml/managers.py | 11 +++-------- src/authentic2_idp_cas/managers.py | 8 +++----- tests/test_all.py | 1 + tests/test_api.py | 5 +++++ tests/test_profile.py | 7 +++++++ 9 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 src/authentic2/migrations/0016_attribute_disabled.py diff --git a/setup.py b/setup.py index c082f2a..c18dcde 100755 --- a/setup.py +++ b/setup.py @@ -111,7 +111,7 @@ setup(name="authentic2", install_requires=[ 'django>=1.7.6,<1.9', 'requests>=2.3', - 'django-model-utils>=2,<2.4', + 'django-model-utils>=2.4', 'django-admin-tools>=0.6,<0.7', 'dnspython>=1.10', 'Django-Select2>=4.3.0,<5', diff --git a/src/authentic2/managers.py b/src/authentic2/managers.py index 8fc7f9b..669d156 100644 --- a/src/authentic2/managers.py +++ b/src/authentic2/managers.py @@ -19,14 +19,14 @@ class GetBySlugQuerySet(QuerySet): def get_by_natural_key(self, slug): return self.get(slug=slug) -GetBySlugManager = managers.PassThroughManager.for_queryset_class(GetBySlugQuerySet) +GetBySlugManager = GetBySlugQuerySet.as_manager class GetByNameQuerySet(QuerySet): def get_by_natural_key(self, name): return self.get(name=name) -GetByNameManager = managers.PassThroughManager.for_queryset_class(GetByNameQuerySet) +GetByNameManager = GetByNameQuerySet.as_manager class DeletedUserManager(models.Manager): @@ -73,7 +73,7 @@ class FederatedIdQuerySet(QuerySet): .for_service_model(service)) -class FederatedIdManager(managers.PassThroughManager.for_queryset_class(FederatedIdQuerySet)): +class FederatedIdManager(models.Manager.from_queryset(FederatedIdQuerySet)): @classmethod def local_user_id(cls, user): return '%s %s' % (LOCAL_USER_URN, urlquote(user.username)) @@ -98,7 +98,7 @@ class GenericQuerySet(QuerySet): content_type = ContentType.objects.get_for_model(model) return self.filter(content_type=content_type, object_id=model.pk) -GenericManager = managers.PassThroughManager.for_queryset_class(GenericQuerySet) +GenericManager = models.Manager.from_queryset(GenericQuerySet) class AttributeValueQuerySet(QuerySet): @@ -145,5 +145,9 @@ class BaseServiceManager(models.Manager): return self.get(**kwargs) +class AttributeManager(managers.QueryManager.from_queryset(GetByNameQuerySet)): + use_for_related_fields = False + + ServiceManager = BaseServiceManager.from_queryset(ServiceQuerySet) -AttributeValueManager = managers.PassThroughManager.for_queryset_class(AttributeValueQuerySet) +AttributeValueManager = models.Manager.from_queryset(AttributeValueQuerySet) diff --git a/src/authentic2/migrations/0016_attribute_disabled.py b/src/authentic2/migrations/0016_attribute_disabled.py new file mode 100644 index 0000000..e92ec61 --- /dev/null +++ b/src/authentic2/migrations/0016_attribute_disabled.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentic2', '0015_auto_20160621_1711'), + ('custom_user', '0011_manual_attribute_values_for_name_fields'), + ] + + operations = [ + migrations.AddField( + model_name='attribute', + name='disabled', + field=models.BooleanField(default=False, verbose_name='disabled'), + ), + ] diff --git a/src/authentic2/models.py b/src/authentic2/models.py index 4526424..3e71672 100644 --- a/src/authentic2/models.py +++ b/src/authentic2/models.py @@ -160,8 +160,12 @@ class Attribute(models.Model): blank=True, default=False) kind = models.CharField(max_length=16, verbose_name=_('kind')) + disabled = models.BooleanField(verbose_name=_('disabled'), + blank=True, default=False) + + objects = managers.AttributeManager(disabled=False) + all_objects = managers.AttributeManager() - objects = managers.GetByNameManager() registration_attributes = QueryManager(asked_on_registration=True) user_attributes = QueryManager(user_editable=True) diff --git a/src/authentic2/saml/managers.py b/src/authentic2/saml/managers.py index 44b5f9a..7ff726c 100644 --- a/src/authentic2/saml/managers.py +++ b/src/authentic2/saml/managers.py @@ -12,8 +12,6 @@ from importlib import import_module from django.contrib.contenttypes.models import ContentType -from model_utils import managers - from . import lasso_helper from ..managers import GetBySlugQuerySet, GenericManager @@ -28,8 +26,7 @@ class SessionLinkedQuerySet(QuerySet): if not store.exists(key): o.delete() -SessionLinkedManager = managers.PassThroughManager \ - .for_queryset_class(SessionLinkedQuerySet) +SessionLinkedManager = models.Manager.from_queryset(SessionLinkedQuerySet) class LibertyFederationManager(models.Manager): def cleanup(self): @@ -80,8 +77,7 @@ class LibertyProviderQueryset(GetBySlugQuerySet): def without_federation(self, user): return self.exclude(identity_provider__libertyfederation__user=user) -LibertyProviderManager = managers.PassThroughManager \ - .for_queryset_class(LibertyProviderQueryset) +LibertyProviderManager = models.Manager.from_queryset(LibertyProviderQueryset) class LibertySessionQuerySet(SessionLinkedQuerySet): def to_session_dump(self): @@ -93,8 +89,7 @@ class LibertySessionQuerySet(SessionLinkedQuerySet): 'name_id_sp_name_qualifier') return lasso_helper.build_session_dump(sessions) -LibertySessionManager = managers.PassThroughManager \ - .for_queryset_class(LibertySessionQuerySet) +LibertySessionManager = models.Manager.from_queryset(LibertySessionQuerySet) class GetByLibertyProviderManager(models.Manager): def get_by_natural_key(self, slug): diff --git a/src/authentic2_idp_cas/managers.py b/src/authentic2_idp_cas/managers.py index 887f0f9..317ab0d 100644 --- a/src/authentic2_idp_cas/managers.py +++ b/src/authentic2_idp_cas/managers.py @@ -1,12 +1,10 @@ -import datetime import urlparse from datetime import timedelta +from django.db import models from django.db.models import query from django.utils.timezone import now -from model_utils import managers - class TicketQuerySet(query.QuerySet): def clean_expired(self): @@ -37,6 +35,6 @@ class ServiceQuerySet(query.QuerySet): return matches[0][1] -ServiceManager = managers.PassThroughManager.for_queryset_class(ServiceQuerySet) +ServiceManager = models.Manager.from_queryset(ServiceQuerySet) -TicketManager = managers.PassThroughManager.for_queryset_class(TicketQuerySet) +TicketManager = models.Manager.from_queryset(TicketQuerySet) diff --git a/tests/test_all.py b/tests/test_all.py index 6ab1032..08f4f90 100644 --- a/tests/test_all.py +++ b/tests/test_all.py @@ -103,6 +103,7 @@ class SerializerTests(TestCase): 'multiple': False, 'user_visible': False, 'required': False, + 'disabled': False, } }, { diff --git a/tests/test_api.py b/tests/test_api.py index 93ea28a..ea5e88f 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -201,6 +201,11 @@ def test_api_users_create(app, user): 'username': 'foobar'}) resp = app.post_json('/api/users/', payload, status=status) assert resp.json['uuid'] == '1234567890' + assert 'title' in resp.json + at.disabled = True + at.save() + resp = app.get('/api/users/1234567890/') + assert 'title' not in resp.json def test_api_users_create_send_mail(app, settings, superuser): diff --git a/tests/test_profile.py b/tests/test_profile.py index ed8e20f..1c786ad 100644 --- a/tests/test_profile.py +++ b/tests/test_profile.py @@ -70,4 +70,11 @@ def test_account_edit_view(app, simple_user): assert attribute.get_value(simple_user) == '0123456789' resp = app.get(url, status=200) + assert 'phone' in resp assert 'readonly' in resp.form['edit-profile-phone'].attrs + + attribute.disabled = True + attribute.save() + resp = app.get(url, status=200) + assert 'phone' not in resp + assert attribute.get_value(simple_user) == '0123456789' -- 2.1.4