From 93485eb7009c00d24aeabb6a3743ef6da484a3b8 Mon Sep 17 00:00:00 2001 From: Luis Sanchez Date: Sat, 27 Dec 2025 16:51:09 -0500 Subject: [PATCH] Reorganizacion de proyecto --- backend/__pycache__/main.cpython-314.pyc | Bin 0 -> 2491 bytes backend/alembic/env.py | 4 +- .../app/__pycache__/schemas.cpython-314.pyc | Bin 0 -> 17632 bytes .../app/__pycache__/security.cpython-314.pyc | Bin 0 -> 4007 bytes .../db/__pycache__/database.cpython-314.pyc | Bin 0 -> 995 bytes backend/{ => app/db}/database.py | 0 backend/{ => app}/init_db.py | 6 +- backend/{ => app}/migrate.py | 0 .../models/__pycache__/models.cpython-314.pyc | Bin 0 -> 8807 bytes backend/{ => app/models}/models.py | 2 +- .../__pycache__/activities.cpython-314.pyc | Bin 0 -> 8667 bytes .../routers/__pycache__/auth.cpython-314.pyc | Bin 0 -> 2113 bytes .../__pycache__/contractors.cpython-314.pyc | Bin 0 -> 5552 bytes .../routers/__pycache__/guest.cpython-314.pyc | Bin 0 -> 5097 bytes .../non_conformities.cpython-314.pyc | Bin 0 -> 11378 bytes .../__pycache__/projects.cpython-314.pyc | Bin 0 -> 7517 bytes .../__pycache__/specialties.cpython-314.pyc | Bin 0 -> 1245 bytes .../__pycache__/transcription.cpython-314.pyc | Bin 0 -> 2996 bytes .../routers/__pycache__/users.cpython-314.pyc | Bin 0 -> 2174 bytes backend/{ => app}/routers/activities.py | 109 +++++----------- backend/{ => app}/routers/auth.py | 10 +- backend/{ => app}/routers/contractors.py | 22 ++-- backend/{ => app}/routers/guest.py | 14 +- backend/{ => app}/routers/non_conformities.py | 26 ++-- backend/{ => app}/routers/projects.py | 20 +-- backend/{ => app}/routers/specialties.py | 10 +- backend/{ => app}/routers/transcription.py | 2 +- backend/{ => app}/routers/users.py | 10 +- backend/{ => app}/schemas.py | 2 +- backend/{ => app}/security.py | 8 +- .../__pycache__/activities.cpython-314.pyc | Bin 0 -> 7757 bytes .../__pycache__/users.cpython-314.pyc | Bin 0 -> 2023 bytes backend/app/services/activities.py | 120 ++++++++++++++++++ backend/{ => app}/services/email_service.py | 0 .../services/transcription_worker.py | 4 +- backend/{ => app}/services/users.py | 6 +- backend/main.py | 2 +- backend/requirements.txt | 40 ++---- backend/services/activities.py | 35 ----- .../environments/environment.development.ts | 2 +- frontend/src/environments/environment.ts | 2 +- 41 files changed, 243 insertions(+), 213 deletions(-) create mode 100644 backend/__pycache__/main.cpython-314.pyc create mode 100644 backend/app/__pycache__/schemas.cpython-314.pyc create mode 100644 backend/app/__pycache__/security.cpython-314.pyc create mode 100644 backend/app/db/__pycache__/database.cpython-314.pyc rename backend/{ => app/db}/database.py (100%) rename backend/{ => app}/init_db.py (88%) rename backend/{ => app}/migrate.py (100%) create mode 100644 backend/app/models/__pycache__/models.cpython-314.pyc rename backend/{ => app/models}/models.py (99%) create mode 100644 backend/app/routers/__pycache__/activities.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/auth.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/contractors.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/guest.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/non_conformities.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/projects.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/specialties.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/transcription.cpython-314.pyc create mode 100644 backend/app/routers/__pycache__/users.cpython-314.pyc rename backend/{ => app}/routers/activities.py (56%) rename backend/{ => app}/routers/auth.py (81%) rename backend/{ => app}/routers/contractors.py (77%) rename backend/{ => app}/routers/guest.py (88%) rename backend/{ => app}/routers/non_conformities.py (88%) rename backend/{ => app}/routers/projects.py (84%) rename backend/{ => app}/routers/specialties.py (61%) rename backend/{ => app}/routers/transcription.py (97%) rename backend/{ => app}/routers/users.py (77%) rename backend/{ => app}/schemas.py (98%) rename backend/{ => app}/security.py (93%) create mode 100644 backend/app/services/__pycache__/activities.cpython-314.pyc create mode 100644 backend/app/services/__pycache__/users.cpython-314.pyc create mode 100644 backend/app/services/activities.py rename backend/{ => app}/services/email_service.py (100%) rename backend/{ => app}/services/transcription_worker.py (97%) rename backend/{ => app}/services/users.py (85%) delete mode 100644 backend/services/activities.py diff --git a/backend/__pycache__/main.cpython-314.pyc b/backend/__pycache__/main.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4525cf15186901d40046863d4219f49258e71657 GIT binary patch literal 2491 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 literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/security.cpython-314.pyc b/backend/app/__pycache__/security.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc7874b3ab0b20e0600d50534535ed57d9fb8f55 GIT binary patch literal 4007 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 literal 0 HcmV?d00001 diff --git a/backend/database.py b/backend/app/db/database.py similarity index 100% rename from backend/database.py rename to backend/app/db/database.py diff --git a/backend/init_db.py b/backend/app/init_db.py similarity index 88% rename from backend/init_db.py rename to backend/app/init_db.py index 802bcaa..942ad47 100644 --- a/backend/init_db.py +++ b/backend/app/init_db.py @@ -1,6 +1,6 @@ -from database import engine, Base, SessionLocal -from models import User, Project, Specialty, Contractor, Activity, NonConformity, Evidence, UserRole -from security import get_password_hash # Import hashing function +from app.db.database import engine, Base, SessionLocal +from app.models import User, Project, Specialty, Contractor, Activity, NonConformity, Evidence, UserRole +from app.security import get_password_hash # Import hashing function import datetime def init_db(): diff --git a/backend/migrate.py b/backend/app/migrate.py similarity index 100% rename from backend/migrate.py rename to backend/app/migrate.py diff --git a/backend/app/models/__pycache__/models.cpython-314.pyc b/backend/app/models/__pycache__/models.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..969e951d623e50b0abdea37bf3654663a2b6a726 GIT binary patch literal 8807 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