diff --git a/polynum_blackboard/app_settings.py b/polynum_blackboard/app_settings.py
index 04934ad..f545c9e 100644
--- a/polynum_blackboard/app_settings.py
+++ b/polynum_blackboard/app_settings.py
@@ -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
diff --git a/polynum_blackboard/django_ws.py b/polynum_blackboard/django_ws.py
index ba699ee..245a57b 100644
--- a/polynum_blackboard/django_ws.py
+++ b/polynum_blackboard/django_ws.py
@@ -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)
diff --git a/polynum_blackboard/forms.py b/polynum_blackboard/forms.py
index ca71862..4e9cdcb 100644
--- a/polynum_blackboard/forms.py
+++ b/polynum_blackboard/forms.py
@@ -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
diff --git a/polynum_blackboard/plugin.py b/polynum_blackboard/plugin.py
index 0e6b0ac..61434fc 100644
--- a/polynum_blackboard/plugin.py
+++ b/polynum_blackboard/plugin.py
@@ -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')]
diff --git a/polynum_blackboard/templates/document_copyrights.new_request.html b/polynum_blackboard/templates/document_copyrights.new_request.html
index 2120564..594a4b0 100644
--- a/polynum_blackboard/templates/document_copyrights.new_request.html
+++ b/polynum_blackboard/templates/document_copyrights.new_request.html
@@ -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(""+name+"");
+ content = ""+course_code+"";
+ content += ""+course_name+"";
+ $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);
diff --git a/polynum_blackboard/urls.py b/polynum_blackboard/urls.py
index e9b8af9..8391402 100644
--- a/polynum_blackboard/urls.py
+++ b/polynum_blackboard/urls.py
@@ -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\d+)/edit/(?P.+)/$', wizard.request_wizard_step, name='request_wizard_step'),
- url(r'^request/(?P\d+)/edit/$', wizard.request_wizard_step, name='request_wizard'),
- url(r'^request/(?P\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\d+)/edit/(?P.+)/$', 'request_wizard_step', name='request_wizard_step'),
+ url(r'^request/(?P\d+)/edit/$', 'request_wizard_step', name='request_wizard'),
+)
+
+urlpatterns += patterns('polynum_blackboard.views',
+ url(r'^request/(?P\d+)/course-list/$', 'courses_list', name='courses_list'),
+ url(r'^bb/create_course/', 'create_course', name='create_course'),
+)
diff --git a/polynum_blackboard/views.py b/polynum_blackboard/views.py
index 3ef502a..e78adb1 100644
--- a/polynum_blackboard/views.py
+++ b/polynum_blackboard/views.py
@@ -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()
diff --git a/polynum_blackboard/wizard.py b/polynum_blackboard/wizard.py
index 165d0dc..cf75c78 100644
--- a/polynum_blackboard/wizard.py
+++ b/polynum_blackboard/wizard.py
@@ -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,