Browse Source

Añado api

main
Celestino Rey 9 months ago
parent
commit
bdc99d20e9
20 changed files with 443 additions and 69 deletions
  1. +3
    -1
      src/eventos/admin.py
  2. +0
    -0
      src/eventos/management/__init__.py
  3. +0
    -0
      src/eventos/management/commands/__init__.py
  4. +45
    -0
      src/eventos/management/commands/importar_eventos.py
  5. +49
    -0
      src/eventos/management/commands/importar_listaespera.py
  6. +49
    -0
      src/eventos/management/commands/importar_noticias.py
  7. +50
    -0
      src/eventos/management/commands/importar_reservas.py
  8. +1
    -0
      src/eventos/models.py
  9. +26
    -0
      src/eventos/serializers.py
  10. +17
    -0
      src/eventos/urls.py
  11. +94
    -4
      src/eventos/views.py
  12. +17
    -13
      src/gestion_reservas/settings.py
  13. +1
    -3
      src/gestion_reservas/urls.py
  14. +0
    -48
      src/gestion_reservas/views.py
  15. +0
    -0
      src/reymotausers/management/__init__.py
  16. +0
    -0
      src/reymotausers/management/commands/__init__.py
  17. +48
    -0
      src/reymotausers/management/commands/importar_usuarios.py
  18. +8
    -0
      src/reymotausers/serializers.py
  19. +9
    -0
      src/reymotausers/urls.py
  20. +26
    -0
      src/reymotausers/views.py

+ 3
- 1
src/eventos/admin.py View File

@ -10,7 +10,9 @@ admin.site.register(Noticia, NoticiaAdmin)
class EventoAdmin(admin.ModelAdmin): class EventoAdmin(admin.ModelAdmin):
list_display = ['nombre', 'fecha', 'plazas_disponibles']
list_display = ['nombre', 'fecha', 'plazas_disponibles', 'url_imagen']
list_filter = ['publicado', 'fecha']
search_fields = ['titulo', 'descripcion']
admin.site.register(Evento, EventoAdmin) admin.site.register(Evento, EventoAdmin)


+ 0
- 0
src/eventos/management/__init__.py View File


+ 0
- 0
src/eventos/management/commands/__init__.py View File


+ 45
- 0
src/eventos/management/commands/importar_eventos.py View File

@ -0,0 +1,45 @@
import json
from django.core.management.base import BaseCommand
from repostajes.models import Evento
class Command(BaseCommand):
help = "Importa eventos desde un archivo JSON"
def add_arguments(self, parser):
parser.add_argument('archivo_json', type=str, help="Ruta del archivo JSON")
def handle(self, *args, **kwargs):
archivo_json = kwargs['archivo_json']
try:
with open(archivo_json, 'r', encoding='utf-8') as file:
datos = json.load(file)
self.stdout.write(self.style.WARNING(f"\nSe encontraron {len(datos)} eventos en el archivo '{archivo_json}'."))
confirmar = input("¿Deseas continuar con la importación? (s/n): ").strip().lower()
if confirmar != 's':
self.stdout.write(self.style.ERROR("Importación cancelada."))
return
eventos_creados = 0
for evento_data in datos:
creado = Evento.objects.create(
id=evento_data['id'],
nombre=evento_data['nombre'],
descripcion=evento_data['descripcion'],
fecha=evento_data['fecha'],
plazas_disponibles=evento_data['plazas_disponibles'],
pubicado=evento_data['pubicado'],
url_imagen=evento_data['url_imagen']
)
if creado:
eventos_creados += 1
self.stdout.write(self.style.SUCCESS(f'Se importaron {eventos_creados} eventos correctamente.'))
except FileNotFoundError:
self.stderr.write(self.style.ERROR(f"El archivo {archivo_json} no se encontró."))
except json.JSONDecodeError:
self.stderr.write(self.style.ERROR("Error al leer el archivo JSON. Asegúrate de que el formato sea correcto."))

+ 49
- 0
src/eventos/management/commands/importar_listaespera.py View File

@ -0,0 +1,49 @@
import json
from django.core.management.base import BaseCommand
from eventos.models import ListaEspera, Evento
from reymotausers.models import ReyMotaUser
class Command(BaseCommand):
help = "Importa listaesperas desde un archivo JSON"
def add_arguments(self, parser):
parser.add_argument('archivo_json', type=str, help="Ruta del archivo JSON")
def handle(self, *args, **kwargs):
archivo_json = kwargs['archivo_json']
try:
with open(archivo_json, 'r', encoding='utf-8') as file:
datos = json.load(file)
self.stdout.write(self.style.WARNING(f"\nSe encontraron {len(datos)} listaesperas en el archivo '{archivo_json}'."))
confirmar = input("¿Deseas continuar con la importación? (s/n): ").strip().lower()
if confirmar != 's':
self.stdout.write(self.style.ERROR("Importación cancelada."))
return
listaesperas_creados = 0
for listaespera_data in datos:
try:
evento = Evento.objects.get(id=listaespera_data["evento"])
usuario = ReyMotaUser.objects.get(id=listaespera_data["usuario"])
creado = ListaEspera.objects.create(
evento_id=evento.id,
usuario_id=usuario.id,
fecha_apuntado=listaespera_data['fecha_apuntado'],
)
if creado:
listaesperas_creados += 1
except Evento.DoesNotExist:
self.stderr.write(self.style.ERROR(f"Evento '{listaespera_data['evento']}' no encontrado."))
self.stdout.write(self.style.SUCCESS(f'Se importaron {listaesperas_creados} listaesperas correctamente.'))
except FileNotFoundError:
self.stderr.write(self.style.ERROR(f"El archivo {archivo_json} no se encontró."))
except json.JSONDecodeError:
self.stderr.write(self.style.ERROR("Error al leer el archivo JSON. Asegúrate de que el formato sea correcto."))

+ 49
- 0
src/eventos/management/commands/importar_noticias.py View File

@ -0,0 +1,49 @@
import json
from django.core.management.base import BaseCommand
from eventos.models import Noticia
from reymotausers.models import ReyMotaUser
class Command(BaseCommand):
help = "Importa noticias desde un archivo JSON"
def add_arguments(self, parser):
parser.add_argument('archivo_json', type=str, help="Ruta del archivo JSON")
def handle(self, *args, **kwargs):
archivo_json = kwargs['archivo_json']
try:
with open(archivo_json, 'r', encoding='utf-8') as file:
datos = json.load(file)
self.stdout.write(self.style.WARNING(f"\nSe encontraron {len(datos)} noticias en el archivo '{archivo_json}'."))
confirmar = input("¿Deseas continuar con la importación? (s/n): ").strip().lower()
if confirmar != 's':
self.stdout.write(self.style.ERROR("Importación cancelada."))
return
noticias_creados = 0
for noticia_data in datos:
try:
usuario = ReyMotaUser.objects.get(id=noticia_data["usuario"])
creado = Noticia.objects.create(
autor_id=usuario.id,
titulo=noticia_data['titulo'],
fecha_publicacion=noticia_data['fecha_publicacion'],
publicado=noticia_data['publicado']
)
if creado:
noticias_creados += 1
except ReyMotaUser.DoesNotExist:
self.stderr.write(self.style.ERROR(f"Usuario '{noticia_data['usuario']}' no encontrado."))
self.stdout.write(self.style.SUCCESS(f'Se importaron {noticias_creados} noticias correctamente.'))
except FileNotFoundError:
self.stderr.write(self.style.ERROR(f"El archivo {archivo_json} no se encontró."))
except json.JSONDecodeError:
self.stderr.write(self.style.ERROR("Error al leer el archivo JSON. Asegúrate de que el formato sea correcto."))

+ 50
- 0
src/eventos/management/commands/importar_reservas.py View File

@ -0,0 +1,50 @@
import json
from django.core.management.base import BaseCommand
from eventos.models import Reserva, Evento
from reymotausers.models import ReyMotaUser
class Command(BaseCommand):
help = "Importa reservas desde un archivo JSON"
def add_arguments(self, parser):
parser.add_argument('archivo_json', type=str, help="Ruta del archivo JSON")
def handle(self, *args, **kwargs):
archivo_json = kwargs['archivo_json']
try:
with open(archivo_json, 'r', encoding='utf-8') as file:
datos = json.load(file)
self.stdout.write(self.style.WARNING(f"\nSe encontraron {len(datos)} reservas en el archivo '{archivo_json}'."))
confirmar = input("¿Deseas continuar con la importación? (s/n): ").strip().lower()
if confirmar != 's':
self.stdout.write(self.style.ERROR("Importación cancelada."))
return
reservas_creados = 0
for reserva_data in datos:
try:
evento = Evento.objects.get(id=reserva_data["evento"])
usuario = ReyMotaUser.objects.get(id=reserva_data["usuario"])
creado = Reserva.objects.create(
evento_id=evento.id,
usuario_id=usuario.id,
fecha_reserva=reserva_data['fecha_reserva'],
evento=reserva_data['evento']
)
if creado:
reservas_creados += 1
except Evento.DoesNotExist:
self.stderr.write(self.style.ERROR(f"Evento '{reserva_data['evento']}' no encontrado."))
self.stdout.write(self.style.SUCCESS(f'Se importaron {reservas_creados} reservas correctamente.'))
except FileNotFoundError:
self.stderr.write(self.style.ERROR(f"El archivo {archivo_json} no se encontró."))
except json.JSONDecodeError:
self.stderr.write(self.style.ERROR("Error al leer el archivo JSON. Asegúrate de que el formato sea correcto."))

+ 1
- 0
src/eventos/models.py View File

@ -11,6 +11,7 @@ class Evento(models.Model):
plazas_disponibles = models.PositiveIntegerField() plazas_disponibles = models.PositiveIntegerField()
publicado = models.BooleanField(default=False) # Nuevo campo para la publicación publicado = models.BooleanField(default=False) # Nuevo campo para la publicación
url_imagen = models.TextField(blank=True, null=True) # Campo para la URL de la imagen
def __str__(self): def __str__(self):
return self.nombre return self.nombre


+ 26
- 0
src/eventos/serializers.py View File

@ -0,0 +1,26 @@
from rest_framework import serializers
from .models import Evento, Reserva, ListaEspera, Noticia
class EventoSerializer(serializers.ModelSerializer):
class Meta:
model = Evento
fields = '__all__' # Incluir todos los campos del modelo
class ReservaSerializer(serializers.ModelSerializer):
class Meta:
model = Reserva
fields = '__all__' # Incluir todos los campos del modelo
class ListaEsperaSerializer(serializers.ModelSerializer):
class Meta:
model = ListaEspera
fields = '__all__' # Incluir todos los campos del modelo
class NoticiaSerializer(serializers.ModelSerializer):
class Meta:
model = Noticia
fields = '__all__' # Incluir todos los campos del modelo

+ 17
- 0
src/eventos/urls.py View File

@ -1,6 +1,11 @@
from django.urls import path from django.urls import path
from . import views from . import views
from .views import api_lista_eventos, api_detalle_evento
from .views import api_lista_reservas, api_detalle_reserva
from .views import api_lista_listaespera, api_detalle_listaespera
from .views import api_lista_noticias, api_detalle_noticia
app_name = 'eventos' app_name = 'eventos'
urlpatterns = [ urlpatterns = [
@ -17,4 +22,16 @@ urlpatterns = [
path('reservar/<int:evento_id>/', path('reservar/<int:evento_id>/',
views.reservar_evento, name='reservar_evento'), views.reservar_evento, name='reservar_evento'),
path('api/eventos/', api_lista_eventos, name='api_lista_eventos'),
path('api/eventos/<int:evento_id>/', api_detalle_evento, name='api_detalle_evento'),
path('api/reservas/', api_lista_reservas, name='api_lista_reservas'),
path('api/reservas/<int:reserva_id>/', api_detalle_reserva, name='api_detalle_reserva'),
path('api/listaespera/', api_lista_listaespera, name='api_lista_listaespera'),
path('api/listaespera/<int:listaespera_id>/', api_detalle_listaespera, name='api_detalle_listaespera'),
path('api/noticias/', api_lista_noticias, name='api_lista_noticias'),
path('api/noticias/<int:noticia_id>/', api_detalle_noticia, name='api_detalle_noticia'),
] ]

+ 94
- 4
src/eventos/views.py View File

@ -4,6 +4,11 @@ from django.contrib import messages
from django.core.mail import EmailMultiAlternatives from django.core.mail import EmailMultiAlternatives
from django.conf import settings from django.conf import settings
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .serializers import EventoSerializer, ReservaSerializer, ListaEsperaSerializer, NoticiaSerializer
from .models import Evento, Reserva, ListaEspera, Noticia from .models import Evento, Reserva, ListaEspera, Noticia
from .forms import ListaEsperaForm, EventoForm from .forms import ListaEsperaForm, EventoForm
@ -72,11 +77,14 @@ def publicar_evento(request, evento_id):
@login_required @login_required
def lista_eventos(request): def lista_eventos(request):
# anno_actual = timezone.now().year
# Solo mostrar los eventos publicados a los usuarios normales # Solo mostrar los eventos publicados a los usuarios normales
if request.user.is_staff: if request.user.is_staff:
eventos = Evento.objects.all() # Los administradores ven todos los eventos
eventos = Evento.objects.all().order_by('-fecha', '-hora')
else: else:
eventos = Evento.objects.filter(publicado=True) # Los usuarios ven solo eventos publicados
eventos = Evento.objects.filter(publicado=True).order_by('-fecha', '-hora')
# eventos = Evento.objects.filter(publicado=True, fecha__year=anno_actual) # Los usuarios ven solo eventos publicados y del año en curso
# Crear un diccionario que mapea cada evento con un booleano indicando si el usuario ya ha reservado # Crear un diccionario que mapea cada evento con un booleano indicando si el usuario ya ha reservado
eventos_con_reserva = [] eventos_con_reserva = []
@ -99,7 +107,8 @@ def lista_eventos(request):
'plazas_restantes': evento.plazas_restantes, 'plazas_restantes': evento.plazas_restantes,
'en_espera': en_espera, 'en_espera': en_espera,
'usuario': request.user, 'usuario': request.user,
'publicado': evento.publicado
'publicado': evento.publicado,
'url_imagen': evento.url_imagen
}) })
return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva}) return render(request, 'eventos/lista_eventos.html', {'eventos_con_reserva': eventos_con_reserva})
@ -144,7 +153,8 @@ def detalle_evento(request, evento_id):
'plazas_restantes': evento.plazas_restantes, 'plazas_restantes': evento.plazas_restantes,
'en_espera': en_espera, 'en_espera': en_espera,
'usuario': request.user, 'usuario': request.user,
'publicado': evento.publicado
'publicado': evento.publicado,
'url_imagen': evento.url_imagen
} }
) )
@ -202,3 +212,83 @@ def apuntar_lista_espera(request, evento_id):
form = ListaEsperaForm() form = ListaEsperaForm()
return render(request, 'eventos/apuntar_lista_espera.html', {'form': form, 'evento': evento}) return render(request, 'eventos/apuntar_lista_espera.html', {'form': form, 'evento': evento})
#
# API
#
@api_view(['GET'])
def api_lista_eventos(request):
"""Devuelve la lista de todos los eventos."""
eventos = Evento.objects.all()
serializer = EventoSerializer(eventos, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_detalle_evento(request, evento_id):
"""Devuelve los detalles de un evento específico."""
try:
evento = Evento.objects.get(id=evento_id)
serializer = EventoSerializer(evento)
return Response(serializer.data)
except Evento.DoesNotExist:
return Response({'error': 'Evento no encontrado'}, status=404)
@api_view(['GET'])
def api_lista_reservas(request):
"""Devuelve la lista de todos los reservas."""
reservas = Reserva.objects.all()
serializer = ReservaSerializer(reservas, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_detalle_reserva(request, reserva_id):
"""Devuelve los detalles de un reserva específico."""
try:
reserva = Reserva.objects.get(id=reserva_id)
serializer = ReservaSerializer(reserva)
return Response(serializer.data)
except Reserva.DoesNotExist:
return Response({'error': 'Reserva no encontrado'}, status=404)
@api_view(['GET'])
def api_lista_listaespera(request):
"""Devuelve la lista de todos los listaespera."""
listaesperas = ListaEspera.objects.all()
serializer = ListaEsperaSerializer(listaesperas, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_detalle_listaespera(request, listaespera_id):
"""Devuelve los detalles de un listaespera específico."""
try:
listaespera = ListaEspera.objects.get(id=listaespera_id)
serializer = ListaEsperaSerializer(listaespera)
return Response(serializer.data)
except ListaEspera.DoesNotExist:
return Response({'error': 'ListaEspera no encontrado'}, status=404)
@api_view(['GET'])
def api_lista_noticias(request):
"""Devuelve la lista de todos los noticias."""
noticias = Noticia.objects.all()
serializer = NoticiaSerializer(noticias, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_detalle_noticia(request, noticia_id):
"""Devuelve los detalles de un noticia específico."""
try:
noticia = Noticia.objects.get(id=noticia_id)
serializer = NoticiaSerializer(noticia)
return Response(serializer.data)
except Noticia.DoesNotExist:
return Response({'error': 'Noticia no encontrado'}, status=404)

+ 17
- 13
src/gestion_reservas/settings.py View File

@ -26,7 +26,7 @@ SECRET_KEY = 'hey'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.environ["DEBUG"] == 'True' DEBUG = os.environ["DEBUG"] == 'True'
ALLOWED_HOSTS = [".ocp-cluster.reymota.lab"]
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
# Application definition # Application definition
@ -85,15 +85,16 @@ WSGI_APPLICATION = 'gestion_reservas.wsgi.application'
DATABASES = { DATABASES = {
"default": { "default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "jugaralpadel",
"USER": "creylopez",
"PASSWORD": "Dsa-0213",
"HOST": "postgresql",
"PORT": "5432",
"ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
"NAME": os.environ.get("SQL_DATABASE", BASE_DIR / "db.sqlite3"),
"USER": os.environ.get("SQL_USER", "user"),
"PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
"HOST": os.environ.get("SQL_HOST", "localhost"),
"PORT": os.environ.get("SQL_PORT", "5432"),
} }
} }
# Password validation # Password validation
# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators
@ -132,12 +133,9 @@ THOUSAND_SEPARATOR = '.'
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/5.1/howto/static-files/ # https://docs.djangoproject.com/en/5.1/howto/static-files/
STATIC_URL = 'static/'
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / "staticfiles" STATIC_ROOT = BASE_DIR / "staticfiles"
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / "mediafiles"
# Default primary key field type # Default primary key field type
# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field # https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field
@ -149,7 +147,13 @@ LOGOUT_REDIRECT_URL = 'principal'
AUTH_USER_MODEL = "reymotausers.ReyMotaUser" AUTH_USER_MODEL = "reymotausers.ReyMotaUser"
CSRF_TRUSTED_ORIGINS = ["https://*.ocp-cluster.reymota.lab"]
MEDIA_ROOT = BASE_DIR / "mediafiles"
MEDIA_URL = '/media/'
if DEBUG is False:
CSRF_TRUSTED_ORIGINS = os.environ.get("CSRF_TRUSTED_ORIGINS").split(" ")
CSRF_TRUSTED_ORIGINS = os.environ.get("CSRF_TRUSTED_ORIGINS").split(" ")
# Configuración de correo con Gmail # Configuración de correo con Gmail
if DEBUG is True: if DEBUG is True:
@ -162,7 +166,7 @@ EMAIL_PORT = 587
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'jugaralpadelentreamigos@gmail.com' EMAIL_HOST_USER = 'jugaralpadelentreamigos@gmail.com'
EMAIL_HOST_PASSWORD = 'oxdkclbtggewxhqc' # Es mejor usar una contraseña de aplicación de Google
EMAIL_HOST_PASSWORD = 'btjnlcliimxcnmhi' # Es mejor usar una contraseña de aplicación de Google
DEFAULT_FROM_EMAIL = 'jugaralpadelentreamigos@gmail.com' DEFAULT_FROM_EMAIL = 'jugaralpadelentreamigos@gmail.com'
# Dirección del administrador # Dirección del administrador


+ 1
- 3
src/gestion_reservas/urls.py View File

@ -27,6 +27,7 @@ urlpatterns = [
path('obreros/', admin.site.urls), path('obreros/', admin.site.urls),
path("eventos/", include('eventos.urls')), path("eventos/", include('eventos.urls')),
path("usuarios/", include('reymotausers.urls')),
path("accounts/", include("accounts.urls")), # new path("accounts/", include("accounts.urls")), # new
path("accounts/", include("django.contrib.auth.urls")), path("accounts/", include("django.contrib.auth.urls")),
@ -35,8 +36,5 @@ urlpatterns = [
path('entorno/', views.ver_variables_entorno, name='ver_variables_entorno'), path('entorno/', views.ver_variables_entorno, name='ver_variables_entorno'),
path('ayuda/', views.ayuda, name='ayuda'), path('ayuda/', views.ayuda, name='ayuda'),
path('api/proximo-evento/', views.proximo_evento, name='proximo_evento'),
path('api/todos-los-eventos/', views.todos_los_eventos, name='todos_los_eventos'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 0
- 48
src/gestion_reservas/views.py View File

@ -1,5 +1,4 @@
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import api_view
from django.utils import timezone from django.utils import timezone
from rest_framework import status from rest_framework import status
@ -52,53 +51,6 @@ def principal(request):
return render(request, 'index.html', {'noticias': noticias}) return render(request, 'index.html', {'noticias': noticias})
@api_view(['GET'])
def proximo_evento(request):
# Obtiene y valida el parámetro `publicado`
publicado_param = request.GET.get('publicado', 'true').lower()
if publicado_param not in ['true', 'false', 'all']:
return Response(
{'detail': 'El parámetro "publicado" debe ser "true", "false" o "all".'},
status=status.HTTP_400_BAD_REQUEST
)
# Configura el filtro según el parámetro `publicado`
if publicado_param == 'all':
eventos = Evento.objects.filter(fecha__gte=timezone.now()).order_by('fecha')
else:
publicado = publicado_param == 'true'
eventos = Evento.objects.filter(publicado=publicado, fecha__gte=timezone.now()).order_by('fecha')
evento = eventos.first()
if evento:
serializer = EventoSerializer(evento)
return Response(serializer.data)
else:
return Response({'detail': 'No hay eventos próximos.'}, status=404)
@api_view(['GET'])
def todos_los_eventos(request):
# Obtiene y valida el parámetro `publicado`
publicado_param = request.GET.get('publicado', 'true').lower()
if publicado_param not in ['true', 'false', 'all']:
return Response(
{'detail': 'El parámetro "publicado" debe ser "true", "false" o "all".'},
status=status.HTTP_400_BAD_REQUEST
)
# Configura el filtro según el parámetro `publicado`
if publicado_param == 'all':
eventos = Evento.objects.all().order_by('fecha')
else:
publicado = publicado_param == 'true'
eventos = Evento.objects.filter(publicado=publicado).order_by('fecha')
serializer = EventoSerializer(eventos, many=True) # `many=True` para serializar una lista de eventos
return Response(serializer.data)
def ayuda(request): def ayuda(request):
elementos_ayuda = Ayuda.objects.all().order_by('apartado') elementos_ayuda = Ayuda.objects.all().order_by('apartado')
apartados = Ayuda.APARTADOS apartados = Ayuda.APARTADOS


+ 0
- 0
src/reymotausers/management/__init__.py View File


+ 0
- 0
src/reymotausers/management/commands/__init__.py View File


+ 48
- 0
src/reymotausers/management/commands/importar_usuarios.py View File

@ -0,0 +1,48 @@
import json
from django.core.management.base import BaseCommand
from reymotausers.models import ReyMotaUser
class Command(BaseCommand):
help = "Importa usuarios desde un archivo JSON"
def add_arguments(self, parser):
parser.add_argument('archivo_json', type=str, help="Ruta del archivo JSON")
def handle(self, *args, **kwargs):
archivo_json = kwargs['archivo_json']
try:
with open(archivo_json, 'r', encoding='utf-8') as file:
datos = json.load(file)
self.stdout.write(self.style.WARNING(f"\nSe encontraron {len(datos)} usuarios en el archivo '{archivo_json}'."))
confirmar = input("¿Deseas continuar con la importación? (s/n): ").strip().lower()
if confirmar != 's':
self.stdout.write(self.style.ERROR("Importación cancelada."))
return
usuarios_creados = 0
for usuario_data in datos:
creado = ReyMotaUser.objects.create(
foto=usuario_data['foto'],
password=usuario_data['password'],
is_superuser=usuario_data['is_superuser'],
is_staff=usuario_data['is_staff'],
is_active=usuario_data['is_active'],
nombre=usuario_data['nombre'],
email=usuario_data['email'],
groups=usuario_data['groups'],
user_permissions=usuario_data['user_permissions'],
last_login=usuario_data['last_login']
)
if creado:
usuarios_creados += 1
self.stdout.write(self.style.SUCCESS(f'Se importaron {usuarios_creados} usuarios correctamente.'))
except FileNotFoundError:
self.stderr.write(self.style.ERROR(f"El archivo {archivo_json} no se encontró."))
except json.JSONDecodeError:
self.stderr.write(self.style.ERROR("Error al leer el archivo JSON. Asegúrate de que el formato sea correcto."))

+ 8
- 0
src/reymotausers/serializers.py View File

@ -0,0 +1,8 @@
from rest_framework import serializers
from .models import ReyMotaUser
class ReyMotaUserSerializer(serializers.ModelSerializer):
class Meta:
model = ReyMotaUser
fields = '__all__' # Incluir todos los campos del modelo

+ 9
- 0
src/reymotausers/urls.py View File

@ -0,0 +1,9 @@
from django.urls import path
from . import views
from .views import api_lista_usuarios, api_detalle_usuario
urlpatterns = [
path('api/usuarios/', api_lista_usuarios, name='api_lista_usuarios'),
path('api/usuarios/<int:usuario_id>/', api_detalle_usuario, name='api_detalle_usuario'),
]

+ 26
- 0
src/reymotausers/views.py View File

@ -1,3 +1,29 @@
from django.shortcuts import render from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .serializers import ReyMotaUserSerializer
from .models import ReyMotaUser
# Create your views here. # Create your views here.
@api_view(['GET'])
def api_lista_usuarios(request):
"""Devuelve la lista de todos los usuarios."""
usuarios = ReyMotaUser.objects.all()
serializer = ReyMotaUserSerializer(usuarios, many=True)
return Response(serializer.data)
@api_view(['GET'])
def api_detalle_usuario(request, usuario_id):
"""Devuelve los detalles de un usuario específico."""
try:
usuario = ReyMotaUser.objects.get(id=usuario_id)
serializer = ReyMotaUserSerializer(usuario)
return Response(serializer.data)
except ReyMotaUser.DoesNotExist:
return Response({'error': 'Canción no encontrada'}, status=404)

Loading…
Cancel
Save