diff --git a/accounts/admin.py b/accounts/admin.py index 60374ee44adb5c8817a2dc400b84de7d0e33be24..cb9b32853e8811378eab241b90b5445fb34c3049 100644 --- a/accounts/admin.py +++ b/accounts/admin.py @@ -10,6 +10,7 @@ admin.site.unregister(Group) @admin.register(EmailUser) class EmailUserAdmin(ExportCsvMixin, admin.ModelAdmin): """option d'affichage des activités dans la vue django admin""" + filename = "export_utilisateurs.csv" list_display = ("email", "last_name", "first_name", "is_superuser", "is_active", "email_confirmed",) list_filter = ("is_superuser","is_active", "email_confirmed",) list_editable = ("is_superuser","is_active") diff --git a/home/admin.py b/home/admin.py index 3a44c2d6b27508c05e50b6f1dd785c57b5ace247..d93a6c02d929d6b2442bd23041ecfc1a13b555b7 100644 --- a/home/admin.py +++ b/home/admin.py @@ -12,6 +12,7 @@ admin.site.site_title = "Admin Interludes" @admin.register(InterludesActivity) class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin): """option d'affichage des activités dans la vue django admin""" + filename = "export_activites.csv" list_display = ("title", "host_name", "display", "must_subscribe","on_planning") list_filter = ("display", "must_subscribe", "on_planning", "status") ordering = ("title", "host_name",) @@ -34,6 +35,7 @@ class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin): @admin.register(InterludesParticipant) class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin): """option d'affichage des participant dans la vue django admin""" + filename = "export_participants.csv" list_display = ("user", "school", "is_registered") list_filter = ( "school", "is_registered", "sleeps", @@ -46,6 +48,7 @@ class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin): @admin.register(ActivityList) class ActivityListAdmin(ExportCsvMixin, admin.ModelAdmin): """option d'affichage des choix d'activités dans la vue django admin""" + filename = "export_choix_activite.csv" list_display = ("activity", "participant", "priority", "accepted") list_filter = ( "activity", "participant__is_registered", "activity__display", diff --git a/shared/admin.py b/shared/admin.py index 6e5db2342165741429d4b1f2c9f3ae34e8464bc5..93405128fa031a30dbb3109ed84dbe64a2593f7d 100644 --- a/shared/admin.py +++ b/shared/admin.py @@ -1,31 +1,30 @@ -import csv +from shared.views import CSVWriteView -from django.http import HttpResponse +class CSVWriteViewForAdmin(CSVWriteView): + def get_values(self): + return self.queryset.values() class ExportCsvMixin: """ class abstraite pour permettre l'export CSV rapide d'un modele utiliser csv_export_exclude pour exclure des colonnes du fichier généré """ - def export_as_csv(self, request, queryset): - """renvoie un fichier CSV contenant l'information du queryset""" - meta = self.model._meta - field_names = [field.name for field in meta.fields] - - if self.csv_export_exclude: - field_names = [field for field in field_names if not field in self.csv_export_exclude] + filename = None - response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta) - writer = csv.writer(response) + csv_export_exclude = [] - writer.writerow(field_names) - for obj in queryset: - writer.writerow([getattr(obj, field) for field in field_names]) + def get_filename(self): + if self.filename: + return self.filename + return str(self.model._meta) - return response + def export_as_csv(self, request, queryset): + """renvoie un fichier CSV contenant l'information du queryset""" + view = CSVWriteViewForAdmin( + request=request, queryset=queryset, model=self.model, + filename=self.get_filename(), exclude_fields = self.csv_export_exclude, + ) + return view.get(request) export_as_csv.short_description = "Exporter au format CSV" - actions = ["export_as_csv"] - csv_export_exclude = None diff --git a/shared/views.py b/shared/views.py index 5ff4d21d60ee6e6461036b70bd1d8ab975fa04e4..5bbc0c806d77711d64df0291f30b121793bd5362 100644 --- a/shared/views.py +++ b/shared/views.py @@ -18,31 +18,47 @@ class CSVWriteView(View): filename = "csv_file.csv" headers = None model = None + exclude_fields = [] - + def get_filename(self): + return self.filename def get_headers(self): """overload this to dynamicaly generate headers""" if self.headers: return self.headers if self.model: - return [field.name for field in self.model._meta.fields] + return [field.name for field in self.get_field_names()] return None + def get_values(self): + """overload to change queryset used in self.get_rows""" + if self.model: + return self.model.objects.values() + raise NotImplementedError("{}.get_values() isn't implemented when model is None".format( + self.__class__.__name__ + )) + + def get_field_names(self): + """overload to limit/change field names + default to all minus those in exclude_fields""" + return [ + field for field in self.model._meta.fields + if not field.name in self.exclude_fields + ] + def get_rows(self): """overload this to return the list of rows""" - if self.model: - queryset = self.model.objects.values() - fields = self.model._meta.fields - table = [] - for row in queryset: - table.append([row[field.name] for field in fields]) - return table - raise NotImplementedError("{}.get_rows isn't implemented".format(self.__class__.__name__)) + queryset = self.get_values() + fields = self.get_field_names() + table = [] + for row in queryset: + table.append([row[field.name] for field in fields]) + return table def get(self, request, *args, **kwargs): response = HttpResponse(content_type='text/csv') - filename = self.filename + filename = self.get_filename() if not filename.endswith(".csv"): filename += ".csv" response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename)