Commit 05af1d1e by Peter Fogg

Merge pull request #95 from edx/peter-fogg/create-catalog-users

Create users as catalog viewers.
parents 85dab76c 94842d51
from django.contrib.auth import get_user_model
from django.db import transaction
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
......@@ -93,11 +94,31 @@ class CatalogSerializer(serializers.ModelSerializer):
allow_null=True, allow_empty=True, required=False,
help_text=_('Usernames of users with explicit access to view this catalog'))
def is_valid(self, **kwargs):
# Ensure that the catalog's viewers actually exist in the
# DB. We keep this in a transaction so that users are only
# created if the data is valid.
sid = transaction.savepoint()
for username in self.initial_data.get('viewers', ()): # pylint: disable=no-member
User.objects.get_or_create(username=username)
if super().is_valid(**kwargs):
# Data is good; commit the transaction.
transaction.savepoint_commit(sid)
return True
else:
# Invalid data; roll back the user creation.
transaction.savepoint_rollback(sid)
return False
def create(self, validated_data):
viewers = set()
for username in validated_data.pop('viewers'):
user = User.objects.get(username=username)
viewers.add(user)
# Set viewers after the model has been saved
viewers = validated_data.pop('viewers')
instance = super(CatalogSerializer, self).create(validated_data)
instance.viewers = viewers
instance.save()
return instance
class Meta(object):
......
......@@ -9,6 +9,7 @@ from course_discovery.apps.api.serializers import(
PersonSerializer, AffiliateWindowSerializer
)
from course_discovery.apps.catalogs.tests.factories import CatalogFactory
from course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.tests.factories import (
CourseFactory, CourseRunFactory, SubjectFactory, PrerequisiteFactory,
......@@ -36,6 +37,34 @@ class CatalogSerializerTests(TestCase):
}
self.assertDictEqual(serializer.data, expected)
def test_create_new_user(self):
username = 'test-user'
data = {
'viewers': [username],
'id': None,
'name': 'test new catalog',
'query': '*',
}
self.assertEqual(User.objects.filter(username=username).count(), 0) # pylint: disable=no-member
serializer = CatalogSerializer(data=data)
self.assertTrue(serializer.is_valid())
catalog = serializer.save()
self.assertEqual([viewer.username for viewer in catalog.viewers], [username])
self.assertEqual(User.objects.filter(username=username).count(), 1) # pylint: disable=no-member
def test_invalid_data_user_create(self):
"""Verify that users are not created if the serializer data is invalid."""
username = 'test-user'
data = {
'viewers': [username],
'id': None,
'name': '',
'query': '',
}
serializer = CatalogSerializer(data=data)
self.assertFalse(serializer.is_valid())
self.assertEqual(User.objects.filter(username=username).count(), 0) # pylint: disable=no-member
class CourseSerializerTests(TestCase):
def test_data(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment