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

138 lines
5.4 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
}
try:
document = Request.objects.get(id=request.POST.get('request-id'))
except Request.DoesNotExist:
document = None
if form.is_valid():
conn = django_ws.get_bb_conn()
course_id = form.cleaned_data['course_id']
entity = form.cleaned_data['entity']
owner_name = document.sponsor_name()
if document and '(' in document.sponsor:
owner_name = document.sponsor.split('(')[0]
course_label = entity.code.upper() + '_' + settings.POLYNUM_BB_COURSE_YEAR
if form.cleaned_data.get('td_group'):
course_label += '_Gr' + form.cleaned_data['td_group']
course_label += '_' + owner_name
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
else:
ctx['user_courses_error'] = 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
else:
ctx['sponsor_courses_error'] = result
if polynum_request.entity or 'ue' in request.GET:
ue = request.GET.get('ue')
possible_ue = None
if ue:
possible_ue = Entity.objects.filter(code=ue.lower())
if possible_ue:
possible_ue = possible_ue[0]
if ue is None:
possible_ue = polynum_request.entity
if possible_ue.entity_type.name != settings.POLYNUM_BB_UE_DESIGNATION:
possible_ue = None
if possible_ue:
ctx['ue'] = possible_ue.get_name()
ue = possible_ue.code.upper()
ok, result = conn.get_course_by_ue(ue)
if ok:
ctx['ue_courses'] = result
else:
ctx['ue_courses_error'] = result
return ctx