Skip to content

Commit

Permalink
Took care of multiple instructors and how to deal with course settings
Browse files Browse the repository at this point in the history
  • Loading branch information
lduarte1991 committed Oct 21, 2015
1 parent 10cf334 commit e7c1966
Show file tree
Hide file tree
Showing 9 changed files with 200 additions and 7 deletions.
11 changes: 8 additions & 3 deletions hx_lti_initializer/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@
"""

from django.contrib import admin
from hx_lti_initializer.models import LTIProfile, LTICourse
from hx_lti_initializer.models import LTIProfile, LTICourse, LTICourseAdmin


class LTIProfileAdmin(admin.ModelAdmin):
pass


class LTICourseAdmin(admin.ModelAdmin):
class NewCourseAdmin(admin.ModelAdmin):
pass


class LTICourseAdm(admin.ModelAdmin):
fields = [
'course_id',
'course_name',
Expand All @@ -27,4 +31,5 @@ def course_id(self, instance): # pragma: no cover
return str(self.course_id)

admin.site.register(LTIProfile, LTIProfileAdmin)
admin.site.register(LTICourse, LTICourseAdmin)
admin.site.register(LTICourse, LTICourseAdm)
admin.site.register(LTICourseAdmin, NewCourseAdmin)
12 changes: 11 additions & 1 deletion hx_lti_initializer/forms.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django import forms
from hx_lti_initializer.models import LTICourse
from hx_lti_initializer.models import LTICourse, LTICourseAdmin
from hx_lti_assignment.models import Assignment


Expand All @@ -9,6 +9,16 @@ class Meta:
model = LTICourse
fields = (
'course_name',
'course_id',
'course_admins',
'course_external_css_default'
)


class CourseAdminForm(forms.ModelForm):
class Meta:
model = LTICourseAdmin
fields = (
'admin_unique_identifier',
'new_admin_course_id',
)
25 changes: 25 additions & 0 deletions hx_lti_initializer/migrations/0013_lticourseadmin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('hx_lti_initializer', '0012_auto_20151008_1650'),
]

operations = [
migrations.CreateModel(
name='LTICourseAdmin',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('admin_unique_identifier', models.CharField(max_length=255)),
('new_admin_course_id', models.CharField(max_length=255)),
],
options={
},
bases=(models.Model,),
),
]
22 changes: 22 additions & 0 deletions hx_lti_initializer/migrations/0014_auto_20151021_2025.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('hx_lti_initializer', '0013_lticourseadmin'),
]

operations = [
migrations.AlterModelOptions(
name='lticourseadmin',
options={'verbose_name': 'Pending Admins'},
),
migrations.AlterUniqueTogether(
name='lticourseadmin',
unique_together=set([('admin_unique_identifier', 'new_admin_course_id')]),
),
]
18 changes: 18 additions & 0 deletions hx_lti_initializer/migrations/0015_auto_20151021_2026.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

dependencies = [
('hx_lti_initializer', '0014_auto_20151021_2025'),
]

operations = [
migrations.AlterModelOptions(
name='lticourseadmin',
options={'verbose_name': 'Pending Admin'},
),
]
28 changes: 28 additions & 0 deletions hx_lti_initializer/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,3 +157,31 @@ def create_course(course_id, lti_profile):
course_object.save()
course_object.course_admins.add(lti_profile)
return course_object


class LTICourseAdmin(models.Model):
"""
"""

# TODO: Add explanation
admin_unique_identifier = models.CharField(
max_length=255,
)

new_admin_course_id = models.CharField(
max_length=255,
)

class Meta:
verbose_name = _("Pending Admin")
unique_together = ("admin_unique_identifier", "new_admin_course_id")

def __unicode__(self):
"""
When asked to print itself, this object will print the name
of the course.
"""
return u"%s" % self.admin_unique_identifier

def __str__(self):
return self.admin_unique_identifier
20 changes: 20 additions & 0 deletions hx_lti_initializer/templates/hx_lti_initializer/edit_course.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{% extends 'hx_lti_initializer/base.html' %}
{% load possible_admins %}
{% load bootstrap3 %}

{# Load CSS and JavaScript #}
Expand All @@ -12,11 +13,30 @@
<h3>Edit Course</h3>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.non_field_errors }}
{{ form.errors }}
<div class="form-group">
<label for="id_course_id" class="hidden">Course ID, do not touch</label>
<input type="text" maxlength="255" name="course_id" class="form-control hidden" id="id_course_id" value="{{form.course_id.value}}">
<label for="id_course_name">Course name:</label>
<input id="id_course_name" maxlength="255" name="course_name" class="form-control" type="text" value="{{form.course_name.value}}">
</div>
<div class="form-group">
<label for="id_select_existing_user">Add a new admin from existing user:</label>
<select class="form-control selectpicker" data-live-search="true" multiple id="id_select_existing_user" name="select_existing_user">
{% for selected, name in form.course_admins.value|list_of_possible_admins %}
<option value="{{name}}" {% if selected %} selected {% endif %}> {{name}} </option>
{% endfor %}
</select>
<label for="id_new_admin_list">Add new admins via unique id (edX = username, canvas = HUID):</label>
<input type="text" maxlength="255" name="new_admin_list" class="form-control" id="id_new_admin_list">
<p class="help">If adding multiple users, separate them with commas, not spaces.</p>
<label for="pending_admins">Pending Admins (will be added as course admins next time they log in):</label> {% if pending %}
{% for ad in pending %}
{{ad.admin_unique_identifier}},
{% endfor %}
{% else %} None {% endif %}
</div>
<div class="form-group hidden">
<label for="id_course_admins">Course admins:</label>
<select class="form-control selectpicker" data-live-search="true" multiple id="id_course_admins" name="course_admins">
{% for id,choice in form.fields.course_admins.choices %}
Expand Down
22 changes: 22 additions & 0 deletions hx_lti_initializer/templatetags/possible_admins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from django.template import Library
from hx_lti_initializer.models import LTIProfile

register = Library()


@register.filter_function
def list_of_possible_admins(already_in_course):
list_of_usernames_already_in_course = []
list_of_unique_names = []
result = []

for profile in LTIProfile.objects.all():
if profile.id in already_in_course:
list_of_usernames_already_in_course.append(profile.user.username)
if profile.user.username not in list_of_unique_names:
list_of_unique_names.append(profile.user.username)

for name in list_of_unique_names:
result.append((name in list_of_usernames_already_in_course, name))

return result
49 changes: 46 additions & 3 deletions hx_lti_initializer/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from django.contrib import messages

from target_object_database.models import TargetObject
from hx_lti_initializer.models import LTIProfile, LTICourse, User
from hx_lti_initializer.models import LTIProfile, LTICourse, User, LTICourseAdmin
from hx_lti_assignment.models import Assignment, AssignmentTargets
from hx_lti_initializer.utils import debug_printer, get_lti_value, retrieve_token # noqa
from hx_lti_initializer.forms import CourseForm
Expand Down Expand Up @@ -298,6 +298,18 @@ def launch_lti(request):
messages.warning(request, message_error)
course_object = LTICourse.create_course(course, lti_profile)

# check to see if user is awaiting to be added as an admin on a course
# if so add them.
try:
userfound = LTICourseAdmin.objects.get(
admin_unique_identifier=lti_profile.user.username,
new_admin_course_id=course
)
course_object.course_admins.add(lti_profile)
userfound.delete()
except:
debug_printer("Not waiting to be added as admin")

# logs the user in
lti_profile.user.backend = 'django.contrib.auth.backends.ModelBackend'
login(request, lti_profile.user)
Expand All @@ -309,23 +321,54 @@ def launch_lti(request):
def edit_course(request, id):
course = get_object_or_404(LTICourse, pk=id)
if request.method == "POST":
debug_printer("%s" % request.POST)
form = CourseForm(request.POST, instance=course)
if form.is_valid():
course = form.save()
course.save()

# this removes an administrator if they were checked off the list
admins = course.course_admins.all()
selected_list = request.POST.getlist('select_existing_user') + request.POST['new_admin_list'].split(',')
for admin in admins:
if admin.user.username not in selected_list:
course.course_admins.remove(admin)
else:
selected_list.remove(admin.user.username)
course.save()

# this will create an item in the database so when the user
# that was just added as an admin logs in, they get added
# to the list of admins in the course.
if len(selected_list) > 0:
for name in selected_list:
if str(name.strip()) != "":
try:
new_course_admin = LTICourseAdmin(
admin_unique_identifier=name,
new_admin_course_id=course.course_id
)
new_course_admin.save()
except:
# admin already pending
debug_printer("Admin already pending.")

messages.success(request, 'Course was successfully edited!')
return redirect('hx_lti_initializer:course_admin_hub')
else:
raise PermissionDenied()
else:
form = CourseForm(instance=course)
try:
pending_admins = LTICourseAdmin.objects.filter(new_admin_course_id=course.course_id)
except:
pending_admins = None
debug_printer("WHAT")
return render(
request,
'hx_lti_initializer/edit_course.html',
{
'form': form,
'user': request.user,
'pending': pending_admins,
}
)

Expand Down

0 comments on commit e7c1966

Please sign in to comment.