This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
polynum-blackboard/polynum_blackboard/views.py

124 lines
5.0 KiB
Python

# -*- coding: utf-8 -*-
import json
import logging
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
from django.template import RequestContext
from django.template.loader import render_to_string
from django import shortcuts
from django.conf import settings
from django.forms.util import ErrorList
from django.forms.forms import NON_FIELD_ERRORS
from django.core.mail import send_mail
from polynum.base.models import Request, Entity
import django_ws
from forms import CreateCourseForm
@require_POST
@login_required
def create_course(request):
'''Ajax view'''
form = CreateCourseForm(data=request.POST, request=request)
ctx = { 'create_course_form': form }
data = {
"success": 0,
"course_year": settings.POLYNUM_BB_COURSE_YEAR
}
if form.is_valid():
conn = django_ws.get_bb_conn()
course_id = form.cleaned_data['course_id']
entity = form.cleaned_data['entity']
diploma = entity.parents().get(
entity_type__name=settings.POLYNUM_BB_DIPLOMA_DESIGNATION)
course_label = diploma.get_name() + '_' + \
settings.POLYNUM_BB_COURSE_YEAR + '_' + \
entity.get_name() + '_' + request.user.display_name().title()
if form.cleaned_data.get('td_group'):
course_label += '_' + form.cleaned_data['td_group']
ok, result = conn.create_course(course_id,
course_label,
form.cleaned_data['category'],
form.cleaned_data['open_to_visitors'],
form.cleaned_data['subscription_policy'] != 'no',
form.cleaned_data['password'])
if ok:
logging.info('user %s created course %s',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'))
notify_mailinglist = settings.POLYNUM_BB_COURSE_CREATE_NOTIFY_EMAIL
if notify_mailinglist:
ctx = form.cleaned_data.copy()
ctx['username'] = request.user.username
ctx['display_name'] = request.user.display_name()
ctx['open_to_visitors'] = 'oui' if ctx['open_to_visitors'] else 'non'
ctx['subscription_policy'] = dict(form.fields['subscription_policy'].choices)[ctx['subscription_policy']]
send_mail(u'Nouveau cours %s créé par %s' % (course_id,
request.user.username),
u'''\
Le nouveau cours %(course_id)s vient d'être créé par %(display_name)s (%(username)s)
Categorie: %(category)s
Ouvert aux visiteurs: %(open_to_visitors)s
Auto-enregistrement: %(subscription_policy)s
Mot de passe: %(password)s
''' % ctx,
settings.DEFAULT_FROM_EMAIL,
notify_mailinglist)
data = {
'success': 1,
'entity_pk': form.cleaned_data['entity'].pk,
'course_id': course_id,
'description': course_label,
}
else:
logging.error('user %s failed to create course %s: %s',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'),
result)
errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())
errors.append(result)
if not data['success']:
data['html'] = render_to_string("_create_course.html", ctx,
context_instance=RequestContext(request))
return HttpResponse(json.dumps(data), mimetype="application/json")
@login_required
def courses_list(request, pk):
'''Generate the list of courses with respect to Request object given by
pk.
'''
polynum_request = shortcuts.get_object_or_404(Request, pk=pk)
return shortcuts.render(request, "_select_course.html", { "courses":
courses_ctx(request, polynum_request)})
def courses_ctx(request, polynum_request):
'''Context building for the course selection template.'''
ctx = {}
conn = django_ws.get_bb_conn()
ok, result = conn.get_course_by_owner(request.user.username)
if ok:
ctx['user_courses'] = result
sponsor_username = polynum_request.sponsor_username()
if sponsor_username and sponsor_username != request.user.username:
ok, result = conn.get_course_by_owner(sponsor_username)
if ok:
ctx['sponsor_courses'] = result
if polynum_request.entity or 'ue' in request.GET:
ue = request.GET.get('ue')
if ue:
possible_ue = Entity.objects.filter(code=ue.lower())
if not ue or not possible_ue:
possible_ue = polynum_request.entity.parents(True).filter(entity_type__name=settings.POLYNUM_BB_UE_DESIGNATION)
if possible_ue:
ctx['ue'] = possible_ue[0].get_name()
ue = possible_ue[0].code.upper()
ok, result = conn.get_course_by_ue(ue)
if not ok:
return dict(error=result)
ctx['ue_courses'] = result
return ctx