diff --git a/requirements.txt b/requirements.txt index 2f58679..3d083a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ -Django>=2.2,<3.1 +Django>=3.0,<3.2 tabimport>=0.4.0 -openpyxl==2.4.9 -xlrd +openpyxl==3.0.5 reportlab django-summernote==0.8.11.6 diff --git a/stages/admin.py b/stages/admin.py index ef40fa4..c7219b0 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -3,6 +3,7 @@ from copy import deepcopy from django import forms from django.contrib import admin +from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME from django.contrib.auth.admin import GroupAdmin as AuthGroupAdmin from django.contrib.auth.models import Group from django.db import models @@ -22,7 +23,7 @@ from .views.export import OpenXMLExport def print_charge_sheet(modeladmin, request, queryset): return HttpResponseRedirect( reverse('print-charge-sheet') + '?ids=%s' % ",".join( - request.POST.getlist(admin.ACTION_CHECKBOX_NAME) + request.POST.getlist(ACTION_CHECKBOX_NAME) ) ) print_charge_sheet.short_description = "Imprimer les feuilles de charge" diff --git a/stages/views/export.py b/stages/views/export.py index 23adf9d..81c27de 100644 --- a/stages/views/export.py +++ b/stages/views/export.py @@ -1,5 +1,6 @@ from collections import OrderedDict from datetime import date +from tempfile import NamedTemporaryFile from django.conf import settings from django.db.models import Q, Sum @@ -8,7 +9,6 @@ from django.http import HttpResponse from openpyxl import Workbook from openpyxl.styles import Font from openpyxl.utils import get_column_letter -from openpyxl.writer.excel import save_virtual_workbook from ..models import ( Availability, CorpContact, Corporation, Course, Section, Student, Teacher, @@ -42,11 +42,15 @@ class OpenXMLExport: if col_widths: self.ws.column_dimensions[get_column_letter(col_idx)].width = col_widths[col_idx - 1] self.row_idx += 1 - + def get_http_response(self, filename_base): - response = HttpResponse(save_virtual_workbook(self.wb), content_type=openxml_contenttype) - response['Content-Disposition'] = 'attachment; filename=%s_%s.xlsx' % ( - filename_base, date.strftime(date.today(), '%Y-%m-%d')) + with NamedTemporaryFile() as tmp: + self.wb.save(tmp.name) + tmp.seek(0) + response = HttpResponse(tmp, content_type=openxml_contenttype) + response['Content-Disposition'] = 'attachment; filename=%s_%s.xlsx' % ( + filename_base, date.strftime(date.today(), '%Y-%m-%d') + ) return response @@ -197,8 +201,8 @@ def _ratio_Ede_Ase_Assc(): tot_asscfe = Course.objects.filter(imputation='ASSCFE').aggregate(Sum('period'))['period__sum'] or 0 tot_mps = Course.objects.filter(imputation='MPS').aggregate(Sum('period'))['period__sum'] or 0 asscfe_ratio = 1 if tot_asscfe + tot_mps == 0 else tot_asscfe / (tot_asscfe + tot_mps) - - return {'edepe':edepe_ratio, 'asefe':asefe_ratio, 'asscfe': asscfe_ratio} + + return {'edepe': edepe_ratio, 'asefe': asefe_ratio, 'asscfe': asscfe_ratio} def imputations_export(request):