beta version of the send to MyCourse views
Course creation is working.
This commit is contained in:
parent
98e1548f68
commit
5ddd54e28a
|
@ -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
|
@ -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">×</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>
|
|
@ -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 « {{ courses.ue }} »</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>
|
||||
|
|
|
@ -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">×</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>
|
||||
|
|
|
@ -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
|
||||
|
|
Reference in New Issue