Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/alfonsoolavarria/florilegio/llms.txt

Use this file to discover all available pages before exploring further.

Florilegio de la Fe opera un sistema editorial dual que distingue entre artículos y ensayos. Los artículos son piezas breves o de mediana extensión orientadas a la divulgación teológica, histórica o biográfica, ideales para lectores que buscan reflexiones accesibles. Los ensayos, por su parte, son escritos de mayor profundidad académica o meditativa, con secciones bien delimitadas; la plataforma genera automáticamente una tabla de contenidos navegable a partir de los encabezados del contenido HTML. Ambos tipos comparten el mismo ciclo de vida editorial — creación, revisión y publicación — y están organizados por categorías e indexados para búsqueda de texto completo.

Modelo Article

El modelo Article almacena los artículos del sitio. Todos los campos se encuentran en la tabla main_florife_article.
CampoTipoDescripción
titleCharField(255)Título principal del artículo
slugSlugField(unique=True)URL amigable derivada del título
authorForeignKey(Author)Enlace al autor; se pone a NULL si el autor se elimina
categoryForeignKey(Category)Categoría a la que pertenece el artículo
image_urlURLField(500)URL de la imagen de portada
contentTextFieldContenido completo en HTML
tagsJSONFieldLista de etiquetas/temas relacionados
meta_descriptionTextFieldDescripción para SEO y redes sociales (máx. 160 caracteres)
is_featuredBooleanFieldSi True, el artículo aparece en el carrusel de la portada
statusCharFieldrevision (por defecto) o liberado
created_atDateTimeFieldFecha de creación (automática)
updated_atDateTimeFieldFecha de última modificación (automática)

Propiedades calculadas

# Devuelve un dict con la URL de la imagen, compatible con templates que esperan article.image.url
@property
def image(self):
    return {'url': self.image_url}

# Devuelve meta_description si existe; de lo contrario, los primeros 160 caracteres del contenido sin HTML
@property
def seo_description(self):
    if self.meta_description:
        return self.meta_description
    clean = re.sub(r'<[^>]+>', '', self.content)[:160].strip() if self.content else self.title
    return clean

Modelo Essay

El modelo Essay tiene la misma estructura de campos que Article. La diferencia principal está en la vista de detalle: al renderizar un ensayo, se genera automáticamente una tabla de contenidos (TOC) a partir de los encabezados <h2> y <h3> presentes en el HTML.

Generación automática de tabla de contenidos

La vista essay_detail recorre el contenido con una expresión regular, extrae todos los encabezados h2 y h3, les asigna un número de sección jerárquico y los inyecta con atributos id para los enlaces de anclaje:
# Ejemplo de numeración generada
# h2 → "1."  "2."  "3."
# h3 → "1.1."  "1.2."  "2.1."

counter = {'h2': 0, 'h3': 0}
for tag, text in headings:
    if tag == 'h2':
        counter['h2'] += 1
        counter['h3'] = 0
        number = str(counter['h2']) + '.'
    else:  # h3
        counter['h3'] += 1
        number = str(counter['h2']) + '.' + str(counter['h3']) + '.'
    heading_id = 'section-' + str(i)
    # El heading queda: <h2 id="section-0">1. Introducción</h2>
Los toc_items se pasan al template con las claves id, number, text y tag, permitiendo renderizar una barra lateral de navegación anclada.

Flujo de publicación

1

El autor crea el contenido

Desde el portal de autores (/autores/articulo/nuevo/), el autor con perfil vinculado redacta el título, selecciona una categoría, añade la URL de la imagen y escribe el contenido. Al guardar, el artículo se crea con status='revision'.
2

El artículo queda en revisión

El contenido no es visible en el sitio público mientras status sea revision. Solo los administradores pueden verlo en el panel de Django Admin.
3

El administrador revisa y libera

Un administrador del sitio edita el artículo en Django Admin y cambia el campo status a liberado.
4

El artículo aparece en el sitio

Una vez liberado, el artículo es devuelto por todos los querysets públicos (Article.objects.filter(status='liberado')) y queda accesible en la lista y en su URL de detalle.

URLs disponibles

Devuelve la lista paginada de artículos con status='liberado'. Acepta el parámetro ?categoria=<id> para filtrar por categoría. Paginación: 5 artículos por página.
GET /articulos/
GET /articulos/?categoria=3
GET /articulos/?categoria=3&page=2
Muestra el artículo con el slug indicado (solo si status='liberado'). El template recibe además hasta 3 related_articles de la misma categoría.
GET /articulo/la-fe-de-los-reformadores/
Lista paginada de ensayos. Acepta ?categoria=<id> y ?q=<búsqueda>. Paginación: 9 ensayos por página. La búsqueda aplica unaccent__icontains sobre title y content.
GET /ensayos/
GET /ensayos/?q=gracia
GET /ensayos/?categoria=2&q=soteriología
Muestra el ensayo con su tabla de contenidos generada automáticamente. Incluye hasta 3 ensayos relacionados de la misma categoría.
GET /ensayo/la-doctrina-de-la-gracia/
Búsqueda de texto completo sobre artículos usando unaccent__icontains en los campos title y content. Resultados paginados a 9 por página.
GET /buscar/?q=Calvino
GET /buscar/?q=justificacion&page=2
La búsqueda con unaccent__icontains requiere tener instalada la extensión unaccent de PostgreSQL en la base de datos. Actívala con:
CREATE EXTENSION IF NOT EXISTS unaccent;
Sin esta extensión, las búsquedas lanzarán un error ProgrammingError. Asegúrate de añadir django.contrib.postgres a INSTALLED_APPS y ejecutar la migración correspondiente.

Portal de autores

El portal de autores permite a usuarios con un perfil Author vinculado a su User crear y editar sus propios artículos. El acceso está restringido por el decorador _author_required, que verifica la existencia de user.author_profile.

Panel del autor

GET /autores/panel/ — Muestra todos los artículos del autor ordenados por fecha de creación, con su estado actual.

Crear artículo

GET /autores/articulo/nuevo/ — Formulario de creación. Al guardar, el slug se genera automáticamente desde el título y se asegura su unicidad.

Editar artículo

GET/POST /autores/articulo/<id>/editar/ — Muestra el formulario de edición (GET) o actualiza título, contenido, categoría e imagen (POST). Solo el autor propietario puede editar.

Modelo Category

Las categorías agrupan tanto artículos como ensayos. Cada categoría tiene un icono CSS que se muestra en la interfaz.
class Category(models.Model):
    name = models.CharField(max_length=100)       # Ej: "Teología", "Historia"
    icon = models.CharField(max_length=100, default="unicon-book")  # Clase CSS del icono
Ejemplos de valores para icon: unicon-book, unicon-university, unicon-cross. Las categorías se gestionan exclusivamente desde Django Admin.

Build docs developers (and LLMs) love