admin.py 6.14 KB
Newer Older
1
""" Django admin pages for student app """
2
from django import forms
3
from django.contrib.auth.models import User
4 5 6 7
from ratelimitbackend import admin
from xmodule.modulestore.django import modulestore
from opaque_keys import InvalidKeyError
from opaque_keys.edx.keys import CourseKey
8

9
from config_models.admin import ConfigurationModelAdmin
10
from student.models import (
11 12
    UserProfile, UserTestGroup, CourseEnrollmentAllowed, DashboardConfiguration, CourseEnrollment, Registration,
    PendingNameChange, CourseAccessRole, LinkedInAddToProfileConfiguration
13
)
14 15 16 17 18
from student.roles import REGISTERED_ACCESS_ROLES


class CourseAccessRoleForm(forms.ModelForm):
    """Form for adding new Course Access Roles view the Django Admin Panel."""
19

20
    class Meta(object):  # pylint: disable=missing-docstring
21 22
        model = CourseAccessRole

23
    email = forms.EmailField(required=True)
24 25 26
    COURSE_ACCESS_ROLES = [(role_name, role_name) for role_name in REGISTERED_ACCESS_ROLES.keys()]
    role = forms.ChoiceField(choices=COURSE_ACCESS_ROLES)

27 28 29 30 31 32 33 34 35 36 37
    def clean_course_id(self):
        """
        Checking course-id format and course exists in module store.
        This field can be null.
        """
        if self.cleaned_data['course_id']:
            course_id = self.cleaned_data['course_id']

            try:
                course_key = CourseKey.from_string(course_id)
            except InvalidKeyError:
38
                raise forms.ValidationError(u"Invalid CourseID. Please check the format and re-try.")
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

            if not modulestore().has_course(course_key):
                raise forms.ValidationError(u"Cannot find course with id {} in the modulestore".format(course_id))

            return course_key

        return None

    def clean_org(self):
        """If org and course-id exists then Check organization name
        against the given course.
        """
        if self.cleaned_data.get('course_id') and self.cleaned_data['org']:
            org = self.cleaned_data['org']
            org_name = self.cleaned_data.get('course_id').org
            if org.lower() != org_name.lower():
                raise forms.ValidationError(
                    u"Org name {} is not valid. Valid name is {}.".format(
                        org, org_name
                    )
                )

        return self.cleaned_data['org']

    def clean_email(self):
        """
        Checking user object against given email id.
        """
        email = self.cleaned_data['email']
        try:
            user = User.objects.get(email=email)
        except Exception:
            raise forms.ValidationError(
72
                u"Email does not exist. Could not find {email}. Please re-enter email address".format(
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
                    email=email
                )
            )

        return user

    def clean(self):
        """
        Checking the course already exists in db.
        """
        cleaned_data = super(CourseAccessRoleForm, self).clean()
        if not self.errors:
            if CourseAccessRole.objects.filter(
                    user=cleaned_data.get("email"),
                    org=cleaned_data.get("org"),
                    course_id=cleaned_data.get("course_id"),
                    role=cleaned_data.get("role")
            ).exists():
                raise forms.ValidationError("Duplicate Record.")

        return cleaned_data

95 96 97 98 99
    def __init__(self, *args, **kwargs):
        super(CourseAccessRoleForm, self).__init__(*args, **kwargs)
        if self.instance.user_id:
            self.fields['email'].initial = self.instance.user.email

100 101 102 103 104

class CourseAccessRoleAdmin(admin.ModelAdmin):
    """Admin panel for the Course Access Role. """
    form = CourseAccessRoleForm
    raw_id_fields = ("user",)
105 106 107 108 109 110 111 112
    exclude = ("user",)

    fieldsets = (
        (None, {
            'fields': ('email', 'course_id', 'org', 'role',)
        }),
    )

113
    list_display = (
114
        'id', 'user', 'org', 'course_id', 'role',
115
    )
116 117 118 119 120 121 122
    search_fields = (
        'id', 'user__username', 'user__email', 'org', 'course_id', 'role',
    )

    def save_model(self, request, obj, form, change):
        obj.user = form.cleaned_data['email']
        super(CourseAccessRoleAdmin, self).save_model(request, obj, form, change)
123

124 125 126 127

class LinkedInAddToProfileConfigurationAdmin(admin.ModelAdmin):
    """Admin interface for the LinkedIn Add to Profile configuration. """

128
    class Meta(object):  # pylint: disable=missing-docstring
129 130 131 132 133 134
        model = LinkedInAddToProfileConfiguration

    # Exclude deprecated fields
    exclude = ('dashboard_tracking_code',)


135 136 137 138 139
class CourseEnrollmentAdmin(admin.ModelAdmin):
    """ Admin interface for the CourseEnrollment model. """
    list_display = ('id', 'course_id', 'mode', 'user', 'is_active',)
    list_filter = ('mode', 'is_active',)
    search_fields = ('course_id', 'mode', 'user__username',)
140 141 142 143 144 145

    def get_readonly_fields(self, request, obj=None):
        # The course_id, mode, and user fields should not be editable for an existing enrollment.
        if obj:
            return self.readonly_fields + ('course_id', 'mode', 'user',)
        return self.readonly_fields
146 147 148 149 150

    class Meta(object):  # pylint: disable=missing-docstring
        model = CourseEnrollment


151 152 153 154 155 156 157 158 159 160 161 162 163 164
class UserProfileAdmin(admin.ModelAdmin):
    """ Admin interface for UserProfile model. """
    list_display = ('user', 'name',)
    search_fields = ('user__username', 'user__first_name', 'user__last_name', 'user__email', 'name',)

    def get_readonly_fields(self, request, obj=None):
        # The user field should not be editable for an existing user profile.
        if obj:
            return self.readonly_fields + ('user',)
        return self.readonly_fields

    class Meta(object):  # pylint: disable=missing-docstring
        model = UserProfile

165

166 167
admin.site.register(UserTestGroup)

168 169
admin.site.register(CourseEnrollmentAllowed)

170 171 172
admin.site.register(Registration)

admin.site.register(PendingNameChange)
173

174
admin.site.register(CourseAccessRole, CourseAccessRoleAdmin)
175 176

admin.site.register(DashboardConfiguration, ConfigurationModelAdmin)
177

178
admin.site.register(LinkedInAddToProfileConfiguration, LinkedInAddToProfileConfigurationAdmin)
179 180

admin.site.register(CourseEnrollment, CourseEnrollmentAdmin)
181 182

admin.site.register(UserProfile, UserProfileAdmin)