diff --git a/cosiap_api/dynamic_forms/admin.py b/cosiap_api/dynamic_forms/admin.py index a3ce620fa7df22ee6ebdeeb2963053ac3303b56c..0cd7dbcdb99f447dfd3f3f3a207b8afc350b0274 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 0000000000000000000000000000000000000000..328ed029b24b91eebe6761fa003033f6e3ef448c --- /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 81abdf7d886e66491e4b25e063b4b8749867c183..4a7fa20bc07ef466dc525f78faecf58a8e7fcd07 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/DynamicTable.py b/cosiap_api/dynamic_tables/DynamicTable.py index 8c9f73c3e1ed4e0f7cabe03aeef6174f942237b0..4538082ad6d97fd644dee9149bf44cae896f7b46 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 73a3c690444d81313acc5abd8bff849d11013742..65d2b050847200b005954814572e447eef870703 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 @@ -10,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 @@ -45,19 +23,10 @@ class DynamicTableDynamicForm(DynamicTable): form_data = form.data solicitud['formulario'] = form_data - + 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/dynamic_tables/views.py b/cosiap_api/dynamic_tables/views.py index 0079336b3e8cecb953222ed90848d8b781c915fb..85895604267bf51ea476ce4fe1de87ad1a44f309 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 5ac48658aac5e055ca8749deb236a94fdc98cce9..35969ccbdc980d53dce4a448eb0ef427659fe907 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 a4e90cd820091a0accfa67c56a0f549d9293da08..403913f95c37a8a1979839342fabeff83be30d1b 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) diff --git a/cosiap_api/users/urls.py b/cosiap_api/users/urls.py index 4582f5fe1e9cf54ed7f8f35ceec865147ec9413d..60d722866fdef5ed86cdd23be5cc56d2b2d3805f 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 8d135e6656b11dc0f3e1c0b290569d38ac43739a..22c9646c2c1cfe79f6514692e9ad19a94756fd8e 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'