Skip to content
Snippets Groups Projects
Commit 45748dd9 authored by Dorian Lesbre's avatar Dorian Lesbre
Browse files

Factorised CSV Export code

parent 77916279
No related branches found
No related tags found
No related merge requests found
...@@ -10,6 +10,7 @@ admin.site.unregister(Group) ...@@ -10,6 +10,7 @@ admin.site.unregister(Group)
@admin.register(EmailUser) @admin.register(EmailUser)
class EmailUserAdmin(ExportCsvMixin, admin.ModelAdmin): class EmailUserAdmin(ExportCsvMixin, admin.ModelAdmin):
"""option d'affichage des activités dans la vue django admin""" """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_display = ("email", "last_name", "first_name", "is_superuser", "is_active", "email_confirmed",)
list_filter = ("is_superuser","is_active", "email_confirmed",) list_filter = ("is_superuser","is_active", "email_confirmed",)
list_editable = ("is_superuser","is_active") list_editable = ("is_superuser","is_active")
......
...@@ -12,6 +12,7 @@ admin.site.site_title = "Admin Interludes" ...@@ -12,6 +12,7 @@ admin.site.site_title = "Admin Interludes"
@admin.register(InterludesActivity) @admin.register(InterludesActivity)
class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin): class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin):
"""option d'affichage des activités dans la vue django admin""" """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_display = ("title", "host_name", "display", "must_subscribe","on_planning")
list_filter = ("display", "must_subscribe", "on_planning", "status") list_filter = ("display", "must_subscribe", "on_planning", "status")
ordering = ("title", "host_name",) ordering = ("title", "host_name",)
...@@ -34,6 +35,7 @@ class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin): ...@@ -34,6 +35,7 @@ class InterludesActivityAdmin(ExportCsvMixin, admin.ModelAdmin):
@admin.register(InterludesParticipant) @admin.register(InterludesParticipant)
class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin): class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin):
"""option d'affichage des participant dans la vue django admin""" """option d'affichage des participant dans la vue django admin"""
filename = "export_participants.csv"
list_display = ("user", "school", "is_registered") list_display = ("user", "school", "is_registered")
list_filter = ( list_filter = (
"school", "is_registered", "sleeps", "school", "is_registered", "sleeps",
...@@ -46,6 +48,7 @@ class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin): ...@@ -46,6 +48,7 @@ class InterludesParticipantAdmin(ExportCsvMixin, admin.ModelAdmin):
@admin.register(ActivityList) @admin.register(ActivityList)
class ActivityListAdmin(ExportCsvMixin, admin.ModelAdmin): class ActivityListAdmin(ExportCsvMixin, admin.ModelAdmin):
"""option d'affichage des choix d'activités dans la vue django admin""" """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_display = ("activity", "participant", "priority", "accepted")
list_filter = ( list_filter = (
"activity", "participant__is_registered", "activity__display", "activity", "participant__is_registered", "activity__display",
......
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 ExportCsvMixin:
""" """
class abstraite pour permettre l'export CSV rapide d'un modele class abstraite pour permettre l'export CSV rapide d'un modele
utiliser csv_export_exclude pour exclure des colonnes du fichier généré utiliser csv_export_exclude pour exclure des colonnes du fichier généré
""" """
def export_as_csv(self, request, queryset): filename = None
"""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]
response = HttpResponse(content_type='text/csv') csv_export_exclude = []
response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
writer = csv.writer(response)
writer.writerow(field_names) def get_filename(self):
for obj in queryset: if self.filename:
writer.writerow([getattr(obj, field) for field in field_names]) 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" export_as_csv.short_description = "Exporter au format CSV"
actions = ["export_as_csv"] actions = ["export_as_csv"]
csv_export_exclude = None
...@@ -18,31 +18,47 @@ class CSVWriteView(View): ...@@ -18,31 +18,47 @@ class CSVWriteView(View):
filename = "csv_file.csv" filename = "csv_file.csv"
headers = None headers = None
model = None model = None
exclude_fields = []
def get_filename(self):
return self.filename
def get_headers(self): def get_headers(self):
"""overload this to dynamicaly generate headers""" """overload this to dynamicaly generate headers"""
if self.headers: if self.headers:
return self.headers return self.headers
if self.model: 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 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): def get_rows(self):
"""overload this to return the list of rows""" """overload this to return the list of rows"""
if self.model: queryset = self.get_values()
queryset = self.model.objects.values() fields = self.get_field_names()
fields = self.model._meta.fields table = []
table = [] for row in queryset:
for row in queryset: table.append([row[field.name] for field in fields])
table.append([row[field.name] for field in fields]) return table
return table
raise NotImplementedError("{}.get_rows isn't implemented".format(self.__class__.__name__))
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
filename = self.filename filename = self.get_filename()
if not filename.endswith(".csv"): if not filename.endswith(".csv"):
filename += ".csv" filename += ".csv"
response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename) response['Content-Disposition'] = 'attachment; filename="{}"'.format(self.filename)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment