Présentation du projet
Ce projet porte sur l’application MONA, une application mobile qui permet de découvrir des œuvres
d’art public à Montréal grâce à la géolocalisation.
Le projet Mona a été développé par la Maison MONA, un organisme à but non lucratif qui vise à
promouvoir l’art public à Montréal.
Au cours du semestre d’été 2026, sous la supervision du professeur Guy Lapalme, je participe à ce projet
dans le rôle de développeuse côté serveur.
Contexte
L'interface d'administration permet actuellement la consultation et la gestion des données relatives aux œuvres d'art, lieux patrimoniaux, lieux culturels, artistes et utilisateurs.
Afin de faciliter l'analyse, le contrôle qualité des données et la production de rapports, une fonctionnalité de recherche avancée doit être développée.
Objectifs
Les objectifs principaux sont :
- Faciliter la recherche et le filtrage des données.
- Permettre des analyses croisées entre plusieurs types d'entités.
- Offrir une visualisation géographique des découvertes.
- Faciliter l'exportation des résultats pour les analyses externes.
- Fournir des outils de suivi de l'activité des utilisateurs et des artistes.
Planification des sprints
| Sprint |
Objectif |
Durée |
| Sprint 1 |
Analyse, validation des critères et maquettes |
2 semaines |
| Sprint 2 |
Création de la page et réutilisation des filtres existants |
2 semaines |
| Sprint 3 |
Développement des nouveaux filtres avancés |
3 semaines |
| Sprint 4 |
Utilisateurs, artistes, statistiques et export |
2 semaines |
| Sprint 5 |
Carte interactive et fiche détaillée |
2 semaines |
| Sprint 6 |
Tests, optimisation et livraison |
1-2 semaines |
Rapport hebdomadaire
Semaine 1 · 08 mai au 14 mai
Objectifs de la semaine
Cette semaine, l'objectif était de prendre contact avec l'équipe du projet MONA, de me familiariser avec l'application mobile et de mettre en place les outils nécessaires au suivi du stage.
Prise de contact
Cette semaine, nous avons eu notre première rencontre avec Lena, qui nous a présenté l’histoire du projet Mona
ainsi que ses objectifs.
J’ai commencé par installer l’application MONA afin de me familiariser avec ses principales fonctionnalités :
création de compte, ajout de photos et commentaires.
J’ai également créé ce site web destiné à regrouper mes rapports hebdomadaires. J’ai pris le temps de consulter
les rapports des anciens participants, notamment ceux de Corélie et d’Anissa, afin de mieux comprendre le déroulement
du projet.
Enfin, j’ai commencé à me documenter sur Laravel.
Semaine 2 · 15 mai au 21 mai
Objectifs de la semaine
Cette semaine, l'objectif était de mettre en place l'environnement de développement local et d'obtenir les accès nécessaires (SSH, serveur) afin de pouvoir commencer à contribuer au code du projet.
Installation de l’environnement de développement
Cette semaine, nous avons eu une rencontre avec l’ensemble des membres de l’équipe technique.
Simon nous a présenté les différents aspects du projet sur lesquels il travaille, tandis que Corélie nous a fait
découvrir l’interface administrateur de l’application.
De mon côté, j’ai commencé par installer les logiciels nécessaires afin de pouvoir exécuter le serveur de l’application
localement avant de procéder à l’installation complète du serveur en suivant les étapes décrites dans le rapport de Corélie.
J’ai également généré ma clé SSH que j’ai transmise à Lena afin d’obtenir les accès nécessaires au projet.
Semaine 3 · 22 mai au 28 mai
Objectifs de la semaine
Cette semaine, l’objectif était de mieux comprendre le projet et son fonctionnement afin de clarifier les tâches sur lesquelles je vais travailler.
Je voulais aussi régler certains problèmes techniques liés à mon environnement de développement et améliorer mon autonomie sur le projet, notamment en obtenant un accès administrateur et en comprenant davantage la structure du code.
Travaux réalisés
- Participation à une rencontre d’équipe afin de planifier une rencontre avec Camille pour clarifier les objectifs du projet et les tâches qui me seront attribuées.
- Rencontre avec Corélie pour parcourir le code du projet. Elle m’a présenté les différentes sections sur lesquelles je pourrais travailler et m’a expliqué certains éléments liés à l’API v4.
- Création d’un compte administrateur pour accéder aux fonctionnalités réservées aux admins. Voir tutoriel Wiki
- Correction d’un problème d’affichage du logo sur la page d’accueil. Le code faisait référence à Mona-Logo.svg, alors que le fichier présent dans le projet avait un autre nom. Pour corriger rapidement le problème, j’ai renommé le fichier afin qu’il corresponde à celui attendu dans le code.
- Rencontre avec Camila pour découvrir l’interface administrateur. Elle m’a proposé de travailler sur la recherche avancée dans l’interface admin. Nous avons parcouru ensemble les différents critères de recherche afin de voir lesquels sont possibles à implémenter et lesquels présentent certaines limites.
Semaine 4 · 29 mai au 04 juin
Objectifs de la semaine
Cette semaine, l'objectif est de continuer à me familiariser avec le projet, notamment avec les données, afin de déterminer quels critères sont réellement applicables à la recherche avancée.
Il s'agit également de mieux comprendre le code afin d'identifier les fonctionnalités déjà implémentées et celles qui restent à développer.
Enfin, l'objectif est de planifier les prochaines étapes du projet en fonction de mes découvertes et des objectifs à atteindre.
Travaux réalisés
Semaine 5 · 05 juin au 11 juin
Objectifs de la semaine
Cette semaine, l'objectif est d'améliorer la maquette de l'interface avant le début du développement.
Travaux réalisés
- Participation à une rencontre avec Lena et Anissa afin de discuter du processus de suppression des découvertes, notamment dans les cas de doublons ou d'œuvres qui n'existent plus.
- Modification de l'affichage des notes afin de les présenter en entier, comme l'a recommandé Lena.
- Participation au parcours de découverte à Hochelaga : exploration de plusieurs œuvres et lieux patrimoniaux, prise de photographies et présentation de l'application MONA aux participants. Coup de cœur personnel : La Bolduc de Laurent Gascon.
- Fixation des seuils de longueur des commentaires, après statistiques sur les commentaires existants dans la sauvegarde de la base de données datant de 2024 : court (0-10 caractères), moyen (11-39 caractères) et long (40 caractères et plus).
Semaine 6 · 12 juin au 18 juin
Objectifs de la semaine
Cette semaine, l'objectif était de mieux comprendre les technologies utilisées dans le projet et de résoudre un problème de connexion à l'environnement de développement afin de retrouver mon autonomie.
Travaux réalisés
- Révision des langages et technologies utilisés dans le projet, soit Laravel pour le serveur, Vue.js (Vue 2, API Options) pour l'interface d'administration, ainsi que BootstrapVue pour les composants visuels, afin de mieux comprendre l'architecture globale de l'application.
- Sollicitation de l'aide d'Anissa et Simon pour résoudre un problème de connexion SSH au serveur de MONA. Après vérification, il s'est avéré que le mauvais passphrase était utilisé pour la clé existante, alors que je pensais ne pas en avoir défini un lors de sa création.
- Génération d'une nouvelle paire de clés SSH et prise de contact avec Raouf afin d'obtenir les accès nécessaires au serveur.
Semaine 7 · 19 juin au 25 juin
Objectifs de la semaine
Cette semaine, en raison de mes examens intra-semestriels, le temps disponible pour le projet était limité; l'objectif était donc de débuter concrètement le développement de la page de recherche avancée.
Travaux réalisés
- Création de la route dédiée à la page de recherche avancée.
- Mise en place de la page correspondante et implémentation complète de la vue.
Semaine 8 · 26 juin au 02 juillet
Objectifs de la semaine
Cette semaine, l'objectif était d'analyser les benchmarks d'interfaces réalisés par Corélie et Camila afin d'orienter les choix de conception, puis d'entamer le développement concret de la page de recherche avancée.
Travaux réalisés
- Séparation de la page de recherche avancée en deux vues : une première page présentant uniquement les filtres, puis une seconde combinant les filtres et les résultats.
- Implémentation des premiers filtres de la recherche avancée (ceux de la section 1, Type : œuvre, lieu patrimonial, lieu culturel, utilisateur).
- Lecture des benchmarks réalisés par Corélie et Camila, et élaboration d'un comparatif avec la maquette actuelle ainsi qu'un résumé synthétique.
Note — idées retenues des benchmarks (Corélie + Camila)
- Affichage progressif : montrer seulement les filtres au chargement, puis basculer vers une mise en page à deux colonnes (filtres à gauche, résultats à droite) une fois la recherche lancée. Déjà en place dans
AdvancedSearchGrid.vue.
- Tags de filtres actifs et libellés clairs : afficher les filtres sélectionnés sous forme d'étiquettes retirables, et utiliser des libellés en langage simple plutôt que des termes techniques ou des noms de champs bruts.
- Exclusion, pas juste inclusion : permettre d'exclure des valeurs, pas seulement d'en inclure. Ex. : section Œuvres d'art — ajouter une liste "Catégories à exclure" à côté du select de catégories déjà existant.
- Filtres contextuels : n'afficher que les sections pertinentes selon le type de contenu choisi. Ex. : si seul "Utilisateur" est coché en section 1, masquer les sections Œuvres d'art / Patrimoine / Lieux culturels.
- Menus déroulants plutôt que champs libres : quand la liste de valeurs est fermée, un select réduit les erreurs de saisie. Déjà fait pour le type d'identifiant — à étendre à des champs comme région/municipalité ou statut patrimoine.
- Résultats modifiables sans repartir de zéro : pouvoir raffiner une recherche depuis la page de résultats, avec le nombre de résultats affecté visible en temps réel.
- Cohérence de langue : vérifier qu'aucun libellé ne bascule en anglais (piège vu chez Rijksmuseum/Gallica dans les benchmarks).
- Autocomplétion : pour les champs à grand nombre de valeurs possibles (ex. : nom d'artiste, nom de lieu), proposer des suggestions au fur et à mesure de la saisie plutôt qu'un champ libre ou un select trop long. Réduit les erreurs de frappe et accélère la recherche.
Semaine 9 · 03 juillet au 09 juillet
Objectifs de la semaine
Cette semaine, l'objectif était de développer la section Informations générales de la recherche avancée et de la connecter au contrôleur backend afin de valider les premiers filtres fonctionnels de bout en bout.
Travaux réalisés
- Développement de la section Informations générales de la recherche avancée.
- Ajout des filtres permettant d'effectuer une recherche à partir des identifiants, des titres et des différents types de contenus.
- Connexion des nouveaux champs de recherche au contrôleur de recherche avancée.
- Vérification du fonctionnement des filtres avec les œuvres d'art, les lieux patrimoniaux et les lieux culturels.
Semaine 10 · 10 juillet au 16 juillet
Objectifs de la semaine
Cette semaine, l'objectif était de corriger un bug bloquant lié aux coordonnées géographiques manquantes, d'implémenter les sections Notes/commentaires/photos et Lieux culturels, et de reconstruire l'affichage des résultats avec pagination et exportation.
Travaux réalisés
- Correction d'un bug bloquant récurrent : l'accesseur
getLocationAttribute() plantait sur toute œuvre, tout patrimoine ou tout lieu culturel sans coordonnées GPS, lorsque la colonne spatiale était null.
- Correction du problème dans les trois modèles concernés :
Artwork, Heritage et Place.
- Implémentation de la section Notes, commentaires et photos.
- Implémentation de la section Lieux culturels : remplacement d'un menu déroulant contenant des valeurs fictives par des cases à cocher basées sur les neuf valeurs d'usage réellement présentes dans la base de données.
- Reconstruction du tableau de résultats dans
AdvancedSearchResults.vue, en s'inspirant du composant FullGridTemplate.vue déjà utilisé dans Mona.
- Ajout de la pagination et d'un bouton d'exportation JSON dans la barre d'outils des résultats.
- Connexion du bouton « Rechercher » afin de relancer la recherche avec les filtres actuellement sélectionnés.
- Ajout d'un bouton de fermeture dans
CartePhotoFicheDecouverte.vue.
- Identification d'une incohérence entre la fiche complète et le tableau de résultats concernant le calcul des notes et des commentaires associés aux contributions sans photo.
Semaine 11 · 17 juillet au 23 juillet
Objectifs de la semaine
Terminer le câblage côté serveur des sections de filtres restantes (Dates, Œuvres d'art, Patrimoine, Type d'artiste), corriger les bogues de recherche remontés en test, et préparer la présentation pour la dernière séance de mise en commun.
Travaux réalisés
- Correction du filtre par identifiant : passage d'une correspondance partielle à une correspondance exacte, qui provoquait des faux positifs (rechercher l'ID 2 retournait aussi 12, 21…) autant pour les œuvres que pour le patrimoine et les utilisateurs.
- Extraction des vraies valeurs de la base de données pour compléter plusieurs menus déroulants (statut et fonctions des lieux patrimoniaux, catégorie/support/technique/matériaux des œuvres, type d'artiste), à la place de valeurs devinées.
- Nettoyage des listes de suggestions pour Support(s)/Technique(s)/Matériaux : retrait des doublons et des entrées manifestement erronées (noms de personnes ou de lieux glissés par erreur dans les données), sans toucher aux données réelles en base.
- Découverte et correction d'un bogue de performance : une case à cocher héritait d'une règle CSS générique lui donnant une largeur de 100 %, écrasant le libellé associé à 0 pixel — diagnostiqué via l'inspecteur du navigateur.
- Implémentation de la section Dates (création, mise à jour, capture et téléversement de photo, création de compte) pour les œuvres, lieux patrimoniaux et lieux culturels.
- Ajout d'un système de badges de filtres actifs, un par valeur cochée, chacun retirable individuellement sans rouvrir le formulaire.
- Correction d'une incohérence entre la fiche de détail et le tableau de résultats, qui calculaient la note moyenne d'une œuvre selon deux règles différentes — tranchée en équipe.
- Préparation du support visuel et du discours pour la séance de mise en commun du 23 et 24 juillet.
Semaine 12 · 24 juillet au 30 juillet
Objectifs de la semaine
Cette semaine, l'objectif était de brancher les sections Artistes et Utilisateurs de la recherche avancée, qui n'étaient jusque-là que des champs sans lien avec la base de données, puis d'adapter l'affichage des résultats à ces deux types de contenu.
Travaux réalisés
- Implémentation des filtres de la section Artistes (type individuel/collectif, nombre d'œuvres, et statistiques de photos/commentaires/notes/note moyenne des œuvres via des sous-requêtes SQL corrélées, Eloquent ne sachant pas agréger nativement à travers deux relations imbriquées).
- Implémentation des filtres de la section Utilisateurs (découvertes collectionnées combinant les trois types de contenu, commentaires rédigés, notes attribuées, étoiles données).
- Établissement d'une règle transversale : une contribution ne compte pour une note ou un commentaire que si elle est accompagnée d'une photo, pour exclure les tests admin sans photo — appliquée aux sections Artistes, Utilisateurs et Notes/commentaires/photos.
- Correction d'un bug où un appel à select() mal placé écrasait une colonne calculée, faisant retomber à zéro les recherches combinant plusieurs critères sur les artistes.
- Refonte du tableau de résultats : bascule automatique vers des colonnes dédiées quand la recherche porte exclusivement sur des artistes ou des utilisateurs, ajout d'un menu de personnalisation des colonnes affichées et d'un sélecteur du nombre de résultats par page.
- Correction d'un champ hérité (« Quantité ») dans la table Artiste qui ne correspondait à aucune donnée réelle en base : recalculé à partir du nombre d'œuvres associées plutôt que de rester systématiquement vide.
Semaine 13 · 31 juillet au 06 août
Objectifs de la semaine
Cette semaine, l'objectif était de brancher la section Localisation et Recherche géographique de la recherche avancée, puis de construire une vue Carte pour visualiser géographiquement les résultats.
Travaux réalisés
- Implémentation des filtres de la section Localisation (région, territoire, municipalité, adresse et coordonnées), en tenant compte des structures de données différentes entre œuvres, lieux patrimoniaux et lieux culturels (par exemple, l'adresse n'est pas stockée de la même façon selon le type de contenu).
- Remplacement des champs Territoire et Municipalité, jusque-là en texte libre, par des menus déroulants dynamiques peuplés depuis la base de données.
- Correction d'une inversion entre latitude et longitude causée par la convention GeoJSON du package spatial utilisé (ST_X = longitude, ST_Y = latitude).
- Remplacement du champ d'adresse en texte libre de la Recherche géographique par deux champs numériques (latitude, longitude) et un rayon, filtrés avec la fonction spatiale native ST_Distance_Sphere plutôt qu'un service de géocodage externe.
- Construction d'une vue Carte avec Leaflet et un plugin de regroupement de pins (marker clustering), incluant un popup au clic présentant la photo la plus récente, le titre, une courte description et un lien vers la fiche complète.
- Adaptation du contenu des fenêtres d'information après des essais infructueux d'intégration d'un composant existant, dont la mise en page ne s'affichait pas correctement dans ce nouveau contexte.
- Correction d'un bug d'interface où un menu déroulant personnalisé se refermait instantanément à l'ouverture, causé par un conflit entre l'événement de clic ayant ouvert le menu et le détecteur de clic à l'extérieur.
- Rencontre avec Camila pour valider le travail réalisé jusqu'ici ; les améliorations et incohérences relevées ensemble seront l'objet de la semaine prochaine.