forked from val-lop20/Pagina-de-Asistencia-MAC
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
from django.contrib import admin
|
|
from django.utils.html import format_html
|
|
from import_export import resources
|
|
from import_export.admin import ImportExportModelAdmin
|
|
from .models import Event
|
|
|
|
|
|
class EventResource(resources.ModelResource):
|
|
"""Recurso para importar/exportar eventos"""
|
|
|
|
class Meta:
|
|
model = Event
|
|
fields = ('title', 'speaker', 'date', 'start_time', 'end_time', 'event_type',
|
|
'modality', 'location', 'description', 'is_active')
|
|
import_id_fields = ['title', 'date', 'start_time']
|
|
skip_unchanged = True
|
|
report_skipped = True
|
|
|
|
def before_import_row(self, row, **kwargs):
|
|
"""Limpiar datos antes de importar"""
|
|
row['title'] = str(row.get('title', '')).strip()
|
|
row['speaker'] = str(row.get('speaker', '')).strip()
|
|
row['location'] = str(row.get('location', '')).strip()
|
|
|
|
|
|
|
|
@admin.register(Event)
|
|
class EventAdmin(ImportExportModelAdmin):
|
|
resource_class = EventResource
|
|
list_display = ['title', 'speaker', 'date', 'start_time', 'modality', 'location', 'is_active']
|
|
list_filter = ['event_type', 'modality', 'date', 'is_active']
|
|
search_fields = ['title', 'speaker', 'location']
|
|
date_hierarchy = 'date'
|
|
ordering = ['date', 'start_time']
|
|
readonly_fields = ['created_at']
|
|
actions = ['export_selected_events']
|
|
|
|
def get_import_formats(self):
|
|
"""Formatos permitidos para importar"""
|
|
from import_export.formats.base_formats import XLSX, CSV
|
|
return [XLSX, CSV]
|
|
|
|
def get_export_formats(self):
|
|
"""Formatos permitidos para exportar"""
|
|
from import_export.formats.base_formats import XLSX, CSV
|
|
return [XLSX, CSV]
|
|
|
|
def export_selected_events(self, request, queryset):
|
|
"""Acción para exportar eventos seleccionados"""
|
|
from django.http import HttpResponse
|
|
resource = EventResource()
|
|
dataset = resource.export(queryset)
|
|
|
|
from import_export.formats.base_formats import XLSX
|
|
xlsx_format = XLSX()
|
|
export_data = xlsx_format.export_data(dataset)
|
|
|
|
response = HttpResponse(
|
|
export_data,
|
|
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
)
|
|
response['Content-Disposition'] = 'attachment; filename="eventos.xlsx"'
|
|
|
|
self.message_user(request, f'Se exportaron {queryset.count()} eventos.')
|
|
return response
|
|
|
|
export_selected_events.short_description = "📊 Exportar eventos seleccionados" |