Commit b9775b30 by Waheed Ahmed

Added publisher user creation form in admin.

ECOM-6841
parent f7349d4f
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 course_discovery.apps.publisher.forms import CourseUserRoleForm, OrganizationUserRoleForm, UserAttributesAdminForm
from course_discovery.apps.publisher.models import (
Course, CourseRun, CourseRunState, CourseState, CourseUserRole,
OrganizationExtension, OrganizationUserRole, Seat, State,
UserAttributes
)
from course_discovery.apps.publisher.forms import (CourseUserRoleForm, OrganizationUserRoleForm,
PublisherUserCreationForm, UserAttributesAdminForm)
from course_discovery.apps.publisher.models import (Course, CourseRun, CourseRunState, CourseState, CourseUserRole,
OrganizationExtension, OrganizationUserRole, PublisherUser, Seat,
State, UserAttributes)
@admin.register(CourseUserRole)
......@@ -58,3 +59,15 @@ class SeatAdmin(admin.ModelAdmin):
@admin.register(State)
class StateAdmin(admin.ModelAdmin):
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
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.publisher.mixins import LanguageModelSelect2Multiple, check_roles_access
from course_discovery.apps.publisher.models import (
Course, CourseRun, CourseUserRole, OrganizationExtension, OrganizationUserRole, Seat, User
)
from course_discovery.apps.publisher.models import (Course, CourseRun, CourseUserRole, OrganizationExtension,
OrganizationUserRole, PublisherUser, Seat, User)
class UserModelChoiceField(forms.ModelChoiceField):
......@@ -360,3 +359,18 @@ class OrganizationUserRoleForm(BaseUserAdminForm):
class CourseUserRoleForm(BaseUserAdminForm):
class Meta(BaseUserAdminForm.Meta):
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):
self.published()
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 course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.models import Person
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):
......@@ -58,3 +59,21 @@ class PersonModelMultipleChoiceTests(TestCase):
url=person.get_profile_image_url
)
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 ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: apps/api/filters.py
#, python-brace-format
......@@ -624,6 +624,10 @@ msgstr ""
msgid "Seat Type"
msgstr ""
#: apps/publisher/forms.py
msgid "This field is required."
msgstr ""
#: apps/publisher/models.py
msgid "Needs Review"
msgstr ""
......@@ -1649,6 +1653,12 @@ msgid ""
"publishes the course About page."
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
msgid "Dashboard"
msgstr ""
......
......@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: static/js/catalogs-change-form.js
msgid "Preview"
......
......@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/api/filters.py
......@@ -746,6 +746,10 @@ msgstr "Pröféssïönäl Édüçätïön Ⱡ'σяєм ιρѕυм ∂σłσя ѕ
msgid "Seat Type"
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
msgid "Needs Review"
msgstr "Nééds Révïéw Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
......@@ -1992,6 +1996,14 @@ msgstr ""
"яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυ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
msgid "Dashboard"
msgstr "Däshßöärd Ⱡ'σяєм ιρѕυм ∂σł#"
......
......@@ -7,14 +7,14 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: 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