UserAdmin   A
last analyzed

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 64
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A make_owner() 0 3 2
A make_student() 0 3 2
A make_tutor() 0 3 2
A make_admin() 0 3 2
A mergeusers() 0 16 4
1
# User admin interface
2
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
3
from django.shortcuts import render
4
from django.contrib import admin
5
from django.http import HttpResponseRedirect
6
from django.contrib import messages
7
from django.core.urlresolvers import reverse
8
9
from opensubmit.models import UserProfile
10
from opensubmit.security import make_student, make_tutor, make_owner, make_admin, STUDENT_TUTORS_GROUP_NAME, COURSE_OWNERS_GROUP_NAME
11
12
13
class UserProfileInline(admin.TabularInline):
14
    model = UserProfile
15
    verbose_name_plural="Student Details"
16
    can_delete = False
17
#    classes = ('grp-collapse grp-open',)
18
    inline_classes = ('grp-collapse grp-open',)
19
20
def study_program(user):
21
    return user.profile.study_program
22
23
def is_student(user):
24
    return user.is_staff
25
is_student.short_description = "Backend?"
26
is_student.boolean = True
27
28
def is_tutor(user):
29
    return user.groups.filter(name=STUDENT_TUTORS_GROUP_NAME).exists()
30
is_tutor.short_description = "Tutor?"
31
is_tutor.boolean = True
32
33
def is_owner(user):
34
    return user.groups.filter(name=COURSE_OWNERS_GROUP_NAME).exists()
35
is_owner.short_description = "Owner?"
36
is_owner.boolean = True
37
38
def is_admin(user):
39
    return user.is_superuser
40
is_admin.short_description = "Admin?"
41
is_admin.boolean = True
42
43
def groups(user):
44
    return ",".join(str(group) for group in user.groups.all())
45
46
def student_id(user):
47
    return user.profile.student_id
48
student_id.short_description = "Student ID"
49
50
def social_login_id(user):
51
    try:
52
        return str(user.social_auth.get().uid)
53
    except:
54
        return None
55
social_login_id.short_description = "Social Login ID"
56
57
class UserAdmin(DjangoUserAdmin):
58
    actions = ['mergeusers','make_student','make_tutor','make_owner','make_admin']
59
    fieldsets = (
60
        ("User Data", {
61
            "classes": ("grp-collapse grp-open",),
62
            "fields": ("username","password","first_name","last_name", "email")
63
        }),
64
        ("Details", {
65
            "classes": ("placeholder profile-group",),
66
            "fields": ()
67
        }),
68
        ("Authorization", {
69
            "classes": ("grp-collapse grp-open",),
70
            "fields": ("is_active", "is_staff", "is_superuser", "groups")
71
        }),
72
        ("Info", {
73
            "classes": ("grp-collapse grp-open",),
74
            "fields": ("last_login","date_joined")
75
        }),
76
    )
77
78
    class Media:
79
        css = {'all': ('css/teacher.css',)}
80
81
    inlines = (UserProfileInline, )
82
    list_display = ('username', 'email', 'first_name', 'last_name', student_id, study_program, is_student, is_tutor, is_owner, is_admin, social_login_id)
83
84
    def make_student(self, request, queryset):
85
        for user in queryset:
86
            make_student(user)
87
    make_student.short_description = "Configure selected users as student"
88
89
    def make_tutor(self, request, queryset):
90
        for user in queryset:
91
            make_tutor(user)
92
    make_tutor.short_description = "Configure selected users as tutor"
93
94
    def make_owner(self, request, queryset):
95
        for user in queryset:
96
            make_owner(user)
97
    make_owner.short_description = "Configure selected users as course owner"
98
99
    def make_admin(self, request, queryset):
100
        for user in queryset:
101
            make_admin(user)
102
    make_admin.short_description = "Configure selected users as admin"
103
104
    def mergeusers(modeladmin, request, queryset):
105
        if len(queryset) != 2:
106
            modeladmin.message_user(request, "Please choose exactly two users to merge.", level=messages.WARNING)
107
            return reverse('admin:index')
108
        # In most cases, we want to keep the user logged in recently, so we query accordingly
109
        primary, secondary = queryset.order_by('-date_joined')
110
        # Since the user is deleted, merging staff users is more complicated
111
        # (course ownership, gradings given etc.)
112
        # We therefore only support the merging of real students
113
        if primary.profile.tutor_courses().count() > 0:
114
            modeladmin.message_user(request, "{0} is a course owner or tutor, which cannot be merged.".format(primary), level=messages.WARNING)
115
            return reverse('admin:index')
116
        if secondary.profile.tutor_courses().count() > 0:
117
            modeladmin.message_user(request, "{0} is a course owner or tutor, which cannot be merged.".format(secondary), level=messages.WARNING)
118
            return reverse('admin:index')
119
        return HttpResponseRedirect(reverse('mergeusers', kwargs={'primary_pk': primary.pk, 'secondary_pk': secondary.pk}))
120
    mergeusers.short_description = "Merge selected users"
121