Skip to content

Commit

Permalink
Merge pull request #26 from edx/bseverino/name-preference
Browse files Browse the repository at this point in the history
[MST-893] Update REST API to include config model
  • Loading branch information
bseverino committed Aug 2, 2021
2 parents 8b18672 + ff43fa3 commit f30a606
Show file tree
Hide file tree
Showing 12 changed files with 390 additions and 52 deletions.
2 changes: 2 additions & 0 deletions .annotation_safe_list.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ waffle.Sample:
".. no_pii:": "This model has no PII"
waffle.Switch:
".. no_pii:": "This model has no PII"
admin.LogEntry:
".. no_pii:": "This model has no PII"
contenttypes.ContentType:
".. no_pii:": "This model has no PII"
auth.User:
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ Change Log
Unreleased
~~~~~~~~~~

[0.3.0] - 2021-08-02
~~~~~~~~~~~~~~~~~~~~
* Add `use_verified_name_for_certs` field to the VerifiedNameView
response, and create a new endpoint to update the user's verified
name config.
* Admin page configuration for VerifiedName and VerifiedNameConfig.

[0.2.0] - 2021-07-22
~~~~~~~~~~~~~~~~~~~~
Expand Down
2 changes: 1 addition & 1 deletion edx_name_affirmation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
Django app housing name affirmation logic.
"""

__version__ = '0.2.0'
__version__ = '0.3.0'

default_app_config = 'edx_name_affirmation.apps.EdxNameAffirmationConfig' # pylint: disable=invalid-name
34 changes: 34 additions & 0 deletions edx_name_affirmation/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""
Custom Django admin pages for Name Affirmation
"""

from django.contrib import admin

from edx_name_affirmation.models import VerifiedName, VerifiedNameConfig


class VerifiedNameAdmin(admin.ModelAdmin):
"""
Admin for the VerifiedName Model
"""
list_display = (
'id', 'user', 'verified_name', 'verification_attempt_id', 'proctored_exam_attempt_id',
'is_verified', 'created', 'modified',
)
readonly_fields = ('id', 'user', 'created', 'modified')
search_fields = ('user__username', 'verification_attempt_id', 'proctored_exam_attempt_id',)


class VerifiedNameConfigAdmin(admin.ModelAdmin):
"""
Admin for the VerifiedNameConfig Model
"""
list_display = (
'id', 'user', 'use_verified_name_for_certs', 'change_date',
)
readonly_fields = ('change_date',)
search_fields = ('user__username',)


admin.site.register(VerifiedName, VerifiedNameAdmin)
admin.site.register(VerifiedNameConfig, VerifiedNameConfigAdmin)
6 changes: 6 additions & 0 deletions edx_name_affirmation/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,12 @@ def create_verified_name_config(user, use_verified_name_for_certs=None):
the user's verified name over their profile name.
"""
fields = {'user': user}

# Default to the values from the most recent config
existing_config = VerifiedNameConfig.objects.filter(user=user).order_by('-change_date').first()
if existing_config:
fields['use_verified_name_for_certs'] = existing_config.use_verified_name_for_certs

if use_verified_name_for_certs is not None:
fields['use_verified_name_for_certs'] = use_verified_name_for_certs

Expand Down
18 changes: 17 additions & 1 deletion edx_name_affirmation/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from django.contrib.auth import get_user_model

from edx_name_affirmation.models import VerifiedName
from edx_name_affirmation.models import VerifiedName, VerifiedNameConfig

User = get_user_model()

Expand All @@ -29,3 +29,19 @@ class Meta:
"created", "username", "verified_name", "profile_name", "verification_attempt_id",
"proctored_exam_attempt_id", "is_verified"
)


class VerifiedNameConfigSerializer(serializers.ModelSerializer):
"""
Serializer for the VerifiedNameConfig Model.
"""
username = serializers.CharField(source="user.username")
use_verified_name_for_certs = serializers.BooleanField(required=False, allow_null=True)

class Meta:
"""
Meta Class
"""
model = VerifiedNameConfig

fields = ("change_date", "username", "use_verified_name_for_certs")
74 changes: 74 additions & 0 deletions edx_name_affirmation/tests/test_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
"""
Unit tests for the NameAffirmation admin classes
"""


from unittest import mock

from django.contrib.admin.sites import AdminSite
from django.test import TestCase

from edx_name_affirmation.admin import VerifiedNameAdmin, VerifiedNameConfigAdmin
from edx_name_affirmation.models import VerifiedName, VerifiedNameConfig


class NameAffirmationAdminTests(TestCase):
"""
Unit tests for the NameAffirmation admin classes
"""

def setUp(self):
super().setUp()
self.verified_name_admin = VerifiedNameAdmin(VerifiedName, AdminSite())
self.verified_name_config_admin = VerifiedNameConfigAdmin(
VerifiedNameConfig, AdminSite()
)

def test_verified_name_admin(self):
request = mock.Mock()

expected_list_display = (
'id', 'user', 'verified_name', 'verification_attempt_id', 'proctored_exam_attempt_id',
'is_verified', 'created', 'modified',
)
self.assertEqual(
expected_list_display,
self.verified_name_admin.get_list_display(request)
)

expected_readonly_fields = ('id', 'user', 'created', 'modified')
self.assertEqual(
expected_readonly_fields,
self.verified_name_admin.get_readonly_fields(request)
)

expected_search_fields = (
'user__username', 'verification_attempt_id', 'proctored_exam_attempt_id',
)
self.assertEqual(
expected_search_fields,
self.verified_name_admin.get_search_fields(request)
)

def test_verified_name_config_admin(self):
request = mock.Mock()

expected_list_display = (
'id', 'user', 'use_verified_name_for_certs', 'change_date',
)
self.assertEqual(
expected_list_display,
self.verified_name_config_admin.get_list_display(request)
)

expected_readonly_fields = ('change_date',)
self.assertEqual(
expected_readonly_fields,
self.verified_name_config_admin.get_readonly_fields(request)
)

expected_search_fields = ('user__username',)
self.assertEqual(
expected_search_fields,
self.verified_name_config_admin.get_search_fields(request)
)
29 changes: 17 additions & 12 deletions edx_name_affirmation/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import ddt

from django.contrib.auth import get_user_model
from django.core.cache import cache
from django.test import TestCase

from edx_name_affirmation.api import (
Expand Down Expand Up @@ -40,6 +41,12 @@ def setUp(self):
super().setUp()
self.user = User(username='jondoe', email='[email protected]')
self.user.save()
# Create a fresh config with default values
VerifiedNameConfig.objects.create(user=self.user)

def tearDown(self):
super().tearDown()
cache.clear()

def test_create_verified_name_defaults(self):
"""
Expand Down Expand Up @@ -275,20 +282,18 @@ def test_create_verified_name_config(self):
"""
Test that verified name config is created and updated successfully
"""
create_verified_name_config(self.user)

# check that one record exists
configs = VerifiedNameConfig.objects.filter(user=self.user)
self.assertEqual(len(configs), 1)
config_obj = configs[0]
self.assertFalse(config_obj.use_verified_name_for_certs)
self.assertEqual(config_obj.user, self.user)

create_verified_name_config(self.user, use_verified_name_for_certs=True)

# check that new record was created
configs = VerifiedNameConfig.objects.filter(user=self.user).order_by('change_date')
self.assertEqual(len(configs), 2)
config_obj = configs[1]
config_obj = VerifiedNameConfig.current(self.user)
self.assertTrue(config_obj.use_verified_name_for_certs)
self.assertEqual(config_obj.user, self.user)

def test_create_verified_name_config_no_overwrite(self):
"""
Test that if a field is set to True, it will not be overridden by False
if not specified when the config is updated
"""
create_verified_name_config(self.user, use_verified_name_for_certs=True)
create_verified_name_config(self.user)
self.assertTrue(should_use_verified_name_for_certs(self.user))
Loading

0 comments on commit f30a606

Please sign in to comment.