diff --git a/stages/static/js/attribution.js b/stages/static/js/attribution.js index 8f26511..7a1b661 100644 --- a/stages/static/js/attribution.js +++ b/stages/static/js/attribution.js @@ -78,6 +78,9 @@ function update_trainings(period_id) { if ($('ul#training_list').children().length > 0) $('input#export').show(); else $('input#export').hide(); + if ($('#corp_select').attr('options').length > 0) + $('input#export_non_attr').show(); + else $('input#export_non_attr').hide(); } if (period_id == '') $('ul#training_list').html(''); @@ -221,7 +224,14 @@ $(document).ready(function() { $('input#export').click(function(ev) { ev.preventDefault(); - $('form#list_export').find('input#filter').val($('#period_select').val()); + $('form#list_export').find('input#period').val($('#period_select').val()); + $('form#list_export').find('input#non_attr').val('0'); + $('form#list_export').submit(); + }); + $('input#export_non_attr').click(function(ev) { + ev.preventDefault(); + $('form#list_export').find('input#period').val($('#period_select').val()); + $('form#list_export').find('input#non_attr').val('1'); $('form#list_export').submit(); }); diff --git a/stages/tests.py b/stages/tests.py index 770daa1..9ccf004 100644 --- a/stages/tests.py +++ b/stages/tests.py @@ -20,10 +20,13 @@ class StagesTest(TestCase): response1 = self.client.get(reverse('stages_export')) self.assertEqual(response1.status_code, 200) - response2 = self.client.get(reverse('stages_export'), {'filter': '2'}) + response2 = self.client.get(reverse('stages_export'), {'period': '2', 'non_attr': '0'}) self.assertEqual(response2.status_code, 200) self.assertGreater(len(response1.content), len(response2.content)) + response3 = self.client.get(reverse('stages_export'), {'period': '1', 'non_attr': '1'}) + self.assertEqual(response2.status_code, 200) + def test_new_training(self): student = Student.objects.get(last_name='Varrin') avail = Availability.objects.get(pk=2) diff --git a/stages/views.py b/stages/views.py index bcbba3f..23542ed 100644 --- a/stages/views.py +++ b/stages/views.py @@ -202,34 +202,66 @@ def del_training(request): return HttpResponse(json.dumps({'ref_id': ref_id}), content_type="application/json") +EXPORT_FIELDS = [ + ('Prénom', 'student__first_name'), ('Nom', 'student__last_name'), + ('Classe', 'student__klass__name'), ('Filière', 'student__klass__section__name'), + ('Nom du stage', 'availability__period__title'), + ('Début', 'availability__period__start_date'), ('Fin', 'availability__period__end_date'), + ('Remarques stage', 'comment'), + ('Prénom référent', 'referent__first_name'), ('Nom référent', 'referent__last_name'), + ('Courriel référent', 'referent__email'), + ('Institution', 'availability__corporation__name'), + ('Rue Inst.', 'availability__corporation__street'), + ('NPA Inst.', 'availability__corporation__pcode'), + ('Ville Inst.', 'availability__corporation__city'), + ('Domaine', 'availability__domain__name'), + ('Remarques Inst.', 'availability__comment'), + ('Civilité contact', 'availability__contact__title'), + ('Prénom contact', 'availability__contact__first_name'), + ('Nom contact', 'availability__contact__last_name'), + ('Courriel contact', 'availability__contact__email'), +] + +NON_ATTR_EXPORT_FIELDS = [ + ('Filière', 'period__section__name'), + ('Nom du stage', 'period__title'), + ('Début', 'period__start_date'), ('Fin', 'period__end_date'), + ('Institution', 'corporation__name'), + ('Rue Inst.', 'corporation__street'), + ('NPA Inst.', 'corporation__pcode'), + ('Ville Inst.', 'corporation__city'), + ('Domaine', 'domain__name'), + ('Remarques Inst.', 'comment'), + ('Civilité contact', 'contact__title'), + ('Prénom contact', 'contact__first_name'), + ('Nom contact', 'contact__last_name'), + ('Courriel contact', 'contact__email'), +] + def stages_export(request): from datetime import date from openpyxl import Workbook from openpyxl.writer.excel import save_virtual_workbook - export_fields = [ - ('Prénom', 'student__first_name'), ('Nom', 'student__last_name'), - ('Classe', 'student__klass__name'), ('Filière', 'student__klass__section__name'), - ('Début', 'availability__period__start_date'), ('Fin', 'availability__period__end_date'), - ('Remarques stage', 'comment'), - ('Prénom référent', 'referent__first_name'), ('Nom référent', 'referent__last_name'), - ('Courriel référent', 'referent__email'), - ('Institution', 'availability__corporation__name'), - ('Rue Inst.', 'availability__corporation__street'), - ('NPA Inst.', 'availability__corporation__pcode'), - ('Ville Inst.', 'availability__corporation__city'), - ('Domaine', 'availability__domain__name'), - ('Remarques Inst.', 'availability__comment'), - ('Civilité contact', 'availability__contact__title'), - ('Prénom contact', 'availability__contact__first_name'), - ('Nom contact', 'availability__contact__last_name'), - ('Courriel contact', 'availability__contact__email'), - ] + period_filter = request.GET.get('period') + non_attributed = bool(int(request.GET.get('non_attr', 0))) + + export_fields = EXPORT_FIELDS + contact_test_field = 'availability__contact__last_name' + corp_name_field = 'availability__corporation__name' - period_filter = request.GET.get('filter') if period_filter: - query = Training.objects.filter(availability__period_id=period_filter) + if non_attributed: + # Export non attributed availabilities for a specific period + query = Availability.objects.filter(period_id=period_filter, training__isnull=True) + export_fields = NON_ATTR_EXPORT_FIELDS + contact_test_field = 'contact__last_name' + corp_name_field = 'corporation__name' + else: + # Export trainings for a specific period + query = Training.objects.filter(availability__period_id=period_filter) else: + # Export all trainings in the database query = Training.objects.all() # Prepare "default" contacts (when not defined on training) @@ -250,9 +282,9 @@ def stages_export(request): for row_idx, tr in enumerate(query.values(*query_keys), start=1): for col_idx, field in enumerate(query_keys): ws.cell(row=row_idx, column=col_idx).value = tr[field] - if tr['availability__contact__last_name'] is None: + if tr[contact_test_field] is None: # Use default contact - contact = contacts.get(tr['availability__corporation__name']) + contact = contacts.get(tr[corp_name_field]) if contact: ws.cell(row=row_idx, column=col_idx-3).value = contact.title ws.cell(row=row_idx, column=col_idx-2).value = contact.first_name diff --git a/templates/attribution.html b/templates/attribution.html index 7c2d311..d490bb3 100644 --- a/templates/attribution.html +++ b/templates/attribution.html @@ -99,8 +99,10 @@