Skip to content

Commit

Permalink
feat: celery tasks for vm updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Julien Corny authored and edelclaux committed May 29, 2024
1 parent 9b4f0a3 commit fc34146
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 5 deletions.
2 changes: 2 additions & 0 deletions backend/gn_module_zh/blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from utils_flask_sqla.response import json_resp_accept_empty_list, json_resp

from .api_error import ZHApiError
from . import tasks # noqa: F401
from .forms import (
create_zh,
post_file_info,
Expand Down Expand Up @@ -81,6 +82,7 @@
get_main_picture_id,
get_user_cruved,
)
import gn_module_zh.tasks

blueprint = Blueprint("pr_zh", __name__, "./static", template_folder="templates")

Expand Down
3 changes: 2 additions & 1 deletion backend/gn_module_zh/conf_schema_toml.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,5 @@ class GnModuleSchemaConf(Schema):
pdf_layer_number = fields.Integer(load_default=pdf_layer_number)
pdf_small_layer_number = fields.Integer(load_default=pdf_small_layer_number)
pdf_last_page_img = fields.String(load_default=pdf_last_page_img)
pdf_title = fields.String(load_default=pdf_title)
pdf_title = fields.String(load_default=pdf_title)
TAXON_VM_CRONTAB = fields.String(load_default="0 0,12 * * *")
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""create_vm_taxon_refresh_function
Revision ID: 76e89c793961
Revises: c0c4748a597a
Create Date: 2024-04-16 08:12:41.346540
"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '76e89c793961'
down_revision = 'c0c4748a597a'
branch_labels = None
depends_on = None


def upgrade():
op.execute(
"""
CREATE OR REPLACE FUNCTION pr_zh.refresh_taxon_materialized_views()
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
REFRESH MATERIALIZED VIEW pr_zh.vm_vertebrates;
REFRESH MATERIALIZED VIEW pr_zh.vm_invertebrates;
REFRESH MATERIALIZED VIEW pr_zh.vm_flora;
END;
$function$
;
"""
)


def downgrade():
op.execute(
"""
DROP FUNCTION pr_zh.refresh_taxon_materialized_views();
"""
)
42 changes: 42 additions & 0 deletions backend/gn_module_zh/tasks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import os

from datetime import datetime, timedelta
from pathlib import Path

from sqlalchemy import func
from celery.utils.log import get_task_logger
from celery.schedules import crontab

from flask import current_app
from geonature.utils.celery import celery_app

from geonature.utils.env import db
from geonature.utils.config import config

logger = get_task_logger(__name__)


@celery_app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
ct = config["ZONES_HUMIDES"]["TAXON_VM_CRONTAB"]
minute, hour, day_of_month, month_of_year, day_of_week = ct.split(" ")
sender.add_periodic_task(
crontab(
minute=minute,
hour=hour,
day_of_week=day_of_week,
day_of_month=day_of_month,
month_of_year=month_of_year,
),
refresh_taxon_vm.s(),
name="Refresh taxon vms",
)


@celery_app.task(bind=True)
def refresh_taxon_vm(self):
logger.info("Refresh taxon vms...")
db.session.execute(func.pr_zh.refresh_taxon_materialized_views())
db.session.commit()
logger.info("Taxon vms refreshed.")

22 changes: 18 additions & 4 deletions doc/admin.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@ Si l'administrateur désire qu'un inventaire n'apparaisse plus dans la section 6

## **5 - Téléchargement des listes de taxons**

### Fonctionnement

Lorsque l'utilisateur clique sur "générer la liste des espèces" dans l'onglet 5, l'application génère 3 fichiers csv correspondant aux taxons de flore, faune vertébrée et invertébrée protégés et observés au sein du périmètre de la zone humide. Voir la documentation utilisateur du module pour plus de détails sur les critères retenus pour la composition de cette liste. A noter qu’il s’agit d’une liste de taxons et non pas d’une liste d’occurrences de taxons (les observations liées à 1 taxon représentent donc 1 seule ligne). Chaque clic sur le bouton génère les fichiers, ces derniers étant stockés sur le serveur (et donc constamment disponibles au téléchargement) dans le dossier `static`.

Par défaut, les 3 vues (`vertebrates_view_name`, `invertebrates_view_name` et `flore_view_name`) sont paramétrées pour :
Par défaut, les 3 vues matérialisées (`vertebrates_view_name`, `invertebrates_view_name` et `flore_view_name`) sont paramétrées pour :

- lister les taxons présents dans la synthèse GeoNature de l'instance sur laquelle est déployé le module ZH. Les vues utilisent donc la table `gn_synthese.synthese` en base de données.
- lister les taxons présents dans la synthèse GeoNature de l'instance sur laquelle est déployé le module ZH. Les vues matérialisées utilisent donc la table `gn_synthese.synthese` en base de données.
- utiliser les statuts d’évaluation, protection et menace listés dans la table `taxonomie.bdc_statut`

![columns](taxons.png)

### Changer la source des données

Si l'administrateur veut changer la source de données, par exemple se brancher sur la synthèse d'une autre instance en configurant un foreign data wrapper, il devra supprimer les vues déjà existantes en base de données puis les recréer en respectant leur structure :

- `id_zh` - integer : id de la zh concernée
Expand All @@ -52,9 +58,17 @@ Si l'administrateur veut changer la source de données, par exemple se brancher

L’association `id_zh`/`cd_nom` doit être unique puisque la vue liste les taxons protégés présents dans chaque zone humide.

Le script `data/script_create_taxon_view.sh` permet d’aider la génération des vues en indiquant la table source des occurrences de taxons et la table listant les statuts d’évaluation, protection et menaces. Etant donné que par défaut les vues sont construites sur la base de la structure des tables `gn_synthese.synthese` et `taxonomie.bdc_statut` de GeoNature, ce script fonctionne de manière optimale en utilisant des sources de données dont la structure est identique, c’est-à-dire provenant de GeoNature, que ce soit en local (= l’instance sur laquelle est installé le module ZH) ou à l’extérieur (ex : un foreign data wrapper vers les données d’un autre GeoNature). Si l’administrateur désire utiliser d’autres sources de données structurées différemment, il devra modifier le code sql de ce script pour obtenir la structure attendue (décrite ci-dessus) des vues.
Le script `data/script_create_taxon_view.sh` permet d’aider la génération des vues matérialisées en indiquant la table source des occurrences de taxons et la table listant les statuts d’évaluation, protection et menaces. Etant donné que par défaut les vues matérialisées sont construites sur la base de la structure des tables `gn_synthese.synthese` et `taxonomie.bdc_statut` de GeoNature, ce script fonctionne de manière optimale en utilisant des sources de données dont la structure est identique, c’est-à-dire provenant de GeoNature, que ce soit en local (= l’instance sur laquelle est installé le module ZH) ou à l’extérieur (ex : un foreign data wrapper vers les données d’un autre GeoNature). Si l’administrateur désire utiliser d’autres sources de données structurées différemment, il devra modifier le code sql de ce script pour obtenir la structure attendue (décrite ci-dessus) des vues.

![columns](taxons.png)
### Rafraichissement des vues matérialisées

Les vues matérisalisées sont mises à jour automatiquement à fréquence définie, par défaut toutes les 12 heures. Si toutefois, vous souhaitez diminuer ou augmenter la durée entre chaque mise à jour, définissez cette dernière dans le fichier de configuration (``zones_humides_config.toml``) dans la variable ``TAXON_VM_CRONTAB``.

TAXON_VM_CRONTAB ="0 0,12 * * *"

Ce paramètre est composé de cinq valeurs, chacune séparée par un espace: minute, heure, jour du mois, mois de l'année, journée de la semaine. Dans l'exemple ci-dessus, il est indiqué que la mise à jour sera effectuée toutes les 12 heures. Pour plus d'informations, vous pouvez consulter la documentation de Celery à ce sujet : https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html#crontab-schedules.

**Note** : Si vous ne voulez pas définir un des paramètres de périodicité, utilisez un astérisque (``*``).

## **6- Les ressources documentaires**

Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"config_schema = gn_module_zh.conf_schema_toml:GnModuleSchemaConf",
"alembic_branch = gn_module_zh:ALEMBIC_BRANCH",
"migrations = gn_module_zh:migrations",
"tasks = gn_module_zh.tasks",
],
},
classifiers=[
Expand Down

0 comments on commit fc34146

Please sign in to comment.