eco-back 0.2.3__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. {eco_back-0.2.3/src/eco_back.egg-info → eco_back-0.2.5}/PKG-INFO +5 -4
  2. {eco_back-0.2.3 → eco_back-0.2.5}/pyproject.toml +5 -4
  3. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/__init__.py +3 -2
  4. eco_back-0.2.5/src/eco_back/models/__init__.py +0 -0
  5. eco_back-0.2.5/src/eco_back/models/registro.py +256 -0
  6. eco_back-0.2.5/src/eco_back/models/sistema.py +2503 -0
  7. eco_back-0.2.5/src/eco_back/models/static.py +1127 -0
  8. eco_back-0.2.5/src/eco_back/models/usuario.py +638 -0
  9. {eco_back-0.2.3 → eco_back-0.2.5/src/eco_back.egg-info}/PKG-INFO +5 -4
  10. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back.egg-info/SOURCES.txt +5 -0
  11. {eco_back-0.2.3 → eco_back-0.2.5}/LICENSE +0 -0
  12. {eco_back-0.2.3 → eco_back-0.2.5}/MANIFEST.in +0 -0
  13. {eco_back-0.2.3 → eco_back-0.2.5}/README.md +0 -0
  14. {eco_back-0.2.3 → eco_back-0.2.5}/setup.cfg +0 -0
  15. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/api/__init__.py +0 -0
  16. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/api/client.py +0 -0
  17. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/api/config.py +0 -0
  18. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/api/registro.py +0 -0
  19. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/__init__.py +0 -0
  20. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/config.py +0 -0
  21. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/connection.py +0 -0
  22. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/models.py +0 -0
  23. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/postgis.py +0 -0
  24. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/database/repository.py +0 -0
  25. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/documento/__init__.py +0 -0
  26. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/documento/anexos.py +0 -0
  27. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/registro/__init__.py +0 -0
  28. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/registro/trazabilidad.py +0 -0
  29. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/utils/__init__.py +0 -0
  30. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/utils/exceptions.py +0 -0
  31. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back/utils/logger_generico.py +0 -0
  32. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back.egg-info/dependency_links.txt +0 -0
  33. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back.egg-info/requires.txt +0 -0
  34. {eco_back-0.2.3 → eco_back-0.2.5}/src/eco_back.egg-info/top_level.txt +0 -0
  35. {eco_back-0.2.3 → eco_back-0.2.5}/tests/test_anexos.py +0 -0
  36. {eco_back-0.2.3 → eco_back-0.2.5}/tests/test_api.py +0 -0
  37. {eco_back-0.2.3 → eco_back-0.2.5}/tests/test_database.py +0 -0
  38. {eco_back-0.2.3 → eco_back-0.2.5}/tests/test_example.py +0 -0
  39. {eco_back-0.2.3 → eco_back-0.2.5}/tests/test_postgis.py +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eco-back
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: Librería Python eco-back
5
5
  Author-email: EI UNP <ecosistema@unp.gov.co>
6
6
  License: MIT
7
- Project-URL: Homepage, https://github.com/tuusuario/eco-back
8
- Project-URL: Documentation, https://github.com/tuusuario/eco-back
9
- Project-URL: Repository, https://github.com/tuusuario/eco-back
7
+ Project-URL: Homepage, https://github.com/EcosistemaUNP/eco-back
8
+ Project-URL: Documentation, https://github.com/EcosistemaUNP/eco-back
9
+ Project-URL: Repository, https://github.com/EcosistemaUNP/eco-back
10
+ Project-URL: Bug Tracker, https://github.com/EcosistemaUNP/eco-back/issues
10
11
  Classifier: Development Status :: 3 - Alpha
11
12
  Classifier: Intended Audience :: Developers
12
13
  Classifier: License :: OSI Approved :: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "eco-back"
7
- version = "0.2.3"
7
+ version = "0.2.5"
8
8
  description = "Librería Python eco-back"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -46,9 +46,10 @@ geo = [
46
46
  ]
47
47
 
48
48
  [project.urls]
49
- Homepage = "https://github.com/tuusuario/eco-back"
50
- Documentation = "https://github.com/tuusuario/eco-back"
51
- Repository = "https://github.com/tuusuario/eco-back"
49
+ Homepage = "https://github.com/EcosistemaUNP/eco-back"
50
+ Documentation = "https://github.com/EcosistemaUNP/eco-back"
51
+ Repository = "https://github.com/EcosistemaUNP/eco-back"
52
+ "Bug Tracker" = "https://github.com/EcosistemaUNP/eco-back/issues"
52
53
 
53
54
  [tool.setuptools.packages.find]
54
55
  where = ["src"]
@@ -2,7 +2,7 @@
2
2
  eco-back - Librería Python
3
3
  """
4
4
 
5
- __version__ = "0.2.3"
5
+ __version__ = "0.2.4"
6
6
 
7
7
  # Módulos principales
8
8
  from . import database
@@ -10,5 +10,6 @@ from . import api
10
10
  from . import documento
11
11
  from . import registro
12
12
  from . import utils
13
+ from . import models
13
14
 
14
- __all__ = ["database", "api", "documento", "registro", "utils", "__version__"]
15
+ __all__ = ["database", "api", "documento", "registro", "utils", "models", "__version__"]
File without changes
@@ -0,0 +1,256 @@
1
+ """
2
+ Modelos de registro y trazabilidad del sistema eco-back.
3
+
4
+ Este módulo contiene los modelos de Django para gestionar registros de solicitudes,
5
+ radicados, estados, trazabilidad y auditoría de procesos en el sistema UNP.
6
+ """
7
+ from django.db import models
8
+ from django.contrib.contenttypes.models import ContentType
9
+ from django.db import connection
10
+ import uuid
11
+ from django.db.models import Max
12
+ from django.db import transaction
13
+
14
+ from eco_back.models.static import CanalSolicitud, EstadoEspecifico, FuenteSolicitud, TipoConsulta, TipoCorreccion, TipoEstudio, TipoRuta
15
+ from eco_back.models.usuario import DatosBasicosUsuario
16
+
17
+
18
+ ##### MODELOS DE REGISTRO BASE #######
19
+
20
+ class Registro(models.Model):
21
+ """
22
+ Modelo base para registros de solicitudes.
23
+
24
+ Almacena la información general de un registro que puede ser de diferentes tipos
25
+ (personas, colectivos, etc.). Contiene los campos que definen la ruta, canal y
26
+ tipo de estudio del registro.
27
+
28
+ Attributes:
29
+ registro: Identificador único autonumérico del registro.
30
+ objects_id: ID del objeto relacionado (para relaciones genéricas).
31
+ content_type: Tipo de contenido al que pertenece el registro.
32
+ ruta: Ruta de atención asignada al registro.
33
+ canal: Canal por el cual se recibió la solicitud.
34
+ fuente: Fuente de origen de la solicitud.
35
+ tipo_estudio: Tipo de estudio o análisis a realizar.
36
+
37
+ Methods:
38
+ get_next_registro: Obtiene el siguiente número de registro de la secuencia.
39
+ """
40
+ registro = models.AutoField(primary_key=True)
41
+ objects_id = models.CharField(blank=True, null=True, max_length=50)
42
+ content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
43
+ ruta = models.ForeignKey(TipoRuta, to_field='id_truta', on_delete=models.CASCADE, null=True, blank=True)
44
+ canal = models.ForeignKey(CanalSolicitud, to_field='id_csolicitud', on_delete=models.CASCADE, null=True, blank=True)
45
+ fuente = models.ForeignKey(FuenteSolicitud, to_field='id_fsolicitud', on_delete=models.CASCADE)
46
+ tipo_estudio = models.ForeignKey(TipoEstudio, to_field='id_estudio', on_delete=models.CASCADE, null=True, blank=True)
47
+
48
+ class Meta:
49
+ db_table = 'eco_reg_registro'
50
+ verbose_name_plural = 'Registro'
51
+
52
+ @classmethod
53
+ def get_next_registro(cls):
54
+ with connection.cursor() as cursor:
55
+ cursor.execute("SELECT nextval('eco_reg_registro_id_seq')")
56
+ row = cursor.fetchone()
57
+ return row[0]
58
+
59
+ def __str__(self):
60
+ return str(self.registro)
61
+
62
+ class Radicado(models.Model):
63
+ """
64
+ Modelo para radicados de solicitudes.
65
+
66
+ Almacena el número de radicación de un registro, incluyendo la sede,
67
+ fecha de asignación y consecutivo para control de orden.
68
+
69
+ Attributes:
70
+ id_radicado: Identificador único UUID del radicado.
71
+ registro: Relación con el registro base.
72
+ fecha_asignacion: Fecha en que se asignó el radicado.
73
+ numero_radicado: Número de radicación oficial.
74
+ sede: Sede donde se radicó la solicitud.
75
+ consecutivo: Número secuencial del radicado.
76
+ """
77
+
78
+ class Meta:
79
+ db_table = 'eco_reg_radicado'
80
+ verbose_name_plural = 'Número de radicado'
81
+ ordering = ['consecutivo'] # esto asegura que siempre salgan en orden
82
+
83
+ def save(self, *args, **kwargs):
84
+ # Asigna el consecutivo solo si no se ha definido
85
+ if self.consecutivo is None:
86
+ ultimo = EstadoRegistro.objects.filter(registro=self.registro).aggregate(Max('consecutivo'))['consecutivo__max']
87
+ self.consecutivo = (ultimo or 0) + 1
88
+ super().save(*args, **kwargs)
89
+
90
+ def __str__(self):
91
+ return str(self.id_radicado)
92
+
93
+ class FechaTerminos(models.Model):
94
+ """
95
+ Modelo para fechas de términos de un registro.
96
+
97
+ Almacena las fechas de inicio y fin de los términos de procesamiento
98
+ de una solicitud.
99
+
100
+ Attributes:
101
+ id_fterminos: Identificador único UUID del registro.
102
+ fecha_inicio: Fecha de inicio de los términos.
103
+ fecha_fin: Fecha de finalización de los términos.
104
+ registro: Relación con el registro base.
105
+ """
106
+
107
+ class Meta:
108
+ db_table = 'eco_reg_fterminos'
109
+ verbose_name_plural = 'Fecha terminos'
110
+ ordering = ['-fecha_inicio'] # descendente: más reciente primero
111
+
112
+ def __str__(self):
113
+ return str(self.id_fterminos)
114
+
115
+ class EstadoRegistro(models.Model):
116
+ """
117
+ Modelo para seguimiento de estados de un registro.
118
+
119
+ Mantiene un historial de los estados por los que pasa un registro,
120
+ con numeración secuencial de los cambios de estado.
121
+
122
+ Attributes:
123
+ id_estado: Identificador único UUID del estado.
124
+ estado: Estado específico asignado al registro.
125
+ registro: Relación con el registro base.
126
+ consecutivo: Número secuencial del cambio de estado.
127
+ """
128
+
129
+ class Meta:
130
+ db_table = 'eco_reg_estadoregistro'
131
+ verbose_name_plural = 'estados del registro'
132
+ ordering = ['consecutivo'] # esto asegura que siempre salgan en orden
133
+
134
+ def save(self, *args, **kwargs):
135
+ # Asigna el consecutivo solo si no se ha definido
136
+ if self.consecutivo is None:
137
+ ultimo = EstadoRegistro.objects.filter(registro=self.registro).aggregate(Max('consecutivo'))['consecutivo__max']
138
+ self.consecutivo = (ultimo or 0) + 1
139
+ super().save(*args, **kwargs)
140
+
141
+ def __str__(self):
142
+ return str(self.id_estado)
143
+
144
+
145
+ ##### MODELOS DE TRAZABILIDAD Y AUDITORíA #######
146
+
147
+ class Trazabilidad(models.Model):
148
+ """
149
+ Modelo para trazabilidad de procesamiento de registros.
150
+
151
+ Registra el movimiento y procesamiento de un registro a través del flujo,
152
+ incluyendo fechas de recepción, finalización, usuario que lo procesa
153
+ y estado actual.
154
+
155
+ Attributes:
156
+ id_traza: Identificador único UUID del registro de trazabilidad.
157
+ fecha_recibido: Fecha y hora en que se recibió el registro.
158
+ fecha_finalizado: Fecha y hora en que se finalizó el procesamiento.
159
+ usuario: Usuario que procesó el registro.
160
+ registro: Relación con el registro base.
161
+ estado_trazabilidad: Indicador del estado de procesamiento.
162
+ estado_registro: Estado actual del registro.
163
+ observacion: Notas u observaciones sobre el procesamiento.
164
+ """
165
+ id_traza = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
166
+ fecha_recibido = models.DateTimeField(blank=True,null=True)
167
+ fecha_finalizado = models.DateTimeField(blank=True,null=True)
168
+ usuario = models.ForeignKey(DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE,null=True,blank=True)
169
+ registro = models.ForeignKey(Registro, to_field='registro', on_delete=models.CASCADE,null=True,blank=True)
170
+ estado_trazabilidad = models.BooleanField(default=False)
171
+ estado_registro = models.ForeignKey(EstadoEspecifico, to_field='id_eespecifico', on_delete=models.CASCADE,null=True,blank=True)
172
+ observacion = models.CharField(max_length=500, null=True)
173
+
174
+ class Meta:
175
+ db_table = 'eco_reg_trazabilidad'
176
+ verbose_name_plural = 'trazabilidad'
177
+ ordering = ['fecha_recibido'] # ascendente
178
+
179
+ def __str__(self):
180
+ return str(self.id_traza)
181
+
182
+ def crear_trazabilidad_manual(**kwargs):
183
+ """
184
+ Función para crear registros de trazabilidad manualmente.
185
+
186
+ Crea un nuevo registro de trazabilidad de forma atómica,
187
+ asignando automáticamente el próximo ID disponible.
188
+
189
+ Args:
190
+ **kwargs: Parámetros para inicializar el modelo Trazabilidad.
191
+
192
+ Returns:
193
+ Trazabilidad: Instancia del registro de trazabilidad creado.
194
+ """
195
+ with transaction.atomic():
196
+ ultimo_id = Trazabilidad.objects.aggregate(max_id=Max('id_traza'))['max_id'] or 0
197
+ nuevo_id = ultimo_id + 1
198
+
199
+ trazabilidad = Trazabilidad(
200
+ id_traza=nuevo_id,
201
+ **kwargs
202
+ )
203
+ trazabilidad.save()
204
+ return trazabilidad
205
+
206
+
207
+ class CorreccionRegistro(models.Model):
208
+ """
209
+ Modelo para correcciones realizadas a registros.
210
+
211
+ Almacena las correcciones que se realizan a un registro durante su
212
+ procesamiento, incluyendo el tipo de corrección y descripción.
213
+
214
+ Attributes:
215
+ id_correccion: Identificador único UUID de la corrección.
216
+ trazabilidad: Relación con el registro de trazabilidad donde se realizó.
217
+ tipo: Tipo de corrección realizada.
218
+ descripcion: Descripción detallada de la corrección.
219
+ """
220
+
221
+ class Meta:
222
+ db_table = 'eco_reg_correccionregistro'
223
+ verbose_name_plural = 'Correcciones de registro'
224
+
225
+ def __str__(self):
226
+ return str(self.id_correccion)
227
+
228
+
229
+ ##### MODELOS DE CONSULTAS #######
230
+
231
+ # Creación del modelo para guardar el historial de consultas sigob
232
+ class HistorialConsultaAplicativos(models.Model):
233
+ """
234
+ Modelo para historial de consultas a aplicativos externos.
235
+
236
+ Registra todas las consultas realizadas a aplicativos externos como SIGOB,
237
+ incluyendo fecha, tipo de consulta y usuario que la realizó.
238
+
239
+ Attributes:
240
+ id_historial: Identificador único UUID del registro.
241
+ usuario: Usuario que realizó la consulta.
242
+ codigo_registro: Código o identificador del registro consultado.
243
+ fecha_consulta: Fecha y hora de la consulta (auto-asignada).
244
+ tipo_consulta: Tipo de consulta realizada.
245
+ """
246
+ id_historial = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
247
+ usuario = models.ForeignKey(DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE)
248
+ codigo_registro = models.CharField(max_length=50)
249
+ fecha_consulta = models.DateTimeField(auto_now_add=True)
250
+ tipo_consulta = models.ForeignKey(TipoConsulta, to_field='id_tconsulta', on_delete=models.CASCADE, null=True, blank=True)
251
+ class Meta:
252
+ db_table = 'eco_reg_historial_consultas'
253
+ verbose_name_plural = 'Historial de consultas a SIGOB'
254
+
255
+ def __str__(self):
256
+ return str(self.id_historial)