Initial commit

This commit is contained in:
Claude Paroz 2012-11-06 17:54:33 +01:00
commit 2d71deccae
18 changed files with 1385 additions and 0 deletions

0
stages/__init__.py Normal file
View file

46
stages/admin.py Normal file
View file

@ -0,0 +1,46 @@
from django.contrib import admin
from stages.models import (Student, Section, Referent, Corporation, CorpContact,
Domain, Period, Availability, Training)
class StudentAdmin(admin.ModelAdmin):
list_display = ('__unicode__', 'pcode', 'city', 'section')
list_filter = ('section',)
fields = (('last_name', 'first_name'), ('pcode', 'city'),
'birth_date', 'section')
class CorpContactAdmin(admin.ModelAdmin):
list_display = ('__unicode__', 'corporation')
fields = ('corporation', ('last_name', 'first_name'), ('tel', 'email'))
class ContactInline(admin.TabularInline):
model = CorpContact
extra = 1
class CorporationAdmin(admin.ModelAdmin):
list_display = ('name', 'pcode', 'city')
fields = ('name', 'street', ('pcode', 'city'), ('tel', 'email'))
inlines = [ContactInline]
class PeriodAdmin(admin.ModelAdmin):
list_display = ('dates', 'section')
list_filter = ('section',)
class AvailabilityAdmin(admin.ModelAdmin):
list_display = ('corporation', 'period', 'number')
fields = (('corporation', 'period'), ('number', 'domain'))
admin.site.register(Student, StudentAdmin)
admin.site.register(Section)
admin.site.register(Referent)
admin.site.register(Corporation, CorporationAdmin)
admin.site.register(CorpContact, CorpContactAdmin)
admin.site.register(Domain)
admin.site.register(Period, PeriodAdmin)
admin.site.register(Availability, AvailabilityAdmin)
admin.site.register(Training)

View file

@ -0,0 +1,125 @@
[
{
"pk": 1,
"model": "stages.section",
"fields": {
"name": "ASE"
}
},
{
"pk": 2,
"model": "stages.section",
"fields": {
"name": "ASSC"
}
},
{
"pk": 3,
"model": "stages.section",
"fields": {
"name": "EDE"
}
},
{
"pk": 1,
"model": "stages.student",
"fields": {
"birth_date": "1994-05-12",
"first_name": "Albin",
"last_name": "Dupond",
"section": 1,
"pcode": "2300",
"city": "La Chaux-de-Fonds"
}
},
{
"pk": 2,
"model": "stages.student",
"fields": {
"birth_date": "1994-07-12",
"first_name": "Justine",
"last_name": "Varrin",
"section": 1,
"pcode": "2000",
"city": "Neuchâtel"
}
},
{
"pk": 3,
"model": "stages.student",
"fields": {
"birth_date": "1994-05-20",
"first_name": "Elvire",
"last_name": "Hickx",
"section": 1,
"pcode": "2053",
"city": "Cernier"
}
},
{
"pk": 4,
"model": "stages.student",
"fields": {
"birth_date": "1994-10-11",
"first_name": "André",
"last_name": "Allemand",
"section": 1,
"pcode": "2314",
"city": "La Sagne"
}
},
{
"pk": 1,
"model": "stages.referent",
"fields": {
"first_name": "Julie",
"last_name": "Caux"
}
},
{
"pk": 1,
"model": "stages.corporation",
"fields": {
"city": "Moulineaux",
"tel": "",
"name": "Centre p\u00e9dagogique XY",
"pcode": "2500",
"street": "Rue des champs 12",
"email": ""
}
},
{
"pk": 1,
"model": "stages.domain",
"fields": {
"name": "handicap"
}
},
{
"pk": 2,
"model": "stages.domain",
"fields": {
"name": "petite enfance"
}
},
{
"pk": 1,
"model": "stages.period",
"fields": {
"section": 1,
"start_date": "2012-11-26",
"end_date": "2012-12-07"
}
},
{
"pk": 1,
"model": "stages.training",
"fields": {
"corporation": 1,
"domain": 1,
"period": 1,
"student": 1,
"referent": 1
}
}
]

12
stages/forms.py Normal file
View file

@ -0,0 +1,12 @@
from django import forms
from .models import Section, Period
class PeriodForm(forms.Form):
section = forms.ModelChoiceField(queryset=Section.objects.all())
period = forms.ModelChoiceField(queryset=None)
def __init__(self, data, *args, **kwargs):
pass

126
stages/models.py Normal file
View file

@ -0,0 +1,126 @@
# -*- encoding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
class Section(models.Model):
""" Filières """
name = models.CharField(max_length=20)
class Meta:
verbose_name = "Filière"
def __unicode__(self):
return self.name
class Student(models.Model):
first_name = models.CharField(max_length=40, verbose_name='Prénom')
last_name = models.CharField(max_length=40, verbose_name='Nom')
birth_date = models.DateField(verbose_name='Date de naissance')
pcode = models.CharField(max_length=4, verbose_name='Code postal')
city = models.CharField(max_length=40, verbose_name='Localité')
section = models.ForeignKey(Section)
class Meta:
verbose_name = "Étudiant"
def __unicode__(self):
return '%s %s' % (self.last_name, self.first_name)
class Referent(models.Model):
first_name = models.CharField(max_length=40, verbose_name='Prénom')
last_name = models.CharField(max_length=40, verbose_name='Nom')
class Meta:
verbose_name = "Référent"
def __unicode__(self):
return '%s %s' % (self.last_name, self.first_name)
class Corporation(models.Model):
name = models.CharField(max_length=100, verbose_name='Nom')
street = models.CharField(max_length=100, verbose_name='Rue')
pcode = models.CharField(max_length=4, verbose_name='Code postal')
city = models.CharField(max_length=40, verbose_name='Localité')
tel = models.CharField(max_length=20, blank=True, verbose_name='Téléphone')
email = models.CharField(max_length=40, blank=True, verbose_name='Courriel')
class Meta:
verbose_name = "Institution"
def __unicode__(self):
return self.name
class CorpContact(models.Model):
corporation = models.ForeignKey(Corporation, verbose_name='Institution')
first_name = models.CharField(max_length=40, verbose_name='Prénom')
last_name = models.CharField(max_length=40, verbose_name='Nom')
tel = models.CharField(max_length=20, blank=True, verbose_name='Téléphone')
email = models.CharField(max_length=40, blank=True, verbose_name='Courriel')
class Meta:
verbose_name = "Contact"
def __unicode__(self):
return '%s %s' % (self.last_name, self.first_name)
class Domain(models.Model):
name = models.CharField(max_length=50, verbose_name='Nom')
class Meta:
verbose_name = "Domaine"
def __unicode__(self):
return self.name
class Period(models.Model):
""" Périodes de stages """
section = models.ForeignKey(Section, verbose_name='Filière')
start_date = models.DateField(verbose_name='Date de début')
end_date = models.DateField(verbose_name='Date de fin')
class Meta:
verbose_name = "Période de stage"
def __unicode__(self):
return '%s (filière %s)' % (self.dates, self.section)
@property
def dates(self):
return '%s - %s' % (self.start_date, self.end_date)
class Availability(models.Model):
""" Disponibilités des institutions """
corporation = models.ForeignKey(Corporation, verbose_name='Institution')
period = models.ForeignKey(Period, verbose_name='Période')
number = models.IntegerField(verbose_name='Nombre de places')
domain = models.ForeignKey(Domain, verbose_name='Domaine')
class Meta:
verbose_name = "Disponibilité"
def __unicode__(self):
return '%d place(s) chez %s (%s)' % (self.number, self.corporation, self.period)
class Training(models.Model):
""" Stages """
student = models.ForeignKey(Student, verbose_name='Étudiant')
corporation = models.ForeignKey(Corporation, verbose_name='Institution')
referent = models.ForeignKey(Referent, verbose_name='Référent')
period = models.ForeignKey(Period, verbose_name='Période')
domain = models.ForeignKey(Domain, verbose_name='Domaine')
class Meta:
verbose_name = "Stage"
def __unicode__(self):
return '%s chez %s (%s)' % (self.student, self.corporation, self.period)

67
stages/views.py Normal file
View file

@ -0,0 +1,67 @@
import json
from django.http import HttpResponse, HttpResponseNotAllowed
from django.shortcuts import get_object_or_404
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import DetailView, TemplateView
from .forms import PeriodForm
from .models import Section, Student, Corporation, Period, Training
class StudentSummaryView(DetailView):
model = Student
template_name = 'student_summary.html'
class CorporationSummaryView(DetailView):
model = Corporation
template_name = 'corporation_summary.html'
class AttributionView(TemplateView):
template_name = 'attribution.html'
def get_context_data(self, **kwargs):
context = super(AttributionView, self).get_context_data(**kwargs)
context.update({
#'period_form': PeriodForm(),
'sections': Section.objects.all(),
})
return context
# AJAX views:
def section_periods(request, pk):
""" Return all periods from a section (JSON) """
section = get_object_or_404(Section, pk=pk)
periods = [(p.id, p.dates) for p in section.period_set.all()]
return HttpResponse(json.dumps(periods), content_type="application/json")
def period_students(request, pk):
""" Return all students from period's section, with corresponding Training
if existing (JSON)
"""
period = get_object_or_404(Period, pk=pk)
students = period.section.student_set.all().order_by('last_name')
trainings = dict((t.student_id, t.id) for t in Training.objects.filter(period=period))
data = [{'name': unicode(s), 'id': s.id, 'training_id': trainings.get(s.id)} for s in students]
return HttpResponse(json.dumps(data), content_type="application/json")
def period_corporations(request, pk):
""" Return all corporations with availabilities in the specified period """
period = get_object_or_404(Period, pk=pk)
corps = [(av.corporation.id, av.corporation.name)
for av in period.availability_set.select_related('corporation').all()]
return HttpResponse(json.dumps(corps), content_type="application/json")
@csrf_exempt
def new_training(request):
if request.method != 'POST':
return HttpResponseNotAllowed()
training = Training.objects.create(
period=Period.objects.get(pk=request.POST.get('period')),
student=Student.objects.get(pk=request.POST.get('student')),
corporation=Corporation.objects.get(pk=request.POST.get('corp'))
)
return HttpResponse('OK')