mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-05-06 19:19:19 +02:00
refactor: rename database → storage
More semantically accurate: contains SQLite files, schema, fixtures, test data. Updated all references in code, scripts, docs.
This commit is contained in:
74
storage/Database_TFE_test.csv
Normal file
74
storage/Database_TFE_test.csv
Normal file
@@ -0,0 +1,74 @@
|
||||
,,,,,,,,,,,,,,,,,,,,
|
||||
Identifiant,Titre,Sous-titre,Auteur·ice(s),Contact,Promoteur·ice(s),Format,Année,AP,Orientation,Finalité,Mots-clés,Synopsis,Contexte,Remarques,Langue,Autorisation,License,taille,Points sur 20,lien BAIU
|
||||
,,,,,,,,,,,séparer par une virgule — max. 10,,,,,,,,,
|
||||
Column1,Column2,Column3,Column4,Column5,Column6,Column7,Column8,Column9,Column10,Column11,Column12,Column13,Column14,Column15,Column16,Column17,Column18,Column19,Column20,
|
||||
2025-002,"Plus haut, la poussière ira plus loin",,Lucie Jacquet,luciejacquetlucie@gmail.com,"Silvia Mesturini, Sasha Newell",objet éditorial,2025,,SC,Approfondi,"carrière, mémoire collective, frictions, folklore, récits","Ce mémoire aborde les frictions générées par les sites d’extraction de pierre calcaire en Wallonie.
|
||||
Ces espaces à ciel ouvert qui creusent le paysage et réveillent des tensions entre exploitation
|
||||
industrielle, transformations environnementales et vécus du vivant. Au-delà des plaies visibles,
|
||||
ce travail cherche à faire entendre les silences des carrières, à travers des récits fragmentés
|
||||
mêlant observations, entretiens et souvenirs personnels.",,,français,,,128 pages,,
|
||||
2025-003,La berge du verre,,Yasmine Salem,yasminexsalem@gmail.com,"Nicolas Prignot, Olivier Gosselain","vidéo, objet éditorial",2025,,VI,Approfondi,"patrimoine, apprentissage, technique du vitrail, artisanat, documentaire,","Lorsque Pierre Majerus décède, il donne l’atelier de vitrail aux aspirants
|
||||
maitres-verriers. D’ailleurs, il disait : « apprendre un métier, c’est le
|
||||
voler à quelqu’un d’autre ». Après son décès, Marcelle son épouse,
|
||||
continuera à fabriquer les vitraux avec Vincent, le fidèle collaborateur.
|
||||
Ensuite, Saskia a rejoint l’atelier pour donner des cours de vitraux avec
|
||||
Vincent. Il y a aussi quelques verriers inconnus, le couple François
|
||||
et Amélie et maintenant, Youri qui s’essaie à la technique du vitrail à
|
||||
l’atelier Pierre Majerus. Désormais, Marcelle et Vincent accompagnent
|
||||
toutes les arrivées et départs de ces aspirants maitres-verriers. Sauf le
|
||||
mardi et le mercredi, quand la salle de cours se remplit d’apprenantes et
|
||||
d’apprenants. Vincent rejoint Saskia pour donner les cours de vitraux
|
||||
avec les petits gâteaux et les « Alors ? C’est pas mal du tout ça ! »
|
||||
Marcelle sort de sa véranda et se dirige vers la salle de cours avec ses
|
||||
verres et ses outils dans un panier en osier. Devenir maitre-verrier ?
|
||||
Ça s’apprend toujours pour Marcelle malgré une soixantaine d’année à
|
||||
coconstruire un atelier de vitrail.",,Dvd : avoir un lecteur dvd externe,français,,,78 pages + ?? minutes,,
|
||||
2025-005,Reflet fantôme,"Mémoire, trauma et narration – Le trauma comme plan cinématographique",Darika Peou,darika.peou@gmail.com,"Silvia Mesturini, Vanessa Frangville",objet éditorial,2025,LIENS,CA,Approfondi,"mémoire, trauma, narration, cambodge, film, héritage, animation, génocide","""Reflet fantôme"" interroge la manière dont le cinéma peut reconstruire un récit identitaire à partir d’un héritage khmer traumatique et fragmenté. À travers trois films sur le génocide cambodgien, j’explore comment les choix narratifs et esthétiques traduisent le trauma et ouvrent un espace pour transmettre et réinventer la mémoire. Ce mémoire croise analyse filmique, études sur la mémoire traumatique et réflexion sur la transmission transgénérationnelle.",,,français,,,70 pages,,
|
||||
2025-006,Tohu-bohu,Vol. 1 – Nitescences Spectrales,Lilo Joris,lilo.joris@erg.school,"Caroline Godart, David Berliner",objet éditorial,2025,DPM,,Approfondi,"mémoire, amnésie, mort, médiation, rêve, utopie, narration, magazine, anthropologie, poésie","Ce mémoire est le deuxième volume de la revue poétique Tohu-Bohu, le premier étant Vol. 0 : L’Iridescence du Brouhaha.
|
||||
Il tente de mélanger différents champs référentiels en les considérant de manière égale, tout en bien tenant compte de leurs spécificités. Il varie entre approche scientifique et approche plus poétique et sensible, proposant ainsi de faire apparaître le « poétique » à travers le « scientifique ».
|
||||
Nitescences Spectrales vient poser la question de la médiation de nos mort·es. Comment est-ce qu’on {ré}agit aux mort·es ? Qu’est-ce qu’iels laissent derrière elleux ? Qu’est-ce qu’iels emmènent avec ellux ? Et qu’est-ce qu’on peut faire des éclats amnésiques qui restent après leur « départ » ? Ces questions demandent à comprendre comment nos récits se forment malgré leurs trous, ainsi que de comprendre comment l’émotion se transforme (de manière sensible ou de manière utilitaire) au fil du temps – et donc de revoir la construction même du temps. L'enjeu sous-jacent du mémoire est d’observer les effets que produisent nos dialogues avec nos mort·es – que ce soit des personnes ou des moments – afin de comprendre comment demain se met en place et les implications que nous y avons.",,,français,,,92 pages + annexes,,
|
||||
2025-007,La Prophétie des Bâtards,Danser et faire re(co)nnaître au monde des corps qui ne comptent pas,Moriane Richard,moriane.richard@gmail.com,"Hélène Bernard, Flavio Rodrigo Orzari Ferreira, Valérie Piette",objet éditorial,2025,,IP,Approfondi,"art, danse, performance, cartographies somatiques du pouvoir, justice, médicine, transe","
|
||||
Nous vivons une épidémie invisible : l’inflammation chronique des systèmes nerveux et sociaux sous l’effet cumulé des traumatismes individuels et structurels (racisme, patriarcat, impérialisme, validisme). Cette inflammation traverse les chairs, défait les liens, atrophie l’attention, durcit la pensée. L’Art—et la danse en particulier—peut y répondre par des pratiques d’attention et de reliance : danser, toucher, trembler pour ré-accorder le c.o.r.p.s.e.s.p.r.i.t, ré-ouvrir l’imaginaire et relancer la capacité relationnelle.
|
||||
|
||||
Je travaille en auto-ethnographie incarnée, depuis des expériences qui débordent le discours : douleurs chroniques, gestes d’auto-défense somatique, apprentissages empiriques. Je croise pratiques somatiques (TRE®—tremblement neurogénique guidé, Body-Mind Centering®, contact-impro) et enquêtes théoriques (traumatologie, écologies affectives), pour élaborer une recherche-création qui pense avec le mouvement et par le toucher. Ce cadre a donné naissance à une méthode en devenir : la DarkDance—un protocole souple, subversif et sans dogme, qui considère muscles, fascias, organes et liquides comme des milieux pensants, et les engage dans une politique de la sensation.
|
||||
|
||||
Les enjeux sont de déplacer la critique des systèmes de domination dans les tissus mêmes des corps (cartographies somatiques du pouvoir). Et d’ouvrir des espaces de re(co)naissance pour celles et ceux dont l’archive est manquante—« les corps qui ne comptent pas ».",,,français,,,99 pages,,
|
||||
2025-008,"L'école, le parlement et la cuisine",,Alice Néron,alice.neron@outlook.com,"Ayoh Kré Duchâtelet,Karolina Svobodova",objet éditorial,2025,,DN,Approfondi,"art participatif, assemblée, bruxelles, joie, conversation, affects, collectif, pouvoir d'agir","L’école, le parlement et la cuisine revient sur trois situations d’art participatif engagées à Bruxelles ces cinq dernières années à partir de mon expérience: Bodies of Knowledge, le Code du numérique et «Cuisiner (...)». Bodies of Knowledge («L’école»), de l’artiste performeuse Sarah Vanhee, est une «salle de classe» nomade installée dans l'espace public pour apprendre des savoirs de vie des habitant·es. Le Code du Numérique («le parlement»),porté par l’asbl reconnue en éducation permanente Habitant·es des images, est un faux vrai code de loi écrit à partir de témoignages pour réglementer le numérique. Il s'écrit pendant les «parlements humains»: un outil d'animation qui met en scène une assemblée législative. Les ateliers «Cuisiner (...)» organisés avec Zeste Le Reste visent à cuisiner des problèmes collectifs en même temps qu’un repas.
|
||||
|
||||
Ce mémoire questionne les potentiels transformateurs de ces trois dispositifs. Comment peuvent-ils participer ou non à nous faire sentir plus capables ensemble et à faire émerger des capacités de sentir, de penser et d’agir en commun ? Comment peuvent-ils, ou non, nous permettre (artistes et participant·es) de reprendre joyeusement prise sur des affects tristes ? Que nous font-ils faire ?
|
||||
",,,français,,,160 pages en plusieurs brochures,,
|
||||
2025-009,Santurantikuy LIVE,"Objets, gestes, transactions",LALESHKA SALAS SALAZAR,laleshka.salas@gmail.com,Ivo Provoost,objet éditorial,2025,LIENS,,Enseignement,"Performance, Pérou, Art Populaire, Hawkaypata, Connexions Partielles, Andes, Andean Culture, Human-Non human, Postcolonial Studies","Ce travail de fin d’études, intitulé Santurantikuy LIVE : Objets, gestes, transactions, constitue
|
||||
une exploration scénique du caractère spatial et performatif de la foire Santurantikuy, à travers
|
||||
trois axes dramatiques : les croyances animistes, le commerce, et les racines communautaires.
|
||||
Instaurée au XVIe siècle par l’Église catholique dans le cadre des mesures du Concile de Trente,
|
||||
la foire du Santurantikuy avait pour objectif d’éradiquer les croyances andines en promouvant la
|
||||
vente de figurines et de saints chrétiens. Cependant, cet objectif n’a jamais été entièrement at
|
||||
teint.
|
||||
Aujourd’hui, la foire constitue un espace où la cosmovision andine et la religion chrétienne coexis
|
||||
tent dans un réseau complexe de relations. Par ailleurs, des tensions persistent entre les enjeux
|
||||
commerciaux et la préservation des traditions.
|
||||
Le choix de ce sujet découle d’un ancrage personnel : la foire du Santurantikuy représente une
|
||||
tradition profondément significative pour moi, car elle fut un moment de partage avec ma grand
|
||||
mère et ma tante. Elles évoquaient leurs souvenirs de la foire pendant que nous y étions, et c’est
|
||||
cette mémoire d’un moment en train de se vivre qui m’a donné envie de revisiter et explorer cet
|
||||
espace à travers une approche performative et scénique.",,,français,,,170 pages,,
|
||||
2025-011,Apprendre comme pratique de la liberté au XXIe siècle ?,,Zem Azem,a.zem@myyahoo.com,Stéphane Noël,audio,2025,,TY,Enseignement,"éducation critique, numérique, émancipation, bell hooks, Paulo Freire, co-création, savoirs situés, logiciel libre, pédagogie, transmission","Ce mémoire, sous forme de podcast en cinq épisodes,
|
||||
explore la pensée de bell hooks et de Paulo Freire
|
||||
à travers la question : qu’ est-ce qu’ apprendre comme pratique de la liberté au XXIe siècle ? En partant des fondements
|
||||
de la pédagogie critique, ce mémoire interroge la manière dont l’éducation peut encore aujourd’hui être un outil d’émancipation, de dialogue et de transformation sociale.
|
||||
|
||||
Dans un monde traversé par le numérique, les algorithmes, la post-vérité et la marchandisation du savoir, la question devient : comment rendre l’ apprentissage à nouveau
|
||||
collectif, sensible et politique ? À travers des enquêtes,
|
||||
des récits personnels, des références théoriques et des interviews d’artistes, de chercheur·ses et de praticien·nes du libre, ce podcast propose de penser autrement l’acte d’apprendre, en dehors des logiques verticales
|
||||
et productivistes.
|
||||
|
||||
Chaque épisode explore une facette de cette problématique, de l’éducation critique à la culture numérique, en passant
|
||||
par la typographie comme outil de réappropriation
|
||||
du langage. Ce projet se veut à la fois réflexion
|
||||
et expérimentation, à la croisée de la pédagogie,
|
||||
du design, du militantisme et des communs.",,Audio + annexes en objet éditorial (brochures pour la bibliographie etc),français,,,68 minutes,,
|
||||
2024-026,DepNum,,Théophile Gervreau-Mercier,theophile.gervreaumercier@erg.school,Audrey Samson,site web,2024,,,Spécialisé,"blog, dépendance, numérique, personnelle, collective, informatique, technologies, autobiographie, addiction","Mon mémoire de Master à l'ERG est un blog autobiographique sur ma dépendance numérique. Chaque post mêle vécu personnel, questions et recherche. J'explore les dynamiques complexes de notre dépendance collective aux technologies numériques, en croisant expérience individuelle et réflexion systémique.",,,français,,,,,https://ils.bib.uclouvain.be/global/documents/3830452
|
||||
2024-036,Les sons de ma maison,,ségolène Chateau,chateau.segolene@icloud.com,Sylvie bouteiller,Audio,2024,,,Spécialisé,"Sons, maison, bruit, extension de bâtiment, Recording","Ce travail sera constitué de 5 pièces sonores, résultant d’enregistrements effectués dans différentes pièces de ma maison.
|
||||
Le but étant de prendre conscience de notre environnement sonore, et du fait que nous sommes des êtres entendants, sensibles et réceptifs aux bruits qui nous entourent.
|
||||
Il consiste également à rendre de nouveau audibles ces sons, oubliés mais pourtant bien présents dans nos environnements personnels et familiers.",,,français,,,,,https://ils.bib.uclouvain.be/global/documents/3828970
|
||||
2024-043,So You!,,Nascimo Clette,nascimo.clette@gmail.com,Alexander Schellow,vidéo,2024,,,Spécialisé,"Mémoire, cinéma amateur, archivage, rapport matérialiste au médium vidéo, pratique naïve","So You! est un film que j'ai réalisé en 2024 pour mon Mémoire de fin de Master à l'ERG en Vidéographie. Il s'agit d'un montage de rush que j'ai rassemblé sur un petit caméscope depuis que j'ai 8 ans. Je me suis intéressé au fonctionnement de la mémoire et au développement d'une archive personnelle au travers du médium vidéographique. Une image en entraîne une autre, au rythme des souvenirs qui remontent et au gré de ce qu'ils m'évoquent. Interroger le geste commun d’un archivage personnel, comment ce geste est modelé par la technologie et comment produit-il des regards et relations uniques avec le monde. La mémoire crée des connexions incongrues a travers le temps et l'espace et nos archives sont précieuses, car elle permettent de s'approprier des micro-récits qui sont souvent réduits au silence.",,,français,,,,,https://ils.bib.uclouvain.be/global/documents/3830451
|
||||
|
222
storage/README.md
Normal file
222
storage/README.md
Normal file
@@ -0,0 +1,222 @@
|
||||
# Database Documentation
|
||||
|
||||
Complete documentation for the Post-ERG thesis database.
|
||||
|
||||
## 📚 Available Documentation
|
||||
|
||||
### 1. **[DATABASE_SPECIFICATION.md](DATABASE_SPECIFICATION.md)** ⭐
|
||||
**Complete technical specification** - 25KB comprehensive document
|
||||
|
||||
**Contents:**
|
||||
- Complete table definitions with all columns
|
||||
- Entity relationship diagrams
|
||||
- Junction table specifications
|
||||
- Lookup table values
|
||||
- Business rules and workflows
|
||||
- Sample queries and use cases
|
||||
- Instructions for requesting schema changes
|
||||
|
||||
**Use when:** You need complete technical details about the database structure.
|
||||
|
||||
---
|
||||
|
||||
### 2. **[QUICK_SCHEMA_REFERENCE.md](QUICK_SCHEMA_REFERENCE.md)** 🚀
|
||||
**Quick reference guide** - 5KB at-a-glance reference
|
||||
|
||||
**Contents:**
|
||||
- Table summary
|
||||
- Key relationships diagram
|
||||
- Core fields reference
|
||||
- Predefined lookup values
|
||||
- Common SQL queries
|
||||
- Constraint summary
|
||||
|
||||
**Use when:** You need quick lookup or common query examples.
|
||||
|
||||
---
|
||||
|
||||
### 3. **[schema.sql](schema.sql)** 💾
|
||||
**The actual SQL schema** - Executable SQL file
|
||||
|
||||
**Contents:**
|
||||
- Complete CREATE TABLE statements
|
||||
- Indexes and triggers
|
||||
- Predefined data (orientations, AP programs, etc.)
|
||||
- Views for common queries
|
||||
|
||||
**Use when:** Setting up or resetting the database.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### View Database Schema
|
||||
```bash
|
||||
# Read the quick reference
|
||||
cat database/QUICK_SCHEMA_REFERENCE.md
|
||||
|
||||
# Or full specification
|
||||
cat database/DATABASE_SPECIFICATION.md
|
||||
```
|
||||
|
||||
### Initialize Database
|
||||
```bash
|
||||
# Create test database from schema
|
||||
just init-test-db
|
||||
|
||||
# Create with sample data
|
||||
just create-fixtures
|
||||
```
|
||||
|
||||
### Query Database
|
||||
```bash
|
||||
# Open SQLite prompt
|
||||
just query-db
|
||||
|
||||
# Show specific thesis
|
||||
just show-thesis 42
|
||||
```
|
||||
|
||||
## 📝 Making Schema Changes
|
||||
|
||||
### Step 1: Document Your Request
|
||||
|
||||
Format:
|
||||
```
|
||||
**Table:** [table_name]
|
||||
**Change Type:** [add/modify/remove]
|
||||
**What:** [description]
|
||||
**Why:** [reason/use case]
|
||||
**Example Data:** [samples]
|
||||
```
|
||||
|
||||
### Step 2: Specify Details
|
||||
|
||||
For **new columns**:
|
||||
- Column name
|
||||
- Data type (TEXT, INTEGER, BOOLEAN, DATETIME)
|
||||
- NULL/NOT NULL
|
||||
- Default value
|
||||
- Indexes needed?
|
||||
|
||||
For **new tables**:
|
||||
- Table name
|
||||
- All columns
|
||||
- Relationships to existing tables
|
||||
- Sample data
|
||||
|
||||
### Step 3: Provide Context
|
||||
|
||||
Include:
|
||||
- Use case scenario
|
||||
- Who will use it?
|
||||
- How will it be displayed?
|
||||
- Any constraints?
|
||||
|
||||
### Example Request
|
||||
|
||||
```
|
||||
**Table:** theses
|
||||
**Change Type:** add column
|
||||
**What:** Add column to track if thesis won an award
|
||||
**Why:** Need to highlight award-winning theses on homepage
|
||||
**Column Name:** has_award
|
||||
**Data Type:** BOOLEAN
|
||||
**Default:** 0 (false)
|
||||
**Example:** 1 for "Prix du Jury 2025" winner
|
||||
```
|
||||
|
||||
## 🗂️ Database Structure Overview
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ theses │ ◄── Main table (500+ records/year)
|
||||
└──────┬──────┘
|
||||
│
|
||||
├──► authors (via thesis_authors)
|
||||
├──► supervisors (via thesis_supervisors)
|
||||
├──► keywords (via thesis_keywords)
|
||||
├──► languages (via thesis_languages)
|
||||
├──► formats (via thesis_formats)
|
||||
├──► thesis_files (attachments)
|
||||
│
|
||||
└──► Lookup tables:
|
||||
• orientations
|
||||
• ap_programs
|
||||
• finality_types
|
||||
• access_types
|
||||
• license_types
|
||||
```
|
||||
|
||||
## 📊 Key Statistics
|
||||
|
||||
- **Core tables:** 3 (theses, authors, supervisors)
|
||||
- **Junction tables:** 5 (many-to-many relationships)
|
||||
- **Lookup tables:** 7 (predefined values)
|
||||
- **Support tables:** 2 (files, pages)
|
||||
- **Views:** 2 (full data, public only)
|
||||
- **Indexes:** 11 (for performance)
|
||||
- **Triggers:** 4 (auto-update timestamps)
|
||||
|
||||
## 🔍 Common Scenarios
|
||||
|
||||
### Scenario 1: Student Submits Thesis
|
||||
1. Create record in `theses` (is_published=0)
|
||||
2. Add author to `authors`, link via `thesis_authors`
|
||||
3. Add supervisor(s) to `supervisors`, link via `thesis_supervisors`
|
||||
4. Set `orientation_id`, `ap_program_id`, `finality_id`
|
||||
5. Upload file to `thesis_files`
|
||||
6. Add keywords via `thesis_keywords`
|
||||
7. Set `submitted_at` timestamp
|
||||
|
||||
### Scenario 2: Admin Publishes Thesis
|
||||
1. Verify all required fields present
|
||||
2. Set `defense_date`
|
||||
3. Set `jury_points`
|
||||
4. Optional: add `context_note`
|
||||
5. Set `is_published = 1`
|
||||
6. Set `published_at = CURRENT_TIMESTAMP`
|
||||
|
||||
### Scenario 3: Public User Searches
|
||||
Query `v_theses_public` view with filters:
|
||||
- By year
|
||||
- By orientation
|
||||
- By keyword
|
||||
- By author name
|
||||
- Full-text search in title/synopsis
|
||||
|
||||
## 🛠️ Development Workflow
|
||||
|
||||
### Local Development
|
||||
1. Use `test.db` for development
|
||||
2. Create via `just init-test-db`
|
||||
3. Populate with `just create-fixtures`
|
||||
4. Test queries before deployment
|
||||
|
||||
### Schema Changes
|
||||
1. Update `schema.sql`
|
||||
2. Update `DATABASE_SPECIFICATION.md`
|
||||
3. Test on `test.db`
|
||||
4. Deploy to production (manual migration)
|
||||
|
||||
### Testing
|
||||
```bash
|
||||
# Run tests on local database
|
||||
just test-public-all
|
||||
|
||||
# Check database stats
|
||||
just stats-public
|
||||
```
|
||||
|
||||
## 📞 Need Help?
|
||||
|
||||
1. **Quick lookup** → Read `QUICK_SCHEMA_REFERENCE.md`
|
||||
2. **Complete details** → Read `DATABASE_SPECIFICATION.md`
|
||||
3. **Schema changes** → Follow format in this README
|
||||
4. **SQL examples** → Check `QUICK_SCHEMA_REFERENCE.md`
|
||||
|
||||
## 🔗 Related Documentation
|
||||
|
||||
- [Deployment Guide](../nginx/DEPLOYMENT_COMPLETE.md)
|
||||
- [Repository Structure](../REPOSITORY_STRUCTURE_ANALYSIS.md)
|
||||
- [Test Database Guide](../nginx/TEST_DATABASE_SETUP.md)
|
||||
887
storage/docs/DATABASE_SPECIFICATION.md
Normal file
887
storage/docs/DATABASE_SPECIFICATION.md
Normal file
@@ -0,0 +1,887 @@
|
||||
# Post-ERG Database Specification
|
||||
|
||||
Complete technical specification of the Post-ERG thesis database schema.
|
||||
|
||||
**Version:** 1.0
|
||||
**Database:** SQLite
|
||||
**Last Updated:** February 5, 2026
|
||||
|
||||
---
|
||||
|
||||
## 📋 Table of Contents
|
||||
|
||||
1. [Overview](#overview)
|
||||
2. [Entity Relationship Diagram](#entity-relationship-diagram)
|
||||
3. [Core Tables](#core-tables)
|
||||
4. [Lookup Tables](#lookup-tables)
|
||||
5. [Junction Tables](#junction-tables)
|
||||
6. [Support Tables](#support-tables)
|
||||
7. [Views](#views)
|
||||
8. [Indexes](#indexes)
|
||||
9. [Triggers](#triggers)
|
||||
10. [Data Types Reference](#data-types-reference)
|
||||
11. [Business Rules](#business-rules)
|
||||
12. [Sample Queries](#sample-queries)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
### Purpose
|
||||
Database for managing and publishing ERG final thesis projects (TFE - Travaux de Fin d'Études) and doctoral theses.
|
||||
|
||||
### Key Features
|
||||
- Multi-author thesis support
|
||||
- Multiple supervisors per thesis
|
||||
- Flexible format types (web, audio, video, print, etc.)
|
||||
- Access control (public, internal, restricted)
|
||||
- File attachment management
|
||||
- Keyword tagging system
|
||||
- Full-text search capability
|
||||
- Academic metadata tracking
|
||||
|
||||
### Database Size Estimates
|
||||
- **Expected records**: 100-500 theses/year
|
||||
- **Growth rate**: ~10-15% annually
|
||||
- **Average record size**: ~5KB (metadata only)
|
||||
- **File storage**: External (linked via file paths)
|
||||
|
||||
---
|
||||
|
||||
## Entity Relationship Diagram
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌──────────────────┐ ┌─────────────┐
|
||||
│ authors │◄──────│ thesis_authors │──────►│ theses │
|
||||
└─────────────┘ 1:N └──────────────────┘ N:1 └─────────────┘
|
||||
│
|
||||
┌─────────────┐ ┌──────────────────┐ │
|
||||
│supervisors │◄──────│thesis_supervisors│──────────────┘
|
||||
└─────────────┘ 1:N └──────────────────┘ N:1
|
||||
|
||||
┌─────────────┐ ┌──────────────────┐
|
||||
│ keywords │◄──────│ thesis_keywords │──────────────┐
|
||||
└─────────────┘ 1:N └──────────────────┘ N:1 │
|
||||
│
|
||||
┌─────────────┐ ┌──────────────────┐ │
|
||||
│ languages │◄──────│ thesis_languages │──────────────┤
|
||||
└─────────────┘ 1:N └──────────────────┘ N:1 │
|
||||
│
|
||||
┌─────────────┐ ┌──────────────────┐ │
|
||||
│format_types │◄──────│ thesis_formats │──────────────┤
|
||||
└─────────────┘ 1:N └──────────────────┘ N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│orientations │──────────────────────────────────────────┤
|
||||
└─────────────┘ 1:N N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│ ap_programs │──────────────────────────────────────────┤
|
||||
└─────────────┘ 1:N N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│finality_types│─────────────────────────────────────────┤
|
||||
└─────────────┘ 1:N N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│access_types │──────────────────────────────────────────┤
|
||||
└─────────────┘ 1:N N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│license_types│──────────────────────────────────────────┤
|
||||
└─────────────┘ 1:N N:1 │
|
||||
│
|
||||
┌─────────────┐ │
|
||||
│thesis_files │──────────────────────────────────────────┘
|
||||
└─────────────┘ N:1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Core Tables
|
||||
|
||||
### `theses`
|
||||
**Purpose:** Main table storing thesis/dissertation information.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `identifier` | TEXT | YES | NULL | Unique identifier (e.g., "2025-002") |
|
||||
| `title` | TEXT | NO | - | Thesis title |
|
||||
| `subtitle` | TEXT | YES | NULL | Optional subtitle |
|
||||
| `year` | INTEGER | NO | - | Academic year of submission |
|
||||
| `is_doctoral` | BOOLEAN | NO | 0 | 0 = TFE (Master), 1 = Doctoral thesis |
|
||||
| `orientation_id` | INTEGER | YES | NULL | FK to `orientations` |
|
||||
| `ap_program_id` | INTEGER | YES | NULL | FK to `ap_programs` (Ateliers Pratiques) |
|
||||
| `finality_id` | INTEGER | YES | NULL | FK to `finality_types` |
|
||||
| `synopsis` | TEXT | YES | NULL | ~200 word summary |
|
||||
| `context_note` | TEXT | YES | NULL | Note by jury president (max 150 words) |
|
||||
| `remarks` | TEXT | YES | NULL | Internal administrative remarks |
|
||||
| `duration_minutes` | INTEGER | YES | NULL | For audio/video works |
|
||||
| `duration_pages` | INTEGER | YES | NULL | For written works |
|
||||
| `file_size_info` | TEXT | YES | NULL | Human-readable size (e.g., "128 pages + 45 minutes") |
|
||||
| `access_type_id` | INTEGER | YES | NULL | FK to `access_types` |
|
||||
| `license_id` | INTEGER | YES | NULL | FK to `license_types` |
|
||||
| `jury_points` | DECIMAL(4,2) | YES | NULL | Grade out of 20 |
|
||||
| `jury_note_added` | BOOLEAN | NO | 0 | Whether jury added a context note |
|
||||
| `submitted_at` | DATETIME | YES | NULL | Student submission timestamp |
|
||||
| `defense_date` | DATETIME | YES | NULL | Date of thesis defense |
|
||||
| `published_at` | DATETIME | YES | NULL | Public publication timestamp |
|
||||
| `is_published` | BOOLEAN | NO | 0 | Publication status |
|
||||
| `baiu_link` | TEXT | YES | NULL | Link to institutional repository (BAIU) |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
| `updated_at` | DATETIME | NO | CURRENT_TIMESTAMP | Last update time |
|
||||
|
||||
**Indexes:**
|
||||
- `idx_theses_year` ON `year`
|
||||
- `idx_theses_published` ON `is_published`
|
||||
- `idx_theses_identifier` ON `identifier`
|
||||
- `idx_theses_orientation` ON `orientation_id`
|
||||
- `idx_theses_ap_program` ON `ap_program_id`
|
||||
- `idx_theses_access_type` ON `access_type_id`
|
||||
|
||||
**Constraints:**
|
||||
- `identifier` must be UNIQUE
|
||||
- `year` must be > 1950 (implicit validation)
|
||||
- `jury_points` must be between 0 and 20 (implicit validation)
|
||||
|
||||
---
|
||||
|
||||
### `authors`
|
||||
**Purpose:** Store student/author information.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Author full name |
|
||||
| `email` | TEXT | YES | NULL | Contact email |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
| `updated_at` | DATETIME | NO | CURRENT_TIMESTAMP | Last update time |
|
||||
|
||||
**Indexes:**
|
||||
- `idx_authors_email` ON `email`
|
||||
|
||||
**Notes:**
|
||||
- Same author can have multiple theses
|
||||
- Email is optional (privacy)
|
||||
- No uniqueness constraint on name (same names possible)
|
||||
|
||||
---
|
||||
|
||||
### `supervisors`
|
||||
**Purpose:** Store thesis supervisor/promoter information.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Supervisor full name |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
| `updated_at` | DATETIME | NO | CURRENT_TIMESTAMP | Last update time |
|
||||
|
||||
**Notes:**
|
||||
- Reusable across multiple theses
|
||||
- No email/contact info stored (administrative data)
|
||||
|
||||
---
|
||||
|
||||
## Lookup Tables
|
||||
|
||||
### `orientations`
|
||||
**Purpose:** Predefined list of artistic orientations.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Orientation name |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
1. Arts Numériques
|
||||
2. Dessin
|
||||
3. Cinéma d'animation
|
||||
4. Installation-Performance
|
||||
5. Peinture
|
||||
6. Photographie
|
||||
7. Sculpture
|
||||
8. Vidéographie
|
||||
9. Graphisme
|
||||
10. Typographie
|
||||
11. Design Numérique
|
||||
12. Illustration
|
||||
13. Bande-Dessinée
|
||||
14. Sérigraphie
|
||||
15. Gravure
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `ap_programs`
|
||||
**Purpose:** Practical workshops programs (Ateliers Pratiques).
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Program full name |
|
||||
| `code` | TEXT | YES | NULL | Short code/acronym |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
1. Narration Spéculative (no code)
|
||||
2. Design et Politique du Multiple (DPM)
|
||||
3. Atelier Pratiques Situées (APS)
|
||||
4. Lieux, Interdisciplinarités, Écologie, Nécessité, Systèmes (LIENS)
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `finality_types`
|
||||
**Purpose:** Master degree finality types.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Finality type name |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
1. Approfondi (Research-focused)
|
||||
2. Enseignement (Teaching)
|
||||
3. Spécialisé (Specialized)
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `languages`
|
||||
**Purpose:** Languages used in thesis.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Language name |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
1. Français
|
||||
2. Anglais
|
||||
|
||||
**Notes:**
|
||||
- Expandable if needed (Dutch, etc.)
|
||||
- Thesis can be multilingual (junction table)
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `format_types`
|
||||
**Purpose:** Physical/digital format types.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Format type name |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
1. Site web
|
||||
2. Audio
|
||||
3. Vidéo
|
||||
4. Performance
|
||||
5. Objet éditorial (printed matter)
|
||||
6. Installation
|
||||
7. Autre (other)
|
||||
|
||||
**Notes:**
|
||||
- Multiple formats per thesis allowed
|
||||
- "Autre" for edge cases
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `access_types`
|
||||
**Purpose:** Define thesis accessibility levels.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | Access type name |
|
||||
| `description` | TEXT | YES | NULL | Detailed description |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Predefined Values:**
|
||||
|
||||
| ID | Name | Description |
|
||||
|----|------|-------------|
|
||||
| 1 | Libre | Full access online and in library |
|
||||
| 2 | Interne | Physical access only; descriptive note online |
|
||||
| 3 | Interdit | No access; descriptive note online only |
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `license_types`
|
||||
**Purpose:** Creative Commons and other license types.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `name` | TEXT | NO | - | License name (e.g., "CC BY-SA 4.0") |
|
||||
| `description` | TEXT | YES | NULL | License description |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Expected Values:**
|
||||
- CC BY 4.0
|
||||
- CC BY-SA 4.0
|
||||
- CC BY-NC 4.0
|
||||
- CC BY-NC-SA 4.0
|
||||
- CC0 1.0
|
||||
- All Rights Reserved
|
||||
- Custom (text description)
|
||||
|
||||
**Constraints:**
|
||||
- `name` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
### `keywords`
|
||||
**Purpose:** Expandable keyword/tag list.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `keyword` | TEXT | NO | - | Keyword/tag text |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
|
||||
**Notes:**
|
||||
- Keywords are case-insensitive (normalized to lowercase)
|
||||
- Maximum 10 keywords per thesis (enforced in application)
|
||||
- Auto-created when first used
|
||||
- Can be reused across theses
|
||||
|
||||
**Constraints:**
|
||||
- `keyword` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
## Junction Tables
|
||||
|
||||
### `thesis_authors`
|
||||
**Purpose:** Many-to-many relationship between theses and authors.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `author_id` | INTEGER | NO | - | FK to `authors.id` |
|
||||
| `author_order` | INTEGER | NO | 1 | Display order (1, 2, 3...) |
|
||||
|
||||
**Primary Key:** (`thesis_id`, `author_id`)
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE (both FKs)
|
||||
|
||||
**Notes:**
|
||||
- Single author: `author_order = 1`
|
||||
- Multiple authors: ordered by `author_order`
|
||||
|
||||
---
|
||||
|
||||
### `thesis_supervisors`
|
||||
**Purpose:** Many-to-many relationship between theses and supervisors.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `supervisor_id` | INTEGER | NO | - | FK to `supervisors.id` |
|
||||
| `supervisor_order` | INTEGER | NO | 1 | Display order |
|
||||
|
||||
**Primary Key:** (`thesis_id`, `supervisor_id`)
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE (both FKs)
|
||||
|
||||
---
|
||||
|
||||
### `thesis_languages`
|
||||
**Purpose:** Many-to-many relationship between theses and languages.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `language_id` | INTEGER | NO | - | FK to `languages.id` |
|
||||
|
||||
**Primary Key:** (`thesis_id`, `language_id`)
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE (both FKs)
|
||||
|
||||
---
|
||||
|
||||
### `thesis_formats`
|
||||
**Purpose:** Many-to-many relationship between theses and format types.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `format_id` | INTEGER | NO | - | FK to `format_types.id` |
|
||||
|
||||
**Primary Key:** (`thesis_id`, `format_id`)
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE (both FKs)
|
||||
|
||||
---
|
||||
|
||||
### `thesis_keywords`
|
||||
**Purpose:** Many-to-many relationship between theses and keywords.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `keyword_id` | INTEGER | NO | - | FK to `keywords.id` |
|
||||
|
||||
**Primary Key:** (`thesis_id`, `keyword_id`)
|
||||
|
||||
**Indexes:**
|
||||
- `idx_thesis_keywords_thesis` ON `thesis_id`
|
||||
- `idx_thesis_keywords_keyword` ON `keyword_id`
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE (both FKs)
|
||||
|
||||
**Business Rules:**
|
||||
- Maximum 10 keywords per thesis (enforced in application layer)
|
||||
|
||||
---
|
||||
|
||||
## Support Tables
|
||||
|
||||
### `thesis_files`
|
||||
**Purpose:** Store file attachments for theses.
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `thesis_id` | INTEGER | NO | - | FK to `theses.id` |
|
||||
| `file_type` | TEXT | NO | - | Type: 'main', 'annex', 'written_part', 'other' |
|
||||
| `file_path` | TEXT | NO | - | Relative path to file |
|
||||
| `file_name` | TEXT | NO | - | Original filename |
|
||||
| `file_size` | INTEGER | YES | NULL | Size in bytes |
|
||||
| `mime_type` | TEXT | YES | NULL | MIME type (e.g., 'application/pdf') |
|
||||
| `description` | TEXT | YES | NULL | File description |
|
||||
| `uploaded_at` | DATETIME | NO | CURRENT_TIMESTAMP | Upload timestamp |
|
||||
|
||||
**Cascade Rules:**
|
||||
- ON DELETE CASCADE on `thesis_id`
|
||||
|
||||
**File Types:**
|
||||
- **main**: Primary thesis document (PDF, HTML, etc.)
|
||||
- **annex**: Supplementary materials
|
||||
- **written_part**: Written component of practice-based thesis
|
||||
- **other**: Additional files
|
||||
|
||||
**Notes:**
|
||||
- Files stored in `/var/www/html/formulaire/data/theses/`
|
||||
- Cover images stored in `/var/www/html/formulaire/data/covers/`
|
||||
|
||||
---
|
||||
|
||||
### `pages`
|
||||
**Purpose:** Static content management (About, Licenses, Contact, etc.).
|
||||
|
||||
| Column | Type | Null | Default | Description |
|
||||
|--------|------|------|---------|-------------|
|
||||
| `id` | INTEGER | NO | AUTOINCREMENT | Primary key |
|
||||
| `slug` | TEXT | NO | - | URL-friendly identifier |
|
||||
| `title` | TEXT | NO | - | Page title |
|
||||
| `content` | TEXT | YES | NULL | Page content (Markdown/HTML) |
|
||||
| `is_published` | BOOLEAN | NO | 1 | Publish status |
|
||||
| `created_at` | DATETIME | NO | CURRENT_TIMESTAMP | Record creation time |
|
||||
| `updated_at` | DATETIME | NO | CURRENT_TIMESTAMP | Last update time |
|
||||
|
||||
**Predefined Pages:**
|
||||
- `charte` - Site charter/policy
|
||||
- `about` - About page
|
||||
- `licenses` - License information
|
||||
- `contact` - Contact page
|
||||
|
||||
**Constraints:**
|
||||
- `slug` must be UNIQUE
|
||||
|
||||
---
|
||||
|
||||
## Views
|
||||
|
||||
### `v_theses_full`
|
||||
**Purpose:** Complete thesis information with all relationships joined.
|
||||
|
||||
**Columns:**
|
||||
- All columns from `theses`
|
||||
- `orientation` (TEXT) - Orientation name
|
||||
- `ap_program` (TEXT) - AP program name
|
||||
- `finality_type` (TEXT) - Finality type name
|
||||
- `access_type` (TEXT) - Access type name
|
||||
- `license_type` (TEXT) - License name
|
||||
- `authors` (TEXT) - Comma-separated author names
|
||||
- `supervisors` (TEXT) - Comma-separated supervisor names
|
||||
- `languages` (TEXT) - Comma-separated language names
|
||||
- `formats` (TEXT) - Comma-separated format names
|
||||
- `keywords` (TEXT) - Comma-separated keywords
|
||||
|
||||
**Usage:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_full WHERE id = 123;
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Uses `GROUP_CONCAT` for many-to-many relationships
|
||||
- Results are comma-delimited strings
|
||||
- May need post-processing for proper arrays
|
||||
|
||||
---
|
||||
|
||||
### `v_theses_public`
|
||||
**Purpose:** Published theses only (for public website).
|
||||
|
||||
**Definition:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_full WHERE is_published = 1;
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_public ORDER BY year DESC, title;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Indexes
|
||||
|
||||
### Performance Indexes
|
||||
|
||||
| Index Name | Table | Columns | Purpose |
|
||||
|------------|-------|---------|---------|
|
||||
| `idx_theses_year` | `theses` | `year` | Filter by year |
|
||||
| `idx_theses_published` | `theses` | `is_published` | Public/private filtering |
|
||||
| `idx_theses_identifier` | `theses` | `identifier` | Unique lookup |
|
||||
| `idx_theses_orientation` | `theses` | `orientation_id` | Filter by orientation |
|
||||
| `idx_theses_ap_program` | `theses` | `ap_program_id` | Filter by AP program |
|
||||
| `idx_theses_access_type` | `theses` | `access_type_id` | Access control |
|
||||
| `idx_authors_email` | `authors` | `email` | Author lookup |
|
||||
| `idx_thesis_authors_thesis` | `thesis_authors` | `thesis_id` | Join optimization |
|
||||
| `idx_thesis_authors_author` | `thesis_authors` | `author_id` | Join optimization |
|
||||
| `idx_thesis_keywords_thesis` | `thesis_keywords` | `thesis_id` | Join optimization |
|
||||
| `idx_thesis_keywords_keyword` | `thesis_keywords` | `keyword_id` | Keyword search |
|
||||
|
||||
---
|
||||
|
||||
## Triggers
|
||||
|
||||
### Timestamp Update Triggers
|
||||
|
||||
**`update_theses_timestamp`**
|
||||
```sql
|
||||
AFTER UPDATE ON theses
|
||||
UPDATE theses SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
```
|
||||
|
||||
**`update_authors_timestamp`**
|
||||
```sql
|
||||
AFTER UPDATE ON authors
|
||||
UPDATE authors SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
```
|
||||
|
||||
**`update_supervisors_timestamp`**
|
||||
```sql
|
||||
AFTER UPDATE ON supervisors
|
||||
UPDATE supervisors SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
```
|
||||
|
||||
**`update_pages_timestamp`**
|
||||
```sql
|
||||
AFTER UPDATE ON pages
|
||||
UPDATE pages SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Data Types Reference
|
||||
|
||||
### SQLite Data Types Used
|
||||
|
||||
| Type | SQLite Affinity | Description | Example Values |
|
||||
|------|----------------|-------------|----------------|
|
||||
| `INTEGER` | INTEGER | Signed integer | 1, 42, 2025 |
|
||||
| `TEXT` | TEXT | Variable-length text | "Title", "Name" |
|
||||
| `BOOLEAN` | INTEGER | 0 or 1 | 0 (false), 1 (true) |
|
||||
| `DATETIME` | TEXT | ISO8601 timestamp | "2025-02-05 12:00:00" |
|
||||
| `DECIMAL(4,2)` | REAL | Decimal number | 15.50, 18.75 |
|
||||
|
||||
### Boolean Convention
|
||||
- `FALSE` = 0
|
||||
- `TRUE` = 1
|
||||
- NULL = undefined/not set
|
||||
|
||||
---
|
||||
|
||||
## Business Rules
|
||||
|
||||
### Thesis Submission Workflow
|
||||
|
||||
1. **Draft Creation** (`is_published = 0`)
|
||||
- Student creates initial entry
|
||||
- Required fields: title, year, at least one author
|
||||
|
||||
2. **Complete Metadata**
|
||||
- Add orientation, AP program, finality
|
||||
- Upload files
|
||||
- Add keywords (max 10)
|
||||
- Set languages, formats
|
||||
|
||||
3. **Submission** (`submitted_at` set)
|
||||
- Student marks as ready for review
|
||||
- Email notification to administrators
|
||||
|
||||
4. **Defense** (`defense_date` set)
|
||||
- After thesis defense
|
||||
- Jury adds grade (`jury_points`)
|
||||
- Optional context note by jury president
|
||||
|
||||
5. **Publication** (`is_published = 1`, `published_at` set)
|
||||
- Administrator approves
|
||||
- Appears on public website
|
||||
- Respects `access_type` rules
|
||||
|
||||
### Data Validation Rules
|
||||
|
||||
**Required Fields (for publication):**
|
||||
- `title`
|
||||
- `year`
|
||||
- At least one author (via `thesis_authors`)
|
||||
- `orientation_id`
|
||||
- `access_type_id`
|
||||
|
||||
**Optional but Recommended:**
|
||||
- `synopsis` (~200 words)
|
||||
- `keywords` (3-10 recommended)
|
||||
- At least one file attachment
|
||||
- `license_id`
|
||||
|
||||
**Constraints:**
|
||||
- `year`: Must be ≥ 1950
|
||||
- `jury_points`: 0.00 to 20.00
|
||||
- `keywords`: Maximum 10 per thesis
|
||||
- `author_order`: Must be sequential (1, 2, 3...)
|
||||
- `identifier`: Unique across all theses
|
||||
|
||||
### Access Control Rules
|
||||
|
||||
| Access Type | Public View | Library Access | File Download |
|
||||
|-------------|-------------|----------------|---------------|
|
||||
| **Libre** | Full metadata + abstract | Yes | Yes |
|
||||
| **Interne** | Metadata + descriptive note | Physical only | No |
|
||||
| **Interdit** | Metadata + descriptive note | No | No |
|
||||
|
||||
---
|
||||
|
||||
## Sample Queries
|
||||
|
||||
### Common Queries
|
||||
|
||||
**Get all published theses from 2025:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_public
|
||||
WHERE year = 2025
|
||||
ORDER BY title;
|
||||
```
|
||||
|
||||
**Find theses by author name:**
|
||||
```sql
|
||||
SELECT t.* FROM theses t
|
||||
JOIN thesis_authors ta ON t.id = ta.thesis_id
|
||||
JOIN authors a ON ta.author_id = a.id
|
||||
WHERE a.name LIKE '%Dupont%'
|
||||
AND t.is_published = 1;
|
||||
```
|
||||
|
||||
**Get thesis with all relationships:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_full WHERE id = 42;
|
||||
```
|
||||
|
||||
**List theses by orientation:**
|
||||
```sql
|
||||
SELECT t.title, t.year, o.name as orientation
|
||||
FROM theses t
|
||||
JOIN orientations o ON t.orientation_id = o.id
|
||||
WHERE o.name = 'Arts Numériques'
|
||||
AND t.is_published = 1
|
||||
ORDER BY t.year DESC;
|
||||
```
|
||||
|
||||
**Full-text search in titles and synopses:**
|
||||
```sql
|
||||
SELECT * FROM v_theses_public
|
||||
WHERE title LIKE '%design%'
|
||||
OR synopsis LIKE '%design%'
|
||||
ORDER BY year DESC;
|
||||
```
|
||||
|
||||
**Get theses by keyword:**
|
||||
```sql
|
||||
SELECT DISTINCT t.* FROM theses t
|
||||
JOIN thesis_keywords tk ON t.id = tk.thesis_id
|
||||
JOIN keywords k ON tk.keyword_id = k.id
|
||||
WHERE k.keyword = 'écologie'
|
||||
AND t.is_published = 1;
|
||||
```
|
||||
|
||||
**Count theses per year:**
|
||||
```sql
|
||||
SELECT year, COUNT(*) as count
|
||||
FROM theses
|
||||
WHERE is_published = 1
|
||||
GROUP BY year
|
||||
ORDER BY year DESC;
|
||||
```
|
||||
|
||||
**Get theses with files:**
|
||||
```sql
|
||||
SELECT t.title, tf.file_name, tf.file_type
|
||||
FROM theses t
|
||||
JOIN thesis_files tf ON t.id = tf.thesis_id
|
||||
WHERE t.is_published = 1
|
||||
ORDER BY t.title;
|
||||
```
|
||||
|
||||
**Find theses without keywords:**
|
||||
```sql
|
||||
SELECT t.* FROM theses t
|
||||
LEFT JOIN thesis_keywords tk ON t.id = tk.thesis_id
|
||||
WHERE tk.thesis_id IS NULL
|
||||
AND t.is_published = 1;
|
||||
```
|
||||
|
||||
### Administrative Queries
|
||||
|
||||
**Recently submitted theses (pending review):**
|
||||
```sql
|
||||
SELECT title, submitted_at
|
||||
FROM theses
|
||||
WHERE submitted_at IS NOT NULL
|
||||
AND is_published = 0
|
||||
ORDER BY submitted_at DESC;
|
||||
```
|
||||
|
||||
**Theses missing required metadata:**
|
||||
```sql
|
||||
SELECT id, title, year
|
||||
FROM theses
|
||||
WHERE (orientation_id IS NULL
|
||||
OR access_type_id IS NULL
|
||||
OR id NOT IN (SELECT thesis_id FROM thesis_authors))
|
||||
AND is_published = 0;
|
||||
```
|
||||
|
||||
**Most used keywords:**
|
||||
```sql
|
||||
SELECT k.keyword, COUNT(*) as usage_count
|
||||
FROM keywords k
|
||||
JOIN thesis_keywords tk ON k.id = tk.keyword_id
|
||||
GROUP BY k.keyword
|
||||
ORDER BY usage_count DESC
|
||||
LIMIT 20;
|
||||
```
|
||||
|
||||
**Theses by supervisor:**
|
||||
```sql
|
||||
SELECT s.name as supervisor, COUNT(*) as thesis_count
|
||||
FROM supervisors s
|
||||
JOIN thesis_supervisors ts ON s.id = ts.supervisor_id
|
||||
JOIN theses t ON ts.thesis_id = t.id
|
||||
WHERE t.is_published = 1
|
||||
GROUP BY s.name
|
||||
ORDER BY thesis_count DESC;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Making Schema Changes
|
||||
|
||||
### How to Request Changes
|
||||
|
||||
When requesting schema changes, please specify:
|
||||
|
||||
1. **What needs to change**
|
||||
- Table name
|
||||
- Column name(s)
|
||||
- Relationship
|
||||
|
||||
2. **Type of change**
|
||||
- Add new table
|
||||
- Add new column
|
||||
- Modify existing column
|
||||
- Remove column/table
|
||||
- Change relationship
|
||||
|
||||
3. **Why it's needed**
|
||||
- Use case
|
||||
- Business requirement
|
||||
- Performance issue
|
||||
|
||||
4. **Example data**
|
||||
- Sample values
|
||||
- Expected format
|
||||
|
||||
### Example Change Request
|
||||
|
||||
```
|
||||
**Change Request:** Add support for thesis awards/distinctions
|
||||
|
||||
**Type:** Add new table + relationship
|
||||
|
||||
**Reason:** Need to track prizes and awards given to theses
|
||||
(e.g., "Best TFE 2025", "Jury Prize")
|
||||
|
||||
**Proposed Structure:**
|
||||
- Table: `awards`
|
||||
- id (INT, PK)
|
||||
- name (TEXT) - Award name
|
||||
- description (TEXT) - Award description
|
||||
- year (INT) - Year established
|
||||
|
||||
- Table: `thesis_awards`
|
||||
- thesis_id (INT, FK)
|
||||
- award_id (INT, FK)
|
||||
- awarded_date (DATETIME)
|
||||
|
||||
**Example Data:**
|
||||
- "Prix du Jury 2025"
|
||||
- "Meilleur TFE Arts Numériques"
|
||||
- "Prix de l'Innovation"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Version History
|
||||
|
||||
| Version | Date | Changes |
|
||||
|---------|------|---------|
|
||||
| 1.0 | 2026-02-05 | Initial specification document |
|
||||
|
||||
---
|
||||
|
||||
**For questions or change requests, reference this document and provide:**
|
||||
- Section name
|
||||
- Table/column affected
|
||||
- Desired outcome
|
||||
- Example use case
|
||||
206
storage/docs/QUICK_SCHEMA_REFERENCE.md
Normal file
206
storage/docs/QUICK_SCHEMA_REFERENCE.md
Normal file
@@ -0,0 +1,206 @@
|
||||
# Database Quick Reference
|
||||
|
||||
Quick lookup for the Post-ERG database schema.
|
||||
|
||||
## 📊 Table Summary
|
||||
|
||||
| Table | Type | Records | Description |
|
||||
|-------|------|---------|-------------|
|
||||
| `theses` | Core | ~500/year | Main thesis records |
|
||||
| `authors` | Core | ~600 | Student/author info |
|
||||
| `supervisors` | Core | ~50 | Thesis supervisors |
|
||||
| `thesis_authors` | Junction | ~550/year | Thesis ↔ Authors |
|
||||
| `thesis_supervisors` | Junction | ~600/year | Thesis ↔ Supervisors |
|
||||
| `thesis_languages` | Junction | ~550/year | Thesis ↔ Languages |
|
||||
| `thesis_formats` | Junction | ~700/year | Thesis ↔ Formats |
|
||||
| `thesis_keywords` | Junction | ~3000/year | Thesis ↔ Keywords |
|
||||
| `thesis_files` | Support | ~800/year | File attachments |
|
||||
| `orientations` | Lookup | 15 | Art orientations |
|
||||
| `ap_programs` | Lookup | 4 | Workshop programs |
|
||||
| `finality_types` | Lookup | 3 | Master finalities |
|
||||
| `languages` | Lookup | 2+ | Languages |
|
||||
| `format_types` | Lookup | 7 | Media formats |
|
||||
| `access_types` | Lookup | 3 | Access levels |
|
||||
| `license_types` | Lookup | ~10 | Creative Commons |
|
||||
| `keywords` | Lookup | ~500+ | Tag system |
|
||||
| `pages` | Support | 4 | Static pages |
|
||||
|
||||
## 🔑 Key Relationships
|
||||
|
||||
```
|
||||
theses ──┬── 1:N ──► thesis_authors ──► N:1 ── authors
|
||||
├── 1:N ──► thesis_supervisors ──► N:1 ── supervisors
|
||||
├── 1:N ──► thesis_keywords ──► N:1 ── keywords
|
||||
├── 1:N ──► thesis_languages ──► N:1 ── languages
|
||||
├── 1:N ──► thesis_formats ──► N:1 ── format_types
|
||||
├── 1:N ──► thesis_files
|
||||
├── N:1 ──► orientations
|
||||
├── N:1 ──► ap_programs
|
||||
├── N:1 ──► finality_types
|
||||
├── N:1 ──► access_types
|
||||
└── N:1 ──► license_types
|
||||
```
|
||||
|
||||
## 📝 Core Fields Reference
|
||||
|
||||
### `theses` (Main Table)
|
||||
|
||||
**Identity:**
|
||||
- `id` - Primary key
|
||||
- `identifier` - Human-readable ID (e.g., "2025-002")
|
||||
|
||||
**Basic Info:**
|
||||
- `title` - Thesis title (required)
|
||||
- `subtitle` - Optional subtitle
|
||||
- `year` - Academic year (required)
|
||||
- `is_doctoral` - TFE (0) or Doctoral (1)
|
||||
|
||||
**Academic:**
|
||||
- `orientation_id` - Art orientation
|
||||
- `ap_program_id` - Workshop program
|
||||
- `finality_id` - Master finality type
|
||||
|
||||
**Content:**
|
||||
- `synopsis` - ~200 word summary
|
||||
- `context_note` - Jury note (max 150 words)
|
||||
- `duration_minutes` - For audio/video
|
||||
- `duration_pages` - For written works
|
||||
|
||||
**Access:**
|
||||
- `access_type_id` - Public/Internal/Restricted
|
||||
- `license_id` - Creative Commons, etc.
|
||||
|
||||
**Workflow:**
|
||||
- `submitted_at` - Student submission
|
||||
- `defense_date` - Defense date
|
||||
- `is_published` - Public visibility
|
||||
- `published_at` - Publication date
|
||||
- `jury_points` - Grade (0-20)
|
||||
|
||||
## 🏷️ Lookup Values
|
||||
|
||||
### Orientations (15)
|
||||
Arts Numériques, Dessin, Cinéma d'animation, Installation-Performance, Peinture, Photographie, Sculpture, Vidéographie, Graphisme, Typographie, Design Numérique, Illustration, Bande-Dessinée, Sérigraphie, Gravure
|
||||
|
||||
### AP Programs (4)
|
||||
- Narration Spéculative
|
||||
- Design et Politique du Multiple (DPM)
|
||||
- Atelier Pratiques Situées (APS)
|
||||
- Lieux, Interdisciplinarités, Écologie, Nécessité, Systèmes (LIENS)
|
||||
|
||||
### Finality Types (3)
|
||||
Approfondi, Enseignement, Spécialisé
|
||||
|
||||
### Languages (2+)
|
||||
Français, Anglais
|
||||
|
||||
### Format Types (7)
|
||||
Site web, Audio, Vidéo, Performance, Objet éditorial, Installation, Autre
|
||||
|
||||
### Access Types (3)
|
||||
- **Libre**: Full access online + library
|
||||
- **Interne**: Library only, note online
|
||||
- **Interdit**: No access, note only
|
||||
|
||||
## 🔍 Common Queries
|
||||
|
||||
### Get Published Theses
|
||||
```sql
|
||||
SELECT * FROM v_theses_public ORDER BY year DESC;
|
||||
```
|
||||
|
||||
### Get Thesis by ID
|
||||
```sql
|
||||
SELECT * FROM v_theses_full WHERE id = ?;
|
||||
```
|
||||
|
||||
### Search by Title
|
||||
```sql
|
||||
SELECT * FROM v_theses_public
|
||||
WHERE title LIKE '%keyword%'
|
||||
ORDER BY year DESC;
|
||||
```
|
||||
|
||||
### Filter by Year
|
||||
```sql
|
||||
SELECT * FROM v_theses_public
|
||||
WHERE year = 2025
|
||||
ORDER BY title;
|
||||
```
|
||||
|
||||
### Filter by Orientation
|
||||
```sql
|
||||
SELECT t.* FROM theses t
|
||||
JOIN orientations o ON t.orientation_id = o.id
|
||||
WHERE o.name = 'Arts Numériques'
|
||||
AND t.is_published = 1;
|
||||
```
|
||||
|
||||
### Get Author's Theses
|
||||
```sql
|
||||
SELECT t.* FROM theses t
|
||||
JOIN thesis_authors ta ON t.id = ta.thesis_id
|
||||
JOIN authors a ON ta.author_id = a.id
|
||||
WHERE a.name LIKE '%name%'
|
||||
AND t.is_published = 1;
|
||||
```
|
||||
|
||||
### Get Keywords for Thesis
|
||||
```sql
|
||||
SELECT k.keyword FROM keywords k
|
||||
JOIN thesis_keywords tk ON k.id = tk.keyword_id
|
||||
WHERE tk.thesis_id = ?;
|
||||
```
|
||||
|
||||
### Count by Year
|
||||
```sql
|
||||
SELECT year, COUNT(*) as count
|
||||
FROM theses
|
||||
WHERE is_published = 1
|
||||
GROUP BY year
|
||||
ORDER BY year DESC;
|
||||
```
|
||||
|
||||
## 📌 Important Constraints
|
||||
|
||||
- **Unique:** `theses.identifier`, `authors.email`, all lookup table names
|
||||
- **Required:** `theses.title`, `theses.year`, at least one author
|
||||
- **Max:** 10 keywords per thesis
|
||||
- **Range:** `jury_points` 0.00 - 20.00
|
||||
- **Cascade:** All junction tables DELETE CASCADE
|
||||
|
||||
## 🎯 Views
|
||||
|
||||
### `v_theses_full`
|
||||
Complete thesis data with all relationships (comma-separated).
|
||||
|
||||
### `v_theses_public`
|
||||
Only published theses (`is_published = 1`).
|
||||
|
||||
## 🔧 Making Changes
|
||||
|
||||
**Format for change requests:**
|
||||
|
||||
```
|
||||
Table: [table_name]
|
||||
Change: [add/modify/remove]
|
||||
Column: [column_name]
|
||||
Type: [data_type]
|
||||
Reason: [why needed]
|
||||
Example: [sample data]
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
||||
```
|
||||
Table: theses
|
||||
Change: add
|
||||
Column: external_url
|
||||
Type: TEXT
|
||||
Reason: Link to external project website
|
||||
Example: https://example.com/project
|
||||
```
|
||||
|
||||
## 📚 Full Documentation
|
||||
|
||||
See `DATABASE_SPECIFICATION.md` for complete details.
|
||||
1375
storage/docs/SETUP.md
Normal file
1375
storage/docs/SETUP.md
Normal file
File diff suppressed because it is too large
Load Diff
170
storage/docs/posterg_fiche-technique.md
Normal file
170
storage/docs/posterg_fiche-technique.md
Normal file
@@ -0,0 +1,170 @@
|
||||
|
||||
# Fiche technique
|
||||
|
||||
## Différentes catégories / métadonnées
|
||||
|
||||
**• Titre du TFE**
|
||||
|
||||
**• Sous-titre (si applicable)**
|
||||
|
||||
**• Auteur·ice(s)**
|
||||
|
||||
**• Contact (optionnel) [mail/site/insta/etc.]**
|
||||
|
||||
**• Promoteur·ice(s)**
|
||||
|
||||
**• Année**
|
||||
|
||||
**• Orientation [liste prédéfinie]**
|
||||
|
||||
* Arts Numériques / Dessin / Cinéma d'animation / Installation-Performance / Peinture / Photographie / Sculpture / Vidéographie / Graphisme / Typographie / Design Numérique / Illustration / Bande-Dessinés / Sérigraphie / Gravure
|
||||
**• AP [liste prédéfinie]**
|
||||
|
||||
* Narration Spéculative / Design et Politique du Multiple [DPM] / Atelier Pratiques Situées [APS] / Lieux, Interdisciplinarités, Écologie, Nécessité, Systèmes [L.I.E.N.S.]
|
||||
**• Finalité du master [liste prédéfinie]**
|
||||
|
||||
* Approfondi / Enseignement /Spécialisé
|
||||
**• Langue du TFE [liste prédéfinie + option de créer des nouvelles langues]**
|
||||
|
||||
* Français / Anglais / autre : [imput] —> possible d'en sélectionner plusieurs en même temps
|
||||
**• Format [liste pré-définie + une case autre "fourre-tout"]**
|
||||
|
||||
* Site web / Audio / Vidéo / Performance / Objet éditorial / Installation / Etc. / Autre
|
||||
* —> possible d'en sélectionner plusieurs en même temps
|
||||
**• Mots-clés (max 10) [liste avec les mots clés déjà existants + option d'en créer des nouveaux]**
|
||||
|
||||
* spéculation / narration / urbanisme / patrimoine / intime / collectivité / film / cinéma / sociologie / anthropologie / éphémérité / queer / écriture / poésie / écologies affectives / technologies / autre : [imput]
|
||||
**• Synopsis (environ 200 mots ; pas nécessairement de max – à voir si c'est nécessaire côté technique)**
|
||||
|
||||
**• Durée du TFE (si applicable) [faire en choix entre minutes/pages : [imput]]**
|
||||
|
||||
|
||||
|
||||
**• J'autorise l'erg à archiver mon TFE de la manière suivante ;**
|
||||
|
||||
[]x Libre ;[] mon TFE est en libre accès à tout le monde sur la plateforme des TFE ainsi que dans la bibliothèque de l'erg.
|
||||
|
||||
[]x Interne ;[] mon TFE n'est accessible que sur place en physique. Une note descriptive est disponible sur le site.
|
||||
|
||||
[]x Interdit ;[] mon TFE n'est pas disponible en physique ni sur le site. Une note descriptive est disponible sur le site.
|
||||
|
||||
L'étudiant·e peut, à tout moment, décider de restreindre son propre choix. Iel ne peut par contre pas l'ouvrir.
|
||||
|
||||
|
||||
|
||||
**• Licence du TFE ; dropdown avec plusieurs choix pré-établis + ouverture pour en donner d'autres ?**
|
||||
|
||||
* Les options précises sont encore au travail.
|
||||
|
||||
|
||||
**• Upload du TFE**
|
||||
|
||||
**• Upload des annexes éventuelles**
|
||||
|
||||
**• Upload de la partie écrite**
|
||||
|
||||
|
||||
|
||||
**• Système pour que læ président·e du jury puisse rajouter une note de max 150 mots qui contextualiserait le TFE.**
|
||||
|
||||
**• Points du jury**
|
||||
|
||||
|
||||
|
||||
[]/!\ Quand l'étudiant·e dépose le TFE, celui-ci ne doit pas immédiatement être publié. Il faut attendre que la soutenance ait eu lieu et que læ président·e puisse éventuellement y ajouter un texte ainsi que les points. []
|
||||
|
||||
[]—> trouver un système pour rendre ça le plus fluide possible pour læ présidant·e ainsi que l'étudiant·e.[]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Design
|
||||
|
||||
• Prévoir un « onglet » Charte / à propos (texte à venir – doit être facile à adapter sans avoir à coder).
|
||||
|
||||
• Prévoir un « onglet » licences (texte à venir – doit être facile à adapter sans avoir à coder).
|
||||
|
||||
• Prévoir un « onglet » contact (texte à venir – doit être facile à adapter sans avoir à coder).
|
||||
|
||||
• Il faut prévoir un espace ou quelque chose pour différencier les thèses (doctorats) des TFE.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Points importants
|
||||
|
||||
• Important que le "back-office" soit accessible / pas trop complexe pour qu'on puisse adapter, supprimer, ajouter, corriger les données des TFE (relativement) facilement.
|
||||
|
||||
|
||||
|
||||
• Important que le texte des différents onglets soit éditable (relativement) facilement.
|
||||
|
||||
|
||||
|
||||
• Important que le statut de monstration "libre", "interne", "interdit" soit facilement changeable.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Création Base de Données
|
||||
|
||||
• Engagement début décembre
|
||||
|
||||
* Min 5h/semaine à horaire libre
|
||||
* On espère qu'un premier draft de base donnée arrivera mi-décembre pour pouvoir expérimenter avec. On vous enverra un fichier csv dès qu'on a une base solide.
|
||||
|
||||
|
||||
• Collecte et assemblage des différentes années (au moins 2 ans – idéalement tout [lol])
|
||||
|
||||
* —> il faudra demander aux ancien·nes étudiant·es s'iels sont d'accord que leurs données soient publiées. Un mail sera envoyé après la récolte.
|
||||
* —> voir avec Karim ce qu'on a le droit de montrer s'il n'y a pas de réponse (fiche descriptive, TFE en physique ?)
|
||||
|
||||
|
||||
• Établir une liste de mots clés prédéfinis / voir s'il y a des lacunes et/ou problèmes quelque part
|
||||
|
||||
|
||||
|
||||
• On est au travail pour la partie doctorats. On vous tient au courant dès qu'il y a plus d'informations à ce sujet.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Technique
|
||||
|
||||
• Hébergement et intégration avec les outils existants à voir avec Joan.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Retroplanning
|
||||
|
||||
• Mi-décembre ; envoi d'un semblant de base de donnée pour permettre à l'équipe posterg d'expérimenter
|
||||
|
||||
• Journées pédagogiques du 15 \& 16 janvier ; travail sur les TFE, la place du jury dans sa publication etc.
|
||||
|
||||
• Mi-février ; envoi d'un mail aux ancien·nes étudiant·es et aux profs en vue de la publication digitale des TFE
|
||||
|
||||
• Mi-février ; finalisation de la maquette du site Post-ERG
|
||||
|
||||
• Mi-mars ; base de donnée des ancien·nes étudiant·es finalisée (fichier .cvs)
|
||||
|
||||
• Mi-avril ; date de remise du projet – site finalisé
|
||||
|
||||
• Début mai ; mise en ligne du site
|
||||
|
||||
• Mi-mai ; dépôt des TFE de 1e session (les TFE ne sont pas publiés publiquement à ce moment)
|
||||
|
||||
• Mi-juin ; publication publique des TFE (après éventuelle note du jury)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
253
storage/fixtures/CreateTestDatabase.php
Normal file
253
storage/fixtures/CreateTestDatabase.php
Normal file
@@ -0,0 +1,253 @@
|
||||
<?php
|
||||
/**
|
||||
* Script to create a test database with sample data
|
||||
* Run this script once to set up test.db for development
|
||||
*/
|
||||
|
||||
$dbPath = __DIR__ . '/../test.db';
|
||||
|
||||
// Remove existing database if it exists
|
||||
if (file_exists($dbPath)) {
|
||||
unlink($dbPath);
|
||||
echo "Removed existing test database\n";
|
||||
}
|
||||
|
||||
try {
|
||||
// Create database connection
|
||||
$pdo = new PDO('sqlite:' . $dbPath);
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
echo "Created new database: $dbPath\n";
|
||||
|
||||
// Read and execute schema
|
||||
$schemaPath = __DIR__ . '/../schema.sql';
|
||||
if (!file_exists($schemaPath)) {
|
||||
throw new Exception("Schema file not found: $schemaPath");
|
||||
}
|
||||
|
||||
$schema = file_get_contents($schemaPath);
|
||||
$pdo->exec($schema);
|
||||
echo "Schema created successfully\n";
|
||||
|
||||
// Insert sample authors
|
||||
$authors = [
|
||||
['name' => 'Marie Dubois', 'email' => 'marie.dubois@example.com'],
|
||||
['name' => 'Jean Martin', 'email' => 'jean.martin@example.com'],
|
||||
['name' => 'Sophie Bernard', 'email' => 'sophie.bernard@example.com'],
|
||||
['name' => 'Lucas Petit', 'email' => 'lucas.petit@example.com'],
|
||||
['name' => 'Emma Leroy', 'email' => 'emma.leroy@example.com'],
|
||||
];
|
||||
|
||||
foreach ($authors as $author) {
|
||||
$stmt = $pdo->prepare("INSERT INTO authors (name, email) VALUES (:name, :email)");
|
||||
$stmt->execute($author);
|
||||
}
|
||||
echo "Inserted " . count($authors) . " sample authors\n";
|
||||
|
||||
// Insert sample supervisors
|
||||
$supervisors = [
|
||||
['name' => 'Prof. Claire Fontaine'],
|
||||
['name' => 'Dr. Thomas Moreau'],
|
||||
['name' => 'Prof. Anne Laurent'],
|
||||
];
|
||||
|
||||
foreach ($supervisors as $supervisor) {
|
||||
$stmt = $pdo->prepare("INSERT INTO supervisors (name) VALUES (:name)");
|
||||
$stmt->execute($supervisor);
|
||||
}
|
||||
echo "Inserted " . count($supervisors) . " sample supervisors\n";
|
||||
|
||||
// Insert sample keywords
|
||||
$sampleKeywords = [
|
||||
'spéculation', 'narration', 'urbanisme', 'patrimoine', 'intime',
|
||||
'collectivité', 'film', 'cinéma', 'sociologie', 'anthropologie',
|
||||
'éphémérité', 'queer', 'écriture', 'poésie', 'écologie',
|
||||
'technologies', 'design', 'performance', 'installation', 'art numérique'
|
||||
];
|
||||
|
||||
foreach ($sampleKeywords as $keyword) {
|
||||
$stmt = $pdo->prepare("INSERT INTO keywords (keyword) VALUES (:keyword)");
|
||||
$stmt->execute(['keyword' => $keyword]);
|
||||
}
|
||||
echo "Inserted " . count($sampleKeywords) . " sample keywords\n";
|
||||
|
||||
// Insert sample theses
|
||||
$theses = [
|
||||
[
|
||||
'identifier' => '2024-001',
|
||||
'title' => 'Espaces Urbains et Narration Collective',
|
||||
'subtitle' => 'Une exploration des récits de la ville',
|
||||
'year' => 2024,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 1, // Arts Numériques
|
||||
'ap_program_id' => 1, // Narration Spéculative
|
||||
'finality_id' => 1, // Approfondi
|
||||
'synopsis' => 'Ce travail explore la manière dont les espaces urbains génèrent des récits collectifs. À travers une série d\'installations vidéo et sonores, je documente les histoires cachées des quartiers en transformation. Le projet interroge la mémoire collective et la façon dont l\'architecture influence nos récits personnels et communautaires.',
|
||||
'access_type_id' => 1, // Libre
|
||||
'is_published' => 1,
|
||||
],
|
||||
[
|
||||
'identifier' => '2024-002',
|
||||
'title' => 'Corps et Technologies',
|
||||
'subtitle' => 'Interfaces sensorielles',
|
||||
'year' => 2024,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 4, // Installation-Performance
|
||||
'ap_program_id' => 2, // Design et Politique du Multiple
|
||||
'finality_id' => 1, // Approfondi
|
||||
'synopsis' => 'Cette recherche artistique examine la relation entre le corps humain et les technologies numériques. À travers des performances interactives, j\'explore comment les interfaces technologiques transforment notre perception corporelle et créent de nouvelles formes de présence. Le projet questionne l\'hybridation entre organique et numérique.',
|
||||
'access_type_id' => 1, // Libre
|
||||
'is_published' => 1,
|
||||
],
|
||||
[
|
||||
'identifier' => '2024-003',
|
||||
'title' => 'Poétiques du Quotidien',
|
||||
'subtitle' => NULL,
|
||||
'year' => 2024,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 6, // Photographie
|
||||
'ap_program_id' => 3, // Atelier Pratiques Situées
|
||||
'finality_id' => 2, // Enseignement
|
||||
'synopsis' => 'Ce projet photographique documente les gestes ordinaires et les moments éphémères du quotidien. En utilisant une approche documentaire mêlée de fiction, je cherche à révéler la poésie cachée dans les rituels banals. Le travail questionne notre rapport au temps et à l\'attention dans un monde accéléré.',
|
||||
'access_type_id' => 1, // Libre
|
||||
'is_published' => 1,
|
||||
],
|
||||
[
|
||||
'identifier' => '2023-015',
|
||||
'title' => 'Écologies Affectives',
|
||||
'subtitle' => 'Cartographies sensibles des liens',
|
||||
'year' => 2023,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 9, // Graphisme
|
||||
'ap_program_id' => 4, // LIENS
|
||||
'finality_id' => 1, // Approfondi
|
||||
'synopsis' => 'Ce travail de design graphique développe une méthodologie visuelle pour cartographier les relations affectives et les réseaux de soin. À travers des visualisations de données sensibles et des éditions expérimentales, le projet explore comment représenter l\'invisible des liens humains et des solidarités.',
|
||||
'access_type_id' => 1, // Libre
|
||||
'is_published' => 1,
|
||||
],
|
||||
[
|
||||
'identifier' => '2023-020',
|
||||
'title' => 'Mémoires Spéculatives',
|
||||
'subtitle' => 'Archives du futur',
|
||||
'year' => 2023,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 10, // Typographie
|
||||
'ap_program_id' => 1, // Narration Spéculative
|
||||
'finality_id' => 3, // Spécialisé
|
||||
'synopsis' => 'Un projet éditorial qui imagine des archives futures à partir de traces présentes. En utilisant la typographie comme outil de spéculation temporelle, je crée des documents fictionnels qui interrogent notre rapport à l\'histoire et à la transmission. Le travail questionne la matérialité de la mémoire.',
|
||||
'access_type_id' => 2, // Interne
|
||||
'is_published' => 1,
|
||||
],
|
||||
[
|
||||
'identifier' => '2025-002',
|
||||
'title' => 'Performance et Politique du Geste',
|
||||
'subtitle' => NULL,
|
||||
'year' => 2025,
|
||||
'is_doctoral' => 0,
|
||||
'orientation_id' => 4, // Installation-Performance
|
||||
'ap_program_id' => 3, // Atelier Pratiques Situées
|
||||
'finality_id' => 1, // Approfondi
|
||||
'synopsis' => 'Cette recherche performative explore la dimension politique des gestes quotidiens. À travers une série de performances filmées, j\'examine comment les micro-actions peuvent constituer des formes de résistance. Le projet s\'intéresse aux corps en mouvement et à leur capacité à transformer l\'espace public.',
|
||||
'access_type_id' => 1, // Libre
|
||||
'is_published' => 1,
|
||||
],
|
||||
];
|
||||
|
||||
foreach ($theses as $thesis) {
|
||||
$columns = implode(', ', array_keys($thesis));
|
||||
$placeholders = ':' . implode(', :', array_keys($thesis));
|
||||
$stmt = $pdo->prepare("INSERT INTO theses ($columns) VALUES ($placeholders)");
|
||||
$stmt->execute($thesis);
|
||||
}
|
||||
echo "Inserted " . count($theses) . " sample theses\n";
|
||||
|
||||
// Link authors to theses
|
||||
$thesisAuthors = [
|
||||
['thesis_id' => 1, 'author_id' => 1, 'author_order' => 1],
|
||||
['thesis_id' => 2, 'author_id' => 2, 'author_order' => 1],
|
||||
['thesis_id' => 3, 'author_id' => 3, 'author_order' => 1],
|
||||
['thesis_id' => 4, 'author_id' => 4, 'author_order' => 1],
|
||||
['thesis_id' => 5, 'author_id' => 5, 'author_order' => 1],
|
||||
['thesis_id' => 6, 'author_id' => 1, 'author_order' => 1],
|
||||
];
|
||||
|
||||
foreach ($thesisAuthors as $link) {
|
||||
$stmt = $pdo->prepare("INSERT INTO thesis_authors (thesis_id, author_id, author_order) VALUES (:thesis_id, :author_id, :author_order)");
|
||||
$stmt->execute($link);
|
||||
}
|
||||
echo "Linked authors to theses\n";
|
||||
|
||||
// Link supervisors to theses
|
||||
$thesisSupervisors = [
|
||||
['thesis_id' => 1, 'supervisor_id' => 1, 'supervisor_order' => 1],
|
||||
['thesis_id' => 2, 'supervisor_id' => 2, 'supervisor_order' => 1],
|
||||
['thesis_id' => 3, 'supervisor_id' => 1, 'supervisor_order' => 1],
|
||||
['thesis_id' => 4, 'supervisor_id' => 3, 'supervisor_order' => 1],
|
||||
['thesis_id' => 5, 'supervisor_id' => 2, 'supervisor_order' => 1],
|
||||
['thesis_id' => 6, 'supervisor_id' => 3, 'supervisor_order' => 1],
|
||||
];
|
||||
|
||||
foreach ($thesisSupervisors as $link) {
|
||||
$stmt = $pdo->prepare("INSERT INTO thesis_supervisors (thesis_id, supervisor_id, supervisor_order) VALUES (:thesis_id, :supervisor_id, :supervisor_order)");
|
||||
$stmt->execute($link);
|
||||
}
|
||||
echo "Linked supervisors to theses\n";
|
||||
|
||||
// Link keywords to theses
|
||||
$thesisKeywords = [
|
||||
['thesis_id' => 1, 'keyword_id' => 3], // urbanisme
|
||||
['thesis_id' => 1, 'keyword_id' => 2], // narration
|
||||
['thesis_id' => 1, 'keyword_id' => 6], // collectivité
|
||||
['thesis_id' => 2, 'keyword_id' => 16], // technologies
|
||||
['thesis_id' => 2, 'keyword_id' => 18], // performance
|
||||
['thesis_id' => 2, 'keyword_id' => 20], // art numérique
|
||||
['thesis_id' => 3, 'keyword_id' => 14], // poésie
|
||||
['thesis_id' => 3, 'keyword_id' => 11], // éphémérité
|
||||
['thesis_id' => 3, 'keyword_id' => 5], // intime
|
||||
['thesis_id' => 4, 'keyword_id' => 15], // écologie
|
||||
['thesis_id' => 4, 'keyword_id' => 17], // design
|
||||
['thesis_id' => 5, 'keyword_id' => 1], // spéculation
|
||||
['thesis_id' => 5, 'keyword_id' => 4], // patrimoine
|
||||
['thesis_id' => 6, 'keyword_id' => 18], // performance
|
||||
['thesis_id' => 6, 'keyword_id' => 9], // sociologie
|
||||
];
|
||||
|
||||
foreach ($thesisKeywords as $link) {
|
||||
$stmt = $pdo->prepare("INSERT INTO thesis_keywords (thesis_id, keyword_id) VALUES (:thesis_id, :keyword_id)");
|
||||
$stmt->execute($link);
|
||||
}
|
||||
echo "Linked keywords to theses\n";
|
||||
|
||||
// Link languages to theses (all in French)
|
||||
for ($i = 1; $i <= 6; $i++) {
|
||||
$stmt = $pdo->prepare("INSERT INTO thesis_languages (thesis_id, language_id) VALUES (:thesis_id, 1)");
|
||||
$stmt->execute(['thesis_id' => $i]);
|
||||
}
|
||||
echo "Linked languages to theses\n";
|
||||
|
||||
// Link formats to theses
|
||||
$thesisFormats = [
|
||||
['thesis_id' => 1, 'format_id' => 3], // Vidéo
|
||||
['thesis_id' => 1, 'format_id' => 6], // Installation
|
||||
['thesis_id' => 2, 'format_id' => 4], // Performance
|
||||
['thesis_id' => 3, 'format_id' => 5], // Objet éditorial
|
||||
['thesis_id' => 4, 'format_id' => 1], // Site web
|
||||
['thesis_id' => 4, 'format_id' => 5], // Objet éditorial
|
||||
['thesis_id' => 5, 'format_id' => 5], // Objet éditorial
|
||||
['thesis_id' => 6, 'format_id' => 4], // Performance
|
||||
['thesis_id' => 6, 'format_id' => 3], // Vidéo
|
||||
];
|
||||
|
||||
foreach ($thesisFormats as $link) {
|
||||
$stmt = $pdo->prepare("INSERT INTO thesis_formats (thesis_id, format_id) VALUES (:thesis_id, :format_id)");
|
||||
$stmt->execute($link);
|
||||
}
|
||||
echo "Linked formats to theses\n";
|
||||
|
||||
echo "\n✅ Test database created successfully!\n";
|
||||
echo "Database location: $dbPath\n";
|
||||
echo "\nYou can now test the search feature at: http://localhost/front-backend/search.php\n";
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "❌ Error: " . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
BIN
storage/posterg.db
Normal file
BIN
storage/posterg.db
Normal file
Binary file not shown.
385
storage/schema.sql
Normal file
385
storage/schema.sql
Normal file
@@ -0,0 +1,385 @@
|
||||
-- Post-ERG Thesis Database Schema
|
||||
-- SQLite Database for managing final thesis projects (TFE) and doctoral theses
|
||||
|
||||
-- ============================================================================
|
||||
-- CORE ENTITIES
|
||||
-- ============================================================================
|
||||
|
||||
-- Students/Authors table
|
||||
CREATE TABLE IF NOT EXISTS authors (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
email TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Supervisors/Promoters table
|
||||
CREATE TABLE IF NOT EXISTS supervisors (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- PREDEFINED REFERENCE DATA (lookup tables)
|
||||
-- ============================================================================
|
||||
|
||||
-- Orientations (predefined list from specifications)
|
||||
CREATE TABLE IF NOT EXISTS orientations (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Insert predefined orientations
|
||||
INSERT OR IGNORE INTO orientations (name) VALUES
|
||||
('Arts Numériques'),
|
||||
('Dessin'),
|
||||
('Cinéma d''animation'),
|
||||
('Installation-Performance'),
|
||||
('Peinture'),
|
||||
('Photographie'),
|
||||
('Sculpture'),
|
||||
('Vidéographie'),
|
||||
('Graphisme'),
|
||||
('Typographie'),
|
||||
('Design Numérique'),
|
||||
('Illustration'),
|
||||
('Bande-Dessinée'),
|
||||
('Sérigraphie'),
|
||||
('Gravure');
|
||||
|
||||
-- AP (Ateliers Pratiques) - predefined list
|
||||
CREATE TABLE IF NOT EXISTS ap_programs (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
code TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Insert predefined AP programs
|
||||
INSERT OR IGNORE INTO ap_programs (name, code) VALUES
|
||||
('Narration Spéculative', NULL),
|
||||
('Design et Politique du Multiple', 'DPM'),
|
||||
('Atelier Pratiques Situées', 'APS'),
|
||||
('Lieux, Interdisciplinarités, Écologie, Nécessité, Systèmes', 'LIENS');
|
||||
|
||||
-- Master finality types
|
||||
CREATE TABLE IF NOT EXISTS finality_types (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
INSERT OR IGNORE INTO finality_types (name) VALUES
|
||||
('Approfondi'),
|
||||
('Enseignement'),
|
||||
('Spécialisé');
|
||||
|
||||
-- Languages
|
||||
CREATE TABLE IF NOT EXISTS languages (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
INSERT OR IGNORE INTO languages (name) VALUES
|
||||
('Français'),
|
||||
('Anglais');
|
||||
|
||||
-- Format types (can select multiple)
|
||||
CREATE TABLE IF NOT EXISTS format_types (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
INSERT OR IGNORE INTO format_types (name) VALUES
|
||||
('Site web'),
|
||||
('Audio'),
|
||||
('Vidéo'),
|
||||
('Performance'),
|
||||
('Objet éditorial'),
|
||||
('Installation'),
|
||||
('Autre');
|
||||
|
||||
-- Keywords (expandable list)
|
||||
CREATE TABLE IF NOT EXISTS keywords (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
keyword TEXT NOT NULL UNIQUE,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Access authorization types
|
||||
CREATE TABLE IF NOT EXISTS access_types (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
INSERT OR IGNORE INTO access_types (name, description) VALUES
|
||||
('Libre', 'TFE en libre accès à tout le monde sur la plateforme et en bibliothèque'),
|
||||
('Interne', 'TFE accessible uniquement sur place en physique. Une note descriptive est disponible sur le site'),
|
||||
('Interdit', 'TFE non disponible en physique ni sur le site. Une note descriptive est disponible sur le site');
|
||||
|
||||
-- License types
|
||||
CREATE TABLE IF NOT EXISTS license_types (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL UNIQUE,
|
||||
description TEXT,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- MAIN THESIS TABLE
|
||||
-- ============================================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS theses (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
identifier TEXT UNIQUE, -- e.g., "2025-002"
|
||||
|
||||
-- Basic information
|
||||
title TEXT NOT NULL,
|
||||
subtitle TEXT,
|
||||
year INTEGER NOT NULL,
|
||||
|
||||
-- Type of work
|
||||
is_doctoral BOOLEAN DEFAULT 0, -- 0 for TFE, 1 for doctoral thesis
|
||||
|
||||
-- Academic details
|
||||
orientation_id INTEGER,
|
||||
ap_program_id INTEGER,
|
||||
finality_id INTEGER,
|
||||
|
||||
-- Content
|
||||
synopsis TEXT, -- ~200 words
|
||||
context_note TEXT, -- Note added by jury president (max 150 words)
|
||||
remarks TEXT, -- Internal remarks
|
||||
|
||||
-- Duration/size
|
||||
duration_minutes INTEGER, -- For audio/video works
|
||||
duration_pages INTEGER, -- For written works
|
||||
file_size_info TEXT, -- e.g., "128 pages", "78 pages + ?? minutes"
|
||||
|
||||
-- Access and licensing
|
||||
access_type_id INTEGER,
|
||||
license_id INTEGER,
|
||||
|
||||
-- Jury information
|
||||
jury_points DECIMAL(4,2), -- Points out of 20
|
||||
jury_note_added BOOLEAN DEFAULT 0, -- Whether jury president added a note
|
||||
|
||||
-- Publication status
|
||||
submitted_at DATETIME, -- When student submitted
|
||||
defense_date DATETIME, -- Date of defense/soutenance
|
||||
published_at DATETIME, -- When made public (after jury review)
|
||||
is_published BOOLEAN DEFAULT 0,
|
||||
|
||||
-- External links
|
||||
baiu_link TEXT, -- Link to institutional repository
|
||||
|
||||
-- Timestamps
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
-- Foreign keys
|
||||
FOREIGN KEY (orientation_id) REFERENCES orientations(id),
|
||||
FOREIGN KEY (ap_program_id) REFERENCES ap_programs(id),
|
||||
FOREIGN KEY (finality_id) REFERENCES finality_types(id),
|
||||
FOREIGN KEY (access_type_id) REFERENCES access_types(id),
|
||||
FOREIGN KEY (license_id) REFERENCES license_types(id)
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- JUNCTION TABLES (Many-to-Many relationships)
|
||||
-- ============================================================================
|
||||
|
||||
-- Authors per thesis (can have multiple authors)
|
||||
CREATE TABLE IF NOT EXISTS thesis_authors (
|
||||
thesis_id INTEGER NOT NULL,
|
||||
author_id INTEGER NOT NULL,
|
||||
author_order INTEGER DEFAULT 1, -- Order of authors if multiple
|
||||
PRIMARY KEY (thesis_id, author_id),
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Supervisors per thesis (can have multiple promoters)
|
||||
CREATE TABLE IF NOT EXISTS thesis_supervisors (
|
||||
thesis_id INTEGER NOT NULL,
|
||||
supervisor_id INTEGER NOT NULL,
|
||||
supervisor_order INTEGER DEFAULT 1,
|
||||
PRIMARY KEY (thesis_id, supervisor_id),
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (supervisor_id) REFERENCES supervisors(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Languages per thesis (can be multilingual)
|
||||
CREATE TABLE IF NOT EXISTS thesis_languages (
|
||||
thesis_id INTEGER NOT NULL,
|
||||
language_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (thesis_id, language_id),
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (language_id) REFERENCES languages(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Formats per thesis (can have multiple formats)
|
||||
CREATE TABLE IF NOT EXISTS thesis_formats (
|
||||
thesis_id INTEGER NOT NULL,
|
||||
format_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (thesis_id, format_id),
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (format_id) REFERENCES format_types(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Keywords per thesis (max 10 as per specs)
|
||||
CREATE TABLE IF NOT EXISTS thesis_keywords (
|
||||
thesis_id INTEGER NOT NULL,
|
||||
keyword_id INTEGER NOT NULL,
|
||||
PRIMARY KEY (thesis_id, keyword_id),
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (keyword_id) REFERENCES keywords(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- FILE ATTACHMENTS
|
||||
-- ============================================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS thesis_files (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
thesis_id INTEGER NOT NULL,
|
||||
file_type TEXT NOT NULL, -- 'main', 'annex', 'written_part', 'other'
|
||||
file_path TEXT NOT NULL,
|
||||
file_name TEXT NOT NULL,
|
||||
file_size INTEGER, -- in bytes
|
||||
mime_type TEXT,
|
||||
description TEXT,
|
||||
uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (thesis_id) REFERENCES theses(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- STATIC PAGES / CONTENT MANAGEMENT
|
||||
-- ============================================================================
|
||||
|
||||
-- For managing editable static pages (charte, about, licenses, contact)
|
||||
CREATE TABLE IF NOT EXISTS pages (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
slug TEXT NOT NULL UNIQUE, -- 'charte', 'about', 'licenses', 'contact'
|
||||
title TEXT NOT NULL,
|
||||
content TEXT, -- Markdown or HTML content
|
||||
is_published BOOLEAN DEFAULT 1,
|
||||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Initialize default pages
|
||||
INSERT OR IGNORE INTO pages (slug, title, content) VALUES
|
||||
('charte', 'Charte', 'Contenu à venir'),
|
||||
('about', 'À propos', 'Contenu à venir'),
|
||||
('licenses', 'Licences', 'Contenu à venir'),
|
||||
('contact', 'Contact', 'Contenu à venir');
|
||||
|
||||
-- ============================================================================
|
||||
-- INDEXES for performance
|
||||
-- ============================================================================
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_year ON theses(year);
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_published ON theses(is_published);
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_identifier ON theses(identifier);
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_orientation ON theses(orientation_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_ap_program ON theses(ap_program_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_theses_access_type ON theses(access_type_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_authors_email ON authors(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_thesis_authors_thesis ON thesis_authors(thesis_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_thesis_authors_author ON thesis_authors(author_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_thesis_keywords_thesis ON thesis_keywords(thesis_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_thesis_keywords_keyword ON thesis_keywords(keyword_id);
|
||||
|
||||
-- ============================================================================
|
||||
-- TRIGGERS for automatic timestamp updates
|
||||
-- ============================================================================
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS update_theses_timestamp
|
||||
AFTER UPDATE ON theses
|
||||
BEGIN
|
||||
UPDATE theses SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS update_authors_timestamp
|
||||
AFTER UPDATE ON authors
|
||||
BEGIN
|
||||
UPDATE authors SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS update_supervisors_timestamp
|
||||
AFTER UPDATE ON supervisors
|
||||
BEGIN
|
||||
UPDATE supervisors SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS update_pages_timestamp
|
||||
AFTER UPDATE ON pages
|
||||
BEGIN
|
||||
UPDATE pages SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
-- ============================================================================
|
||||
-- VIEWS for common queries
|
||||
-- ============================================================================
|
||||
|
||||
-- Full thesis information view
|
||||
CREATE VIEW IF NOT EXISTS v_theses_full AS
|
||||
SELECT
|
||||
t.id,
|
||||
t.identifier,
|
||||
t.title,
|
||||
t.subtitle,
|
||||
t.year,
|
||||
t.is_doctoral,
|
||||
o.name as orientation,
|
||||
ap.name as ap_program,
|
||||
ft.name as finality_type,
|
||||
t.synopsis,
|
||||
t.context_note,
|
||||
t.duration_minutes,
|
||||
t.duration_pages,
|
||||
t.file_size_info,
|
||||
at.name as access_type,
|
||||
lt.name as license_type,
|
||||
t.jury_points,
|
||||
t.submitted_at,
|
||||
t.defense_date,
|
||||
t.published_at,
|
||||
t.is_published,
|
||||
t.baiu_link,
|
||||
GROUP_CONCAT(DISTINCT a.name) as authors,
|
||||
GROUP_CONCAT(DISTINCT s.name) as supervisors,
|
||||
GROUP_CONCAT(DISTINCT l.name) as languages,
|
||||
GROUP_CONCAT(DISTINCT fmt.name) as formats,
|
||||
GROUP_CONCAT(DISTINCT k.keyword) as keywords
|
||||
FROM theses t
|
||||
LEFT JOIN orientations o ON t.orientation_id = o.id
|
||||
LEFT JOIN ap_programs ap ON t.ap_program_id = ap.id
|
||||
LEFT JOIN finality_types ft ON t.finality_id = ft.id
|
||||
LEFT JOIN access_types at ON t.access_type_id = at.id
|
||||
LEFT JOIN license_types lt ON t.license_id = lt.id
|
||||
LEFT JOIN thesis_authors ta ON t.id = ta.thesis_id
|
||||
LEFT JOIN authors a ON ta.author_id = a.id
|
||||
LEFT JOIN thesis_supervisors ts ON t.id = ts.thesis_id
|
||||
LEFT JOIN supervisors s ON ts.supervisor_id = s.id
|
||||
LEFT JOIN thesis_languages tl ON t.id = tl.thesis_id
|
||||
LEFT JOIN languages l ON tl.language_id = l.id
|
||||
LEFT JOIN thesis_formats tf ON t.id = tf.thesis_id
|
||||
LEFT JOIN format_types fmt ON tf.format_id = fmt.id
|
||||
LEFT JOIN thesis_keywords tk ON t.id = tk.thesis_id
|
||||
LEFT JOIN keywords k ON tk.keyword_id = k.id
|
||||
GROUP BY t.id;
|
||||
|
||||
-- Published theses only (for public view)
|
||||
CREATE VIEW IF NOT EXISTS v_theses_public AS
|
||||
SELECT * FROM v_theses_full
|
||||
WHERE is_published = 1;
|
||||
BIN
storage/test.db
Normal file
BIN
storage/test.db
Normal file
Binary file not shown.
Reference in New Issue
Block a user