beta version of the send to MyCourse views

Course creation is working.
This commit is contained in:
Benjamin Dauvergne 2012-12-05 00:40:30 +01:00
parent 98e1548f68
commit 5ddd54e28a
6 changed files with 1343 additions and 64 deletions

View File

@ -2,6 +2,7 @@
from django import forms
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, HTML, Field, Fieldset
@ -10,8 +11,9 @@ from polynum.base.models import Entity
from polynum.request import widgets , forms as request_forms
import django_ws
import constant
import models
YEAR = '2012'
DEFAULT_CATEGORY = ''
def categories():
@ -19,7 +21,7 @@ def categories():
ok, response = django_ws.get_bb_conn().get_categories()
if ok:
for category in response.categories:
yield (category.id, category.name)
yield (category.name, category.name)
class func2iter(object):
def __init__(self, func):
@ -33,12 +35,20 @@ class CreateCourseForm(forms.Form):
helper = FormHelper()
helper.form_tag = False
helper.layout = Layout(
'description',
Div(
Div('description', css_class="span4"),
HTML('<div class="span8" class="future-name"></div>'),
css_class='row-fluid'),
'entity',
'category',
'td_group',
'open_to_visitors',
'subscription_policy',
Div(
Div(Field('category', css_class="span12"),
css_class="span8"),
Div('td_group', css_class="span4"),
css_class="row-fluid"),
Div(
Div('subscription_policy', css_class="span6"),
Div('open_to_visitors', css_class="span6"),
css_class="row-fluid"),
Div(Field('password'), css_class="hide"))
SUBSCRIPTION_POLICIES = (
@ -46,7 +56,8 @@ class CreateCourseForm(forms.Form):
('password', u'avec mot de passe'),
('no', u'non'))
description = forms.CharField(max_length=32)
entity = forms.ModelChoiceField(Entity.objects.all(), label=u'Diplôme')
entity = forms.ModelChoiceField(Entity.objects.all(),
label=u'Diplôme')
category = forms.ChoiceField(label=u'Catégorie',
choices=func2iter(categories))
td_group = forms.CharField(label=u'Groupe de TD', max_length=16,
@ -54,49 +65,91 @@ class CreateCourseForm(forms.Form):
open_to_visitors = forms.BooleanField(label=u'Ouvert aux visiteurs',
required=False)
subscription_policy = forms.ChoiceField(label=u'Auto-inscription', choices=SUBSCRIPTION_POLICIES)
password = forms.CharField(max_length=32)
password = forms.CharField(label=u'Mot de passe', max_length=32, required=False)
def __init__(self, request=None, *args, **kwargs):
self.request = request
super(CreateCourseForm, self).__init__(*args, **kwargs)
self.fields['entity'].widget = widgets.MillerColumns(attrs={'data-entity-type': 'etape'})
self.fields['entity'].widget = widgets.MillerColumns(
attrs={'data-entity-type': settings.POLYNUM_BB_UE_DESIGNATION})
def clean(self):
cleaned_data = self.cleaned_data
if not cleaned_data['category']:
if not cleaned_data.get('category'):
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 != 'element pedagogique':
if cleaned_data['entity'].entity_type.name != settings.POLYNUM_BB_UE_DESIGNATION:
raise forms.ValidationError(u'vous devez sélectionner une UE')
diplome_entity = cleaned_data['entity'].parents().get(entity_type__name='etape')
cleaned_data['course_id'] = '{0}_{1}_{2}'.format(diplome_entity,
YEAR, self.request.user.username)
diplome_entity = cleaned_data['entity'].parents().get(entity_type__name=settings.POLYNUM_BB_DIPLOMA_DESIGNATION)
name = [ diplome_entity.code.upper(), settings.POLYNUM_BB_COURSE_YEAR, cleaned_data['entity'].code.upper(),
self.request.user.username.upper() ]
course_id = [ diplome_entity.code.upper(), settings.POLYNUM_BB_COURSE_YEAR ]
if cleaned_data['td_group']:
course_id.append(cleaned_data['td_group'])
cleaned_data['course_id'] = u'_'.join(course_id)
return cleaned_data
class MyCourseForm(request_forms.CopyrigtsForm):
send_to_mycourse = forms.BooleanField(
label=u'Envoyer le document à MyCourse')
visible_to_students = forms.BooleanField(
label=u'Visible aux étudiants',
initial=True)
ue = forms.ModelChoiceField(Entity.objects.all(), label=u'Unité d\'enseignement')
course_name = forms.CharField(max_length=64)
class Meta(request_forms.CopyrigtsForm.Meta):
fields = ('copyright',)
required = ('copyright',)
fields = ('copyright', 'licence')
required = ('copyright', 'licence')
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance', None)
push = None
if instance:
try:
push = models.BlackBoardPush.objects.get(request=instance)
except models.BlackBoardPush.DoesNotExist:
pass
initial = kwargs.setdefault('initial', {})
initial['ue'] = instance.entity.pk if instance and instance.entity else 7300
if push:
initial['course_name'] = push.course_name
super(MyCourseForm, self).__init__(*args, **kwargs)
self.fields['course_name'].widget = forms.HiddenInput()
self.fields['send_to_mycourse'].initial = \
settings.POLYNUM_BB_SEND_TO_MYCOURSE_DEFAULT
self.fields['ue'].widget = widgets.MillerColumns(attrs={
'data-entity-type': settings.POLYNUM_BB_UE_DESIGNATION
})
licence_pks_with_mycourse_tag = []
for licence in self.fields['licence'].queryset:
if constant.MYCOURSE_TAG in licence.diffusion_tags:
licence_pks_with_mycourse_tag.append(licence.pk)
self.helper.layout = Layout(
'copyright',
'licence',
HTML('<script>var licence_pks_with_mycourse_tag = [%s];</script>' %
', '.join(map(str, licence_pks_with_mycourse_tag))),
Fieldset(u'Diffusion sur la plateform d\'e-Learning',
'send_to_mycourse',
Div(
'visible_to_students',
'ue',
HTML('{% include \'_select_course.html\' %}'),
id='mycourse-block', css_class='hide')))
def clean_course_name(self):
if self.cleaned_data['licence'] and \
constant.MYCOURSE_TAG in self.cleaned_data['licence'].diffusion_tags and \
not self.cleaned_data.get('course_name'):
raise forms.ValidationError(_(u'Vous devez choisir un cours'))
return self.cleaned_data.get('course_name')
def save(self, commit=True):
instance = super(MyCourseForm, self).save(commit=commit)
if self.cleaned_data['licence'] and \
constant.MYCOURSE_TAG in self.cleaned_data['licence'].diffusion_tags:
push, created = models.BlackBoardPush.objects.get_or_create(request=instance)
push.course_name = self.cleaned_data['course_name']
push.visible_to_students = self.cleaned_data['visible_to_students']
push.save()
else:
models.BlackBoardPush(request=instance).delete()
return instance

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
{% load url from future %}
{% load crispy_forms_tags %}
<div id="create-course" class="modal hide fade large">
<form action="{% url 'create_course' %}" method="POST">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3>Création d'un nouveau cours</h3>
</div>
<div class="modal-body">
{% crispy create_course_form %}
</div>
<div class="modal-footer">
<button type="button" data-dismiss="modal" class="btn">Fermer</a>
<button class="btn btn-primary">Créer</a>
</div>
</form>
<script>
$(function () {
function install_form() {
$('#create-course form').ajaxForm({
dataType: 'json',
success: function (content, statusText, xhr, form) {
console.log(content);
if (content.success) {
alert('Cours ' + content.course_id + ' créé.');
$('#create-course').modal('hide');
var option = $('<option value="' + content.course_id + '">' + content.description + '</option>');
var select = $('.type-owner select');
option.appendTo(select);
select.val(content.course_id);
select.trigger('change');
} else {
var newform = $(content.html);
$('#create-course form').replaceWith($('form', newform));
window.install_django_miller_columns();
install_form();
}
}
});
}
install_form();
});
</script>
</div>

View File

@ -1,12 +1,16 @@
{% load sekizai_tags %}
{% load url from future %}
<div class="course-selector" data-refresh-url="{% url 'courses_list' pk=object.pk %}">
{% if wizard.form.course_name.errors %}
<div class="alert">
{{ wizard.form.course_name.errors }}
</div>
{% endif %}
<div id="course-selector" class="course-selector">
{% if courses.error %}
<div class="alert alert-error">Impossible de récupérer la liste des cours: {{ courses.error }}</div>
{% else %}
<div class="control-group">
<div class="control-group type-owner">
<label for="course-type-owner" class="control-label">Mes cours</label>
<div class="controls">
{% include '_courses_selector.html' with response=courses.user_courses only %}
@ -14,22 +18,48 @@
</div>
</div>
{% if courses.ue_courses %}
<div class="control-group">
<label for="course-type-ue" class="control-label">Cours proches du document</label>
<label for="course-type-ue" class="control-label">Cours proches de l'UE «&nbsp;{{ courses.ue }}&nbsp;»</label>
<div class="controls">
{% include '_courses_selector.html' with response=courses.ue_courses only %}
</div>
</div>
{% endif %}
{% endif %}
</div>
{% addtoblock "endscripts" %}
<script>
(function ($) {
$(function () {
$('body', 'change', '.courses-selector', function (){
var getJSON = function(url) {
var res;
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
success: function(data) {
res = data;
},
async: false
});
return res;
};
$('.courses-selector').on('change', function (){
$('.courses-selector').not(this).val('');
$('.courses-input').val($(this).val());
$('#id_document_copyrights-course_name').val($(this).val());
});
$('#id_document_copyrights-ue').on('change', function () {
var value = $(this).val();
var url = '/entity/' + value + '/';
var json = getJSON(url);
console.log(json);
var url = '../../course-list/';
url = url + '?ue=' + json.code + '#course-selector';
$('#course-selector').load(url);
});
})
})(window.jQuery)
</script>

View File

@ -19,6 +19,7 @@
max-height: 600px;
}
</style>
<script src="{{ STATIC_URL }}/jquery/js/jquery.form.js"></script>
{% endblock %}
{% block form %}
@ -31,22 +32,9 @@
{% editablecontent wizard.steps.current "form-footer" %}
{% endeditablecontent %}
{% addtoblock "endscripts" %}
<div id="create-course" class="modal hide fade large">
<form action="{% url 'create_course' %}" method="POST">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h3>Création d'un nouveau cours</h3>
</div>
<div class="modal-body">
{% crispy create_course_form %}
</div>
<div class="modal-footer">
<button type="button" data-dismiss="modal" class="btn">Fermer</a>
<button class="btn btn-primary">Créer</a>
</div>
</form>
</div>
{% include "_create_course.html" %}
{{ create_course_form.media.js }}
<script>
(function ($) {
@ -61,10 +49,24 @@
$('#create-course').on('shown', function () {
$('.miller-columns').millercolumns('refresh');
});
$('#id_document_copyrights-send_to_mycourse').on('change', function () {
$('#mycourse-block').toggle('slow');
function toggle_mycourse_panel() {
var val = $('#id_document_copyrights-licence').val();
try {
val = parseInt(val);
} catch (err) {
val = -1;
}
if (licence_pks_with_mycourse_tag.indexOf(val) != -1) {
$('#mycourse-block').show('slow');
$('.miller-columns').millercolumns('refresh');
} else {
$('#mycourse-block').hide('slow');
}
}
$('#id_document_copyrights-licence').on('change', function () {
toggle_mycourse_panel();
});
$('#mycourse-block').toggle($('#id_document_copyrights-send_to_mycourse').is(':checked'));
toggle_mycourse_panel();
})
})(window.jQuery)
</script>

View File

@ -1,4 +1,5 @@
import json
import logging
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
@ -7,8 +8,10 @@ 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 polynum.base.models import Request
from polynum.base.models import Request, Entity
import django_ws
from forms import CreateCourseForm
@ -16,10 +19,14 @@ from forms import CreateCourseForm
@require_POST
@login_required
def create_course(request):
form = CreateCourseForm(request.POST, request=request)
ctx = { 'form': form }
form = CreateCourseForm(data=request.POST, request=request)
ctx = { 'create_course_form': form }
data = {
"success": 0,
"course_year": settings.POLYNUM_BB_COURSE_YEAR
}
if form.is_valid():
conn = get_conn()
conn = django_ws.get_bb_conn()
course_id = form.cleaned_data['course_id']
ok, result = conn.create_course(course_id,
form.cleaned_data['description'],
@ -27,21 +34,28 @@ def create_course(request):
form.cleaned_data['open_to_visitors'],
form.cleaned_data['subscription_policy'] != 'no',
form.cleaned_data['password'])
ctx['ok'], ctx['result'] = ok, result
form = CreateCourseForm(request=request)
data = {
"html": render_to_string("_create_course.html", ctx,
context_instance=RequestContext(request))
}
if ok:
logging.info('user %s created course %s',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'))
data = { 'success': 1, 'course_id': course_id, 'description': form.cleaned_data['description'] }
else:
logging.error('user %s failed to create course %s: %s',
request.user.username.encode('utf-8'),
course_id.encode('utf-8'),
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):
polynum_request = shortcuts.get_object_or_404(Request, pk=pk)
data = { "html": render_to_string("_select_course.html", {
"courses": courses_ctx(request, polynum_request)},
context_instance=RequestContext(request)) }
return HttpResponse(json.dumps(data), mimetype="application/json")
return shortcuts.render(request, "_select_course.html", { "courses":
courses_ctx(request, polynum_request)})
def courses_ctx(request, polynum_request):
ctx = {}
@ -50,10 +64,16 @@ def courses_ctx(request, polynum_request):
if not ok:
return dict(error=result)
ctx['user_courses'] = result
if polynum_request.entity:
possible_ue = polynum_request.entity.parents(True).filter(entity_type__name=settings.POLYNUM_BB_UE_DESIGNATION)
if polynum_request.entity or 'ue' in request.GET:
ue = request.GET.get('ue')
if ue:
possible_ue = Entity.objects.filter(code=ue.lower())
if not ue or not possible_ue:
possible_ue = polynum_request.entity.parents(True).filter(entity_type__name=settings.POLYNUM_BB_UE_DESIGNATION)
if possible_ue:
ok, result = conn.get_course_by_ue(possible_ue[0].code.lower())
ctx['ue'] = possible_ue[0].get_name()
ue = possible_ue[0].code.upper()
ok, result = conn.get_course_by_ue(ue)
if not ok:
return dict(error=result)
ctx['ue_courses'] = result