improve computation of course code and names
This commit is contained in:
parent
89bbb8428f
commit
45f8c7c764
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')]
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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'),
|
||||
)
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
Reference in New Issue