From eab7bcfaf292ea22050334843fbdf34008d322d4 Mon Sep 17 00:00:00 2001 From: AdalbertoCV <34152734@uaz.edu.mx> Date: Thu, 22 Aug 2024 18:45:55 -0600 Subject: [PATCH 1/2] =?UTF-8?q?Inclusi=C3=B3n=20de=20respuestas=20en=20tab?= =?UTF-8?q?la=20din=C3=A1mica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cosiap_api/dynamic_forms/admin.py | 5 +++-- ...002_OneToOneRelation_RegistroFormulario.py | 19 +++++++++++++++++++ cosiap_api/dynamic_forms/models.py | 2 +- .../dynamic_tables/DynamicTableDynamicForm.py | 3 ++- cosiap_api/dynamic_tables/views.py | 2 +- .../solicitudes/migrations/0001_initial.py | 2 +- cosiap_api/solicitudes/models.py | 11 +++++++---- 7 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 cosiap_api/dynamic_forms/migrations/0002_OneToOneRelation_RegistroFormulario.py diff --git a/cosiap_api/dynamic_forms/admin.py b/cosiap_api/dynamic_forms/admin.py index a3ce620..0cd7dbc 100644 --- a/cosiap_api/dynamic_forms/admin.py +++ b/cosiap_api/dynamic_forms/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from dynamic_forms.models import DynamicForm, DynamicFormsSecciones, \ Seccion, SeccionesElementos, Elemento, ElementosOpciones, Opcion, \ RegistroSeccion, Respuesta, RTextoCorto, RTextoParrafo, RNumerico, \ - RHora, RFecha, ROpcionMultiple, RDesplegable, RCasillas, RDocumento + RHora, RFecha, ROpcionMultiple, RDesplegable, RCasillas, RDocumento, RegistroFormulario # Register your models here. admin.site.register(DynamicForm) @@ -22,4 +22,5 @@ admin.site.register(RFecha) admin.site.register(ROpcionMultiple) admin.site.register(RDesplegable) admin.site.register(RCasillas) -admin.site.register(RDocumento) \ No newline at end of file +admin.site.register(RDocumento) +admin.site.register(RegistroFormulario) \ No newline at end of file diff --git a/cosiap_api/dynamic_forms/migrations/0002_OneToOneRelation_RegistroFormulario.py b/cosiap_api/dynamic_forms/migrations/0002_OneToOneRelation_RegistroFormulario.py new file mode 100644 index 0000000..328ed02 --- /dev/null +++ b/cosiap_api/dynamic_forms/migrations/0002_OneToOneRelation_RegistroFormulario.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.7 on 2024-08-22 01:31 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dynamic_forms', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='registroseccion', + name='registro_formulario', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='dynamic_forms.registroformulario'), + ), + ] diff --git a/cosiap_api/dynamic_forms/models.py b/cosiap_api/dynamic_forms/models.py index 81abdf7..4a7fa20 100644 --- a/cosiap_api/dynamic_forms/models.py +++ b/cosiap_api/dynamic_forms/models.py @@ -152,7 +152,7 @@ class RegistroSeccion(models.Model): Campos: -id (id) has ''' - registro_formulario = models.ForeignKey(RegistroFormulario, on_delete=models.CASCADE) + registro_formulario = models.OneToOneField(RegistroFormulario, on_delete=models.CASCADE) seccion = models.ForeignKey(Seccion, on_delete=models.CASCADE, null=False, blank=False) class Meta: diff --git a/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py b/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py index 73a3c69..be8d4f6 100644 --- a/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py +++ b/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py @@ -1,6 +1,7 @@ from .DynamicTable import DynamicTable from dynamic_forms.models import DynamicForm from solicitudes.models import Solicitud +from dynamic_forms.models import Respuesta from dynamic_forms.serializers import OpcionSerializer, ElementosOpcionesSerializer, ElementoSerializer, SeccionesElementosSerializer, SeccionSerializer, DynamicFormsSeccionesSerializer, DynamicFormSerializer, RespuestaFormularioSerializer @@ -45,7 +46,7 @@ class DynamicTableDynamicForm(DynamicTable): form_data = form.data solicitud['formulario'] = form_data - + return solicitud diff --git a/cosiap_api/dynamic_tables/views.py b/cosiap_api/dynamic_tables/views.py index 0079336..8589560 100644 --- a/cosiap_api/dynamic_tables/views.py +++ b/cosiap_api/dynamic_tables/views.py @@ -22,7 +22,7 @@ class DynamicTableAPIView(BasePermissionAPIView): ''' permission_classes_update = [IsAuthenticated, es_admin] - permission_classes_list = [IsAuthenticated, es_admin] + permission_classes_list = [AllowAny] permission_classes_create = [IsAuthenticated, es_admin] permission_classes_delete = [IsAuthenticated, es_admin] diff --git a/cosiap_api/solicitudes/migrations/0001_initial.py b/cosiap_api/solicitudes/migrations/0001_initial.py index 5ac4865..35969cc 100644 --- a/cosiap_api/solicitudes/migrations/0001_initial.py +++ b/cosiap_api/solicitudes/migrations/0001_initial.py @@ -54,7 +54,7 @@ class Migration(migrations.Migration): ('convenio', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='solicitudes.convenio', verbose_name='Convenio')), ('minuta', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='solicitudes.minuta', verbose_name='Minuta')), ('modalidad', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='modalidades.modalidad', verbose_name='Modalidad')), - ('registro_formulario', models.OneToOneField(default=solicitudes.models.create_default_registro_formulario, on_delete=django.db.models.deletion.SET_DEFAULT, to='dynamic_forms.registroformulario')), + ('registro_formulario', models.OneToOneField(null=True, blank=True, on_delete=django.db.models.deletion.SET_NULL, to='dynamic_forms.registroformulario')), ], ), ] diff --git a/cosiap_api/solicitudes/models.py b/cosiap_api/solicitudes/models.py index a4e90cd..403913f 100644 --- a/cosiap_api/solicitudes/models.py +++ b/cosiap_api/solicitudes/models.py @@ -90,9 +90,6 @@ class Convenio(models.Model): ordering = ['pk'] -def create_default_registro_formulario(): - return RegistroFormulario.objects.create().pk - class Solicitud(models.Model): """ Modelo que contiene la información de referencia de una solicitud. @@ -120,5 +117,11 @@ class Solicitud(models.Model): timestamp = models.DateTimeField(verbose_name='Timestamp', auto_now_add=True) observacion = models.TextField(verbose_name='Observación', null=True, blank=True) solicitante = models.ForeignKey(Solicitante, verbose_name='Solicitante', on_delete=models.SET_NULL, null=True, blank=True) - registro_formulario = models.OneToOneField(RegistroFormulario, on_delete=models.SET_DEFAULT, default=create_default_registro_formulario) + registro_formulario = models.OneToOneField(RegistroFormulario, on_delete=models.SET_NULL, null=True, blank=True) + + def save(self, *args, **kwargs): + # Si no tiene un registro_formulario asignado, lo creamos + if not self.registro_formulario: + self.registro_formulario = RegistroFormulario.objects.create() + super().save(*args, **kwargs) -- GitLab From bec1ff695d81d010e76662599c13674cf1145f53 Mon Sep 17 00:00:00 2001 From: AdalbertoCV <34152734@uaz.edu.mx> Date: Fri, 23 Aug 2024 10:50:41 -0600 Subject: [PATCH 2/2] Agregado un endpoint para recuperar info de usuario --- cosiap_api/dynamic_tables/DynamicTable.py | 3 ++ .../dynamic_tables/DynamicTableDynamicForm.py | 34 +----------------- cosiap_api/users/urls.py | 1 + cosiap_api/users/views.py | 36 +++++++++++++++++-- 4 files changed, 39 insertions(+), 35 deletions(-) diff --git a/cosiap_api/dynamic_tables/DynamicTable.py b/cosiap_api/dynamic_tables/DynamicTable.py index 8c9f73c..4538082 100644 --- a/cosiap_api/dynamic_tables/DynamicTable.py +++ b/cosiap_api/dynamic_tables/DynamicTable.py @@ -151,6 +151,9 @@ class DynamicTable(serializers.ModelSerializer): model = self.buscar_modelo(obj) for column in obj.columns: + print(column) + if column == 'formulario': + continue field_path = column.split('__') field = model label = "" diff --git a/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py b/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py index be8d4f6..65d2b05 100644 --- a/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py +++ b/cosiap_api/dynamic_tables/DynamicTableDynamicForm.py @@ -11,29 +11,6 @@ class DynamicTableDynamicForm(DynamicTable): datos de un formulario dinámico ''' - - def get_data(self, obj): - ''' - Método sobreescrito para obtener los datos tanto de la solicitud como de el formulario - dinámico asociado a ella. - ''' - solicitudes = super().get_data(obj) - solicitud_ids = [solicitud.get('id') for solicitud in solicitudes if solicitud.get('id')] - solicitud_instances = Solicitud.objects.filter(id__in=solicitud_ids).select_related('modalidad__dynamic_form') - - # Serializar las solicitudes utilizando RespuestaFormularioSerializer, pasando dynamic_form_source como parámetro - serialized_forms = RespuestaFormularioSerializer(solicitud_instances, many=True, dynamic_form_source='modalidad__dynamic_form') - - forms_data = serialized_forms.data - forms_data_dict = {form['id']: form for form in forms_data} - - for solicitud in solicitudes: - dynamic_form_id = solicitud.get('modalidad__dynamic_form__id') - if dynamic_form_id: - solicitud['formulario'] = forms_data_dict.get(dynamic_form_id) - - return solicitudes - def retrieve_instance_data(self, instance): ''' Método sobreescrito para la vista detallada de la solicitud incluyendo su formulario dinámico @@ -50,15 +27,6 @@ class DynamicTableDynamicForm(DynamicTable): return solicitud - def get_dynamicform_filters(self): - ''' Aquí se realizará la lógica para la obtención de los filtros disponibles de dynamic_form''' - pass - - def apply_dynamicform_filters(self): - ''' Aquí se realizará la lógica para la aplicación de filtros sobre el dynamic_form''' - pass - def update_dynamicform_fields(self): - ''' Aquí se realizará la lógica para la actualización del dynamic_form''' - pass \ No newline at end of file + \ No newline at end of file diff --git a/cosiap_api/users/urls.py b/cosiap_api/users/urls.py index 4582f5f..60d7228 100644 --- a/cosiap_api/users/urls.py +++ b/cosiap_api/users/urls.py @@ -9,6 +9,7 @@ app_name = 'users' urlpatterns = [ path('token/', CustomTokenObtainPairView.as_view(), name='token_obtain'), path('token/refresh/', CustomTokenRefreshView.as_view(), name='token_refresh'), + path('uid/', views.UserIDUserIsStaff.as_view(), name='user_id'), path('', views.UsuarioAPIView.as_view(), name = 'usuarios'), path('/', views.UsuarioAPIView.as_view(), name = 'usuarios_pk'), diff --git a/cosiap_api/users/views.py b/cosiap_api/users/views.py index 8d135e6..22c9646 100644 --- a/cosiap_api/users/views.py +++ b/cosiap_api/users/views.py @@ -60,6 +60,33 @@ class CustomTokenRefreshView(TokenRefreshView): return response +class UserIDUserIsStaff(APIView): + ''' + Clase para obtener el id y el tipo de usuario del usuario actual + ''' + permission_classes = [AllowAny] + + def get(self, request, *args, **kwargs): + ''' + Método get para obtener la response con el id y tipo de usuario del usuario que + realizó la petición + ''' + data = {} + try: + user = request.user + uid = user.id + user_type = user.is_staff + + data = {'user_id': uid, 'user_is_admin': user_type} + + return Response(data, status = status.HTTP_200_OK) + + except Exception as e: + + Mensaje.error(data, str(e)) + + + class UsuarioAPIView(DynamicTableAPIView): """ Clase Usuario para manejar las solicitudes de los usuarios básicos @@ -72,7 +99,10 @@ class UsuarioAPIView(DynamicTableAPIView): Herencia: - BasePermissionAPIView (Heréda de la clase con los permisos predefinidos) """ - permission_classes_create = [AllowAny] + permission_classes_create = [AllowAny] + permission_classes_list = [IsAuthenticated, es_admin] + permission_classes_update = [IsAuthenticated, es_admin] + permission_classes_delete = [IsAuthenticated, es_admin] model_class = Usuario model_name = 'Usuario' @@ -81,7 +111,7 @@ class UsuarioAPIView(DynamicTableAPIView): def post( self, request, *args, **kwargs ): ''' Método post para la creación de un nuevo usuario - ''' + ''' email = request.data.get('email') curp = request.data.get('curp') curp_exist = Usuario.objects.filter(curp=curp, is_active=False) @@ -117,8 +147,10 @@ class SolicitanteAPIView(DynamicTableAPIView): Herencia: - BasePermissionAPIView (Heréda de la clase con los permisos predefinidos) """ + permission_classes_list = [IsAuthenticated, es_admin] permission_classes_create = [IsAuthenticated] permission_classes_update = [IsAuthenticated, primer_login] + permission_classes_delete = [IsAuthenticated, primer_login] model_class = Solicitante model_name = 'Solicitante' -- GitLab