Gestión de Entidades en la DPE (parte 2)
Published: 2024-04-24 00:10:18

Este tutorial cubre los siguientes puntos:

- Definición de modelo Entidad.

**Paso 1: Definición del Modelo**

- Dentro del paquete "models", crea el archivo Python: "entidad.py" con el siguiente código:

```
# entidades/models/entidad.py
from django.db import models
from entidades.models import *

class Entidad(models.Model):
    nombre = models.CharField(max_length=250)
    ruc = models.CharField(max_length=13)
    tipo_organizacion = models.ForeignKey(TipoOrganizacion, on_delete=models.CASCADE)
    tipo_entidad = models.ForeignKey(TipoEntidad, on_delete=models.CASCADE)
    funcion = models.ForeignKey(Funcion, on_delete=models.CASCADE)
    control_snap = models.BooleanField()
    ambito_accion = models.ForeignKey(AmbitoAccion, on_delete=models.CASCADE)
    zonal = models.ForeignKey(Zonal, on_delete=models.CASCADE)
    provincia = models.ForeignKey(Provincia, on_delete=models.CASCADE)
    canton = models.ForeignKey(Canton, on_delete=models.CASCADE)
    parroquia = models.ForeignKey(Parroquia, on_delete=models.CASCADE)
    direccion = models.CharField(max_length=150)
    telefono = models.CharField(max_length=9)
    correo_institucional = models.EmailField()
    tipo_gad = models.ForeignKey(TipoGad, on_delete=models.CASCADE)
    base_normativa = models.TextField(max_length=5000, blank=True, null=True)
    fecha_publicacion_base_legal = models.DateField()
    num_registro_oficial = models.CharField(max_length=25)
    nota_aclaracion = models.TextField(max_length=1000, blank=True, null=True)
    nombres_maxima_autoridad = models.CharField(max_length=100)
    nombres_responsable = models.CharField(max_length=100)
    correo_responsable = models.EmailField()
    telefono_responsable = models.CharField(max_length=9)
    extension_telef_responsable = models.CharField(max_length=5)
    file_ordenanza = models.FileField(null=True, upload_to='adjuntos/')
    file_registro_oficial = models.FileField(null=True, upload_to='adjuntos/')
    file_ruc = models.FileField(null=True, upload_to='adjuntos/')
    fecha_registro = models.DateTimeField(auto_now_add=True)
    fecha_ult_act = models.DateTimeField(auto_now=True)

    def __str__(self) -> str:
        return f'{self.nombre} ({self.id})'

    class Meta:
        db_table = 'ent_entidades'
        verbose_name = 'Entidad'
        verbose_name_plural = 'Entidades'
```

- En el módulo `models/__init__.py` incluye la importación del modelo creado:

```
from .entidad import Entidad
```

**Paso 2: Configuración para el Manejo de archivos**

Asegurar la configuración adecuada para manejar uploads en Django es esencial, especialmente al utilizar el campo `FileField` en el modelo `Entidad`.

- Necesitamos configurar la carpeta para almacenar los archivos subidos. Por lo general, esto se hace agregando una configuración en tu archivo settings.py.

Abre tu archivo `gestor_entidades/settings.py` y agrega o modifica las siguientes líneas:

```
# Configuración para manejar archivos multimedia
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR  / 'media'
```

Adicionalmente, en las URLS del proyecto `gestor_entidades/urls.py` agrega:

```
from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

```
Estas líneas de código permiten que, cuando estemos en modo de depuración (DEBUG=True en settings.py), Django pueda manejar automáticamente las solicitudes para archivos de medios y los sirva correctamente (publicarlos vía http) tomándolos desde el directorio establecido en MEDIA_ROOT.

- Crea la carpeta media/ en la raíz de tu proyecto si aún no existe. Esto es donde se almacenarán los archivos subidos.
Puedes crear esta carpeta manualmente o hacerlo ejecutando el siguiente comando en tu terminal:

```mkdir media```

Ahora, los archivos subidos se almacenarán en la carpeta media/adjuntos/ dentro de tu proyecto.

**Paso 3: Configuración del Administrador**

En el archivo `entidades/admin.py`, registra el modelo Entidad para que puedan ser gestionado a través del administrador de Django:

```
@admin.register(Entidad)
class EntidadAdmin(admin.ModelAdmin):
    list_display = ('id', 'nombre', 'tipo_organizacion', 'fecha_registro', 'fecha_ult_act')
    
```

Y finalmente, para ejecutar el servidor de desarrollo de Django, usa el siguiente comando:

`poetry run python manage.py runserver`