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)
@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")
......
......@@ -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",
......
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
......@@ -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)
......
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