diff --git a/Proyecto/espacios_obligados/forms.py b/Proyecto/espacios_obligados/forms.py index 07db616..567790e 100644 --- a/Proyecto/espacios_obligados/forms.py +++ b/Proyecto/espacios_obligados/forms.py @@ -1,5 +1,5 @@ from django import forms -from .models import Entidad, Sede, Provincias +from .models import Entidad, Sede, Provincias, DEA from leaflet.forms.widgets import LeafletWidget from django.contrib.gis.geos import Point from django.contrib.gis import forms as gis_forms @@ -34,4 +34,64 @@ def save(self, commit=True): sede.ubicacion = coordenadas if commit: sede.save() - return sede \ No newline at end of file + return sede + + + +class EditSedeForm(forms.ModelForm): + + ubicacion = gis_forms.PointField(widget=LeafletWidget()) + class Meta: + model = Sede + fields = ['nombre', 'cant_personas_externas', 'superficie', 'cant_personal', 'direccion', 'ubicacion'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['ubicacion'].required = False + + def clean_ubicacion(self): + ubicacion = self.cleaned_data.get('ubicacion') + if not ubicacion: + raise forms.ValidationError('Debe seleccionar una ubicación en el mapa.') + return ubicacion + + def save(self, commit=True): + sede = super().save(commit=False) + coordenadas = self.cleaned_data.get('ubicacion') + if coordenadas: + sede.ubicacion = coordenadas + if commit: + sede.save() + return sede + + +class DeclaracionJuradaForm(forms.ModelForm): + personal_capacitado = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})) + senaletica = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})) + protocolo_accion = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})) + sistema_emergencia = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class': 'form-check-input'})) + deas_decreto = forms.IntegerField(required=False, widget=forms.NumberInput(attrs={'class': 'form-control'})) + + class Meta: + model = Sede + fields = ['personal_capacitado', 'senaletica', 'protocolo_accion', 'sistema_emergencia', 'deas_decreto'] + + +class DEAForm(forms.ModelForm): + marca = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + modelo = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + numero_serie = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + nombre_representativo = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + + class Meta: + model = DEA + fields = ['marca', 'modelo', 'numero_serie', 'nombre_representativo'] + + +class DEAEditForm(forms.ModelForm): + numero_serie = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + nombre_representativo = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) + + class Meta: + model = DEA + fields = ['numero_serie', 'nombre_representativo'] diff --git a/Proyecto/espacios_obligados/migrations/__init__.py b/Proyecto/espacios_obligados/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Proyecto/espacios_obligados/models.py b/Proyecto/espacios_obligados/models.py index 9393448..60518bc 100644 --- a/Proyecto/espacios_obligados/models.py +++ b/Proyecto/espacios_obligados/models.py @@ -10,6 +10,7 @@ class Entidad(models.Model): cuit = models.CharField(max_length=200) sector = models.CharField(max_length=200) tipo = models.CharField(max_length=200) + def __str__(self): return self.razon_social @@ -22,15 +23,42 @@ class Sede(models.Model): ubicacion = gis_models.PointField() cant_personal = models.IntegerField(default=0) direccion = models.CharField(max_length=200) + + # Declaración Jurada + + personal_capacitado = models.BooleanField(default=False) + senaletica = models.BooleanField(default=False) + protocolo_accion = models.BooleanField(default=False) + sistema_emergencia = models.BooleanField(default=False) + deas_registrados = models.ManyToManyField('DEA', blank=True) + deas_decreto = models.IntegerField(default=0) + + provincia = models.ForeignKey(Provincias, on_delete=models.CASCADE) entidad = models.ForeignKey(Entidad, on_delete=models.CASCADE) + def __str__(self): return self.nombre -class EspacioObligado(models.Model): - nombre = models.CharField(max_length=200) +class DEA(models.Model): + dea_sede = models.ForeignKey(Sede, on_delete=models.CASCADE) + aprobacion_ANMAT = models.BooleanField(default=False) + marca = models.CharField(max_length=200) + modelo = models.CharField(max_length=200) + numero_serie = models.CharField(max_length=200) + nombre_representativo = models.CharField(max_length=200) + estado = models.CharField(max_length=10, choices=[('activo', 'Activo'), ('inactivo', 'Inactivo')], default='activo') + + def __str__(self): + return self.sede.nombre + + +class HistorialDEA(models.Model): + dea = models.ForeignKey(DEA, on_delete=models.CASCADE) + dia = models.DateField() + servicio = models.CharField(max_length=200) + observaciones = models.CharField(max_length=200, blank=True, null=True) - sede = models.ForeignKey(Sede, on_delete=models.CASCADE) def __str__(self): - return self.nombre \ No newline at end of file + return self.dea.nombre_representativo diff --git a/Proyecto/espacios_obligados/templates/administrar_entidad_sede.html b/Proyecto/espacios_obligados/templates/administrar_entidad_sede.html new file mode 100644 index 0000000..4b8a4f4 --- /dev/null +++ b/Proyecto/espacios_obligados/templates/administrar_entidad_sede.html @@ -0,0 +1,23 @@ + + +
+
+ +
+
+ +
+
+ +
+
diff --git a/Proyecto/espacios_obligados/templates/dea/editar_dea.html b/Proyecto/espacios_obligados/templates/dea/editar_dea.html new file mode 100644 index 0000000..6f92a96 --- /dev/null +++ b/Proyecto/espacios_obligados/templates/dea/editar_dea.html @@ -0,0 +1,11 @@ +{% extends "ProyectoApp/base.html" %} +{% load static %} +{% block content %} +

Editar DEA

+
+ {% csrf_token %} + {{ form.as_p }} + +
+Atrás +{% endblock %} \ No newline at end of file diff --git a/Proyecto/espacios_obligados/templates/dea/listar_deas.html b/Proyecto/espacios_obligados/templates/dea/listar_deas.html new file mode 100644 index 0000000..888431d --- /dev/null +++ b/Proyecto/espacios_obligados/templates/dea/listar_deas.html @@ -0,0 +1,25 @@ +{% extends "ProyectoApp/base.html" %} +{% load static %} +{% block content %} +Registrar Nuevo DEA +
+ {% for dea in deas %} +
+
+

{{ dea.nombre_representativo }}

+
+
+

Marca: {{ dea.marca }}

+

Modelo: {{ dea.modelo }}

+ Editar + Validar + {% if dea.aprobacion_ANMAT %} + Validado + {% else %} + No Validado + {% endif %} +
+
+ {% endfor %} +
+{% endblock %} \ No newline at end of file diff --git a/Proyecto/espacios_obligados/templates/dea/registrar_dea.html b/Proyecto/espacios_obligados/templates/dea/registrar_dea.html new file mode 100644 index 0000000..171ef34 --- /dev/null +++ b/Proyecto/espacios_obligados/templates/dea/registrar_dea.html @@ -0,0 +1,16 @@ +{% extends "ProyectoApp/base.html" %} +{% load static %} +{% block content %} + +

Registrar DEA

+
+ {% csrf_token %} + {{ form.as_p }} + +
+Atrás +{% endblock %} \ No newline at end of file diff --git a/Proyecto/espacios_obligados/templates/listar_mis_entidades_sedes.html b/Proyecto/espacios_obligados/templates/listar_mis_entidades_sedes.html index 3889fdb..a2a38b6 100644 --- a/Proyecto/espacios_obligados/templates/listar_mis_entidades_sedes.html +++ b/Proyecto/espacios_obligados/templates/listar_mis_entidades_sedes.html @@ -4,6 +4,7 @@

Lista de mis Entidades-Sedes

{% endblock %} \ No newline at end of file diff --git a/Proyecto/espacios_obligados/templates/sede/declaracion_jurada.html b/Proyecto/espacios_obligados/templates/sede/declaracion_jurada.html new file mode 100644 index 0000000..a32085e --- /dev/null +++ b/Proyecto/espacios_obligados/templates/sede/declaracion_jurada.html @@ -0,0 +1,36 @@ +{% extends "ProyectoApp/base.html" %} +{% load static %} +{% block title %}Declaración Jurada{% endblock %} +{% block content %} + +
+ {% csrf_token %} +
+ + {{ form.personal_capacitado }} +
+
+ + {{ form.senaletica }} +
+
+ + {{ form.protocolo_accion }} +
+
+ + {{ form.sistema_emergencia }} +
+
+
+ + {{ form.deas_decreto }} +
+ +
+Atrás +{% endblock %} diff --git a/Proyecto/espacios_obligados/templates/sede/editar_sede.html b/Proyecto/espacios_obligados/templates/sede/editar_sede.html new file mode 100644 index 0000000..305fab6 --- /dev/null +++ b/Proyecto/espacios_obligados/templates/sede/editar_sede.html @@ -0,0 +1,16 @@ +{% extends "ProyectoApp/base.html" %} +{% load leaflet_tags %} +{% load static %} +{% block content %} + + {% leaflet_js plugins="forms" %} + {% leaflet_css plugins="forms" %} + +

Editar Sede {{ sede.nombre }}

+
+ {% csrf_token %} + {{ form.as_p }} + +
+Atrás +{% endblock %} diff --git a/Proyecto/espacios_obligados/urls.py b/Proyecto/espacios_obligados/urls.py index 1418778..bf9eada 100644 --- a/Proyecto/espacios_obligados/urls.py +++ b/Proyecto/espacios_obligados/urls.py @@ -6,4 +6,11 @@ path('registrar_sede//', views.registrar_sede, name='registrar_sede'), path('listar_sedes//', views.listar_sedes, name='listar_sedes'), path('listar_mis_entidades_sedes/', views.listar_mis_entidades_sedes, name='listar_mis_entidades_sedes'), + path('administrar_entidad_sede//', views.administrar_entidad_sede, name='administrar_entidad_sede'), + path('editar_sede//', views.editar_sede, name='editar_sede'), + path('declaracion_jurada//', views.declaracion_jurada, name='declaracion_jurada'), + path('registrar_dea//', views.registrar_dea, name='registrar_dea'), + path('listar_deas//', views.listar_deas, name='listar_deas'), + path('editar_dea//', views.editar_dea, name='editar_dea'), + path('validar_dea//', views.verificar_aprobacion_ANMAT, name='validar_dea'), ] diff --git a/Proyecto/espacios_obligados/views.py b/Proyecto/espacios_obligados/views.py index 02293f5..372f20b 100644 --- a/Proyecto/espacios_obligados/views.py +++ b/Proyecto/espacios_obligados/views.py @@ -1,8 +1,10 @@ from django.shortcuts import render, redirect -from .models import Entidad, Sede, Provincias -from .forms import EntidadForm, SedeForm +from .models import * +from .forms import * from django.contrib.gis.geos import Point from usuarios.models import Representante +import requests +from django.http import JsonResponse # Create your views here. @@ -57,3 +59,119 @@ def listar_mis_entidades_sedes(request): return render(request, 'listar_mis_entidades_sedes.html', {'entidades_sedes': entidades_sedes}) +def administrar_entidad_sede(request, sede_id): + sede = Sede.objects.get(id=sede_id) + return render(request, 'administrar_entidad_sede.html', {'sede': sede}) + + +def editar_sede(request, sede_id): + sede = Sede.objects.get(id=sede_id) + if request.method == 'POST': + form = EditSedeForm(request.POST, instance=sede) + if form.is_valid(): + sede = form.save(commit=False) + coordenadas = form.cleaned_data.get('ubicacion') + if coordenadas: + latitud = coordenadas.y + longitud = coordenadas.x + sede.ubicacion = Point(longitud, latitud) + sede.save() + + return redirect('listar_mis_entidades_sedes') + else: + form = EditSedeForm(instance=sede) + return render(request, 'sede/editar_sede.html', {'form': form, 'sede': sede}) + + +def declaracion_jurada(request, sede_id): + sede = Sede.objects.get(id=sede_id) + if request.method == 'POST': + form = DeclaracionJuradaForm(request.POST, instance=sede) + if form.is_valid(): + ddjj = form.save(commit=False) + ddjj.save() + return redirect('listar_mis_entidades_sedes') + else: + form = DeclaracionJuradaForm(instance=sede) + return render(request, 'sede/declaracion_jurada.html', {'form': form, 'sede': sede}) + + + +def registrar_dea(request, sede_id): + sede = Sede.objects.get(id=sede_id) + if request.method == 'POST': + form = DEAForm(request.POST) + if form.is_valid(): + dea = form.save(commit=False) + dea.dea_sede = sede + dea.save() + + sede.deas_registrados.add(dea) + + return redirect('listar_mis_entidades_sedes') + else: + form = DEAForm() + return render(request, 'dea/registrar_dea.html', {'form': form, 'sede': sede}) + + +def listar_deas(request, sede_id): + sede = Sede.objects.get(id=sede_id) + deas = DEA.objects.filter(dea_sede=sede) + return render(request, 'dea/listar_deas.html', {'sede': sede, 'deas': deas}) + + +def editar_dea(request, dea_id): + dea = DEA.objects.get(id=dea_id) + sede_id = dea.dea_sede.id + if request.method == 'POST': + form = DEAEditForm(request.POST, instance=dea) + if form.is_valid(): + dea = form.save(commit=False) + dea.save() + return redirect('listar_deas', sede_id=sede_id) + else: + form = DEAEditForm(instance=dea) + return render(request, 'dea/editar_dea.html', {'form': form, 'sede':sede_id, 'dea': dea}) + + + + +def verificar_aprobacion_ANMAT(request, dea_id): + + try: + # Obtén el DEA con el ID especificado + dea = DEA.objects.get(id=dea_id) + + # URL de la API para obtener la lista de modelos del DEA con el ID especificado + url = f'https://api.claudioraverta.com/deas/{dea.marca}/modelos/' + + # Realizar una solicitud GET a la API + response = requests.get(url) + + # Comprobar si la respuesta tiene el código de estado 200 (OK) + if response.status_code == 200: + # Analizar la respuesta JSON + modelos = response.json() + + # Verificar si el modelo está en la lista de modelos aprobados por ANMAT + if any(modelo.get("nombre") == dea.modelo for modelo in modelos): + # El DEA con el modelo especificado está aprobado por ANMAT + # Ahora, debes actualizar el campo aprobacion_ANMAT en tu modelo DEA + + # Establece el campo aprobacion_ANMAT en True + dea.aprobacion_ANMAT = True + dea.save() + + return JsonResponse({'success': True}) # Aprobado por ANMAT y campo actualizado + + else: + return JsonResponse({'success': False, 'message': f'El DEA { dea.marca } { dea.modelo } no está aprobado por ANMAT'}) + + else: + return JsonResponse({'success': False, 'message': f'Error en la solicitud a la API: {response.status_code}'}) + + except DEA.DoesNotExist: + return JsonResponse({'success': False, 'message': 'No se encontró el DEA con el ID especificado'}) + + except requests.exceptions.RequestException as e: + return JsonResponse({'success': False, 'message': f'Error en la solicitud a la API: {str(e)}'}) diff --git a/Proyecto/usuarios/migrations/__init__.py b/Proyecto/usuarios/migrations/__init__.py new file mode 100644 index 0000000..e69de29