From e562b54b3861fc458de38f27f2f5b3f0dee9efdf Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 11:39:58 +0200 Subject: [PATCH 01/20] Delete migrations/versions/__pycache__/3598886c6764_v3_test.cpython-39.pyc --- .../3598886c6764_v3_test.cpython-39.pyc | Bin 901 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 migrations/versions/__pycache__/3598886c6764_v3_test.cpython-39.pyc diff --git a/migrations/versions/__pycache__/3598886c6764_v3_test.cpython-39.pyc b/migrations/versions/__pycache__/3598886c6764_v3_test.cpython-39.pyc deleted file mode 100644 index ba1210bbad3fa29156a0db5f4287c99f7d7aa836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 901 zcmZ`%!EVz)5Z$#M+jU#fg1ErN*BqLpbsE~JLa5D!0~MkOgfG^{vr1B}*J0NQDuNSS zD}Div{Q(Yq2FJZ}>Lk+~A`ODYQcZZN~HdtQxjXXfp z2M9n?0u&rU3nz7`^5`a$I+4Etm5$ip&##bc6PTq$<}rfZ}0Rwoqng+ z+TTyQNjHivkr`=H<&dE-xExjEr|5=qCIlM_-t?8#*lZ42m5(zfDz381o|uRMWO*rOg*1+4#y?v4 z{z;`Ka)edF#h=RQ1yP%r<;S2sE(_kaEZT#^tw&6<5ihu`+Qnp~ScRJF_8ckJ&azh7 zJjrZxTGKNV%%*r5_$^GSJp|%xP-Ub4D{ANC4@K`R6or4Q*ZNC6?^wB*L)m)DM`*gW zGRh99Sp`*2uf$L{>=pao1>Ce3R-k+(Yu0x$yk>nHqvom!vJA>R%S^xoFNTwRp?aiW z3MOo;&eWPs6RNAxH0w5Db{!5Clh`0^8W-9`z^7b-&PrJeqimfePBpulSa?vBFcbW~ T9YDQ-;00?m^gLQ`Hw=FPO7zp< From be7e75775b5a9779a4f957efc54d856a4872799c Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 11:40:33 +0200 Subject: [PATCH 02/20] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2cd22..502d0a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ ([`4894e16`](https://github.com/DEPSEC-Project/DB-Management/commit/4894e16261b1dbd74614ee9a92a378bedc227d1d)) - **ci**: Désactivation des warnings dans pylint - ([`f66ccc5`](https://github.com/DEPSEC-Project/DB-Management/commit/f66ccc5f1fbfb3f46a61d2526594430ec79649d9)) + ([`f66ccc5`](https://github.com/DEPSEC-Project/DB-Management/commit/f66ccc5f1fbfb3f46a61d2526594430ec79649d9)) - **ci**: Modification de master.yml ([`fee2131`](https://github.com/DEPSEC-Project/DB-Management/commit/fee213137cc5e643cc8d9f92940f3393bc51b880)) From b01b7dc8f85de2005e5ca950931de3a8bd636328 Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 11:43:36 +0200 Subject: [PATCH 03/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76f8b28..8ec9b43 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Objectifs: - Permettre l'importation de ces modèles pour les microservices Package gérant la mise à jour de la BDD ainsi que tous les modèles. -ca +c Pour récupérer le package (et pour ainsi dire les modèles): ```bash pip install --no-cache-dir --index-url https://pypi.org/simple git+https://github.com/DEPSEC-Project/DB-Management.git From 64b39200e8f126b6aa1fccce74ee568561fadbbc Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 14:17:12 +0200 Subject: [PATCH 04/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ec9b43..4957a52 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Objectifs: Package gérant la mise à jour de la BDD ainsi que tous les modèles. c -Pour récupérer le package (et pour ainsi dire les modèles): +Pour récupérer le package (et pour ainsi dire les modèles): ```bash pip install --no-cache-dir --index-url https://pypi.org/simple git+https://github.com/DEPSEC-Project/DB-Management.git ``` From 7c9375ebdc694796e8a07bfa113016f9d84eed66 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 12:18:36 +0000 Subject: [PATCH 05/20] 0.6.0 Automatically generated by python-semantic-release --- CHANGELOG.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc2cd22..aea6143 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,90 @@ # CHANGELOG +## v0.6.0 (2025-04-02) + +### Bug Fixes + +- Fix du problème pylint louche + ([`6ad0b7c`](https://github.com/DEPSEC-Project/DB-Management/commit/6ad0b7c75162d08ed22960479d19413ccc838ddd)) + +- La j'ai 10/10 + ([`c232f4d`](https://github.com/DEPSEC-Project/DB-Management/commit/c232f4d36d2486f9e93c093a5f9dcdd88dc7e2b8)) + +- Longueur de la ligne + ([`94c0c88`](https://github.com/DEPSEC-Project/DB-Management/commit/94c0c887d04971ab3ab03d5b08e3243564258088)) + +- Maj des fichiers workflow dev.yml et master.yml + ([`041bfa4`](https://github.com/DEPSEC-Project/DB-Management/commit/041bfa4b6d9da2f7205525849551222e190afa42)) + +- Model TrivyReport contenait une variable deja utilisée + ([`029c2bd`](https://github.com/DEPSEC-Project/DB-Management/commit/029c2bd4e111f038a34b7163f4777fdfd1ef2ad6)) + +- Models + ([`7445bcc`](https://github.com/DEPSEC-Project/DB-Management/commit/7445bccd9c89a86b5d43243a6f52f40ec228ef89)) + +- Not callable + ([`e5ba63f`](https://github.com/DEPSEC-Project/DB-Management/commit/e5ba63ff72b83dca2a9fa8ec3f8d095f7cd9b683)) + +- Not callable (bug pylint) + ([`9d785d1`](https://github.com/DEPSEC-Project/DB-Management/commit/9d785d17ff18f4f093cd83a7a4702db77e6d0af7)) + +- Pour avoir 10/10 avec pylint + ([`31536e2`](https://github.com/DEPSEC-Project/DB-Management/commit/31536e2a8a1787e0221fc54f33c25922fd53fab9)) + +- Pylint + ([`0f36fad`](https://github.com/DEPSEC-Project/DB-Management/commit/0f36fad9ddac40d9c222528b94d102e1a25e296e)) + +### Features + +- Ajout du model du rapport Trivy + ([`5e449dd`](https://github.com/DEPSEC-Project/DB-Management/commit/5e449ddc5c0ca9dbf4a136287fccf17d07ca9441)) + +- **auth**: Ajout des modèles d'user / blacklistToken + ([`1d2fc7f`](https://github.com/DEPSEC-Project/DB-Management/commit/1d2fc7f660163ba8fbf699f0c228474cdeafc22c)) + +### Testing + +- Migration BDD + ([`59c06c0`](https://github.com/DEPSEC-Project/DB-Management/commit/59c06c0a93f3075995fbf97dba2219fd16281a1b)) + +- Migration BDD + ([`1abe6df`](https://github.com/DEPSEC-Project/DB-Management/commit/1abe6df06ff73240e37eb5f7bc7630661b209e85)) + +- Migration BDD + ([`1e1002b`](https://github.com/DEPSEC-Project/DB-Management/commit/1e1002b33b264f9d601ce357ea74f9853d6424a7)) + +- Migration BDD + ([`c3cb0e9`](https://github.com/DEPSEC-Project/DB-Management/commit/c3cb0e9519c8af03b278d96429e79c132fc238e1)) + +- Migration BDD + ([`f6ea447`](https://github.com/DEPSEC-Project/DB-Management/commit/f6ea447670b4c68b4408adaeec66a3fbf44222c3)) + +- Migration BDD + ([`e577de7`](https://github.com/DEPSEC-Project/DB-Management/commit/e577de7c4fcb88bb1eb813e44608ad6bf974b5db)) + +- Migration de la BDD + ([`feabc6d`](https://github.com/DEPSEC-Project/DB-Management/commit/feabc6d2d027a66ae4324d3028bf2091cdca3080)) + +- Migration de la bdd sur le serveur portainer + ([`10a3842`](https://github.com/DEPSEC-Project/DB-Management/commit/10a3842fbe210bdf78e01575084db2acf9a95b58)) + +- Migration de la BDD test n°2 + ([`759f62e`](https://github.com/DEPSEC-Project/DB-Management/commit/759f62ef85b38708804e75e99ffc73e3df5ac915)) + +- Migration de la BDD test n°3 + ([`e8ee1c4`](https://github.com/DEPSEC-Project/DB-Management/commit/e8ee1c452aebf885a973da0e307a05f6c76e0f87)) + +- Migration de la BDD vers le serveur portainer + ([`26ef818`](https://github.com/DEPSEC-Project/DB-Management/commit/26ef8186c37f98247d303876e5cdf875e516ea2b)) + +- Réparation semantic-release + ([`b9b5bca`](https://github.com/DEPSEC-Project/DB-Management/commit/b9b5bca5911d0c0d18d88e0eca5316074b11d438)) + +- Test de la migratiuon de la BDD sur le serveur portainer + ([`0f27967`](https://github.com/DEPSEC-Project/DB-Management/commit/0f27967f1c41264570393f52dc45534e052f1fcc)) + + ## v0.5.0 (2025-03-24) ### Bug Fixes From 35a2a9104b4cb3b8cf5fd682ef9e2a2794965458 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 13:16:18 +0000 Subject: [PATCH 06/20] 0.7.0 Automatically generated by python-semantic-release --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aea6143..7fa36c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ # CHANGELOG +## v0.7.0 (2025-04-02) + +### Bug Fixes + +- **bdd**: Pb et tout quoi des choses + ([`39509bb`](https://github.com/DEPSEC-Project/DB-Management/commit/39509bb0d9467c3eeb276771c63470707789aa79)) + +- **bdd**: Ya un truc qui marchait pas du coup et voila + ([`943eeba`](https://github.com/DEPSEC-Project/DB-Management/commit/943eeba872894d19ca88246ea32a98a1a87ea3bd)) + +### Features + +- **model**: Ajout du modele des projets + ([`7533b8a`](https://github.com/DEPSEC-Project/DB-Management/commit/7533b8a448b19c279ede6a222cc66b8e0fab79c7)) + + ## v0.6.0 (2025-04-02) ### Bug Fixes From e39251f2f5584d5fc396bee9d0f40b4e957a7216 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 13:23:56 +0000 Subject: [PATCH 07/20] 0.7.1 Automatically generated by python-semantic-release --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa36c2..365f685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # CHANGELOG +## v0.7.1 (2025-04-02) + +### Bug Fixes + +- **name_class**: Des trucs + ([`64b78a8`](https://github.com/DEPSEC-Project/DB-Management/commit/64b78a80f673e148acbd0dc223d8428f09a2be53)) + + ## v0.7.0 (2025-04-02) ### Bug Fixes From 05092bade84ef49b216006199a77dea1c7527432 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 13:36:20 +0000 Subject: [PATCH 08/20] 0.8.0 Automatically generated by python-semantic-release --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 365f685..2bfa9df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # CHANGELOG +## v0.8.0 (2025-04-02) + +### Features + +- **trivyreport**: Ajout d'une clé étrangère pour id_sbom de trivyreport avec la table SBOM + ([`34ca141`](https://github.com/DEPSEC-Project/DB-Management/commit/34ca141e5d3bc183aa4e96e59832d87c566318fd)) + + ## v0.7.1 (2025-04-02) ### Bug Fixes From 0357a0146b854f0248967998b45c5e93a86a2761 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 14:36:44 +0000 Subject: [PATCH 09/20] 0.9.0 Automatically generated by python-semantic-release --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bfa9df..dc30c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,19 @@ # CHANGELOG +## v0.9.0 (2025-04-02) + +### Bug Fixes + +- **error**: Missing-function-docstring + ([`6a92a2e`](https://github.com/DEPSEC-Project/DB-Management/commit/6a92a2e2809acce58d3bf4b51f5dc434c66780fb)) + +### Features + +- **create_function**: Cette fonction permet de retourner tous les projets + ([`e9b37f7`](https://github.com/DEPSEC-Project/DB-Management/commit/e9b37f7a1faead253f0486572349dd5362f322bb)) + + ## v0.8.0 (2025-04-02) ### Features From 506abe47441b3b6f51b39d16c3b9f9a02a5c0014 Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 17:08:19 +0200 Subject: [PATCH 10/20] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d0ec43a..1f42233 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ """ from setuptools import find_packages, setup -__version__ ="0.5.0" +__version__ ="0.9.0" setup( name="depsec_models", version=__version__, From 9acb8d2d044acfb646685856465efac47a13c080 Mon Sep 17 00:00:00 2001 From: goat du site <72492241+aguacero7@users.noreply.github.com> Date: Wed, 2 Apr 2025 17:12:52 +0200 Subject: [PATCH 11/20] Update .releaserc.toml --- .releaserc.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.releaserc.toml b/.releaserc.toml index b7aa5b6..342863a 100644 --- a/.releaserc.toml +++ b/.releaserc.toml @@ -1,5 +1,6 @@ [tool.semantic_release] branch = "main" +version_source = "variable" version_variable = "setup.py:__version__" commit_message = "chore(release): create new version {version}" -github_token = "${GH_TOKEN}" \ No newline at end of file +github_token = "${GH_TOKEN}" From 40e70981f64ecf3b5eaa6c6ee4c5ece6aae4daa9 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 18:26:59 +0000 Subject: [PATCH 12/20] 0.10.0 Automatically generated by python-semantic-release --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc30c76..5abc414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # CHANGELOG +## v0.10.0 (2025-04-02) + +### Features + +- **ci**: Modif des migrations selon la branche + ([`02499e4`](https://github.com/DEPSEC-Project/DB-Management/commit/02499e4daacfffb94c571b610c780a53c38ed5bf)) + + ## v0.9.0 (2025-04-02) ### Bug Fixes From 3c16eabd140453e71f4661281367280d31f28c92 Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 19:23:21 +0000 Subject: [PATCH 13/20] 0.10.1 Automatically generated by python-semantic-release --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5abc414..7c4cc6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # CHANGELOG +## v0.10.1 (2025-04-02) + +### Bug Fixes + +- Migration sbom id peut etre null + ([`0c64b3d`](https://github.com/DEPSEC-Project/DB-Management/commit/0c64b3d4000b49df7fa8e0933ac4a15a5be9297a)) + + ## v0.10.0 (2025-04-02) ### Features From 602cf99207f078ec3efc64df864e9a3350292daf Mon Sep 17 00:00:00 2001 From: semantic-release Date: Wed, 2 Apr 2025 19:28:31 +0000 Subject: [PATCH 14/20] 0.10.2 Automatically generated by python-semantic-release --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c4cc6f..44005a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # CHANGELOG +## v0.10.2 (2025-04-02) + +### Bug Fixes + +- Modification de la CI pour les upgrades + ([`ab23312`](https://github.com/DEPSEC-Project/DB-Management/commit/ab23312e0df5d49b1b3ef6f0c312bd4d7d472f2a)) + + ## v0.10.1 (2025-04-02) ### Bug Fixes From fe903a15182a8ec20603516bb694ea89d124040e Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:00:08 +0200 Subject: [PATCH 15/20] Update models.py --- depsec_db/models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/depsec_db/models.py b/depsec_db/models.py index 0106a87..fd5fc53 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -18,6 +18,8 @@ class Project(db.Model): titre = db.Column(db.String, nullable=False) status = db.Column(db.String, nullable=False) path = db.Column(db.String, nullable=False) + """Relation avec SBOM : suppression en cascade""" + sboms = relationship("SBOM", backref="project", cascade="all, delete", passive_deletes=True) def to_dict(self): """Function to return projects as JSON""" return { @@ -109,7 +111,8 @@ class SBOM(db.Model): """ __tablename__ = 'sboms' id = db.Column(db.Integer, primary_key=True, autoincrement=True) - project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False) + """Clé étrangère vers l'id du projet""" + project_id = db.Column(db.Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) sbom_data = db.Column(db.JSON, nullable=False) """Relation One-To-Many avec la table TrivyReport qui utilise l'id du SBOM""" projects = db.relationship('TrivyReport', backref='sboms', lazy=True) From 2c62da97596b491b4978a2820d05a6aaccd7f63e Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:04:01 +0200 Subject: [PATCH 16/20] Update models.py --- depsec_db/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/depsec_db/models.py b/depsec_db/models.py index fd5fc53..94f26f4 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -8,6 +8,8 @@ from werkzeug.security import generate_password_hash, check_password_hash from sqlalchemy import func as sa_func from depsec_db.extensions import db +from sqlalchemy import ForeignKey +from sqlalchemy.orm import relationship class Project(db.Model): """Modèle d'un projet.""" From 3eb4400003660ecc8da7a42cf8e9b009b574953c Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:08:30 +0200 Subject: [PATCH 17/20] Update models.py --- depsec_db/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/depsec_db/models.py b/depsec_db/models.py index 94f26f4..4087f28 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -5,11 +5,13 @@ """ import uuid + +from sqlalchemy import ForeignKey +from sqlalchemy.orm import relationship from werkzeug.security import generate_password_hash, check_password_hash from sqlalchemy import func as sa_func + from depsec_db.extensions import db -from sqlalchemy import ForeignKey -from sqlalchemy.orm import relationship class Project(db.Model): """Modèle d'un projet.""" From c8f2aa38eeeab80b3763cf076fb598b5fd42e902 Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:15:53 +0200 Subject: [PATCH 18/20] Update models.py --- depsec_db/models.py | 132 +++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 62 deletions(-) diff --git a/depsec_db/models.py b/depsec_db/models.py index 4087f28..9401ea8 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -4,66 +4,70 @@ Ces modèles sont conçus pour être utilisés dans une application Flask externe. """ -import uuid +import uuid # ✅ 1️⃣ Import standard Python -from sqlalchemy import ForeignKey +# ✅ 2️⃣ Imports externes (librairies installées) +from sqlalchemy import ( + Column, Integer, String, ForeignKey, JSON, DateTime, Boolean +) from sqlalchemy.orm import relationship from werkzeug.security import generate_password_hash, check_password_hash from sqlalchemy import func as sa_func +# ✅ 3️⃣ Imports internes (modules du projet) from depsec_db.extensions import db + class Project(db.Model): """Modèle d'un projet.""" __tablename__ = 'projects' - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - """Clé étrangère vers l'id de la table User""" - auteur_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) - titre = db.Column(db.String, nullable=False) - status = db.Column(db.String, nullable=False) - path = db.Column(db.String, nullable=False) + + id = Column(Integer, primary_key=True, autoincrement=True) + auteur_id = Column(Integer, ForeignKey('users.id'), nullable=False) # Clé étrangère vers User + titre = Column(String, nullable=False) + status = Column(String, nullable=False) + path = Column(String, nullable=False) + """Relation avec SBOM : suppression en cascade""" - sboms = relationship("SBOM", backref="project", cascade="all, delete", passive_deletes=True) + sboms = relationship( + "SBOM", backref="project", cascade="all, delete", passive_deletes=True + ) + def to_dict(self): - """Function to return projects as JSON""" + """Retourne un dictionnaire représentant le projet.""" return { "id": self.id, "auteur_id": self.auteur_id, "titre": self.titre, "status": self.status, "path": self.path - } + } + class User(db.Model): """Modèle utilisateur principal pour l'authentification.""" __tablename__ = 'users' - id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) - public_id = db.Column( - db.String(36), - unique=True, - nullable=False, - default=lambda: str(uuid.uuid4()) - ) - username = db.Column(db.String(255), unique=True, nullable=False) - email = db.Column(db.String(255), unique=True, nullable=False) - password_hash = db.Column(db.String(255), nullable=False) - full_name = db.Column(db.String(255), nullable=True) - name = db.Column(db.String(255), nullable=True) - is_admin = db.Column(db.Boolean, nullable=False, default=False) - created_at = db.Column( - db.DateTime(timezone=True), - server_default=sa_func.now(), # pylint: disable=not-callable - nullable=False - ) - updated_at = db.Column( - db.DateTime(timezone=True), - server_default=sa_func.now(), # pylint: disable=not-callable - onupdate=sa_func.now(), # pylint: disable=not-callable - nullable=False - ) - """Relation One-To-Many avec la table Project qui utilise l'id de User""" - projects = db.relationship('Project', backref='user', lazy=True) + id = Column(Integer, primary_key=True, autoincrement=True) + public_id = Column( + String(36), unique=True, nullable=False, default=lambda: str(uuid.uuid4()) + ) + username = Column(String(255), unique=True, nullable=False) + email = Column(String(255), unique=True, nullable=False) + password_hash = Column(String(255), nullable=False) + full_name = Column(String(255), nullable=True) + is_admin = Column(Boolean, nullable=False, default=False) + created_at = Column(DateTime(timezone=True), server_default=sa_func.now(), nullable=False) + updated_at = Column( + DateTime(timezone=True), + server_default=sa_func.now(), + onupdate=sa_func.now(), + nullable=False + ) + + """Relation One-To-Many avec Project (un user peut avoir plusieurs projets)""" + projects = relationship('Project', backref='user', lazy=True) + def set_password(self, password: str) -> None: """Hash et définit le mot de passe de l'utilisateur.""" self.password_hash = generate_password_hash(password) @@ -74,12 +78,12 @@ def check_password(self, password: str) -> bool: class TokenBlacklist(db.Model): - """Modèle pour stocker les JWT révoqués (blacklistés).""" + """Modèle pour stocker les JWT révoqués.""" __tablename__ = 'token_blacklist' - id = db.Column(db.Integer, primary_key=True) - jti = db.Column(db.String(36), unique=True, nullable=False) - created_at = db.Column(db.DateTime(timezone=True), server_default=sa_func.now(), nullable=False) # pylint: disable=not-callable + id = Column(Integer, primary_key=True) + jti = Column(String(36), unique=True, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=sa_func.now(), nullable=False) @classmethod def is_token_blacklisted(cls, jti: str, session=None) -> bool: @@ -92,31 +96,35 @@ class TrivyReport(db.Model): """Modèle représentant un rapport d'analyse Trivy.""" __tablename__ = 'trivy_reports' - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - schema_version = db.Column(db.Integer, nullable=False) - """Clé étrangère vers l'id de la table SBOM""" - sbom_id = db.Column(db.Integer, db.ForeignKey('sboms.id'), nullable=False) - created_at = db.Column( - db.DateTime(timezone=True), - server_default=sa_func.now(), # pylint: disable=not-callable - default=sa_func.now(), # pylint: disable=not-callable + id = Column(Integer, primary_key=True, autoincrement=True) + schema_version = Column(Integer, nullable=False) + + """Clé étrangère vers SBOM""" + sbom_id = Column(Integer, ForeignKey('sboms.id'), nullable=False) + + created_at = Column( + DateTime(timezone=True), + server_default=sa_func.now(), + default=sa_func.now(), nullable=False ) - artifact_name = db.Column(db.String, nullable=False) - artifact_type = db.Column(db.String, nullable=False) - report_metadata = db.Column(db.JSON, nullable=True) - results = db.Column(db.JSON, nullable=True) + artifact_name = Column(String, nullable=False) + artifact_type = Column(String, nullable=False) + report_metadata = Column(JSON, nullable=True) + results = Column(JSON, nullable=True) class SBOM(db.Model): - """ - Modèle d'un SBOM. - """ + """Modèle d'un SBOM.""" __tablename__ = 'sboms' - id = db.Column(db.Integer, primary_key=True, autoincrement=True) - """Clé étrangère vers l'id du projet""" - project_id = db.Column(db.Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) - sbom_data = db.Column(db.JSON, nullable=False) - """Relation One-To-Many avec la table TrivyReport qui utilise l'id du SBOM""" - projects = db.relationship('TrivyReport', backref='sboms', lazy=True) + + id = Column(Integer, primary_key=True, autoincrement=True) + + """Clé étrangère vers Project avec suppression en cascade""" + project_id = Column(Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) + + sbom_data = Column(JSON, nullable=False) + + """Relation One-To-Many avec TrivyReport""" + trivy_reports = relationship('TrivyReport', backref='sbom', lazy=True) From 0a798eca002c50182f4a007faa668314173ab951 Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:19:31 +0200 Subject: [PATCH 19/20] Update models.py --- depsec_db/models.py | 132 +++++++++++++++++++++----------------------- 1 file changed, 62 insertions(+), 70 deletions(-) diff --git a/depsec_db/models.py b/depsec_db/models.py index 9401ea8..4087f28 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -4,70 +4,66 @@ Ces modèles sont conçus pour être utilisés dans une application Flask externe. """ -import uuid # ✅ 1️⃣ Import standard Python +import uuid -# ✅ 2️⃣ Imports externes (librairies installées) -from sqlalchemy import ( - Column, Integer, String, ForeignKey, JSON, DateTime, Boolean -) +from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship from werkzeug.security import generate_password_hash, check_password_hash from sqlalchemy import func as sa_func -# ✅ 3️⃣ Imports internes (modules du projet) from depsec_db.extensions import db - class Project(db.Model): """Modèle d'un projet.""" __tablename__ = 'projects' - - id = Column(Integer, primary_key=True, autoincrement=True) - auteur_id = Column(Integer, ForeignKey('users.id'), nullable=False) # Clé étrangère vers User - titre = Column(String, nullable=False) - status = Column(String, nullable=False) - path = Column(String, nullable=False) - + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + """Clé étrangère vers l'id de la table User""" + auteur_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) + titre = db.Column(db.String, nullable=False) + status = db.Column(db.String, nullable=False) + path = db.Column(db.String, nullable=False) """Relation avec SBOM : suppression en cascade""" - sboms = relationship( - "SBOM", backref="project", cascade="all, delete", passive_deletes=True - ) - + sboms = relationship("SBOM", backref="project", cascade="all, delete", passive_deletes=True) def to_dict(self): - """Retourne un dictionnaire représentant le projet.""" + """Function to return projects as JSON""" return { "id": self.id, "auteur_id": self.auteur_id, "titre": self.titre, "status": self.status, "path": self.path - } - + } class User(db.Model): """Modèle utilisateur principal pour l'authentification.""" __tablename__ = 'users' - id = Column(Integer, primary_key=True, autoincrement=True) - public_id = Column( - String(36), unique=True, nullable=False, default=lambda: str(uuid.uuid4()) - ) - username = Column(String(255), unique=True, nullable=False) - email = Column(String(255), unique=True, nullable=False) - password_hash = Column(String(255), nullable=False) - full_name = Column(String(255), nullable=True) - is_admin = Column(Boolean, nullable=False, default=False) - created_at = Column(DateTime(timezone=True), server_default=sa_func.now(), nullable=False) - updated_at = Column( - DateTime(timezone=True), - server_default=sa_func.now(), - onupdate=sa_func.now(), - nullable=False - ) - - """Relation One-To-Many avec Project (un user peut avoir plusieurs projets)""" - projects = relationship('Project', backref='user', lazy=True) - + id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) + public_id = db.Column( + db.String(36), + unique=True, + nullable=False, + default=lambda: str(uuid.uuid4()) + ) + username = db.Column(db.String(255), unique=True, nullable=False) + email = db.Column(db.String(255), unique=True, nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + full_name = db.Column(db.String(255), nullable=True) + name = db.Column(db.String(255), nullable=True) + is_admin = db.Column(db.Boolean, nullable=False, default=False) + created_at = db.Column( + db.DateTime(timezone=True), + server_default=sa_func.now(), # pylint: disable=not-callable + nullable=False + ) + updated_at = db.Column( + db.DateTime(timezone=True), + server_default=sa_func.now(), # pylint: disable=not-callable + onupdate=sa_func.now(), # pylint: disable=not-callable + nullable=False + ) + """Relation One-To-Many avec la table Project qui utilise l'id de User""" + projects = db.relationship('Project', backref='user', lazy=True) def set_password(self, password: str) -> None: """Hash et définit le mot de passe de l'utilisateur.""" self.password_hash = generate_password_hash(password) @@ -78,12 +74,12 @@ def check_password(self, password: str) -> bool: class TokenBlacklist(db.Model): - """Modèle pour stocker les JWT révoqués.""" + """Modèle pour stocker les JWT révoqués (blacklistés).""" __tablename__ = 'token_blacklist' - id = Column(Integer, primary_key=True) - jti = Column(String(36), unique=True, nullable=False) - created_at = Column(DateTime(timezone=True), server_default=sa_func.now(), nullable=False) + id = db.Column(db.Integer, primary_key=True) + jti = db.Column(db.String(36), unique=True, nullable=False) + created_at = db.Column(db.DateTime(timezone=True), server_default=sa_func.now(), nullable=False) # pylint: disable=not-callable @classmethod def is_token_blacklisted(cls, jti: str, session=None) -> bool: @@ -96,35 +92,31 @@ class TrivyReport(db.Model): """Modèle représentant un rapport d'analyse Trivy.""" __tablename__ = 'trivy_reports' - id = Column(Integer, primary_key=True, autoincrement=True) - schema_version = Column(Integer, nullable=False) - - """Clé étrangère vers SBOM""" - sbom_id = Column(Integer, ForeignKey('sboms.id'), nullable=False) - - created_at = Column( - DateTime(timezone=True), - server_default=sa_func.now(), - default=sa_func.now(), + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + schema_version = db.Column(db.Integer, nullable=False) + """Clé étrangère vers l'id de la table SBOM""" + sbom_id = db.Column(db.Integer, db.ForeignKey('sboms.id'), nullable=False) + created_at = db.Column( + db.DateTime(timezone=True), + server_default=sa_func.now(), # pylint: disable=not-callable + default=sa_func.now(), # pylint: disable=not-callable nullable=False ) - artifact_name = Column(String, nullable=False) - artifact_type = Column(String, nullable=False) - report_metadata = Column(JSON, nullable=True) - results = Column(JSON, nullable=True) + artifact_name = db.Column(db.String, nullable=False) + artifact_type = db.Column(db.String, nullable=False) + report_metadata = db.Column(db.JSON, nullable=True) + results = db.Column(db.JSON, nullable=True) class SBOM(db.Model): - """Modèle d'un SBOM.""" + """ + Modèle d'un SBOM. + """ __tablename__ = 'sboms' - - id = Column(Integer, primary_key=True, autoincrement=True) - - """Clé étrangère vers Project avec suppression en cascade""" - project_id = Column(Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) - - sbom_data = Column(JSON, nullable=False) - - """Relation One-To-Many avec TrivyReport""" - trivy_reports = relationship('TrivyReport', backref='sbom', lazy=True) + id = db.Column(db.Integer, primary_key=True, autoincrement=True) + """Clé étrangère vers l'id du projet""" + project_id = db.Column(db.Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) + sbom_data = db.Column(db.JSON, nullable=False) + """Relation One-To-Many avec la table TrivyReport qui utilise l'id du SBOM""" + projects = db.relationship('TrivyReport', backref='sboms', lazy=True) From 32847239dd01b4544b71f87cb545ce15d82c03ce Mon Sep 17 00:00:00 2001 From: BabtouZER <166703741+BabtouZER@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:24:37 +0200 Subject: [PATCH 20/20] Update models.py --- depsec_db/models.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/depsec_db/models.py b/depsec_db/models.py index 4087f28..87281d3 100644 --- a/depsec_db/models.py +++ b/depsec_db/models.py @@ -6,10 +6,12 @@ import uuid -from sqlalchemy import ForeignKey +from sqlalchemy import ( + ForeignKey, + func as sa_func +) from sqlalchemy.orm import relationship from werkzeug.security import generate_password_hash, check_password_hash -from sqlalchemy import func as sa_func from depsec_db.extensions import db @@ -116,7 +118,7 @@ class SBOM(db.Model): __tablename__ = 'sboms' id = db.Column(db.Integer, primary_key=True, autoincrement=True) """Clé étrangère vers l'id du projet""" - project_id = db.Column(db.Integer, ForeignKey('projects.id', ondelete="CASCADE"), nullable=False) + project_id = db.Column(db.Integer, ForeignKey('projects.id',ondelete="CASCADE"),nullable=False) sbom_data = db.Column(db.JSON, nullable=False) """Relation One-To-Many avec la table TrivyReport qui utilise l'id du SBOM""" projects = db.relationship('TrivyReport', backref='sboms', lazy=True)