From 45f8c7c7649c09c6ae7308ea1d402a164628474b Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Mon, 20 Jan 2014 12:00:59 +0100 Subject: [PATCH] improve computation of course code and names --- polynum_blackboard/app_settings.py | 58 ++++++++++++++- polynum_blackboard/django_ws.py | 12 ++-- polynum_blackboard/forms.py | 15 ++-- polynum_blackboard/plugin.py | 4 ++ .../document_copyrights.new_request.html | 21 ++++-- polynum_blackboard/urls.py | 19 ++--- polynum_blackboard/views.py | 70 ++++++++++++------- polynum_blackboard/wizard.py | 6 +- 8 files changed, 140 insertions(+), 65 deletions(-) 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,