154 lines
5.9 KiB
Python
154 lines
5.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import logging
|
|
import datetime
|
|
|
|
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.forms.util import ErrorList
|
|
from django.forms.forms import NON_FIELD_ERRORS
|
|
from django.core.mail import send_mail
|
|
from django.conf import settings
|
|
|
|
from polynum.base.models import Request, Entity
|
|
|
|
import django_ws
|
|
from forms import CreateCourseForm
|
|
from . import app_settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
@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": app_settings.COURSE_YEAR
|
|
}
|
|
try:
|
|
document = Request.objects.get(id=request.POST.get('request-id'))
|
|
except Request.DoesNotExist:
|
|
document = None
|
|
ctx['object'] = document
|
|
if form.is_valid():
|
|
conn = django_ws.get_bb_conn()
|
|
entity = form.cleaned_data['entity']
|
|
diploma = entity.parent_of_type('version diplome') or entity
|
|
group = ''
|
|
if form.cleaned_data.get('td_group'):
|
|
group = '_Gr{0}'.format(form.cleaned_data['td_group'])
|
|
course_code = u'{entity_code}_{today.year}{group}'.format(
|
|
entity_code=entity.code.upper(),
|
|
today=datetime.date.today(),
|
|
group=group)
|
|
course_name = u'{diploma.name}_{scholar_year}_{entity.description}{group}_{sponsor_name}'.format(
|
|
scholar_year=app_settings.COURSE_YEAR,
|
|
diploma=diploma,
|
|
entity=entity,
|
|
group=group,
|
|
sponsor_name=document.sponsor_name())
|
|
logger.debug('trying to create course with code %r and name %r',
|
|
course_code, course_name)
|
|
try:
|
|
ok, result = conn.create_course(course_code,
|
|
course_name,
|
|
form.cleaned_data['category'],
|
|
form.cleaned_data['open_to_visitors'],
|
|
form.cleaned_data['subscription_policy'] != 'no',
|
|
form.cleaned_data['password'])
|
|
except Exception:
|
|
raise
|
|
if ok:
|
|
logger.info('user %s created course %r with label %r',
|
|
request.user.username.encode('utf-8'),
|
|
course_code, course_name)
|
|
notify_mailinglist = app_settings.COURSE_CREATE_NOTIFY_EMAIL
|
|
if notify_mailinglist:
|
|
ctx = form.cleaned_data.copy()
|
|
ctx['course_code'] = course_code
|
|
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_code,
|
|
request.user.username),
|
|
u'''\
|
|
Le nouveau cours %(course_code)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_code': course_code,
|
|
'description': course_name,
|
|
}
|
|
else:
|
|
logger.error('user %s failed to create course %r: %r',
|
|
request.user.username.encode('utf-8'),
|
|
course_code, 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 != app_settings.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
|