Source code for tickets.exporters

import csv
from django.http.response import HttpResponse
from .models import TicketCode

__author__ = 'alfred'


[docs]class BaseExporter: short_description = 'Base class for exporters' mime_type = 'text/csv' @property def __name__(self): return self.__class__.__name__ def __call__(self, modeladmin, request, queryset, filename='export'): response = self.create_response() response['Content-Disposition'] = 'attachment; filename="{}.csv"'.format(filename) tickets = self.get_tickets(queryset) self.write_data(response, tickets) return response
[docs] def create_response(self): return HttpResponse(content_type=self.mime_type)
[docs] def write_data(self, response, tickets): pass
[docs] def get_tickets(self, queryset): return queryset
[docs]class BaseTicketExporter(BaseExporter): short_description = 'Base class for ticket exporters'
[docs] def get_tickets(self, queryset): return queryset.order_by('ticket_number')
[docs]class BaseTicketPackExporter(BaseExporter): short_description = 'Base class for ticket pack exporters'
[docs] def get_tickets(self, queryset): return TicketCode.objects.order_by('-ticket_number').filter(ticket_pack__in=queryset)
[docs]class ExporterManager: def __init__(self): self.exporters = set()
[docs] def register(self, exporter_cls): self.exporters.add(exporter_cls)
[docs] def unregister(self, exporter_cls): self.exporters.remove(exporter_cls)
ticket_exporter_manager = ExporterManager() ticket_pack_exporter_manager = ExporterManager()
[docs]class DefaultTicketExporter(BaseTicketExporter): short_description = 'Export selected tickets as CSV file'
[docs] def write_data(self, response, tickets): writer = self.create_writer(response) row = ['code', 'ticket_id', 'ticket_number', 'status', 'creation_date', 'modified_date', 'modified_by', 'ticket_pack', 'external_id', 'external_customer_name', 'external_fiscal_number', 'external_locator', 'attempt_count'] writer.writerow(row) for item in tickets: self.write_item(writer, item)
[docs] def write_item(self, writer, item): row = [str(item.code), "{num:06d}".format(num=item.id), "{num:05d}".format(num=int(item.ticket_number)) if item.ticket_number is not None else '', item.status, str(item.creation_date), str(item.modified_date), str(item.modified_by), str(item.ticket_pack), item.external_id, item.external_customer_name, item.external_fiscal_number, item.external_locator, item.attempt_count()] writer.writerow(row)
[docs] def create_writer(self, response): return csv.writer(response)
[docs]class DefaultTicketWithAttemptsExporter(DefaultTicketExporter): short_description = 'Export selected tickets with attempts as CSV file'
[docs] def write_item(self, writer, item): super(DefaultTicketWithAttemptsExporter, self).write_item(writer, item) attempts = item.attempt_list.order_by('date').all() for attempt in attempts: row = ['', attempt.id, attempt.code, str(attempt.success), str(attempt.date), '', str(attempt.user)] writer.writerow(row)
ticket_exporter_manager.register(DefaultTicketExporter()) ticket_exporter_manager.register(DefaultTicketWithAttemptsExporter())
[docs]class DefaultTicketPackExporter(BaseTicketPackExporter, DefaultTicketExporter): short_description = 'Export selected ticket packs as CSV file'
[docs]class DefaultTicketPackWithAttemptsExporter(BaseTicketPackExporter, DefaultTicketWithAttemptsExporter): short_description = 'Export selected ticket packs with attempts as CSV file'
ticket_pack_exporter_manager.register(DefaultTicketPackExporter()) ticket_pack_exporter_manager.register(DefaultTicketPackWithAttemptsExporter())