Improved attribution template and adapted data model

This commit is contained in:
Claude Paroz 2012-11-07 17:45:53 +01:00
parent d4072450fa
commit 780b475d41
11 changed files with 196 additions and 82 deletions

View file

@ -25,14 +25,20 @@ class CorporationAdmin(admin.ModelAdmin):
inlines = [ContactInline]
class AvailabilityInline(admin.TabularInline):
model = Availability
extra = 1
class PeriodAdmin(admin.ModelAdmin):
list_display = ('dates', 'section')
list_filter = ('section',)
inlines = [AvailabilityInline]
class AvailabilityAdmin(admin.ModelAdmin):
list_display = ('corporation', 'period', 'number')
fields = (('corporation', 'period'), ('number', 'domain'))
list_display = ('corporation', 'period', 'domain')
list_filter = ('period',)
fields = (('corporation', 'period'), 'domain', 'comment')
admin.site.register(Student, StudentAdmin)

View file

@ -24,48 +24,48 @@
"pk": 1,
"model": "stages.student",
"fields": {
"birth_date": "1994-05-12",
"city": "La Chaux-de-Fonds",
"first_name": "Albin",
"last_name": "Dupond",
"section": 1,
"pcode": "2300",
"city": "La Chaux-de-Fonds"
"last_name": "Dupond",
"section": 1,
"pcode": "2300",
"birth_date": "1994-05-12"
}
},
{
"pk": 2,
"model": "stages.student",
"fields": {
"birth_date": "1994-07-12",
"city": "Neuch\u00e2tel",
"first_name": "Justine",
"last_name": "Varrin",
"section": 1,
"pcode": "2000",
"city": "Neuchâtel"
"last_name": "Varrin",
"section": 1,
"pcode": "2000",
"birth_date": "1994-07-12"
}
},
{
"pk": 3,
"model": "stages.student",
"fields": {
"birth_date": "1994-05-20",
"city": "Cernier",
"first_name": "Elvire",
"last_name": "Hickx",
"section": 1,
"pcode": "2053",
"city": "Cernier"
"last_name": "Hickx",
"section": 1,
"pcode": "2053",
"birth_date": "1994-05-20"
}
},
{
"pk": 4,
"model": "stages.student",
"fields": {
"birth_date": "1994-10-11",
"first_name": "André",
"last_name": "Allemand",
"section": 1,
"pcode": "2314",
"city": "La Sagne"
"city": "La Sagne",
"first_name": "Andr\u00e9",
"last_name": "Allemand",
"section": 1,
"pcode": "2314",
"birth_date": "1994-10-11"
}
},
{
@ -88,6 +88,17 @@
"email": ""
}
},
{
"pk": 1,
"model": "stages.corpcontact",
"fields": {
"corporation": 1,
"first_name": "Jean",
"last_name": "Horner",
"tel": "",
"email": ""
}
},
{
"pk": 1,
"model": "stages.domain",
@ -113,13 +124,32 @@
},
{
"pk": 1,
"model": "stages.training",
"model": "stages.availability",
"fields": {
"corporation": 1,
"domain": 1,
"period": 1,
"comment": ""
}
},
{
"pk": 2,
"model": "stages.availability",
"fields": {
"corporation": 1,
"domain": 2,
"period": 1,
"comment": ""
}
},
{
"pk": 1,
"model": "stages.training",
"fields": {
"availability": 1,
"student": 1,
"referent": 1
"referent": 1,
"comment": ""
}
}
]

View file

@ -101,26 +101,33 @@ 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')
comment = models.TextField(blank=True, verbose_name='Remarques')
class Meta:
verbose_name = "Disponibilité"
def __unicode__(self):
return '%d place(s) chez %s (%s)' % (self.number, self.corporation, self.period)
return '%s - %s (%s)' % (self.period, self.corporation, self.domain)
@property
def free(self):
try:
self.training
except Training.DoesNotExist:
return True
return False
class Training(models.Model):
""" Stages """
student = models.ForeignKey(Student, verbose_name='Étudiant')
corporation = models.ForeignKey(Corporation, verbose_name='Institution')
availability = models.OneToOneField(Availability, verbose_name='Disponibilité')
referent = models.ForeignKey(Referent, verbose_name='Référent')
period = models.ForeignKey(Period, verbose_name='Période')
domain = models.ForeignKey(Domain, verbose_name='Domaine')
comment = models.TextField(blank=True, verbose_name='Remarques')
class Meta:
verbose_name = "Stage"
def __unicode__(self):
return '%s chez %s (%s)' % (self.student, self.corporation, self.period)
return '%s chez %s (%s)' % (self.student, self.availability.corporation, self.availability.period)

View file

@ -6,10 +6,10 @@ 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 django.views.generic import DetailView, TemplateView, ListView
from .forms import PeriodForm
from .models import Section, Student, Corporation, Period, Training
from .models import Section, Student, Corporation, Period, Training, Referent, Availability
class StudentSummaryView(DetailView):
@ -17,9 +17,18 @@ class StudentSummaryView(DetailView):
template_name = 'student_summary.html'
class CorporationSummaryView(DetailView):
model = Corporation
template_name = 'corporation_summary.html'
class AvailabilitySummaryView(DetailView):
model = Availability
template_name = 'availability_summary.html'
class TrainingsByPeriodView(ListView):
template_name = 'trainings_list.html'
context_object_name = 'trainings'
def get_queryset(self):
return Training.objects.select_related('student', 'availability__corporation', 'availability__domain'
).filter(availability__period__pk=self.kwargs['pk'])
class AttributionView(TemplateView):
@ -30,6 +39,7 @@ class AttributionView(TemplateView):
context.update({
#'period_form': PeriodForm(),
'sections': Section.objects.all(),
'referents': Referent.objects.all(),
})
return context
@ -47,14 +57,14 @@ def period_students(request, pk):
"""
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))
trainings = dict((t.student_id, t.id) for t in Training.objects.filter(availability__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 """
def period_availabilities(request, pk):
""" Return all availabilities in the specified period """
period = get_object_or_404(Period, pk=pk)
corps = [(av.corporation.id, av.corporation.name)
corps = [{'id': av.id, 'corp_name': av.corporation.name, 'domain': av.domain.name, 'free': av.free}
for av in period.availability_set.select_related('corporation').all()]
return HttpResponse(json.dumps(corps), content_type="application/json")
@ -62,11 +72,14 @@ def period_corporations(request, pk):
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'))
)
try:
training = Training.objects.create(
student=Student.objects.get(pk=request.POST.get('student')),
availability=Availability.objects.get(pk=request.POST.get('avail')),
referent=Referent.objects.get(pk=request.POST.get('referent')),
)
except Exception as exc:
return HttpResponse(str(exc))
return HttpResponse('OK')
@ -77,10 +90,10 @@ def stages_export(request):
export_fields = [
('Prénom', 'student__first_name'), ('Nom', 'student__last_name'),
('Filière', 'period__section__name'),
('Début', 'period__start_date'), ('Fin', 'period__end_date'),
('Institution', 'corporation__name'),
('Domaine', 'domain__name'),
('Filière', 'student__section__name'),
('Début', 'availability__period__start_date'), ('Fin', 'availability__period__end_date'),
('Institution', 'availability__corporation__name'),
('Domaine', 'availability__domain__name'),
('Prénom référent', 'referent__first_name'), ('Nom référent', 'referent__last_name')
]