# Agenda culturel

L'agenda culturel est un projet django créé à partir de [Django Docker Quickstard](https://github.com/godd0t/django-docker-quickstart/) pour faciliter son développement et déploiement. Il est distribué sous licence AGPL.

Une instance de démonstration est disponible à l'adresse https://pommesdelune.fr/.

Parmi les outils et ressources sur lesquelles s'appuie l'agenda culturel, on peut lister:

* [Django](https://www.djangoproject.com/)
* [redis](https://redis.io/)
* [celery](https://docs.celeryq.dev/en/stable/)
* [Selenium](https://www.selenium.dev/)
* [Feather icons](https://feathericons.com/)
* [Pico CSS](https://picocss.com/)

## Installation

Pour installer une version de développement, reportez-vous à la documentation de [Django Docker Quickstard](https://github.com/godd0t/django-docker-quickstart/). En résumé:

* ```git pull```
* ```make build-dev```

On peut aussi peupler les catégories avec un choix de catégories élémentaires:

* ```make create-categories```

On peut aussi peupler les positions de référence qui serviront aux recherches géographiques avec la commande, après avoir éventuellement modifié le fichier [communes.json](./src/scripts/communes.json) qui contient pour l'exemple toutes les communes récupérées depuis [public.opendatasoft.com](https://public.opendatasoft.com/explore/dataset/georef-france-commune/export/?flg=fr-fr&disjunctive.reg_name&disjunctive.dep_name&disjunctive.arrdep_name&disjunctive.ze2020_name&disjunctive.bv2022_name&disjunctive.epci_name&disjunctive.ept_name&disjunctive.com_name&disjunctive.ze2010_name&disjunctive.com_is_mountain_area&sort=year&refine.dep_name=Puy-de-D%C3%B4me&location=9,45.51597,3.05969&basemap=jawg.light):

* ```make create-reference-locations```

## Utilisation d'un proxy socket

On peut activer à la main (pour l'instant) un proxy type socket pour l'import d'événements.

* se connecter au docker du celery worker : ```docker exec -it agenda_culturel-celery-worker bash```
* mettre à jour les dépôts ```apt update```
* installer le client ssh ```apt install ssh-client```
* créer un socket ssh ```ssh -D 12345 USER@HOST```
* modifier le drapeau proxy dans le constructeur de [downloader.py](src/agenda_culturel/import_tasks/downloader.py).

## Notes aux développeurs

### Ajout d'une nouvelle source *custom*

Pour ajouter une nouvelle source custom:
- ajouter un fichier dans ```src/agenda_culturel/import_tasks/custom_extractors``` en s'inspirant des autres fichiers présents. Il existe de nombreuses facilités dans les classes mères correspondantes
- s'inspirer des scripts présents dans ```experimentations/``` pour créer son propre script de test
- quand l'import fonctionne de manière indépendante dans ces expérimentations, il est tant de l'ajouter au site internet:
    - ajouter à la classe ```RecurrentImport.PROCESSOR``` présente dans le fichier ```src/agenda_culturel/models.py``` une entrée correspondant à cette source pour qu'elle soit proposée aux utilisateurs
    - ajouter à la fonction ```run_recurrent_import``` présente dans le fichier ```src/agenda_culturel/celery.py``` le test correspondant à cet ajout, pour lancer le bon extracteur
- se rendre sur le site, page administration, et ajouter un import récurrent correspondant à cette nouvelle source

### Récupérer un dump du prod sur un serveur dev

* sur le serveur de prod:
  * ```docker exec -i agenda_culturel-backend python3 manage.py dumpdata --natural-foreign --natural-primary --format=json --exclude=admin.logentry --indent=2   > fixtures/postgres-backup-20241101.json``` (à noter qu'ici on oublie les comptes, qu'il faudra recréer)
* sur le serveur de dev:
  * On récupère le dump json ```scp $SERVEUR:$PATH/fixtures/postgres-backup-20241101.json src/fixtures/```
  * ```scripts/reset-database.sh FIXTURE COMMIT``` où ```FIXTURE``` est le timestamp dans le nom de la fixture, et ```COMMIT``` est l'ID du commit git correspondant à celle en prod sur le serveur au moment de la création de la fixture

À noter que les images ne sont pas récupérées.

**Remarque:** il y a un script qui fait une bonne partie du travail. Voir [reset-database.sh](./scripts/reset-database.sh).