From 90e318e60ff390a1b37eafb67e988df5b4f37fd4 Mon Sep 17 00:00:00 2001 From: Lgsus23 Date: Mon, 23 Feb 2026 19:09:12 +0000 Subject: [PATCH 1/9] migrations puesto en gitignore --- .gitignore | 1 + package-lock.json | 155 ---------------------------------------------- 2 files changed, 1 insertion(+), 155 deletions(-) diff --git a/.gitignore b/.gitignore index 80704f4378..e66294da88 100755 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ database.database database.db diagram.png __pycache__/ +migrations diff --git a/package-lock.json b/package-lock.json index 8d43d98ab7..398b3c017c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -877,19 +877,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -997,14 +984,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", @@ -1307,14 +1286,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -3915,29 +3886,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -4074,35 +4022,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/terser": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.1.tgz", - "integrity": "sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4944,18 +4863,6 @@ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", @@ -5044,14 +4951,6 @@ "@babel/types": "^7.20.7" } }, - "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", - "dev": true, - "optional": true, - "peer": true - }, "@types/prop-types": { "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", @@ -5252,14 +5151,6 @@ "update-browserslist-db": "^1.1.1" } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "optional": true, - "peer": true - }, "call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -6982,28 +6873,6 @@ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true, - "peer": true - } - } - }, "string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -7094,30 +6963,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "terser": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.38.1.tgz", - "integrity": "sha512-GWANVlPM/ZfYzuPHjq0nxT+EbOEDDN3Jwhwdg1D8TU8oSkktp8w64Uq4auuGLxFSoNTRDncTq2hQHX1Ld9KHkA==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "optional": true, - "peer": true - } - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", From f9c77b7539661c000a666ecef06ff2561438329d Mon Sep 17 00:00:00 2001 From: Alberto Madrid Date: Mon, 23 Feb 2026 20:01:06 +0000 Subject: [PATCH 2/9] Colores tema claro/oscuro definidos --- src/front/index.css | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/front/index.css b/src/front/index.css index e69de29bb2..8c5ace62ca 100644 --- a/src/front/index.css +++ b/src/front/index.css @@ -0,0 +1,21 @@ +@media (prefers-color-scheme: light) { + :root { + --primaryBackground: #f7fafc; + --primaryText: #1a202c; + --cardBackground: #ffffff; + --navBar: #2b6cb0; + --label: #718096; + --spacer: #e2e8f0; + } +} + +@media (prefers-color-scheme: dark) { + :root { + --primaryBackground: #1a202c; + --primaryText: #f7fafc; + --cardBackground: #2d3748; + --navBar: #1777bd; + --label: #a0aec0; + --spacer: #4a5568; + } +} From 7ca475b771a14762fd45564b0296ea0b4f587b3b Mon Sep 17 00:00:00 2001 From: MBello21 Date: Tue, 24 Feb 2026 15:53:00 +0000 Subject: [PATCH 3/9] Modelos para MVP --- Pipfile | 1 + Pipfile.lock | 97 ++++++++++++++++++++++++++++++++++++++++++----- src/api/models.py | 83 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 165 insertions(+), 16 deletions(-) diff --git a/Pipfile b/Pipfile index 4d377014ae..f75fb3d98a 100644 --- a/Pipfile +++ b/Pipfile @@ -20,6 +20,7 @@ typing-extensions = "*" flask-jwt-extended = "==4.6.0" wtforms = "==3.1.2" sqlalchemy = "*" +flask-bcrypt = "*" [requires] python_version = "3.13" diff --git a/Pipfile.lock b/Pipfile.lock index d9e474e972..7f919a3beb 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ffbfb32d0afa5e4bcaba5c2d08c81381a97abd90f22284d2b76647365df5dc50" + "sha256": "9c612f7eebcf717533779dc02b40fce5eeaf66bfab71c81d166828128c272240" }, "pipfile-spec": 6, "requires": { @@ -24,6 +24,75 @@ "markers": "python_version >= '3.10'", "version": "==1.17.1" }, + "bcrypt": { + "hashes": [ + "sha256:046ad6db88edb3c5ece4369af997938fb1c19d6a699b9c1b27b0db432faae4c4", + "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", + "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", + "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", + "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", + "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", + "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", + "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", + "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", + "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", + "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", + "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", + "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", + "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", + "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", + "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", + "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", + "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", + "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", + "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", + "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", + "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", + "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", + "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", + "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", + "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", + "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", + "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", + "sha256:7edda91d5ab52b15636d9c30da87d2cc84f426c72b9dba7a9b4fe142ba11f534", + "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", + "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", + "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", + "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", + "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", + "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", + "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", + "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", + "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", + "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", + "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", + "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", + "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", + "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", + "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", + "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", + "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", + "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", + "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", + "sha256:dcd58e2b3a908b5ecc9b9df2f0085592506ac2d5110786018ee5e160f28e0911", + "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", + "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", + "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", + "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", + "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", + "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", + "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", + "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", + "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", + "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", + "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", + "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", + "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", + "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b" + ], + "markers": "python_version >= '3.8'", + "version": "==5.0.0" + }, "blinker": { "hashes": [ "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", @@ -42,11 +111,11 @@ }, "click": { "hashes": [ - "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", - "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4" + "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", + "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" ], "markers": "python_version >= '3.10'", - "version": "==8.3.0" + "version": "==8.3.1" }, "cloudinary": { "hashes": [ @@ -58,12 +127,12 @@ }, "flask": { "hashes": [ - "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87", - "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c" + "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", + "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.1.2" + "version": "==3.1.3" }, "flask-admin": { "hashes": [ @@ -74,6 +143,14 @@ "markers": "python_version >= '3.10'", "version": "==2.0.0" }, + "flask-bcrypt": { + "hashes": [ + "sha256:062fd991dc9118d05ac0583675507b9fe4670e44416c97e0e6819d03d01f808a", + "sha256:f07b66b811417ea64eb188ae6455b0b708a793d966e1a80ceec4a23bc42a4369" + ], + "index": "pypi", + "version": "==1.0.1" + }, "flask-cors": { "hashes": [ "sha256:c7b2cbfb1a31aa0d2e5341eea03a6805349f7a61647daee1a15c46bbe981494c", @@ -575,11 +652,11 @@ }, "werkzeug": { "hashes": [ - "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", - "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" + "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", + "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131" ], "markers": "python_version >= '3.9'", - "version": "==3.1.3" + "version": "==3.1.6" }, "wtforms": { "hashes": [ diff --git a/src/api/models.py b/src/api/models.py index da515f6a1a..88c01bf70f 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -1,19 +1,90 @@ from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import String, Boolean -from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy import String, Boolean, ForeignKey, Text, Date +from sqlalchemy.orm import Mapped, mapped_column, relationship +from flask_bcrypt import generate_password_hash, check_password_hash +from datetime import date db = SQLAlchemy() + class User(db.Model): id: Mapped[int] = mapped_column(primary_key=True) - email: Mapped[str] = mapped_column(String(120), unique=True, nullable=False) - password: Mapped[str] = mapped_column(nullable=False) + firstname: Mapped[str] = mapped_column( + String(120), unique=False, nullable=True) + lastname: Mapped[str] = mapped_column( + String(120), unique=False, nullable=True) + rol: Mapped[str] = mapped_column(String(55), unique=False, nullable=True) + email: Mapped[str] = mapped_column( + String(120), unique=True, nullable=False) is_active: Mapped[bool] = mapped_column(Boolean(), nullable=False) + password_hash: Mapped[str] = mapped_column(nullable=True) + + def generate_hash(self, password): + self.password_hash = generate_password_hash(password).decode("utf-8") + def check_hash(self, password): + return check_password_hash(self.password_hash, password) def serialize(self): return { "id": self.id, + "firstname": self.firstname, + "lastname": self.lastname, + "rol": self.rol, "email": self.email, - # do not serialize the password, its a security breach - } \ No newline at end of file + } + + +class Income(db.Model): + id: Mapped[str] = mapped_column(primary_key=True) + id_patient: Mapped[str] = mapped_column(ForeignKey("patient.dni")) + patient: Mapped["Patient"] = relationship(back_populates="income") + reason_consultation: Mapped[str] = mapped_column( + String(600), nullable=False, unique=False) + triage_priority: Mapped[int] = mapped_column(nullable=True) + diagnosis: Mapped[str] = mapped_column(Text, nullable=True, unique=False) + state: Mapped[str] = mapped_column( + String(120), nullable=False, unique=False) + + def serialize(self): + return { + "reason_consultation": self.reason_consultation, + "triage_priority": self.triage_priority, + "diagnosis": self.diagnosis, + "state": self.state + } + + def serialize_patient_data(self): + return { + "patient_dni": self.patient.dni, + "patient_firstname": self.patient.firstname, + "patient_lastname": self.patient.lastname, + "patient_birthdate": self.patient.birthdate.isoformat(), + "patient_allergies": self.patient.allergies, + "reason_consultation": self.reason_consultation, + "triage_priority": self.triage_priority, + "diagnosis": self.diagnosis, + "state": self.state + } + + +class Patient(db.Model): + # ID del paciente para evitar que se repita + dni: Mapped[str] = mapped_column(primary_key=True) + firstname: Mapped[str] = mapped_column( + String(120), nullable=False, unique=False) + lastname: Mapped[str] = mapped_column( + String(120), nullable=False, unique=False) + birthdate: Mapped[date] = mapped_column(Date, nullable=False, unique=False) + allergies: Mapped[str] = mapped_column(Text, nullable=False) + income: Mapped[list["Income"]] = relationship(back_populates="patient") + + def serialize(self): + return { + "dni": self.dni, + "firstname": self.firstname, + "lastname": self.lastname, + "birthdate": self.birthdate.isoformat(), + "allergies": self.allergies, + "income": [i.serialize() for i in self.income] + } From 7f120584fee391260bb1319db2cce00e40f934d0 Mon Sep 17 00:00:00 2001 From: MBello21 Date: Tue, 24 Feb 2026 20:16:38 +0000 Subject: [PATCH 4/9] Correccion modelos MVP --- migrations/versions/0763d677d453_.py | 35 ---------------------------- src/api/models.py | 16 +++++++++++-- 2 files changed, 14 insertions(+), 37 deletions(-) delete mode 100644 migrations/versions/0763d677d453_.py diff --git a/migrations/versions/0763d677d453_.py b/migrations/versions/0763d677d453_.py deleted file mode 100644 index 88964176f1..0000000000 --- a/migrations/versions/0763d677d453_.py +++ /dev/null @@ -1,35 +0,0 @@ -"""empty message - -Revision ID: 0763d677d453 -Revises: -Create Date: 2025-02-25 14:47:16.337069 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '0763d677d453' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('user', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('email', sa.String(length=120), nullable=False), - sa.Column('password', sa.String(), nullable=False), - sa.Column('is_active', sa.Boolean(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('email') - ) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('user') - # ### end Alembic commands ### diff --git a/src/api/models.py b/src/api/models.py index 88c01bf70f..bfa3c21a80 100644 --- a/src/api/models.py +++ b/src/api/models.py @@ -1,5 +1,5 @@ from flask_sqlalchemy import SQLAlchemy -from sqlalchemy import String, Boolean, ForeignKey, Text, Date +from sqlalchemy import String, Boolean, ForeignKey, Text, Date, Integer from sqlalchemy.orm import Mapped, mapped_column, relationship from flask_bcrypt import generate_password_hash, check_password_hash from datetime import date @@ -16,6 +16,10 @@ class User(db.Model): rol: Mapped[str] = mapped_column(String(55), unique=False, nullable=True) email: Mapped[str] = mapped_column( String(120), unique=True, nullable=False) + income_doctor: Mapped[list["Income"]] = relationship( + back_populates="doctor", foreign_keys="Income.id_doctor") + income_nurse: Mapped[list["Income"]] = relationship( + back_populates="nurse", foreign_keys="Income.id_nurse") is_active: Mapped[bool] = mapped_column(Boolean(), nullable=False) password_hash: Mapped[str] = mapped_column(nullable=True) @@ -39,6 +43,12 @@ class Income(db.Model): id: Mapped[str] = mapped_column(primary_key=True) id_patient: Mapped[str] = mapped_column(ForeignKey("patient.dni")) patient: Mapped["Patient"] = relationship(back_populates="income") + id_doctor: Mapped[int] = mapped_column(Integer, ForeignKey("user.id")) + doctor: Mapped["User"] = relationship( + back_populates="income_doctor", foreign_keys=[id_doctor]) + id_nurse: Mapped[int] = mapped_column(Integer, ForeignKey("user.id")) + nurse: Mapped["User"] = relationship( + back_populates="income_nurse", foreign_keys=[id_nurse]) reason_consultation: Mapped[str] = mapped_column( String(600), nullable=False, unique=False) triage_priority: Mapped[int] = mapped_column(nullable=True) @@ -51,7 +61,9 @@ def serialize(self): "reason_consultation": self.reason_consultation, "triage_priority": self.triage_priority, "diagnosis": self.diagnosis, - "state": self.state + "state": self.state, + "doctor": self.doctor.firstname if self.doctor else None, + "nurse": self.nurse.firstname if self.nurse else None } def serialize_patient_data(self): From 610f50b5062e08c1ee12ebaa5e766f2c6b4950eb Mon Sep 17 00:00:00 2001 From: MBello21 Date: Wed, 25 Feb 2026 17:48:12 +0000 Subject: [PATCH 5/9] =?UTF-8?q?Maquetaci=C3=B3n=20Navbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/assets/img/Logo.png | Bin 0 -> 50109 bytes src/front/components/Navbar.jsx | 19 ----------- src/front/components/Navbar/Navbar.css | 42 +++++++++++++++++++++++++ src/front/components/Navbar/Navbar.jsx | 37 ++++++++++++++++++++++ src/front/index.css | 16 +++++----- src/front/pages/Layout.jsx | 13 +++++--- 6 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 src/front/assets/img/Logo.png delete mode 100644 src/front/components/Navbar.jsx create mode 100644 src/front/components/Navbar/Navbar.css create mode 100644 src/front/components/Navbar/Navbar.jsx diff --git a/src/front/assets/img/Logo.png b/src/front/assets/img/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f9cdd6f4bae84c95b1d6a7650cc33da01f771a GIT binary patch literal 50109 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 literal 0 HcmV?d00001 diff --git a/src/front/components/Navbar.jsx b/src/front/components/Navbar.jsx deleted file mode 100644 index 30d43a2636..0000000000 --- a/src/front/components/Navbar.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Link } from "react-router-dom"; - -export const Navbar = () => { - - return ( - - ); -}; \ No newline at end of file diff --git a/src/front/components/Navbar/Navbar.css b/src/front/components/Navbar/Navbar.css new file mode 100644 index 0000000000..868516ce5d --- /dev/null +++ b/src/front/components/Navbar/Navbar.css @@ -0,0 +1,42 @@ +.custom_navbar { + color: var(--primaryText); + background-color: var(--navBar); + width: 80px; + min-height: 100vh; + transition: width 0.5s ease-in-out; + overflow: hidden; +} +.expended { + width: 250px; + opacity: 1; +} +.img_contianer { + min-width: 80px; + height: 60px; +} +.img_contianer-expend { + min-width: 250px; +} +.img_contianer img { + width: 50px; + height: 40px; +} +.navbar_icons { + cursor: pointer; + flex-shrink: 0; + white-space: nowrap; +} + +.navbar_icons h3 { + font-size: 38px; +} +.width-icon { + min-width: 80px; +} +.navbar_icons-text { + opacity: 0; +} +.text-expended { + opacity: 1; + transition: opacity 0.5s ease-in-out; +} diff --git a/src/front/components/Navbar/Navbar.jsx b/src/front/components/Navbar/Navbar.jsx new file mode 100644 index 0000000000..eef88a89c6 --- /dev/null +++ b/src/front/components/Navbar/Navbar.jsx @@ -0,0 +1,37 @@ +import { Link } from "react-router-dom"; +import LogoUrl from "../../assets/img/Logo.png"; +import "./Navbar.css" +import { useState } from "react"; +export const Navbar = () => { + + const [offCanvas, setOffCanvas] = useState(false) + + return ( + <> + + + + + ); +}; \ No newline at end of file diff --git a/src/front/index.css b/src/front/index.css index 8c5ace62ca..462d96d22c 100644 --- a/src/front/index.css +++ b/src/front/index.css @@ -1,12 +1,10 @@ -@media (prefers-color-scheme: light) { - :root { - --primaryBackground: #f7fafc; - --primaryText: #1a202c; - --cardBackground: #ffffff; - --navBar: #2b6cb0; - --label: #718096; - --spacer: #e2e8f0; - } +:root { + --primaryBackground: #f7fafc; + --primaryText: #1a202c; + --cardBackground: #ffffff; + --navBar: #2b6cb0; + --label: #718096; + --spacer: #e2e8f0; } @media (prefers-color-scheme: dark) { diff --git a/src/front/pages/Layout.jsx b/src/front/pages/Layout.jsx index 9bfa31325c..9ea72bff5f 100644 --- a/src/front/pages/Layout.jsx +++ b/src/front/pages/Layout.jsx @@ -1,15 +1,20 @@ import { Outlet } from "react-router-dom/dist" import ScrollToTop from "../components/ScrollToTop" -import { Navbar } from "../components/Navbar" +import { Navbar } from "../components/Navbar/Navbar" import { Footer } from "../components/Footer" // Base component that maintains the navbar and footer throughout the page and the scroll to top functionality. export const Layout = () => { return ( - - -