diff --git a/Plataform_Web/gades_manager/urls.py b/Plataform_Web/gades_manager/urls.py index 0359442..6d53cf2 100644 --- a/Plataform_Web/gades_manager/urls.py +++ b/Plataform_Web/gades_manager/urls.py @@ -21,6 +21,7 @@ from django.contrib.auth import views as auth_views from gestion import views from users import views as users_views from temporadas import views as temporadas_views +from pruebas import views as pruebas_views urlpatterns = [ path('admin/', admin.site.urls), @@ -45,4 +46,10 @@ urlpatterns = [ path('patrocinios/proponer/', views.proponer_patrocinio, name='proponer_patrocinio'), path('patrocinios//editar/', views.editar_patrocinio, name='editar_patrocinio'), path('patrocinios//estado/', views.cambiar_estado_patrocinio, name='cambiar_estado_patrocinio'), + path('pruebas/', pruebas_views.listado_pruebas, name='listado_pruebas'), + path('pruebas/nueva/', pruebas_views.crear_prueba, name='crear_prueba'), + path('pruebas//', pruebas_views.detalle_prueba, name='detalle_prueba'), + path('pruebas//editar/', pruebas_views.editar_prueba, name='editar_prueba'), + path('pruebas//eliminar/', pruebas_views.eliminar_prueba, name='eliminar_prueba'), + path('pruebas//csv/subir/', pruebas_views.subir_csv, name='subir_csv'), ] \ No newline at end of file diff --git a/Plataform_Web/pruebas/forms.py b/Plataform_Web/pruebas/forms.py new file mode 100644 index 0000000..60029e9 --- /dev/null +++ b/Plataform_Web/pruebas/forms.py @@ -0,0 +1,22 @@ +from django import forms +from .models import Prueba, Telemetria + + +class PruebaForm(forms.ModelForm): + class Meta: + model = Prueba + fields = ['nombre', 'descripcion', 'fecha_inicio', 'fecha_fin', 'categoria', 'resultados', 'temporada'] + widgets = { + 'fecha_inicio': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}), + 'fecha_fin': forms.DateInput(attrs={'type': 'date', 'class': 'form-control'}), + } + + +class TelemetriaForm(forms.ModelForm): + class Meta: + model = Telemetria + fields = ['nombre', 'archivo_csv'] + widgets = { + 'nombre': forms.TextInput(attrs={'class': 'form-control form-control-sm'}), + 'archivo_csv': forms.ClearableFileInput(attrs={'class': 'form-control form-control-sm'}), + } diff --git a/Plataform_Web/pruebas/models.py b/Plataform_Web/pruebas/models.py index 0f8ac45..257563e 100644 --- a/Plataform_Web/pruebas/models.py +++ b/Plataform_Web/pruebas/models.py @@ -1,6 +1,7 @@ from django.db import models from django.conf import settings from temporadas.models import Temporada +import os class Prueba(models.Model): CATEGORIAS_TEST = ( @@ -52,6 +53,13 @@ class Telemetria(models.Model): def __str__(self): return f"Telemetría: {self.nombre} (De: {self.prueba.nombre})" + def delete(self, *args, **kwargs): + # Borra el archivo físico del disco duro cuando borras la entrada en la base de datos + if self.archivo_csv: + if os.path.isfile(self.archivo_csv.path): + os.remove(self.archivo_csv.path) + super().delete(*args, **kwargs) + class Variable(models.Model): nombre = models.CharField(max_length=50, verbose_name="Nombre ") diff --git a/Plataform_Web/pruebas/views.py b/Plataform_Web/pruebas/views.py index 91ea44a..38fcb78 100644 --- a/Plataform_Web/pruebas/views.py +++ b/Plataform_Web/pruebas/views.py @@ -1,3 +1,102 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.views.decorators.http import require_POST +from users.decorators import require_rol +from temporadas.models import Temporada +from .models import Prueba +from .forms import PruebaForm, TelemetriaForm -# Create your views here. + +def puede_subir_csv(user): + return user.rol == 'directiva' or user.especialidad == 'software' + + +@login_required +def listado_pruebas(request): + temporada_actual = Temporada.objects.filter(actual=True).first() + temporada_id = request.GET.get('temporada') or (temporada_actual.pk if temporada_actual else None) + categoria = request.GET.get('categoria') + + pruebas = Prueba.objects.all() + if temporada_id: + pruebas = pruebas.filter(temporada_id=temporada_id) + if categoria: + pruebas = pruebas.filter(categoria=categoria) + + return render(request, 'listado_pruebas.html', { + 'pruebas': pruebas, + 'temporadas': Temporada.objects.all(), + 'categorias': Prueba.CATEGORIAS_TEST, + 'temporada_seleccionada': str(temporada_id) if temporada_id else '', + 'categoria_seleccionada': categoria or '', + }) + + +@login_required +def detalle_prueba(request, pk): + prueba = get_object_or_404(Prueba, pk=pk) + puede_editar = request.user.rol == 'directiva' or ( + request.user.rol == 'jefe_area' and prueba.realizado_por_id == request.user.id + ) + return render(request, 'detalle_prueba.html', { + 'prueba': prueba, + 'puede_editar': puede_editar, + 'puede_subir_csv': puede_subir_csv(request.user), + 'form_csv': TelemetriaForm(), + }) + + +@require_rol('directiva', 'jefe_area') +def crear_prueba(request): + form = PruebaForm(request.POST or None) + if request.method == 'POST' and form.is_valid(): + prueba = form.save(commit=False) + prueba.realizado_por = request.user + prueba.save() + messages.success(request, 'Test creado correctamente.') + return redirect('listado_pruebas') + return render(request, 'editar_prueba.html', {'form': form, 'prueba': None}) + + +@require_rol('directiva', 'jefe_area') +def editar_prueba(request, pk): + prueba = get_object_or_404(Prueba, pk=pk) + if request.user.rol == 'jefe_area' and prueba.realizado_por_id != request.user.id: + messages.error(request, 'Solo puedes editar los tests que tú has creado.') + return redirect('detalle_prueba', pk=prueba.pk) + + form = PruebaForm(request.POST or None, instance=prueba) + if request.method == 'POST' and form.is_valid(): + form.save() + messages.success(request, 'Test actualizado correctamente.') + return redirect('detalle_prueba', pk=prueba.pk) + return render(request, 'editar_prueba.html', {'form': form, 'prueba': prueba}) + + +@require_rol('directiva') +@require_POST +def eliminar_prueba(request, pk): + prueba = get_object_or_404(Prueba, pk=pk) + prueba.delete() + messages.success(request, f'Test "{prueba.nombre}" eliminado.') + return redirect('listado_pruebas') + + +@login_required +@require_POST +def subir_csv(request, pk): + prueba = get_object_or_404(Prueba, pk=pk) + if not puede_subir_csv(request.user): + messages.error(request, 'No tienes permiso para subir archivos de telemetría.') + return redirect('detalle_prueba', pk=prueba.pk) + + form = TelemetriaForm(request.POST, request.FILES) + if form.is_valid(): + telemetria = form.save(commit=False) + telemetria.prueba = prueba + telemetria.save() + messages.success(request, 'Archivo de telemetría subido correctamente.') + else: + messages.error(request, 'No se pudo subir el archivo. Revisa el formulario.') + return redirect('detalle_prueba', pk=prueba.pk) diff --git a/Plataform_Web/templates/base.html b/Plataform_Web/templates/base.html index 5c5a20d..fd7817d 100644 --- a/Plataform_Web/templates/base.html +++ b/Plataform_Web/templates/base.html @@ -47,7 +47,7 @@