Browse Source

Api e importación listo

main
Celestino Rey 9 months ago
parent
commit
db3e68a881
16 changed files with 115 additions and 32 deletions
  1. +5
    -2
      src/eventos/management/commands/importar_listaespera.py
  2. +3
    -2
      src/eventos/management/commands/importar_noticias.py
  3. +3
    -4
      src/eventos/management/commands/importar_reservas.py
  4. +10
    -4
      src/eventos/serializers.py
  5. +0
    -0
      src/gestion_reservas/management/__init__.py
  6. +0
    -0
      src/gestion_reservas/management/commands/__init__.py
  7. +41
    -0
      src/gestion_reservas/management/commands/importar_ayuda.py
  8. +4
    -5
      src/gestion_reservas/serializers.py
  9. +13
    -9
      src/gestion_reservas/settings.py
  10. +3
    -0
      src/gestion_reservas/urls.py
  11. +15
    -1
      src/gestion_reservas/views.py
  12. +3
    -1
      src/reymotausers/management/commands/importar_usuarios.py
  13. +1
    -1
      src/reymotausers/serializers.py
  14. +2
    -2
      src/templates/_head.html
  15. +7
    -0
      src/templates/eventos/detalle_evento.html
  16. +5
    -1
      src/templates/eventos/lista_eventos.html

+ 5
- 2
src/eventos/management/commands/importar_listaespera.py View File

@ -27,8 +27,8 @@ class Command(BaseCommand):
listaesperas_creados = 0 listaesperas_creados = 0
for listaespera_data in datos: for listaespera_data in datos:
try: try:
evento = Evento.objects.get(id=listaespera_data["evento"])
usuario = ReyMotaUser.objects.get(id=listaespera_data["usuario"])
evento = Evento.objects.get(nombre=listaespera_data["evento_nombre"])
usuario = ReyMotaUser.objects.get(email=listaespera_data["usuario_email"])
creado = ListaEspera.objects.create( creado = ListaEspera.objects.create(
evento_id=evento.id, evento_id=evento.id,
@ -41,6 +41,9 @@ class Command(BaseCommand):
except Evento.DoesNotExist: except Evento.DoesNotExist:
self.stderr.write(self.style.ERROR(f"Evento '{listaespera_data['evento']}' no encontrado.")) self.stderr.write(self.style.ERROR(f"Evento '{listaespera_data['evento']}' no encontrado."))
except ReyMotaUser.DoesNotExist:
self.stderr.write(self.style.ERROR(f"Usuario con email '{listaespera_data['usuario_email']}' no encontrado."))
self.stdout.write(self.style.SUCCESS(f'Se importaron {listaesperas_creados} listaesperas correctamente.')) self.stdout.write(self.style.SUCCESS(f'Se importaron {listaesperas_creados} listaesperas correctamente.'))
except FileNotFoundError: except FileNotFoundError:


+ 3
- 2
src/eventos/management/commands/importar_noticias.py View File

@ -27,12 +27,13 @@ class Command(BaseCommand):
noticias_creados = 0 noticias_creados = 0
for noticia_data in datos: for noticia_data in datos:
try: try:
usuario = ReyMotaUser.objects.get(id=noticia_data["autor"])
usuario = ReyMotaUser.objects.get(email=noticia_data["usuario_email"])
creado = Noticia.objects.create( creado = Noticia.objects.create(
autor_id=usuario.id,
autor=usuario,
titulo=noticia_data['titulo'], titulo=noticia_data['titulo'],
fecha_publicacion=noticia_data['fecha_publicacion'], fecha_publicacion=noticia_data['fecha_publicacion'],
contenido=noticia_data['contenido'],
publicado=noticia_data['publicado'] publicado=noticia_data['publicado']
) )
if creado: if creado:


+ 3
- 4
src/eventos/management/commands/importar_reservas.py View File

@ -27,14 +27,13 @@ class Command(BaseCommand):
reservas_creados = 0 reservas_creados = 0
for reserva_data in datos: for reserva_data in datos:
try: try:
evento = Evento.objects.get(id=reserva_data["evento"])
evento = Evento.objects.get(nombre=reserva_data["evento_nombre"])
usuario = ReyMotaUser.objects.get(email=reserva_data["usuario_email"]) usuario = ReyMotaUser.objects.get(email=reserva_data["usuario_email"])
creado = Reserva.objects.create( creado = Reserva.objects.create(
evento_id=evento.id,
usuario_id=usuario.id,
fecha_reserva=reserva_data['fecha_reserva'], fecha_reserva=reserva_data['fecha_reserva'],
evento=evento
evento=evento,
usuario=usuario
) )
if creado: if creado:
reservas_creados += 1 reservas_creados += 1


+ 10
- 4
src/eventos/serializers.py View File

@ -10,20 +10,26 @@ class EventoSerializer(serializers.ModelSerializer):
class ReservaSerializer(serializers.ModelSerializer): class ReservaSerializer(serializers.ModelSerializer):
usuario_email = serializers.CharField(source='usuario.email', read_only=True) usuario_email = serializers.CharField(source='usuario.email', read_only=True)
evento_nombre = serializers.CharField(source='evento.nombre', read_only=True)
class Meta: class Meta:
model = Reserva model = Reserva
# fields = '__all__' # Incluir todos los campos del modelo
fields = ['id', 'usuario', 'usuario_email', 'evento', 'fecha_reserva']
fields = ['id', 'usuario', 'usuario_email', 'evento', 'fecha_reserva', 'evento_nombre']
class ListaEsperaSerializer(serializers.ModelSerializer): class ListaEsperaSerializer(serializers.ModelSerializer):
usuario_email = serializers.CharField(source='usuario.email', read_only=True)
evento_nombre = serializers.CharField(source='evento.nombre', read_only=True)
class Meta: class Meta:
model = ListaEspera model = ListaEspera
fields = '__all__' # Incluir todos los campos del modelo
fields = ['id', 'fecha_apuntado', 'usuario_email', 'evento_nombre']
class NoticiaSerializer(serializers.ModelSerializer): class NoticiaSerializer(serializers.ModelSerializer):
usuario_email = serializers.CharField(source='autor.email', read_only=True)
class Meta: class Meta:
model = Noticia model = Noticia
fields = '__all__' # Incluir todos los campos del modelo
fields = ['id', 'titulo', 'contenido', 'fecha_publicacion', 'publicado', 'usuario_email']

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


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


+ 41
- 0
src/gestion_reservas/management/commands/importar_ayuda.py View File

@ -0,0 +1,41 @@
import json
from django.core.management.base import BaseCommand
from gestion_reservas.models import Ayuda
class Command(BaseCommand):
help = "Importa la ayuda 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)} elementos de ayuda 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
ayuda_creados = 0
for ayuda_data in datos:
creado = Ayuda.objects.create(
titulo=ayuda_data['titulo'],
descripcion=ayuda_data['descripcion'],
apartado=ayuda_data['apartado'],
)
if creado:
ayuda_creados += 1
self.stdout.write(self.style.SUCCESS(f'Se importaron {ayuda_creados} entradas de ayuda 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."))

+ 4
- 5
src/gestion_reservas/serializers.py View File

@ -1,9 +1,8 @@
from rest_framework import serializers from rest_framework import serializers
from eventos.models import Evento
from .models import Ayuda
class EventoSerializer(serializers.ModelSerializer):
class AyudaSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Evento
fields = ['id', 'nombre', 'descripcion', 'fecha', 'hora', 'plazas_restantes', 'publicado']
model = Ayuda
fields = '__all__' # Incluir todos los campos del modelo

+ 13
- 9
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,14 +85,15 @@ 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
@ -149,7 +150,10 @@ AUTH_USER_MODEL = "reymotausers.ReyMotaUser"
MEDIA_ROOT = BASE_DIR / "mediafiles" MEDIA_ROOT = BASE_DIR / "mediafiles"
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
CSRF_TRUSTED_ORIGINS = ["https://*.ocp-cluster.reymota.lab"]
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:


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

@ -21,6 +21,7 @@ from django.conf import settings
from django.views.generic.base import TemplateView # new from django.views.generic.base import TemplateView # new
from . import views from . import views
from .views import api_lista_ayuda
urlpatterns = [ urlpatterns = [
@ -36,5 +37,7 @@ 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/ayuda/', api_lista_ayuda, name='api_lista_ayuda'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 15
- 1
src/gestion_reservas/views.py View File

@ -8,8 +8,10 @@ from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render, get_object_or_404 from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseForbidden from django.http import HttpResponseForbidden
from rest_framework.decorators import api_view
from eventos.models import Noticia, Evento from eventos.models import Noticia, Evento
from .serializers import EventoSerializer
from .serializers import AyudaSerializer
from .models import Ayuda from .models import Ayuda
import markdown # Importa la biblioteca de markdown import markdown # Importa la biblioteca de markdown
@ -60,3 +62,15 @@ def ayuda(request):
item.descripcion = markdown.markdown(item.descripcion) item.descripcion = markdown.markdown(item.descripcion)
return render(request, 'ayuda.html', {'elementos': elementos_ayuda, 'apartados': apartados}) return render(request, 'ayuda.html', {'elementos': elementos_ayuda, 'apartados': apartados})
#
# API
#
@api_view(['GET'])
def api_lista_ayuda(request):
"""Devuelve la lista de toda la ayuda."""
ayuda = Ayuda.objects.all()
serializer = AyudaSerializer(ayuda, many=True)
return Response(serializer.data)

+ 3
- 1
src/reymotausers/management/commands/importar_usuarios.py View File

@ -32,7 +32,9 @@ class Command(BaseCommand):
is_staff=usuario_data['is_staff'], is_staff=usuario_data['is_staff'],
is_active=usuario_data['is_active'], is_active=usuario_data['is_active'],
nombre=usuario_data['nombre'], nombre=usuario_data['nombre'],
email=usuario_data['email'] )
email=usuario_data['email'],
last_login=usuario_data['last_login']
)
if creado: if creado:
usuarios_creados += 1 usuarios_creados += 1


+ 1
- 1
src/reymotausers/serializers.py View File

@ -5,4 +5,4 @@ from .models import ReyMotaUser
class ReyMotaUserSerializer(serializers.ModelSerializer): class ReyMotaUserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = ReyMotaUser model = ReyMotaUser
fields = '__all__' # Incluir todos los campos del modelo
fields = ['email', 'password', 'foto', 'is_superuser', 'is_staff', 'is_active', 'nombre', 'last_login']

+ 2
- 2
src/templates/_head.html View File

@ -10,7 +10,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Portal - Bootstrap 5 Admin Dashboard Template For Developers">
<meta name="description" content="Jugar al pádel entre amigos">
<meta name="author" content="Celestino Rey" > <meta name="author" content="Celestino Rey" >
<link rel="shortcut icon" href="{% static 'images/favicon.ico' %}"> <link rel="shortcut icon" href="{% static 'images/favicon.ico' %}">
@ -20,4 +20,4 @@
<!-- App CSS --> <!-- App CSS -->
<link id="theme-style" rel="stylesheet" href="{% static 'css/portal.css' %}"> <link id="theme-style" rel="stylesheet" href="{% static 'css/portal.css' %}">
</head>
</head>

+ 7
- 0
src/templates/eventos/detalle_evento.html View File

@ -1,5 +1,7 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %}
{% block menuapp %} {% block menuapp %}
{% endblock menuapp %} {% endblock menuapp %}
@ -59,6 +61,11 @@
</div> </div>
</div><!--//card-header--> </div><!--//card-header-->
{% if evento.url_imagen %}
<div class="app-card-thumb">
<img src="https://lh3.googleusercontent.com/d/{{ evento.url_imagen }}" alt="Imagen de {{ evento.nombre }}" width="820" height="612">
</div>
{% endif %}
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-12 col-lg-auto text-center text-lg-start"> <div class="col-12 col-lg-auto text-center text-lg-start">
{% if reservas %} {% if reservas %}


+ 5
- 1
src/templates/eventos/lista_eventos.html View File

@ -37,7 +37,11 @@
<div class="app-card app-card-doc shadow-sm h-100"> <div class="app-card app-card-doc shadow-sm h-100">
<div class="app-card-thumb-holder p-3"> <div class="app-card-thumb-holder p-3">
<div class="app-card-thumb"> <div class="app-card-thumb">
<img class="thumb-image" src="{% static 'images/padel-court.jpg' %}" alt="">
{% if evento.url_imagen %}
<img src="https://lh3.googleusercontent.com/d/{{ evento.url_imagen }}" alt="Imagen de {{ evento.nombre }}" width="205px" height="153px">
{% else %}
<img class="thumb-image" src="{% static 'images/padel-court.jpg' %}" alt="">
{% endif %}
</div> </div>
<a class="app-card-link-mask" href="{% url 'eventos:detalle_evento' evento.id %}"></a> <a class="app-card-link-mask" href="{% url 'eventos:detalle_evento' evento.id %}"></a>
</div> </div>


Loading…
Cancel
Save