Initial commit
This commit is contained in:
commit
2d71deccae
18 changed files with 1385 additions and 0 deletions
0
stages/__init__.py
Normal file
0
stages/__init__.py
Normal file
46
stages/admin.py
Normal file
46
stages/admin.py
Normal 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)
|
||||
125
stages/fixtures/test_fixture.json
Normal file
125
stages/fixtures/test_fixture.json
Normal 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
12
stages/forms.py
Normal 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
126
stages/models.py
Normal 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
67
stages/views.py
Normal 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')
|
||||
Loading…
Add table
Add a link
Reference in a new issue