Commit 31a294cd by Waheed Ahmed

Fixed same role can be added multiple times against an Org or Course.

ECOM-7823
parent 526bda7e
...@@ -195,6 +195,7 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -195,6 +195,7 @@ class UpdateCourseRunViewTests(TestCase):
super(UpdateCourseRunViewTests, self).setUp() super(UpdateCourseRunViewTests, self).setUp()
self.course_run = factories.CourseRunFactory() self.course_run = factories.CourseRunFactory()
self.user = UserFactory() self.user = UserFactory()
self.course_team_user = UserFactory()
self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME))
self.organization_extension = factories.OrganizationExtensionFactory() self.organization_extension = factories.OrganizationExtensionFactory()
...@@ -210,6 +211,12 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -210,6 +211,12 @@ class UpdateCourseRunViewTests(TestCase):
user=self.user user=self.user
) )
factories.CourseUserRoleFactory(
role=PublisherUserRole.CourseTeam,
course=self.course_run.course,
user=self.course_team_user
)
factories.UserAttributeFactory(user=self.user, enable_email_notification=True) factories.UserAttributeFactory(user=self.user, enable_email_notification=True)
toggle_switch('enable_publisher_email_notifications', True) toggle_switch('enable_publisher_email_notifications', True)
self.client.login(username=self.user.username, password=USER_PASSWORD) self.client.login(username=self.user.username, password=USER_PASSWORD)
...@@ -272,11 +279,6 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -272,11 +279,6 @@ class UpdateCourseRunViewTests(TestCase):
# By default `lms_course_id` and `changed_by` are None # By default `lms_course_id` and `changed_by` are None
self.assert_course_key_and_changed_by() self.assert_course_key_and_changed_by()
# create course team role for email
factories.CourseUserRoleFactory(
course=self.course_run.course, role=PublisherUserRole.CourseTeam, user=self.user
)
lms_course_id = 'course-v1:edxTest+TC12+2050Q1' lms_course_id = 'course-v1:edxTest+TC12+2050Q1'
response = self.client.patch( response = self.client.patch(
self.update_course_run_url, self.update_course_run_url,
...@@ -308,7 +310,7 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -308,7 +310,7 @@ class UpdateCourseRunViewTests(TestCase):
Helper method to assert sent email data. Helper method to assert sent email data.
""" """
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
self.assertEqual([self.user.email], mail.outbox[0].to) self.assertEqual([self.course_team_user.email], mail.outbox[0].to)
self.assertEqual(str(mail.outbox[0].subject), subject) self.assertEqual(str(mail.outbox[0].subject), subject)
body = mail.outbox[0].body.strip() body = mail.outbox[0].body.strip()
...@@ -325,9 +327,6 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -325,9 +327,6 @@ class UpdateCourseRunViewTests(TestCase):
factories.CourseUserRoleFactory( factories.CourseUserRoleFactory(
course=self.course_run.course, role=PublisherUserRole.Publisher course=self.course_run.course, role=PublisherUserRole.Publisher
) )
course_team_role = factories.CourseUserRoleFactory(
course=self.course_run.course, role=PublisherUserRole.CourseTeam
)
response = self._make_request(preview_url) response = self._make_request(preview_url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
...@@ -340,7 +339,7 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -340,7 +339,7 @@ class UpdateCourseRunViewTests(TestCase):
run_number=course_key.run run_number=course_key.run
) )
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
self.assertEqual([course_team_role.user.email], mail.outbox[0].to) self.assertEqual([self.course_team_user.email], mail.outbox[0].to)
self.assertEqual(str(mail.outbox[0].subject), subject) self.assertEqual(str(mail.outbox[0].subject), subject)
def test_update_with_invalid_preview_url(self): def test_update_with_invalid_preview_url(self):
...@@ -364,10 +363,7 @@ class UpdateCourseRunViewTests(TestCase): ...@@ -364,10 +363,7 @@ class UpdateCourseRunViewTests(TestCase):
""" """
preview_url = 'https://example.com/abc/course' preview_url = 'https://example.com/abc/course'
factories.CourseRunStateFactory.create(course_run=self.course_run, owner_role=PublisherUserRole.Publisher) factories.CourseRunStateFactory.create(course_run=self.course_run, owner_role=PublisherUserRole.Publisher)
course_team_role = factories.CourseUserRoleFactory( factories.UserAttributeFactory(user=self.course_team_user, enable_email_notification=False)
course=self.course_run.course, role=PublisherUserRole.CourseTeam
)
factories.UserAttributeFactory(user=course_team_role.user, enable_email_notification=False)
response = self._make_request(preview_url) response = self._make_request(preview_url)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-05-23 10:06
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('course_metadata', '0054_update_program_type_slug_field'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('publisher', '0049_auto_20170518_1017'),
]
operations = [
migrations.AlterUniqueTogether(
name='courseuserrole',
unique_together=set([('course', 'user'), ('course', 'role')]),
),
migrations.AlterUniqueTogether(
name='organizationuserrole',
unique_together=set([('organization', 'role'), ('organization', 'user')]),
),
]
...@@ -398,7 +398,8 @@ class OrganizationUserRole(TimeStampedModel): ...@@ -398,7 +398,8 @@ class OrganizationUserRole(TimeStampedModel):
class Meta: class Meta:
unique_together = ( unique_together = (
('organization', 'user', 'role'), ('organization', 'user'),
('organization', 'role'),
) )
def __str__(self): def __str__(self):
...@@ -421,7 +422,8 @@ class CourseUserRole(TimeStampedModel, ChangedByMixin): ...@@ -421,7 +422,8 @@ class CourseUserRole(TimeStampedModel, ChangedByMixin):
class Meta: class Meta:
unique_together = ( unique_together = (
('course', 'user', 'role'), ('course', 'user'),
('course', 'role'),
) )
def __str__(self): def __str__(self):
......
...@@ -201,8 +201,8 @@ class CourseTests(TestCase): ...@@ -201,8 +201,8 @@ class CourseTests(TestCase):
permitted to access the course AND have not disabled email notifications. permitted to access the course AND have not disabled email notifications.
""" """
self.assertListEqual( self.assertListEqual(
self.course.get_course_users_emails(), sorted(self.course.get_course_users_emails()),
[self.user1.email, self.user2.email, self.user3.email] sorted([self.user1.email, self.user2.email, self.user3.email])
) )
# The email addresses of users who have disabled email notifications should NOT be returned. # The email addresses of users who have disabled email notifications should NOT be returned.
......
...@@ -1318,9 +1318,9 @@ class DashboardTests(TestCase): ...@@ -1318,9 +1318,9 @@ class DashboardTests(TestCase):
self.assert_dashboard_response(studio_count=0, published_count=0, progress_count=0, preview_count=0) self.assert_dashboard_response(studio_count=0, published_count=0, progress_count=0, preview_count=0)
# assign user course role # assign user course role
factories.CourseUserRoleFactory( course_role = self.course_run_3.course.course_user_roles.get(role=PublisherUserRole.ProjectCoordinator)
course=self.course_run_3.course, user=internal_user, role=PublisherUserRole.ProjectCoordinator course_role.user = internal_user
) course_role.save()
# Verify that user can see 1 published course run # Verify that user can see 1 published course run
response = self.assert_dashboard_response(studio_count=0, published_count=1, progress_count=0, preview_count=0) response = self.assert_dashboard_response(studio_count=0, published_count=1, progress_count=0, preview_count=0)
...@@ -1767,6 +1767,9 @@ class CourseDetailViewTests(TestCase): ...@@ -1767,6 +1767,9 @@ class CourseDetailViewTests(TestCase):
""" """
Verify that user can see approval widget on course detail page with `Mark as Reviewed`. Verify that user can see approval widget on course detail page with `Mark as Reviewed`.
""" """
self.course_team_role.user = UserFactory()
self.course_team_role.save()
factories.CourseUserRoleFactory( factories.CourseUserRoleFactory(
course=self.course, user=self.user, role=PublisherUserRole.MarketingReviewer course=self.course, user=self.user, role=PublisherUserRole.MarketingReviewer
) )
...@@ -1774,14 +1777,11 @@ class CourseDetailViewTests(TestCase): ...@@ -1774,14 +1777,11 @@ class CourseDetailViewTests(TestCase):
self.course_state.name = CourseStateChoices.Review self.course_state.name = CourseStateChoices.Review
self.course_state.save() self.course_state.save()
self.course_team_role.user = UserFactory()
self.course_team_role.save()
self.user.groups.add(self.organization_extension.group) self.user.groups.add(self.organization_extension.group)
assign_perm(OrganizationExtension.VIEW_COURSE, self.organization_extension.group, self.organization_extension) assign_perm(OrganizationExtension.VIEW_COURSE, self.organization_extension.group, self.organization_extension)
response = self.client.get(self.detail_page_url) response = self.client.get(self.detail_page_url)
# Verify that content is sent for review and user can see Reviewed button. # Verify that content is sent for review and user can see "Mark as Reviewed" button.
self.assertContains(response, 'Mark as Reviewed') self.assertContains(response, 'Mark as Reviewed')
self.assertContains(response, '<span class="icon fa fa-check" aria-hidden="true">') self.assertContains(response, '<span class="icon fa fa-check" aria-hidden="true">')
self.assertContains(response, 'Sent for Review') self.assertContains(response, 'Sent for Review')
......
...@@ -11,7 +11,7 @@ from testfixtures import LogCapture ...@@ -11,7 +11,7 @@ from testfixtures import LogCapture
from course_discovery.apps.core.tests.factories import UserFactory from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.tests import toggle_switch from course_discovery.apps.course_metadata.tests import toggle_switch
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole
from course_discovery.apps.publisher.models import CourseRun, CourseUserRole from course_discovery.apps.publisher.models import CourseRun, CourseUserRole, UserAttributes
from course_discovery.apps.publisher.tests import factories from course_discovery.apps.publisher.tests import factories
from course_discovery.apps.publisher.tests.factories import UserAttributeFactory from course_discovery.apps.publisher.tests.factories import UserAttributeFactory
from course_discovery.apps.publisher_comments.emails import log as comments_email_logger from course_discovery.apps.publisher_comments.emails import log as comments_email_logger
...@@ -45,11 +45,11 @@ class CommentsEmailTests(TestCase): ...@@ -45,11 +45,11 @@ class CommentsEmailTests(TestCase):
# add user in course-user-role table # add user in course-user-role table
factories.CourseUserRoleFactory( factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.ProjectCoordinator, user=self.user course=self.course, role=PublisherUserRole.MarketingReviewer, user=self.user
) )
factories.CourseUserRoleFactory( factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.ProjectCoordinator, user=self.user_2 course=self.course, role=PublisherUserRole.CourseTeam, user=self.user_2
) )
factories.CourseUserRoleFactory( factories.CourseUserRoleFactory(
...@@ -148,28 +148,16 @@ class CommentsEmailTests(TestCase): ...@@ -148,28 +148,16 @@ class CommentsEmailTests(TestCase):
def test_email_with_roles(self): def test_email_with_roles(self):
""" Verify that emails send to the users against course-user-roles also.""" """ Verify that emails send to the users against course-user-roles also."""
user_4 = UserFactory() UserAttributeFactory(user=self.user_2, enable_email_notification=True)
user_5 = UserFactory() user_attribute, __ = UserAttributes.objects.get_or_create(user=self.user_3)
user_attribute.enable_email_notification = True
# assign the role against a course user_attribute.save()
factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.MarketingReviewer, user=user_4
)
factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.ProjectCoordinator, user=user_5
)
self.create_comment(content_object=self.course_run) self.create_comment(content_object=self.course_run)
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
self.assertEqual([self.user_2.email, user_4.email, user_5.email], mail.outbox[0].to) self.assertEqual([self.user_2.email, self.user_3.email], mail.outbox[0].to)
def test_email_for_roles_only(self): def test_email_for_roles_only(self):
""" Verify the emails send to the course roles users even if groups has no users. """ """ Verify the emails send to the course roles users even if groups has no users. """
user_4 = UserFactory()
# assign the role against a course
factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.MarketingReviewer, user=user_4
)
self.create_comment(content_object=self.course) self.create_comment(content_object=self.course)
self.assertEqual(len(mail.outbox), 1) self.assertEqual(len(mail.outbox), 1)
...@@ -192,9 +180,6 @@ class CommentsEmailTests(TestCase): ...@@ -192,9 +180,6 @@ class CommentsEmailTests(TestCase):
""" Verify that after editing a comment against a course emails send """ Verify that after editing a comment against a course emails send
to multiple users. to multiple users.
""" """
factories.CourseUserRoleFactory(
course=self.course, role=PublisherUserRole.Publisher, user=self.user
)
comment = self.create_comment(content_object=self.course_run) comment = self.create_comment(content_object=self.course_run)
comment.comment = 'Update the comment' comment.comment = 'Update the comment'
comment.save() # pylint: disable=no-member comment.save() # pylint: disable=no-member
......
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