eco-back 0.2.4__py3-none-any.whl → 0.2.5__py3-none-any.whl
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.
- eco_back/__init__.py +2 -1
- eco_back/models/__init__.py +0 -0
- eco_back/models/registro.py +256 -0
- eco_back/models/sistema.py +2503 -0
- eco_back/models/static.py +1127 -0
- eco_back/models/usuario.py +638 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/METADATA +1 -1
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/RECORD +11 -6
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/WHEEL +0 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/licenses/LICENSE +0 -0
- {eco_back-0.2.4.dist-info → eco_back-0.2.5.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modelos de usuarios del sistema eco-back.
|
|
3
|
+
|
|
4
|
+
Este módulo contiene los modelos de Django para gestionar información de usuarios,
|
|
5
|
+
incluyendo datos básicos, contacto, ubicación, autenticación y roles dentro del sistema UNP.
|
|
6
|
+
"""
|
|
7
|
+
from django.db import models
|
|
8
|
+
from django.contrib.contenttypes.fields import GenericRelation
|
|
9
|
+
from django.contrib.contenttypes.models import ContentType
|
|
10
|
+
import uuid
|
|
11
|
+
from django.utils import timezone
|
|
12
|
+
from datetime import timedelta
|
|
13
|
+
from decouple import config
|
|
14
|
+
from cryptography.fernet import Fernet
|
|
15
|
+
from django.contrib.auth.models import User
|
|
16
|
+
|
|
17
|
+
from eco_back.models.static import Departamento, Dependencia, Eps, EstadoCivil, FondoPensiones, GpRh, Grupo, Municipio, Pais, Rol, TipoGenero, TipoIdentificacion, TipoOrientacionSexual, TipoSexo, TipoVinculacion, ZonaUbicacion
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
##### MODELOS DE CONTACTO #######
|
|
21
|
+
|
|
22
|
+
class TelefonoCelularContactoUsuario(models.Model):
|
|
23
|
+
"""
|
|
24
|
+
Modelo para almacenar números telefónicos de contacto.
|
|
25
|
+
|
|
26
|
+
Almacena hasta tres números de teléfono: uno principal, uno secundario y uno de emergencia.
|
|
27
|
+
|
|
28
|
+
Attributes:
|
|
29
|
+
id_ctelefono: Identificador único UUID del registro de teléfonos.
|
|
30
|
+
celular_uno: Número de teléfono principal.
|
|
31
|
+
celular_dos: Número de teléfono secundario.
|
|
32
|
+
celular_emergencia: Número de teléfono de emergencia.
|
|
33
|
+
"""
|
|
34
|
+
id_ctelefono = models.UUIDField(
|
|
35
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
36
|
+
celular_uno = models.CharField(max_length=15, blank=True, null=True)
|
|
37
|
+
celular_dos = models.CharField(max_length=15, blank=True, null=True)
|
|
38
|
+
celular_emergencia = models.CharField(max_length=15, blank=True, null=True)
|
|
39
|
+
|
|
40
|
+
class Meta:
|
|
41
|
+
db_table = 'eco_usr_ctelefono'
|
|
42
|
+
verbose_name_plural = 'Datos de contacto'
|
|
43
|
+
|
|
44
|
+
def __str__(self):
|
|
45
|
+
return str(self.id_ctelefono)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class CorreoElectronicoContactoUsuario(models.Model):
|
|
49
|
+
"""
|
|
50
|
+
Modelo para almacenar correos electrónicos de contacto.
|
|
51
|
+
|
|
52
|
+
Guarda la dirección de correo electrónico de un usuario.
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
id_ccelectronico: Identificador único UUID del registro de correo.
|
|
56
|
+
correo_electronico: Dirección de correo electrónico del usuario.
|
|
57
|
+
"""
|
|
58
|
+
id_ccelectronico = models.UUIDField(
|
|
59
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
60
|
+
correo_electronico = models.EmailField(max_length=100)
|
|
61
|
+
|
|
62
|
+
class Meta:
|
|
63
|
+
db_table = 'eco_usr_ccelectronico'
|
|
64
|
+
verbose_name_plural = 'Datos de contacto'
|
|
65
|
+
|
|
66
|
+
def __str__(self):
|
|
67
|
+
return str(self.id_ccelectronico)
|
|
68
|
+
|
|
69
|
+
class DatosContactoUsuario(models.Model):
|
|
70
|
+
"""
|
|
71
|
+
Modelo para datos de contacto consolidados.
|
|
72
|
+
|
|
73
|
+
Agrupa los números telefónicos y correos electrónicos de un usuario.
|
|
74
|
+
Usa GenericRelation para asociarse con diferentes tipos de entidades.
|
|
75
|
+
|
|
76
|
+
Attributes:
|
|
77
|
+
id_contacto: Identificador único UUID del registro.
|
|
78
|
+
id_ctelefono: Relación con los datos de teléfono.
|
|
79
|
+
id_ccelectronico: Relación con los datos de correo electrónico.
|
|
80
|
+
content_type: Tipo de contenido al que pertenecen estos datos.
|
|
81
|
+
object_id: ID del objeto al que están relacionados estos datos.
|
|
82
|
+
"""
|
|
83
|
+
id_contacto = models.UUIDField(
|
|
84
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
85
|
+
id_ctelefono = models.ForeignKey(
|
|
86
|
+
TelefonoCelularContactoUsuario, to_field='id_ctelefono', on_delete=models.CASCADE)
|
|
87
|
+
id_ccelectronico = models.ForeignKey(
|
|
88
|
+
CorreoElectronicoContactoUsuario, to_field='id_ccelectronico', on_delete=models.CASCADE)
|
|
89
|
+
content_type = models.ForeignKey(
|
|
90
|
+
ContentType, on_delete=models.CASCADE, blank=True, null=True)
|
|
91
|
+
object_id = models.CharField(blank=True, null=True, max_length=50)
|
|
92
|
+
|
|
93
|
+
class Meta:
|
|
94
|
+
db_table = 'eco_usr_contacto'
|
|
95
|
+
verbose_name_plural = 'Datos de contacto'
|
|
96
|
+
|
|
97
|
+
def __str__(self):
|
|
98
|
+
return str(self.id_contacto)
|
|
99
|
+
|
|
100
|
+
class DatosUbicacionUsuario(models.Model):
|
|
101
|
+
"""
|
|
102
|
+
Modelo base para datos de ubicación geográfica.
|
|
103
|
+
|
|
104
|
+
Almacena información geográfica base (país, departamento, municipio, zona)
|
|
105
|
+
y dirección general. Sirve como clase padre para ubicaciones rurales y urbanas.
|
|
106
|
+
Usa GenericRelation para asociarse con diferentes tipos de entidades.
|
|
107
|
+
|
|
108
|
+
Attributes:
|
|
109
|
+
id_ubicacion: Identificador único UUID del registro.
|
|
110
|
+
pais: País del usuario.
|
|
111
|
+
departamento: Departamento o estado.
|
|
112
|
+
municipio: Municipio.
|
|
113
|
+
zona: Tipo de zona (urbana/rural).
|
|
114
|
+
direccion: Dirección completa o principal.
|
|
115
|
+
indicacion: Indicaciones adicionales de ubicación.
|
|
116
|
+
content_type: Tipo de contenido al que pertenecen estos datos.
|
|
117
|
+
object_id: ID del objeto al que están relacionados estos datos.
|
|
118
|
+
"""
|
|
119
|
+
id_ubicacion = models.UUIDField(
|
|
120
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
121
|
+
pais = models.ForeignKey(Pais, to_field='id_pais',
|
|
122
|
+
on_delete=models.CASCADE)
|
|
123
|
+
departamento = models.ForeignKey(
|
|
124
|
+
Departamento, to_field='id_departamento', on_delete=models.CASCADE)
|
|
125
|
+
municipio = models.ForeignKey(
|
|
126
|
+
Municipio, to_field='id_municipio', on_delete=models.CASCADE)
|
|
127
|
+
zona = models.ForeignKey(
|
|
128
|
+
ZonaUbicacion, to_field='id_zubicacion', on_delete=models.CASCADE)
|
|
129
|
+
direccion = models.CharField(max_length=160, blank=True, null=True)
|
|
130
|
+
indicacion = models.CharField(max_length=160, blank=True, null=True)
|
|
131
|
+
content_type = models.ForeignKey(
|
|
132
|
+
ContentType, on_delete=models.CASCADE, blank=True, null=True)
|
|
133
|
+
object_id = models.CharField(blank=True, null=True, max_length=50)
|
|
134
|
+
|
|
135
|
+
class Meta:
|
|
136
|
+
db_table = 'eco_usr_ubicacion'
|
|
137
|
+
verbose_name_plural = 'Datos de ubicación'
|
|
138
|
+
|
|
139
|
+
def __str__(self):
|
|
140
|
+
return str(self.id_ubicacion)
|
|
141
|
+
|
|
142
|
+
class UbicacionRural(DatosUbicacionUsuario):
|
|
143
|
+
"""
|
|
144
|
+
Modelo para direcciones rurales.
|
|
145
|
+
|
|
146
|
+
Extiende DatosUbicacionUsuario con campos específicos para ubicaciones rurales.
|
|
147
|
+
|
|
148
|
+
Attributes:
|
|
149
|
+
corregimiento: Nombre del corregimiento (división administrativa rural).
|
|
150
|
+
centro_poblado: Centro poblado más cercano.
|
|
151
|
+
vereda: Vereda o localidad.
|
|
152
|
+
"""
|
|
153
|
+
corregimiento = models.CharField(max_length=150, null=True, blank=True)
|
|
154
|
+
centro_poblado = models.CharField(max_length=150, null=True, blank=True)
|
|
155
|
+
vereda = models.CharField(max_length=150, null=True, blank=True)
|
|
156
|
+
|
|
157
|
+
def __str__(self):
|
|
158
|
+
return self.direccion
|
|
159
|
+
|
|
160
|
+
class Meta:
|
|
161
|
+
db_table = 'eco_usr_direccionrural'
|
|
162
|
+
verbose_name_plural = 'Dirección rural'
|
|
163
|
+
|
|
164
|
+
class UbicacionUrbana(DatosUbicacionUsuario):
|
|
165
|
+
"""
|
|
166
|
+
Modelo para direcciones urbanas.
|
|
167
|
+
|
|
168
|
+
Extiende DatosUbicacionUsuario con campos específicos para direcciones urbanas
|
|
169
|
+
siguiendo el formato colombiano de direcciones (tipo vía, número, letra, cuadrante).
|
|
170
|
+
|
|
171
|
+
Attributes:
|
|
172
|
+
nombre_barrio: Nombre del barrio o localidad.
|
|
173
|
+
tipo_viaprincipal: Tipo de vía principal (Calle, Carrera, Diagonal, etc.).
|
|
174
|
+
numero_viaprincipal: Número de la vía principal.
|
|
175
|
+
letra_principal: Letra de la vía principal (A, B, C).
|
|
176
|
+
es_bis: Indicador si la dirección tiene "BIS".
|
|
177
|
+
cuadrante_principal: Cuadrante de la vía principal (N, S, E, O).
|
|
178
|
+
numero_viasecundaria: Número de la vía secundaria.
|
|
179
|
+
letra_secundaria: Letra de la vía secundaria.
|
|
180
|
+
cuadrante_secundario: Cuadrante de la vía secundaria.
|
|
181
|
+
numero_placa: Número de placa o lote.
|
|
182
|
+
complemento: Información complementaria (apto, casa, oficina, etc.).
|
|
183
|
+
"""
|
|
184
|
+
nombre_barrio = models.CharField(max_length=100, null=True, blank=True)
|
|
185
|
+
tipo_viaprincipal = models.CharField(max_length=20, null=True, blank=True)
|
|
186
|
+
numero_viaprincipal = models.IntegerField(null=True, blank=True)
|
|
187
|
+
letra_principal = models.CharField(max_length=10, null=True, blank=True)
|
|
188
|
+
es_bis = models.BooleanField(null=True)
|
|
189
|
+
cuadrante_principal = models.CharField(
|
|
190
|
+
max_length=10, null=True, blank=True)
|
|
191
|
+
numero_viasecundaria = models.IntegerField(null=True, blank=True)
|
|
192
|
+
letra_secundaria = models.CharField(max_length=10, null=True, blank=True)
|
|
193
|
+
cuadrante_secundario = models.CharField(
|
|
194
|
+
max_length=10, null=True, blank=True)
|
|
195
|
+
numero_placa = models.IntegerField(null=True, blank=True)
|
|
196
|
+
complemento = models.CharField(max_length=60, null=True, blank=True)
|
|
197
|
+
|
|
198
|
+
def __str__(self):
|
|
199
|
+
fields = [
|
|
200
|
+
self.tipo_viaprincipal, self.numero_viaprincipal, self.letra_principal,
|
|
201
|
+
self.cuadrante_principal, self.numero_viasecundaria, self.letra_secundaria, self.numero_placa,
|
|
202
|
+
self.cuadrante_secundario, self.complemento]
|
|
203
|
+
|
|
204
|
+
fields = [str(field) for field in fields if field]
|
|
205
|
+
return " ".join(fields)
|
|
206
|
+
|
|
207
|
+
class Meta:
|
|
208
|
+
db_table = 'eco_usr_direccionurbana'
|
|
209
|
+
verbose_name_plural = 'Dirección urbana'
|
|
210
|
+
|
|
211
|
+
class IdentificacionUsuario(models.Model):
|
|
212
|
+
"""
|
|
213
|
+
Modelo para datos de identificación de usuarios.
|
|
214
|
+
|
|
215
|
+
Almacena el número y tipo de documento de identificación de una persona,
|
|
216
|
+
con la fecha de expedición del documento.
|
|
217
|
+
|
|
218
|
+
Attributes:
|
|
219
|
+
id_iusuario: Identificador único UUID del registro.
|
|
220
|
+
numero_identificacion: Número del documento de identidad (CC, TI, Pasaporte, etc.).
|
|
221
|
+
fecha_expedicion: Fecha en que fue expedido el documento.
|
|
222
|
+
tipo_identificacion: Tipo de documento (relación con modelo estático).
|
|
223
|
+
"""
|
|
224
|
+
id_iusuario = models.UUIDField(
|
|
225
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
226
|
+
numero_identificacion = models.CharField(
|
|
227
|
+
max_length=20, null=False, blank=True, unique=True)
|
|
228
|
+
fecha_expedicion = models.DateField()
|
|
229
|
+
tipo_identificacion = models.ForeignKey(
|
|
230
|
+
TipoIdentificacion, to_field='id_tidentificacion', on_delete=models.CASCADE)
|
|
231
|
+
|
|
232
|
+
class Meta:
|
|
233
|
+
db_table = 'eco_usr_iusuario'
|
|
234
|
+
verbose_name_plural = 'Datos de la identificación del usuario'
|
|
235
|
+
|
|
236
|
+
def __str__(self):
|
|
237
|
+
return str(self.numero_identificacion) + str(self.fecha_expedicion)
|
|
238
|
+
|
|
239
|
+
class NombrePersonaUsuario(models.Model):
|
|
240
|
+
"""
|
|
241
|
+
Modelo para nombres y apellidos de personas.
|
|
242
|
+
|
|
243
|
+
Almacena el nombre completo descompuesto en primer nombre, segundo nombre,
|
|
244
|
+
primer apellido y segundo apellido.
|
|
245
|
+
|
|
246
|
+
Attributes:
|
|
247
|
+
id_npersona: Identificador único UUID del registro.
|
|
248
|
+
primer_nombre: Primer nombre de la persona.
|
|
249
|
+
segundo_nombre: Segundo nombre (opcional).
|
|
250
|
+
primer_apellido: Primer apellido de la persona.
|
|
251
|
+
segundo_apellido: Segundo apellido (opcional).
|
|
252
|
+
"""
|
|
253
|
+
id_npersona = models.UUIDField(
|
|
254
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
255
|
+
primer_nombre = models.CharField(max_length=20, null=False, blank=False)
|
|
256
|
+
segundo_nombre = models.CharField(max_length=50, null=True, blank=True)
|
|
257
|
+
primer_apellido = models.CharField(max_length=50, null=False, blank=False)
|
|
258
|
+
segundo_apellido = models.CharField(max_length=50, null=True, blank=True)
|
|
259
|
+
|
|
260
|
+
class Meta:
|
|
261
|
+
db_table = 'eco_usr_nombrepersona'
|
|
262
|
+
verbose_name_plural = 'Nombres y apellidos de las personas'
|
|
263
|
+
|
|
264
|
+
def __str__(self):
|
|
265
|
+
return str(self.id_npersona) + str(self.primer_nombre)
|
|
266
|
+
|
|
267
|
+
class DatosBasicosUsuario(models.Model):
|
|
268
|
+
"""
|
|
269
|
+
Modelo para datos básicos del usuario.
|
|
270
|
+
|
|
271
|
+
Consolida la información básica de una persona: identificación, nombre,
|
|
272
|
+
características demográficas y ubicación de contacto.
|
|
273
|
+
|
|
274
|
+
Attributes:
|
|
275
|
+
id_busuario: Identificador único UUID del registro.
|
|
276
|
+
identificacion_usuario: Relación con datos de identificación.
|
|
277
|
+
nombre_persona: Relación con nombres y apellidos.
|
|
278
|
+
sexo_persona: Tipo de sexo biológico.
|
|
279
|
+
genero_persona: Identidad de género.
|
|
280
|
+
orientacion_persona: Orientación sexual.
|
|
281
|
+
gp_rh: Grupo sanguíneo y factor RH.
|
|
282
|
+
ubicacion_persona: GenericRelation con ubicaciones del usuario.
|
|
283
|
+
contacto_persona: GenericRelation con datos de contacto.
|
|
284
|
+
"""
|
|
285
|
+
id_busuario = models.UUIDField(
|
|
286
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
287
|
+
identificacion_usuario = models.ForeignKey(
|
|
288
|
+
IdentificacionUsuario, to_field='id_iusuario', on_delete=models.CASCADE)
|
|
289
|
+
nombre_persona = models.ForeignKey(
|
|
290
|
+
NombrePersonaUsuario, to_field='id_npersona', on_delete=models.CASCADE)
|
|
291
|
+
sexo_persona = models.ForeignKey(
|
|
292
|
+
TipoSexo, to_field='id_tsexo', on_delete=models.CASCADE, null=True, blank=True)
|
|
293
|
+
genero_persona = models.ForeignKey(
|
|
294
|
+
TipoGenero, to_field='id_tgenero', on_delete=models.CASCADE, null=True, blank=True)
|
|
295
|
+
orientacion_persona = models.ForeignKey(
|
|
296
|
+
TipoOrientacionSexual, to_field='id_torientacion', on_delete=models.CASCADE, null=True, blank=True)
|
|
297
|
+
gp_rh = models.ForeignKey(GpRh, to_field='id_grh',
|
|
298
|
+
on_delete=models.CASCADE, null=True, blank=True)
|
|
299
|
+
ubicacion_persona = GenericRelation(DatosUbicacionUsuario)
|
|
300
|
+
contacto_persona = GenericRelation(DatosContactoUsuario)
|
|
301
|
+
|
|
302
|
+
class Meta:
|
|
303
|
+
db_table = 'eco_usr_basicosusuario'
|
|
304
|
+
verbose_name_plural = 'Datos básicos del usuario'
|
|
305
|
+
|
|
306
|
+
def __str__(self):
|
|
307
|
+
return str(self.id_busuario)
|
|
308
|
+
|
|
309
|
+
class DatosComplementariosUsuario(models.Model):
|
|
310
|
+
"""
|
|
311
|
+
Modelo para datos complementarios del usuario.
|
|
312
|
+
|
|
313
|
+
Almacena información adicional sobre el usuario: estado civil, afiliaciones
|
|
314
|
+
a pensiones y salud, vinculación con la UNP y aceptación de políticas.
|
|
315
|
+
|
|
316
|
+
Attributes:
|
|
317
|
+
id_cusuario: Identificador único UUID del registro.
|
|
318
|
+
estado_civil: Estado civil de la persona.
|
|
319
|
+
fondo_pensiones: Fondo de pensiones al que está afiliado.
|
|
320
|
+
eps: Entidad Promotora de Salud (EPS).
|
|
321
|
+
tipo_vinculacion: Tipo de vínculo con la UNP.
|
|
322
|
+
acepto_politicas: Indicador de si aceptó los términos y condiciones.
|
|
323
|
+
basicos_usuario: Relación con datos básicos del usuario.
|
|
324
|
+
"""
|
|
325
|
+
id_cusuario = models.UUIDField(
|
|
326
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
327
|
+
estado_civil = models.ForeignKey(
|
|
328
|
+
EstadoCivil, to_field='id_ecivil', on_delete=models.CASCADE, null=True, blank=True)
|
|
329
|
+
fondo_pensiones = models.ForeignKey(
|
|
330
|
+
FondoPensiones, to_field='id_fpensiones', on_delete=models.CASCADE, null=True, blank=True)
|
|
331
|
+
eps = models.ForeignKey(Eps, to_field='id_eps',
|
|
332
|
+
on_delete=models.CASCADE, null=True, blank=True)
|
|
333
|
+
tipo_vinculacion = models.ForeignKey(
|
|
334
|
+
TipoVinculacion, to_field='id_tvinculacion', on_delete=models.CASCADE, null=True, blank=True)
|
|
335
|
+
acepto_politicas = models.BooleanField(default=False)
|
|
336
|
+
basicos_usuario = models.ForeignKey(
|
|
337
|
+
DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE, null=True, blank=True)
|
|
338
|
+
|
|
339
|
+
class Meta:
|
|
340
|
+
db_table = 'eco_usr_complementariosusuario'
|
|
341
|
+
verbose_name_plural = 'Datos básicos del usuario'
|
|
342
|
+
|
|
343
|
+
def __str__(self):
|
|
344
|
+
return str(self.id_cusuario)
|
|
345
|
+
|
|
346
|
+
##### MODELOS DE GESTIÓN CONTRACTUAL #######
|
|
347
|
+
|
|
348
|
+
class ContratoContratista(models.Model):
|
|
349
|
+
"""
|
|
350
|
+
Modelo para contratos de personal contratista.
|
|
351
|
+
|
|
352
|
+
Almacena información sobre los contratos laborales de contratistas de la UNP.
|
|
353
|
+
|
|
354
|
+
Attributes:
|
|
355
|
+
id_contrato: Identificador único UUID del contrato.
|
|
356
|
+
numero_contrato: Número de referencia del contrato.
|
|
357
|
+
fecha_iniciocontrato: Fecha de inicio del contrato.
|
|
358
|
+
fecha_fincontrato: Fecha de término del contrato.
|
|
359
|
+
complementario_usuario: Relación con datos complementarios del usuario.
|
|
360
|
+
"""
|
|
361
|
+
id_contrato = models.UUIDField(
|
|
362
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
363
|
+
numero_contrato = models.CharField(max_length=10, blank=True, null=True)
|
|
364
|
+
fecha_iniciocontrato = models.DateField(blank=True, null=True)
|
|
365
|
+
fecha_fincontrato = models.DateField(blank=True, null=True)
|
|
366
|
+
complementario_usuario = models.ForeignKey(
|
|
367
|
+
DatosComplementariosUsuario, to_field='id_cusuario', on_delete=models.CASCADE, null=True, blank=True)
|
|
368
|
+
|
|
369
|
+
class Meta:
|
|
370
|
+
db_table = 'eco_usr_datoscontrato'
|
|
371
|
+
verbose_name_plural = 'Datos básicos del contrato'
|
|
372
|
+
|
|
373
|
+
def __str__(self):
|
|
374
|
+
return str(self.id_contrato)
|
|
375
|
+
|
|
376
|
+
class ResolucionFuncionario(models.Model):
|
|
377
|
+
"""
|
|
378
|
+
Modelo para resoluciones de funcionarios.
|
|
379
|
+
|
|
380
|
+
Almacena datos de las resoluciones que asignan funciones a empleados de la UNP.
|
|
381
|
+
|
|
382
|
+
Attributes:
|
|
383
|
+
id_resolucion: Identificador único UUID del registro.
|
|
384
|
+
numero_resolucion: Número de la resolución oficial.
|
|
385
|
+
complementario_usuario: Relación con datos complementarios del usuario.
|
|
386
|
+
"""
|
|
387
|
+
id_resolucion = models.UUIDField(
|
|
388
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
389
|
+
numero_resolucion = models.CharField(max_length=30, blank=True, null=True)
|
|
390
|
+
complementario_usuario = models.ForeignKey(
|
|
391
|
+
DatosComplementariosUsuario, to_field='id_cusuario', on_delete=models.CASCADE, null=True, blank=True)
|
|
392
|
+
|
|
393
|
+
class Meta:
|
|
394
|
+
db_table = 'eco_usr_datosresolucion'
|
|
395
|
+
verbose_name_plural = 'Datos básicos de la resolucion del contratista'
|
|
396
|
+
|
|
397
|
+
def __str__(self):
|
|
398
|
+
return str(self.id_resolucion)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
##### MODELOS DE PERFILES Y ROLES #######
|
|
402
|
+
|
|
403
|
+
class PerfilUsuario(models.Model):
|
|
404
|
+
"""
|
|
405
|
+
Modelo para perfil de usuario en el sistema.
|
|
406
|
+
|
|
407
|
+
Asigna roles, grupos y dependencias a los usuarios dentro de la UNP.
|
|
408
|
+
Controla el estado de activación y la frecuencia de actualización de datos.
|
|
409
|
+
|
|
410
|
+
Attributes:
|
|
411
|
+
id_pusuario: Identificador único UUID del perfil.
|
|
412
|
+
dependencia: Dependencia de la UNP a la que pertenece.
|
|
413
|
+
grupo: Grupo de trabajo dentro de la dependencia.
|
|
414
|
+
rol: Rol asignado al usuario.
|
|
415
|
+
basicos_usuario: Relación con datos básicos del usuario.
|
|
416
|
+
user: Relación con el usuario de Django.
|
|
417
|
+
activo: Indicador si el perfil está activo.
|
|
418
|
+
fecha_actualizacion: Última fecha de actualización de datos básicos.
|
|
419
|
+
frecuencia_actualizacion: Frecuencia en días que deben actualizarse los datos.
|
|
420
|
+
asignador: Usuario que asignó el perfil (relación auto-referencial).
|
|
421
|
+
"""
|
|
422
|
+
id_pusuario = models.UUIDField(
|
|
423
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
424
|
+
dependencia = models.ForeignKey(
|
|
425
|
+
Dependencia, to_field='id_dependencia', on_delete=models.CASCADE, null=True, blank=True)
|
|
426
|
+
grupo = models.ForeignKey(
|
|
427
|
+
Grupo, to_field='id_grupo', on_delete=models.CASCADE, null=True, blank=True)
|
|
428
|
+
rol = models.ForeignKey(Rol, to_field='id_rol',
|
|
429
|
+
on_delete=models.CASCADE, null=True, blank=True)
|
|
430
|
+
basicos_usuario = models.ForeignKey(
|
|
431
|
+
DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE, null=True, blank=True)
|
|
432
|
+
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
|
433
|
+
activo = models.BooleanField(default=True)
|
|
434
|
+
fecha_actualizacion = models.DateField(default=timezone.now)
|
|
435
|
+
frecuencia_actualizacion = models.PositiveIntegerField(default=180)
|
|
436
|
+
asignador = models.ForeignKey(
|
|
437
|
+
DatosBasicosUsuario, to_field='id_busuario', on_delete=models.CASCADE, null=True, blank=True, related_name="asignador_id")
|
|
438
|
+
|
|
439
|
+
class Meta:
|
|
440
|
+
db_table = 'eco_usr_perfilusuario'
|
|
441
|
+
verbose_name_plural = 'perfil del usuario'
|
|
442
|
+
|
|
443
|
+
def __str__(self):
|
|
444
|
+
return str(self.id_pusuario)
|
|
445
|
+
|
|
446
|
+
def datos_basicos_expirados(self):
|
|
447
|
+
if not self.fecha_actualizacion:
|
|
448
|
+
return True
|
|
449
|
+
return (timezone.now().date() - self.fecha_actualizacion) > timedelta(days=self.frecuencia_actualizacion)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
##### MODELOS DE SEGURIDAD Y AUTENTICACIÓN #######
|
|
453
|
+
|
|
454
|
+
class ValidationCode(models.Model):
|
|
455
|
+
"""
|
|
456
|
+
Modelo para códigos de validación de correo electrónico.
|
|
457
|
+
|
|
458
|
+
Almacena códigos temporales para validar direcciones de correo electrónico
|
|
459
|
+
en procesos de registro o cambio de email.
|
|
460
|
+
|
|
461
|
+
Attributes:
|
|
462
|
+
id_vcodigo: Identificador único UUID del código.
|
|
463
|
+
email: Correo electrónico a validar.
|
|
464
|
+
code: Código alfanumérico de validación único.
|
|
465
|
+
expiration: Fecha y hora de expiración del código.
|
|
466
|
+
is_active: Indicador si el código aún es válido.
|
|
467
|
+
created_at: Fecha de creación del código.
|
|
468
|
+
updated_at: Última fecha de actualización.
|
|
469
|
+
"""
|
|
470
|
+
id_vcodigo = models.UUIDField(
|
|
471
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
472
|
+
email = models.CharField(max_length=255, unique=False)
|
|
473
|
+
code = models.CharField(max_length=100, unique=True)
|
|
474
|
+
expiration = models.DateTimeField()
|
|
475
|
+
is_active = models.BooleanField(default=True)
|
|
476
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
477
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
478
|
+
|
|
479
|
+
class Meta:
|
|
480
|
+
db_table = 'eco_usr_validationcode'
|
|
481
|
+
verbose_name_plural = 'codigos de validacion'
|
|
482
|
+
|
|
483
|
+
def is_valid(self):
|
|
484
|
+
if not self.is_active:
|
|
485
|
+
return False
|
|
486
|
+
|
|
487
|
+
now = timezone.now()
|
|
488
|
+
if self.expiration.tzinfo is None:
|
|
489
|
+
self.expiration = self.expiration.replace(tzinfo=timezone.utc)
|
|
490
|
+
return now < self.expiration
|
|
491
|
+
|
|
492
|
+
def desactivate(self):
|
|
493
|
+
self.is_active = False
|
|
494
|
+
self.save()
|
|
495
|
+
|
|
496
|
+
def __str__(self):
|
|
497
|
+
return str(self.id_vcodigo)
|
|
498
|
+
|
|
499
|
+
class RecoveryCode(models.Model):
|
|
500
|
+
"""
|
|
501
|
+
Modelo para códigos de recuperación de contraseña.
|
|
502
|
+
|
|
503
|
+
Almacena códigos temporales para permitir que usuarios recuperen acceso
|
|
504
|
+
a sus cuentas en caso de contraseña olvidada.
|
|
505
|
+
|
|
506
|
+
Attributes:
|
|
507
|
+
id_rcode: Identificador único UUID del código.
|
|
508
|
+
email: Correo electrónico de recuperación.
|
|
509
|
+
code: Código alfanumérico de recuperación único.
|
|
510
|
+
expiration: Fecha y hora de expiración del código.
|
|
511
|
+
is_active: Indicador si el código aún es válido.
|
|
512
|
+
created_at: Fecha de creación del código.
|
|
513
|
+
updated_at: Última fecha de actualización.
|
|
514
|
+
"""
|
|
515
|
+
id_rcode = models.UUIDField(
|
|
516
|
+
primary_key=True, default=uuid.uuid4, editable=False)
|
|
517
|
+
email = models.CharField(max_length=255, unique=False)
|
|
518
|
+
code = models.CharField(max_length=100, unique=True)
|
|
519
|
+
expiration = models.DateTimeField()
|
|
520
|
+
is_active = models.BooleanField(default=True)
|
|
521
|
+
created_at = models.DateTimeField(auto_now_add=True)
|
|
522
|
+
updated_at = models.DateTimeField(auto_now=True)
|
|
523
|
+
|
|
524
|
+
class Meta:
|
|
525
|
+
db_table = 'eco_usr_recoverycode'
|
|
526
|
+
verbose_name_plural = 'codigos de recuperacion'
|
|
527
|
+
|
|
528
|
+
def is_valid(self):
|
|
529
|
+
if not self.is_active:
|
|
530
|
+
return False
|
|
531
|
+
|
|
532
|
+
now = timezone.now()
|
|
533
|
+
if self.expiration.tzinfo is None:
|
|
534
|
+
self.expiration = self.expiration.replace(tzinfo=timezone.utc)
|
|
535
|
+
return now < self.expiration
|
|
536
|
+
|
|
537
|
+
def desactivate(self):
|
|
538
|
+
self.is_active = False
|
|
539
|
+
self.save()
|
|
540
|
+
|
|
541
|
+
def __str__(self):
|
|
542
|
+
return str(self.id_rcode)
|
|
543
|
+
|
|
544
|
+
class Notification(models.Model):
|
|
545
|
+
"""
|
|
546
|
+
Modelo para almacenar tokens de notificación de usuarios.
|
|
547
|
+
|
|
548
|
+
Guarda tokens encriptados de dispositivos para envío de notificaciones push.
|
|
549
|
+
Incluye métodos para encriptar y desencriptar tokens usando Fernet.
|
|
550
|
+
|
|
551
|
+
Attributes:
|
|
552
|
+
id_notification: Identificador único UUID del registro.
|
|
553
|
+
user: Relación con el usuario de Django.
|
|
554
|
+
token: Token encriptado del dispositivo para notificaciones.
|
|
555
|
+
is_active: Indicador si el token está activo.
|
|
556
|
+
created_at: Fecha de creación del registro.
|
|
557
|
+
updated_at: Última fecha de actualización.
|
|
558
|
+
|
|
559
|
+
Methods:
|
|
560
|
+
set_encrypted_token: Encripta y almacena un token.
|
|
561
|
+
get_decrypted_token: Desencripta y retorna el token original.
|
|
562
|
+
desactivate: Desactiva el token.
|
|
563
|
+
"""
|
|
564
|
+
|
|
565
|
+
class Meta:
|
|
566
|
+
db_table = 'eco_usr_notification'
|
|
567
|
+
verbose_name_plural = 'Notificacion de usuario'
|
|
568
|
+
|
|
569
|
+
def set_encrypted_token(self, token):
|
|
570
|
+
if not isinstance(token, (str, bytes)):
|
|
571
|
+
raise TypeError("El token debe ser string o bytes")
|
|
572
|
+
fernet = Fernet(config('FERNET_SECRET_KEY'))
|
|
573
|
+
if isinstance(token, str):
|
|
574
|
+
token = token.encode('utf-8')
|
|
575
|
+
self.token = fernet.encrypt(token)
|
|
576
|
+
|
|
577
|
+
def get_decrypted_token(self):
|
|
578
|
+
fernet = Fernet(config('FERNET_SECRET_KEY'))
|
|
579
|
+
if isinstance(self.token, memoryview):
|
|
580
|
+
self.token = bytes(self.token)
|
|
581
|
+
|
|
582
|
+
decrypted_token = fernet.decrypt(self.token)
|
|
583
|
+
return decrypted_token.decode()
|
|
584
|
+
|
|
585
|
+
def desactivate(self):
|
|
586
|
+
self.is_active = False
|
|
587
|
+
self.save()
|
|
588
|
+
|
|
589
|
+
def __str__(self):
|
|
590
|
+
return str(self.id_notification)
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
##### MODELOS DE REPRESENTANTES Y COLECTIVOS #######
|
|
595
|
+
|
|
596
|
+
class DatosRepresentate(models.Model):
|
|
597
|
+
"""
|
|
598
|
+
Modelo para datos de representantes de colectivos.
|
|
599
|
+
|
|
600
|
+
Almacena información de personas que representan legalmente a un colectivo,
|
|
601
|
+
incluyendo identificación, nombre, ubicación y contacto.
|
|
602
|
+
|
|
603
|
+
Attributes:
|
|
604
|
+
id_representante: Identificador único UUID del representante.
|
|
605
|
+
identificacion_representante: Relación con datos de identificación.
|
|
606
|
+
nombre_representante: Relación con nombres y apellidos.
|
|
607
|
+
ubicacion_representante: GenericRelation con ubicaciones del representante.
|
|
608
|
+
contacto_representante: GenericRelation con datos de contacto.
|
|
609
|
+
"""
|
|
610
|
+
|
|
611
|
+
class Meta:
|
|
612
|
+
db_table = 'eco_usr_representate'
|
|
613
|
+
verbose_name_plural = 'Datos de representante'
|
|
614
|
+
|
|
615
|
+
def __str__(self):
|
|
616
|
+
return str(self.id_representante)
|
|
617
|
+
|
|
618
|
+
class DatosColectivos(models.Model):
|
|
619
|
+
"""
|
|
620
|
+
Modelo para datos de colectivos.
|
|
621
|
+
|
|
622
|
+
Almacena información de colectivos u organizaciones de personas,
|
|
623
|
+
incluyendo su resolución de constitución.
|
|
624
|
+
|
|
625
|
+
Attributes:
|
|
626
|
+
id_colectivo: Identificador único UUID del colectivo.
|
|
627
|
+
nombre_colectivo: Nombre oficial del colectivo u organización.
|
|
628
|
+
resolucion: Número de resolución que constituye el colectivo.
|
|
629
|
+
fecha_resaolucion: Fecha de emisión de la resolución.
|
|
630
|
+
"""
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
class Meta:
|
|
634
|
+
db_table = 'eco_usr_datoscolectivos'
|
|
635
|
+
verbose_name_plural = 'Datos de colectivos'
|
|
636
|
+
|
|
637
|
+
def __str__(self):
|
|
638
|
+
return str(self.id_colectivo)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
eco_back/__init__.py,sha256=
|
|
1
|
+
eco_back/__init__.py,sha256=RfM42X3puCa8z8lotiLzlFvNTUQJTKFT4zpSk8UEcag,317
|
|
2
2
|
eco_back/api/__init__.py,sha256=9moiU5H8jGlva8k65bUK49LRIkE7bcLH1SK1dk23wcM,202
|
|
3
3
|
eco_back/api/client.py,sha256=b2J9ty7mRtPUsMD-YJui60B9GEa-85VAAb-sS5y1Rp8,8537
|
|
4
4
|
eco_back/api/config.py,sha256=dyERZY_4lXtRjhqLaHI0F4WlgPOQ_sw35eHNWGkQNLo,1590
|
|
@@ -11,13 +11,18 @@ eco_back/database/postgis.py,sha256=oTuz8OzGeFiM3Aro3Zlid31t7tJJNSvqAUYTTaYUzoI,
|
|
|
11
11
|
eco_back/database/repository.py,sha256=NFh0pfvf7Pw878qOoVhR8ARMFC0CiJBQ_EwKshY8lOE,4433
|
|
12
12
|
eco_back/documento/__init__.py,sha256=0rIgJ52in_BMg7VYr2pVlu9EnTPftgdqJ4hOZU5I4j0,146
|
|
13
13
|
eco_back/documento/anexos.py,sha256=KIzGNEVJ6tV3awhq4WGiqb8eSV2PluRRZ0PRbqeO5VE,17511
|
|
14
|
+
eco_back/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
eco_back/models/registro.py,sha256=ZZMmQgNs9N_N703hlWT5FzvqmSjDTuyPmvLtRj3DHfY,10402
|
|
16
|
+
eco_back/models/sistema.py,sha256=hPxgnKvkd4IKH15tqQCTR91F-tv5XOkbYRo4iOhyqNc,107580
|
|
17
|
+
eco_back/models/static.py,sha256=AlzVN28sDc-ZA4k5vS2YTbpkGCPwcd3qQNv4Ea2BY_U,39128
|
|
18
|
+
eco_back/models/usuario.py,sha256=LSdmv1GNEMeFWlsmrLJFr2GUwNI7nh-0LgKRyaZveD8,26619
|
|
14
19
|
eco_back/registro/__init__.py,sha256=CRDv6OSKzt1r-RnKSfv86Ceb7yfL2Fn-OhHGCx467lE,148
|
|
15
20
|
eco_back/registro/trazabilidad.py,sha256=XiOxAJCDGIkRjG-Lznko9ztmVxDhEBUYYwQiUxYOuxg,1185
|
|
16
21
|
eco_back/utils/__init__.py,sha256=DM0Y6fMeoRH6tG0skpkfEUVR71OAIFuVKQDC3_XBHvc,317
|
|
17
22
|
eco_back/utils/exceptions.py,sha256=woKrhxkncGIG_rCgRFT6B9ZAgV2TdaCH4Vcusyj3aX4,2010
|
|
18
23
|
eco_back/utils/logger_generico.py,sha256=1FIalQDkxzu0NBj-L7SzTuKEWcZuh25ZcIEux5WCB2c,4227
|
|
19
|
-
eco_back-0.2.
|
|
20
|
-
eco_back-0.2.
|
|
21
|
-
eco_back-0.2.
|
|
22
|
-
eco_back-0.2.
|
|
23
|
-
eco_back-0.2.
|
|
24
|
+
eco_back-0.2.5.dist-info/licenses/LICENSE,sha256=XKKSDU9WlUEAyPNlRhq6e2xhVNpJc097JwPZJ1rUnRE,1077
|
|
25
|
+
eco_back-0.2.5.dist-info/METADATA,sha256=06v2klA7gg_DOw0Hx9aTnyqn_H7Cg6nGIRsUQzrPF3o,6632
|
|
26
|
+
eco_back-0.2.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
27
|
+
eco_back-0.2.5.dist-info/top_level.txt,sha256=ViJZv023782XNNFMcAsRC9iN1CU3tb8lP9wDAHacMyc,9
|
|
28
|
+
eco_back-0.2.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|