Commit b9775b30 by Waheed Ahmed

Added publisher user creation form in admin.

ECOM-6841
parent f7349d4f
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group
from guardian.admin import GuardedModelAdmin from guardian.admin import GuardedModelAdmin
from course_discovery.apps.publisher.forms import CourseUserRoleForm, OrganizationUserRoleForm, UserAttributesAdminForm from course_discovery.apps.publisher.forms import (CourseUserRoleForm, OrganizationUserRoleForm,
from course_discovery.apps.publisher.models import ( PublisherUserCreationForm, UserAttributesAdminForm)
Course, CourseRun, CourseRunState, CourseState, CourseUserRole, from course_discovery.apps.publisher.models import (Course, CourseRun, CourseRunState, CourseState, CourseUserRole,
OrganizationExtension, OrganizationUserRole, Seat, State, OrganizationExtension, OrganizationUserRole, PublisherUser, Seat,
UserAttributes State, UserAttributes)
)
@admin.register(CourseUserRole) @admin.register(CourseUserRole)
...@@ -58,3 +59,15 @@ class SeatAdmin(admin.ModelAdmin): ...@@ -58,3 +59,15 @@ class SeatAdmin(admin.ModelAdmin):
@admin.register(State) @admin.register(State)
class StateAdmin(admin.ModelAdmin): class StateAdmin(admin.ModelAdmin):
raw_id_fields = ('changed_by',) raw_id_fields = ('changed_by',)
@admin.register(PublisherUser)
class PublisherUserAdmin(UserAdmin):
add_form_template = 'publisher/admin/add_user_form.html'
add_fieldsets = (
(None, {'fields': ('username', 'groups',)}),
)
add_form = PublisherUserCreationForm
def get_queryset(self, request):
return self.model.objects.filter(groups__in=Group.objects.all()).distinct()
...@@ -13,9 +13,8 @@ from course_discovery.apps.course_metadata.choices import CourseRunPacing ...@@ -13,9 +13,8 @@ from course_discovery.apps.course_metadata.choices import CourseRunPacing
from course_discovery.apps.course_metadata.models import Organization, Person, Subject from course_discovery.apps.course_metadata.models import Organization, Person, Subject
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher.mixins import LanguageModelSelect2Multiple, check_roles_access from course_discovery.apps.publisher.mixins import LanguageModelSelect2Multiple, check_roles_access
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (Course, CourseRun, CourseUserRole, OrganizationExtension,
Course, CourseRun, CourseUserRole, OrganizationExtension, OrganizationUserRole, Seat, User OrganizationUserRole, PublisherUser, Seat, User)
)
class UserModelChoiceField(forms.ModelChoiceField): class UserModelChoiceField(forms.ModelChoiceField):
...@@ -360,3 +359,18 @@ class OrganizationUserRoleForm(BaseUserAdminForm): ...@@ -360,3 +359,18 @@ class OrganizationUserRoleForm(BaseUserAdminForm):
class CourseUserRoleForm(BaseUserAdminForm): class CourseUserRoleForm(BaseUserAdminForm):
class Meta(BaseUserAdminForm.Meta): class Meta(BaseUserAdminForm.Meta):
model = CourseUserRole model = CourseUserRole
class PublisherUserCreationForm(forms.ModelForm):
class Meta:
model = PublisherUser
fields = ('username', 'groups',)
def clean(self):
groups = self.cleaned_data.get('groups')
if not groups:
raise forms.ValidationError(
{'groups': _('This field is required.')}
)
return self.cleaned_data
# -*- coding: utf-8 -*-
# Generated by Django 1.9.12 on 2017-02-15 14:13
from __future__ import unicode_literals
import django.contrib.auth.models
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0002_partner_studio_url'),
('publisher', '0034_auto_20170213_0918'),
]
operations = [
migrations.CreateModel(
name='PublisherUser',
fields=[
],
options={
'proxy': True,
},
bases=('core.user',),
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
]
...@@ -596,3 +596,10 @@ class CourseRunState(TimeStampedModel, ChangedByMixin): ...@@ -596,3 +596,10 @@ class CourseRunState(TimeStampedModel, ChangedByMixin):
self.published() self.published()
self.save() self.save()
class PublisherUser(User):
""" Publisher User Proxy Model. """
class Meta:
proxy = True
from django.core.exceptions import ValidationError
from django.test import TestCase from django.test import TestCase
from course_discovery.apps.core.models import User from course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.models import Person from course_discovery.apps.course_metadata.models import Person
from course_discovery.apps.course_metadata.tests.factories import PersonFactory from course_discovery.apps.course_metadata.tests.factories import PersonFactory
from course_discovery.apps.publisher.forms import CustomCourseForm, CustomCourseRunForm from course_discovery.apps.publisher.forms import CustomCourseForm, CustomCourseRunForm, PublisherUserCreationForm
class UserModelChoiceFieldTests(TestCase): class UserModelChoiceFieldTests(TestCase):
...@@ -58,3 +59,21 @@ class PersonModelMultipleChoiceTests(TestCase): ...@@ -58,3 +59,21 @@ class PersonModelMultipleChoiceTests(TestCase):
url=person.get_profile_image_url url=person.get_profile_image_url
) )
self.assertEqual(choice_label.strip(), expected) self.assertEqual(choice_label.strip(), expected)
class PublisherUserCreationFormTests(TestCase):
"""
Tests for the publisher `PublisherUserCreationForm`.
"""
def test_clean_groups(self):
"""
Verify that `clean` raises `ValidationError` error if no group is selected.
"""
user_form = PublisherUserCreationForm()
user_form.cleaned_data = {'username': 'test_user', 'groups': []}
with self.assertRaises(ValidationError):
user_form.clean()
user_form.cleaned_data['groups'] = ['test_group']
self.assertEqual(user_form.clean(), user_form.cleaned_data)
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-13 07:55-0500\n" "POT-Creation-Date: 2017-02-15 15:52+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: apps/api/filters.py #: apps/api/filters.py
#, python-brace-format #, python-brace-format
...@@ -624,6 +624,10 @@ msgstr "" ...@@ -624,6 +624,10 @@ msgstr ""
msgid "Seat Type" msgid "Seat Type"
msgstr "" msgstr ""
#: apps/publisher/forms.py
msgid "This field is required."
msgstr ""
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Needs Review" msgid "Needs Review"
msgstr "" msgstr ""
...@@ -1649,6 +1653,12 @@ msgid "" ...@@ -1649,6 +1653,12 @@ msgid ""
"publishes the course About page." "publishes the course About page."
msgstr "" msgstr ""
#: templates/publisher/admin/add_user_form.html
msgid ""
"First, enter a username and select a group. Then, you'll be able to edit "
"more user options."
msgstr ""
#: templates/publisher/base.html templates/publisher/dashboard.html #: templates/publisher/base.html templates/publisher/dashboard.html
msgid "Dashboard" msgid "Dashboard"
msgstr "" msgstr ""
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-13 07:55-0500\n" "POT-Creation-Date: 2017-02-15 15:52+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
msgid "Preview" msgid "Preview"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-13 07:55-0500\n" "POT-Creation-Date: 2017-02-15 15:52+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/api/filters.py #: apps/api/filters.py
...@@ -746,6 +746,10 @@ msgstr "Pröféssïönäl Édüçätïön Ⱡ'σяєм ιρѕυм ∂σłσя ѕ ...@@ -746,6 +746,10 @@ msgstr "Pröféssïönäl Édüçätïön Ⱡ'σяєм ιρѕυм ∂σłσя ѕ
msgid "Seat Type" msgid "Seat Type"
msgstr "Séät Týpé Ⱡ'σяєм ιρѕυм ∂σł#" msgstr "Séät Týpé Ⱡ'σяєм ιρѕυм ∂σł#"
#: apps/publisher/forms.py
msgid "This field is required."
msgstr "Thïs fïéld ïs réqüïréd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#"
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Needs Review" msgid "Needs Review"
msgstr "Nééds Révïéw Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" msgstr "Nééds Révïéw Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
...@@ -1992,6 +1996,14 @@ msgstr "" ...@@ -1992,6 +1996,14 @@ msgstr ""
"яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα " "яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα "
"ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт, ѕ#" "ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση ρяσι∂єηт, ѕ#"
#: templates/publisher/admin/add_user_form.html
msgid ""
"First, enter a username and select a group. Then, you'll be able to edit "
"more user options."
msgstr ""
"Fïrst, éntér ä üsérnämé änd séléçt ä gröüp. Thén, ýöü'll ßé äßlé tö édït "
"möré üsér öptïöns. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢ση#"
#: templates/publisher/base.html templates/publisher/dashboard.html #: templates/publisher/base.html templates/publisher/dashboard.html
msgid "Dashboard" msgid "Dashboard"
msgstr "Däshßöärd Ⱡ'σяєм ιρѕυм ∂σł#" msgstr "Däshßöärd Ⱡ'σяєм ιρѕυм ∂σł#"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-13 07:55-0500\n" "POT-Creation-Date: 2017-02-15 15:52+0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
......
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block form_top %}
<p>{% trans "First, enter a username and select a group. Then, you'll be able to edit more user options." %}</p>
{% endblock %}
{% block after_field_sets %}
<script type="text/javascript">document.getElementById("id_username").focus();</script>
{% endblock %}
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