Commit 9edefee2 by tasawernawaz Committed by Tasawer Nawaz

remove team admin from course model ecom-6665

parent c686e99f
...@@ -67,9 +67,12 @@ class CustomCourseForm(CourseForm): ...@@ -67,9 +67,12 @@ class CustomCourseForm(CourseForm):
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
queryset = kwargs.pop('team_admin_queryset', None) team_admin_id = kwargs.pop('team_admin_id', None)
if queryset: if team_admin_id:
self.declared_fields['team_admin'].queryset = queryset try:
self.declared_fields['team_admin'].queryset = User.objects.filter(id=team_admin_id)
except Exception: # pylint: disable=broad-except
pass
super(CustomCourseForm, self).__init__(*args, **kwargs) super(CustomCourseForm, self).__init__(*args, **kwargs)
......
# -*- coding: utf-8 -*-
# Generated by Django 1.9.11 on 2016-12-28 13:50
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('publisher', '0022_auto_20161222_2135'),
]
operations = [
migrations.RemoveField(
model_name='course',
name='team_admin',
),
migrations.RemoveField(
model_name='historicalcourse',
name='team_admin',
),
]
...@@ -118,7 +118,6 @@ class Course(TimeStampedModel, ChangedByMixin): ...@@ -118,7 +118,6 @@ class Course(TimeStampedModel, ChangedByMixin):
Subject, default=None, null=True, blank=True, related_name='publisher_courses_tertiary' Subject, default=None, null=True, blank=True, related_name='publisher_courses_tertiary'
) )
team_admin = models.ForeignKey(User, null=True, blank=True, related_name='team_admin_user')
image = StdImageField( image = StdImageField(
upload_to=UploadToFieldNamePath( upload_to=UploadToFieldNamePath(
populate_from='number', populate_from='number',
......
...@@ -38,8 +38,6 @@ class CourseFactory(factory.DjangoModelFactory): ...@@ -38,8 +38,6 @@ class CourseFactory(factory.DjangoModelFactory):
secondary_subject = factory.SubFactory(factories.SubjectFactory) secondary_subject = factory.SubFactory(factories.SubjectFactory)
tertiary_subject = factory.SubFactory(factories.SubjectFactory) tertiary_subject = factory.SubFactory(factories.SubjectFactory)
team_admin = factory.SubFactory(UserFactory)
class Meta: class Meta:
model = Course model = Course
......
...@@ -47,7 +47,7 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -47,7 +47,7 @@ class CreateUpdateCourseViewTests(TestCase):
self.organization_extension = factories.OrganizationExtensionFactory() self.organization_extension = factories.OrganizationExtensionFactory()
self.group = self.organization_extension.group self.group = self.organization_extension.group
self.course = factories.CourseFactory(team_admin=self.user) self.course = factories.CourseFactory()
self.course_run = factories.CourseRunFactory(course=self.course) self.course_run = factories.CourseRunFactory(course=self.course)
self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2) self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2)
...@@ -129,7 +129,6 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -129,7 +129,6 @@ class CreateUpdateCourseViewTests(TestCase):
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict.pop('verification_deadline') course_dict.pop('verification_deadline')
course_dict.pop('image') course_dict.pop('image')
course_dict.pop('team_admin')
updated_course_title = 'Updated {}'.format(self.course.title) updated_course_title = 'Updated {}'.format(self.course.title)
course_dict['title'] = updated_course_title course_dict['title'] = updated_course_title
...@@ -184,7 +183,6 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -184,7 +183,6 @@ class CreateUpdateCourseViewTests(TestCase):
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict.pop('verification_deadline') course_dict.pop('verification_deadline')
course_dict.pop('image') course_dict.pop('image')
course_dict.pop('team_admin')
updated_course_title = 'Updated {}'.format(self.course.title) updated_course_title = 'Updated {}'.format(self.course.title)
course_dict['title'] = updated_course_title course_dict['title'] = updated_course_title
...@@ -255,9 +253,28 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -255,9 +253,28 @@ class CreateUpdateCourseViewTests(TestCase):
response = self.client.get(reverse('publisher:publisher_courses_new')) response = self.client.get(reverse('publisher:publisher_courses_new'))
self.assertContains(response, '<input id="id_organization" name="organization" type="hidden"') self.assertContains(response, '<input id="id_organization" name="organization" type="hidden"')
def test_create_form_with_multiple_organization(self):
"""Verify that if there are more than one organization then there will be
a drop down of organization choices.
"""
factories.OrganizationExtensionFactory()
response = self.client.get(reverse('publisher:publisher_courses_new'))
self.assertContains(response,
'<select class="field-input input-select" id="id_organization" name="organization">')
def test_create_with_invalid_team_admin(self):
""" Verify that view returns status_code=400 with invalid team admin. """
data = {'number': 'course_1', 'image': ''}
course_dict = self._post_data(data, self.course, self.course_run, self.seat)
course_dict['team_admin'] = "-------"
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image'])
self.assertEqual(response.status_code, 400)
def _post_data(self, data, course, course_run, seat): def _post_data(self, data, course, course_run, seat):
course_dict = model_to_dict(course) course_dict = model_to_dict(course)
course_dict.update(**data) course_dict.update(**data)
course_dict['team_admin'] = self.user.id
course_dict['keywords'] = 'abc def xyz' course_dict['keywords'] = 'abc def xyz'
if course_run: if course_run:
course_dict.update(**model_to_dict(course_run)) course_dict.update(**model_to_dict(course_run))
...@@ -299,7 +316,7 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -299,7 +316,7 @@ class CreateUpdateCourseViewTests(TestCase):
target_status_code=200 target_status_code=200
) )
self.assertEqual(course.organizations.first(), self.organization_extension.organization) self.assertEqual(course.organizations.first(), self.organization_extension.organization)
self.assertEqual(course.team_admin, self.user) self.assertEqual(course.course_user_roles.filter(role=PublisherUserRole.CourseTeam).count(), 1)
course_run = course.publisher_course_runs.all()[0] course_run = course.publisher_course_runs.all()[0]
self.assertEqual(self.course_run.language, course_run.language) self.assertEqual(self.course_run.language, course_run.language)
self.assertEqual(course_run.start.strftime("%Y-%m-%d %H:%M:%S"), self.start_date_time) self.assertEqual(course_run.start.strftime("%Y-%m-%d %H:%M:%S"), self.start_date_time)
...@@ -323,13 +340,14 @@ class CreateUpdateCourseRunViewTests(TestCase): ...@@ -323,13 +340,14 @@ class CreateUpdateCourseRunViewTests(TestCase):
def setUp(self): def setUp(self):
super(CreateUpdateCourseRunViewTests, self).setUp() super(CreateUpdateCourseRunViewTests, self).setUp()
self.user = UserFactory() self.user = UserFactory()
self.course = factories.CourseFactory(team_admin=self.user) self.course = factories.CourseFactory()
factories.CourseUserRoleFactory.create(course=self.course, role=PublisherUserRole.CourseTeam, user=self.user)
self.course_run = factories.CourseRunFactory() self.course_run = factories.CourseRunFactory()
self.organization_extension = factories.OrganizationExtensionFactory() self.organization_extension = factories.OrganizationExtensionFactory()
self.course.organizations.add(self.organization_extension.organization) self.course.organizations.add(self.organization_extension.organization)
self.course_run_dict = model_to_dict(self.course_run) self.course_run_dict = model_to_dict(self.course_run)
self.course_run_dict.update( self.course_run_dict.update(
{'number': self.course.number, 'team_admin': self.course.team_admin.id, 'is_self_paced': True} {'number': self.course.number, 'team_admin': self.user.id, 'is_self_paced': True}
) )
self._pop_valuse_from_dict( self._pop_valuse_from_dict(
self.course_run_dict, self.course_run_dict,
......
...@@ -15,8 +15,8 @@ from django.views.generic import View, CreateView, UpdateView, DetailView, ListV ...@@ -15,8 +15,8 @@ from django.views.generic import View, CreateView, UpdateView, DetailView, ListV
from django_fsm import TransitionNotAllowed from django_fsm import TransitionNotAllowed
from guardian.shortcuts import get_objects_for_user from guardian.shortcuts import get_objects_for_user
from rest_framework.generics import UpdateAPIView from rest_framework.generics import UpdateAPIView
from course_discovery.apps.core.models import User from course_discovery.apps.core.models import User
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole
from course_discovery.apps.publisher.forms import ( from course_discovery.apps.publisher.forms import (
CourseForm, CourseRunForm, SeatForm, CustomCourseForm, CustomCourseRunForm, CourseForm, CourseRunForm, SeatForm, CustomCourseForm, CustomCourseRunForm,
...@@ -25,8 +25,7 @@ from course_discovery.apps.publisher.forms import ( ...@@ -25,8 +25,7 @@ from course_discovery.apps.publisher.forms import (
from course_discovery.apps.publisher import mixins from course_discovery.apps.publisher import mixins
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
Course, CourseRun, Seat, State, UserAttributes, Course, CourseRun, Seat, State, UserAttributes,
OrganizationExtension OrganizationExtension, CourseUserRole)
)
from course_discovery.apps.publisher.serializers import UpdateCourseKeySerializer from course_discovery.apps.publisher.serializers import UpdateCourseKeySerializer
from course_discovery.apps.publisher.utils import ( from course_discovery.apps.publisher.utils import (
is_internal_user, get_internal_users, is_publisher_admin, is_internal_user, get_internal_users, is_publisher_admin,
...@@ -181,8 +180,8 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView): ...@@ -181,8 +180,8 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView):
ctx = self.get_context_data() ctx = self.get_context_data()
# add selected team admin into choice of ChoiceField # add selected team admin into choice of ChoiceField
team_admin_queryset = User.objects.filter(id=self.request.POST.get('team_admin')) team_admin_id = self.request.POST.get('team_admin')
course_form = self.course_form(request.POST, request.FILES, team_admin_queryset=team_admin_queryset) course_form = self.course_form(request.POST, request.FILES, team_admin_id=team_admin_id)
run_form = self.run_form(request.POST) run_form = self.run_form(request.POST)
seat_form = self.seat_form(request.POST) seat_form = self.seat_form(request.POST)
...@@ -215,6 +214,10 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView): ...@@ -215,6 +214,10 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView):
# add default organization roles into course-user-roles # add default organization roles into course-user-roles
course.assign_organization_role(organization_extension.organization) course.assign_organization_role(organization_extension.organization)
# add team admin as CourseTeam role again course
CourseUserRole.add_course_roles(course=course, role=PublisherUserRole.CourseTeam,
user=User.objects.get(id=course_form.data['team_admin']))
messages.success( messages.success(
request, _('Course created successfully.') request, _('Course created successfully.')
) )
...@@ -285,12 +288,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -285,12 +288,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
parent_course = self.get_parent_course() parent_course = self.get_parent_course()
course_form = self.course_form(instance=parent_course) course_form = self.course_form(instance=parent_course)
user_role = CourseUserRole.objects.get(course=parent_course, role=PublisherUserRole.CourseTeam)
context = { context = {
'parent_course': parent_course, 'parent_course': parent_course,
'course_form': course_form, 'course_form': course_form,
'run_form': self.run_form, 'run_form': self.run_form,
'seat_form': self.seat_form, 'seat_form': self.seat_form,
'is_team_admin_hidden': parent_course.team_admin and 'team_admin' not in course_form.errors 'is_team_admin_hidden': user_role.user and 'team_admin' not in course_form.errors
} }
return context return context
...@@ -323,12 +327,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -323,12 +327,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
messages.error(request, _('Please fill all required fields.')) messages.error(request, _('Please fill all required fields.'))
context = self.get_context_data() context = self.get_context_data()
user_role = CourseUserRole.objects.get(course=parent_course, role=PublisherUserRole.CourseTeam)
context.update( context.update(
{ {
'course_form': course_form, 'course_form': course_form,
'run_form': run_form, 'run_form': run_form,
'seat_form': seat_form, 'seat_form': seat_form,
'is_team_admin_hidden': parent_course.team_admin and 'team_admin' not in course_form.errors 'is_team_admin_hidden': user_role.user and 'team_admin' not in course_form.errors
} }
) )
......
...@@ -31,7 +31,7 @@ $(document).ready(function(){ ...@@ -31,7 +31,7 @@ $(document).ready(function(){
}); });
$(document).on('change', '#id_organization', function (e) { $(document).on('change', '#id_organization', function (e) {
var org_id = $(this).value(); var org_id = this.value;
// it will reset the select input // it will reset the select input
$("#id_team_admin").prop("selectedIndex", 0); $("#id_team_admin").prop("selectedIndex", 0);
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
{% trans "Please choose the school that will be providing the course. Once chosen then you can select an administrator for the studio shell." %} {% trans "Please choose the school that will be providing the course. Once chosen then you can select an administrator for the studio shell." %}
</div> </div>
<div class="col col-6"> <div class="col col-6">
{% if course_form.organization.choices|length > 1 %} {% if course_form.organization.field.queryset.all.count > 1 %}
<label class="field-label">{{ course_form.organization.label_tag }} <span <label class="field-label">{{ course_form.organization.label_tag }} <span
class="required">* {% trans "required" %}</span> </label> class="required">* {% trans "required" %}</span> </label>
{{ course_form.organization }} {{ course_form.organization }}
......
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