Mudanza de repo

This commit is contained in:
2025-09-22 18:43:29 -06:00
parent 26fe36ca52
commit d11d543bdc
193 changed files with 10998 additions and 0 deletions

0
api/reports/__init__.py Normal file
View File

3
api/reports/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
api/reports/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ReportsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api.reports'

3
api/reports/models.py Normal file
View File

@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@@ -0,0 +1,7 @@
from rest_framework import serializers
class ExportModelSerializer(serializers.Serializer):
model = serializers.CharField()
fields = serializers.ListField(child=serializers.CharField())
filters = serializers.DictField(required=False)
type = serializers.CharField(default='csv')

3
api/reports/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

6
api/reports/urls.py Normal file
View File

@@ -0,0 +1,6 @@
from django.urls import path, include
from .views import ExportModelView
urlpatterns = [
path('exportmodel/', ExportModelView.as_view(), name='export-model'),
]

93
api/reports/views.py Normal file
View File

@@ -0,0 +1,93 @@
import csv
import io
from rest_framework.views import APIView
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from .serializers import ExportModelSerializer
from rest_framework.response import Response
from django.http import HttpResponse
import openpyxl
from django.apps import apps
from rest_framework import status
from django.shortcuts import render
from rest_framework import viewsets
from .serializers import ExportModelSerializer
def export_model_to_csv(request, model_name, fields, filters=None):
model = apps.get_model('datastage', model_name)
queryset = model.objects.filter(**(filters or {})).values(*fields)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="{model_name}.csv"'
writer = csv.DictWriter(response, fieldnames=fields)
writer.writeheader()
for row in queryset:
writer.writerow(row)
return response
def export_model_to_excel(request, model_name, fields, filters=None):
model = apps.get_model('datastage', model_name)
queryset = model.objects.filter(**(filters or {})).values(*fields)
wb = openpyxl.Workbook()
ws = wb.active
ws.append(fields)
for row in queryset:
ws.append([row[field] for field in fields])
output = io.BytesIO()
wb.save(output)
output.seek(0)
response = HttpResponse(output.read(), content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = f'attachment; filename="{model_name}.xlsx"'
return response
# Create your views here.
from rest_framework.views import APIView
class ExportModelView(APIView):
my_tags = ['Reportes']
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter('model', openapi.IN_QUERY, description="Nombre del modelo (ejemplo: Registro500)", type=openapi.TYPE_STRING, required=True)
],
responses={200: openapi.Response('Campos disponibles', schema=openapi.Schema(
type=openapi.TYPE_OBJECT,
properties={
'fields': openapi.Schema(type=openapi.TYPE_ARRAY, items=openapi.Items(type=openapi.TYPE_STRING))
}
))}
)
def get(self, request, *args, **kwargs):
"""
Devuelve los campos disponibles para el modelo solicitado.
Ejemplo: /api/reports/exportmodel/?model=Registro500
"""
model_name = request.query_params.get('model')
if not model_name:
return Response({'error': 'model is required'}, status=status.HTTP_400_BAD_REQUEST)
try:
model = apps.get_model('datastage', model_name)
except LookupError:
return Response({'error': f'Model {model_name} not found'}, status=status.HTTP_404_NOT_FOUND)
fields = [f.name for f in model._meta.fields]
return Response({'fields': fields})
@swagger_auto_schema(
request_body=ExportModelSerializer,
responses={200: 'Archivo generado (Excel o CSV)'}
)
def post(self, request, *args, **kwargs):
model_name = request.data.get('model')
fields = request.data.get('fields')
filters = request.data.get('filters', {})
export_type = request.data.get('type', 'csv')
if not model_name or not fields:
return Response({'error': 'model and fields are required'}, status=status.HTTP_400_BAD_REQUEST)
if export_type == 'excel':
return export_model_to_excel(request, model_name, fields, filters)
else:
return export_model_to_csv(request, model_name, fields, filters)