improve computation of course code and names

This commit is contained in:
Benjamin Dauvergne 2014-01-20 12:00:59 +01:00
parent 89bbb8428f
commit 45f8c7c764
8 changed files with 140 additions and 65 deletions

View File

@ -1,6 +1,58 @@
# -*- coding: utf-8 -*-
from django.conf import settings
import sys
BB_RESUME_MESSAGE = getattr(settings, 'POLYNUM_BLACKBOARD_RESUME_MESSAGE',
u'Votre document sera en ligne dans 5 minutes, dans un menu nommé "Reprographie".')
class AppSettings(object):
'''Thanks django-allauth'''
__DEFAULTS = dict(
URL = 'https://mycourse.dauphine.fr/webapps/',
ADMIN_LOGIN = 'testbb',
ADMIN_PASSWORD = '',
SECRET_KEY = '',
DIPLOMA_DESIGNATION = 'diplome',
UE_DESIGNATION = 'element pedagogique',
COURSE_CREATE_NOTIFY_EMAIL = [ ],
RESUME_MESSAGE=u'Votre document sera en ligne dans 5 minutes, dans un menu nommé "Reprographie".',
)
def __init__(self, prefix):
self.prefix = prefix
@classmethod
def get_default_course_year(cls):
import datetime
t = datetime.date.today()
if t.month > 7:
return '%s-%s' % (t.year, t.year+1)
else:
return '%s-%s' % (t.year-1, t.year)
@property
def settings(self):
from django.conf import settings
return settings
@property
def COURSE_YEAR(self):
key = self.prefix+'COURSE_YEAR'
if hasattr(self.settings, key):
return getattr(self.settings, key)
return self.get_default_course_year()
def __getattr__(self, key):
if key in self.__DEFAULTS:
return getattr(self.settings,
self.prefix+key, self.__DEFAULTS[key])
else:
from django.core.exceptions import ImproperlyConfigured
try:
return getattr(self.settings, self.prefix+key)
except AttributeError:
raise ImproperlyConfigured('settings %s is missing' % self.prefix+key)
app_settings = AppSettings('POLYNUM_BB_')
app_settings.__name__ = __name__
app_settings.__file__ = __file__
sys.modules[__name__] = app_settings

View File

@ -1,10 +1,8 @@
from django.conf import settings
import ws
from . import app_settings, ws
def get_bb_conn():
url = settings.POLYNUM_BB_URL
login = settings.POLYNUM_BB_ADMIN_LOGIN
password = settings.POLYNUM_BB_ADMIN_PASSWORD
secret_key = settings.POLYNUM_BB_SECRET_KEY
url = app_settings.URL
login = app_settings.ADMIN_LOGIN
password = app_settings.ADMIN_PASSWORD
secret_key = app_settings.SECRET_KEY
return ws.BlackboardConnector(url, login, password, secret_key)

View File

@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from crispy_forms.helper import FormHelper
@ -79,7 +78,7 @@ class CreateCourseForm(forms.Form):
self.request = request
super(CreateCourseForm, self).__init__(*args, **kwargs)
self.fields['entity'].widget = widgets.MillerColumns(
attrs={'data-entity-type': settings.POLYNUM_BB_UE_DESIGNATION})
attrs={'data-entity-type': app_settings.UE_DESIGNATION})
def clean(self):
'''Check that category, subscription_policy and entity are correctly
@ -90,12 +89,8 @@ class CreateCourseForm(forms.Form):
cleaned_data['category'] = DEFAULT_CATEGORY
if cleaned_data['subscription_policy'] == 'password' and not cleaned_data['password']:
raise forms.ValidationError(u'vous devez fournir un mot de passe')
if cleaned_data['entity'].entity_type.name != settings.POLYNUM_BB_UE_DESIGNATION:
if cleaned_data['entity'].entity_type.name != app_settings.UE_DESIGNATION:
raise forms.ValidationError(u'vous devez sélectionner une UE')
course_id = [ cleaned_data['entity'].code.upper(), settings.POLYNUM_BB_COURSE_YEAR ]
if cleaned_data['td_group']:
course_id.append('Gr' + cleaned_data['td_group'])
cleaned_data['course_id'] = u'_'.join(course_id)
return cleaned_data
class MyCourseForm(request_forms.CopyrigtsForm):
@ -126,7 +121,7 @@ laquelle vous souhaitez diffuser votre document')
super(MyCourseForm, self).__init__(*args, **kwargs)
self.fields['course_name'].widget = forms.HiddenInput()
self.fields['ue'].widget = widgets.MillerColumns(attrs={
'data-entity-type': settings.POLYNUM_BB_UE_DESIGNATION
'data-entity-type': app_settings.UE_DESIGNATION
})
licence_pks_with_mycourse_tag = []
for licence in self.fields['licence'].queryset:
@ -170,7 +165,7 @@ laquelle vous souhaitez diffuser votre document')
ret = super(MyCourseForm, self).pprint_data(data)
if self.push and self.push.course_name:
ret.append((u'Déposer dans le cours', self.push.course_name, False))
if app_settings.BB_RESUME_MESSAGE:
ret.append(('', app_settings.BB_RESUME_MESSAGE, False))
if app_settings.RESUME_MESSAGE:
ret.append(('', app_settings.RESUME_MESSAGE, False))
return ret

View File

@ -5,3 +5,7 @@ class Plugin(object):
def get_urls(self):
from . import urls
return ((0, urls.urlpatterns),)
def get_template_dirs(self):
import os.path
return [os.path.join(os.path.dirname(__file__), 'templates')]

View File

@ -106,17 +106,26 @@ option.unavailable {
while (item && item.type != 'diplome') {
item = delegate.cache[item.parent_id];
}
var diploma = item;
if (item == undefined) {
$name.addClass('alert');
$name.text("La sélection n'est pas une unité d'enseignement.");
} else {
var username = '{{user.username}}';
var name = item.name+'_'+'{{course_year}}'+'_'+ue.name+'_{{user.display_name|title}}';
var sponsor_name = '{{ object.sponsor_name }}';
var scholar_year = '{{ course_year }}';
var diploma_name = diploma.name;
var group = '';
if (td_group) {
name += '_' + td_group.toUpperCase();
group = '_Gr' + td_group;
}
var course_code = ue.code.toUpperCase() + '_' + new Date().getFullYear() + group;
var course_name = diploma.name.toUpperCase() + '_' + scholar_year + '_' +
ue.description + group + '_' + sponsor_name;
$name.removeClass('alert');
$name.html("<span><label>Libellé</label>"+name+"</span>");
content = "<span><label>Code</label>"+course_code+"</span>";
content += "<span><label>Nom</label>"+course_name+"</span>";
$name.html(content);
}
}
$('#id_document_copyrights-licence').on('change', function () {
@ -141,11 +150,11 @@ option.unavailable {
dataType: 'json',
success: function (content, statusText, xhr, form) {
if (content.success) {
alert('Cours ' + content.course_id + ' créé.');
alert('Cours ' + content.course_code + ' créé.');
$('#create-course').modal('hide');
$('#div_id_document_copyrights-ue .miller-columns').millercolumns(
'setItem', ''+content.entity_pk);
$('#id_document_copyrights-course_name').val(content.course_id);
$('#id_document_copyrights-course_name').val(content.course_code);
$('#id_document_copyrights-ue').trigger('change');
} else {
var newform = $(content.html);

View File

@ -1,12 +1,13 @@
from django.conf.urls import patterns, include, url
from django.conf.urls import patterns, url
import views
import wizard
urlpatterns = patterns('',
url(r'^request/(?P<pk>\d+)/edit/(?P<step>.+)/$', wizard.request_wizard_step, name='request_wizard_step'),
url(r'^request/(?P<pk>\d+)/edit/$', wizard.request_wizard_step, name='request_wizard'),
url(r'^request/(?P<pk>\d+)/course-list/$', views.courses_list, name='courses_list'),
url(r'^bb/create_course/', views.create_course, name='create_course'),
(r'^', include('polynum.urls')))
urlpatterns = patterns('polynum_blackboard.wizard',
url(r'^request/(?P<pk>\d+)/edit/(?P<step>.+)/$', 'request_wizard_step', name='request_wizard_step'),
url(r'^request/(?P<pk>\d+)/edit/$', 'request_wizard_step', name='request_wizard'),
)
urlpatterns += patterns('polynum_blackboard.views',
url(r'^request/(?P<pk>\d+)/course-list/$', 'courses_list', name='courses_list'),
url(r'^bb/create_course/', 'create_course', name='create_course'),
)

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import json
import logging
import datetime
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
@ -8,15 +9,18 @@ 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 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
@ -26,44 +30,59 @@ def create_course(request):
ctx = { 'create_course_form': form }
data = {
"success": 0,
"course_year": settings.POLYNUM_BB_COURSE_YEAR
"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()
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
diploma = entity.parent_of_type('diplome') or entity
group = ''
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'])
group = '_Gr{0}'.format(form.cleaned_data['td_group'])
course_code = '{entity_code}_{today.year}{group}'.format(
entity_code=entity.code.upper(),
today=datetime.date.today(),
group=group)
course_name = '{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(unicode(course_code),
unicode(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:
logging.info('user %s created course %s',
import pdb
pdb.set_trace()
logger.info('user %s created course %r with label %r',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'))
notify_mailinglist = settings.POLYNUM_BB_COURSE_CREATE_NOTIFY_EMAIL
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_id,
send_mail(u'Nouveau cours %s créé par %s' % (course_code,
request.user.username),
u'''\
Le nouveau cours %(course_id)s vient d'être créé par %(display_name)s (%(username)s)
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
@ -75,14 +94,13 @@ Mot de passe: %(password)s
data = {
'success': 1,
'entity_pk': form.cleaned_data['entity'].pk,
'course_id': course_id,
'description': course_label,
'course_code': course_code,
'description': course_name,
}
else:
logging.error('user %s failed to create course %s: %s',
logger.error('user %s failed to create course %r: %r',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'),
result)
course_code, result)
errors = form._errors.setdefault(NON_FIELD_ERRORS, ErrorList())
errors.append(result)
if not data['success']:
@ -124,7 +142,7 @@ def courses_ctx(request, polynum_request):
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:
if possible_ue.entity_type.name != app_settings.UE_DESIGNATION:
possible_ue = None
if possible_ue:
ctx['ue'] = possible_ue.get_name()

View File

@ -1,10 +1,8 @@
from django.contrib.auth.decorators import login_required
from django.conf import settings
from polynum.request import views as request_views
import forms
import views
from . import app_settings, forms, views
named_new_request_forms = []
@ -21,7 +19,7 @@ class RequestWizardView(request_views.RequestWizardView):
context['create_course_form'] = forms.CreateCourseForm(request=self.request,
initial={'entity': polynum_request.entity})
context['courses'] = views.courses_ctx(self.request, polynum_request)
context['course_year'] = settings.POLYNUM_BB_COURSE_YEAR
context['course_year'] = app_settings.COURSE_YEAR
return context
request_wizard_step = login_required(RequestWizardView.as_view(named_new_request_forms,