factorisation db.py, database.py
parent
1a7d66b09d
commit
e3732e1c9a
|
|
@ -1,129 +1,17 @@
|
|||
from datetime import datetime
|
||||
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean, MetaData, ForeignKey, Text
|
||||
from config.settings import settings
|
||||
import logging
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Métadonnées pour les tables
|
||||
metadata = MetaData()
|
||||
|
||||
# Table des utilisateurs
|
||||
users_table = Table(
|
||||
"users",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("email", String(255), unique=True, nullable=False), # VARCHAR(255)
|
||||
Column("full_name", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("phone", String(20), nullable=False), # VARCHAR(20)
|
||||
Column("date_of_birth", DateTime, nullable=False),
|
||||
Column("organization", String(255)), # VARCHAR(255)
|
||||
Column("hashed_password", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("role", String(50), default="user"), # VARCHAR(50)
|
||||
Column("is_blocked", Boolean, default=False),
|
||||
Column("is_deleted", Boolean, default=False)
|
||||
)
|
||||
|
||||
# Table des rôles
|
||||
roles_table = Table(
|
||||
"roles",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("name", String(50), unique=True, nullable=False), # VARCHAR(50)
|
||||
Column("permissions", Text) # Stocke les permissions sous forme de chaîne séparée par des virgules
|
||||
)
|
||||
|
||||
# Table des demandes de besoin
|
||||
need_requests_table = Table(
|
||||
"need_requests",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("category", String(50), nullable=False), # Ex: "water", "food", "medical assistance"
|
||||
Column("description", Text, nullable=False),
|
||||
Column("adults", Integer, nullable=False),
|
||||
Column("children", Integer, nullable=False),
|
||||
Column("vulnerable", Integer, nullable=False),
|
||||
Column("location", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100)), # VARCHAR(100)
|
||||
Column("requester_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255)
|
||||
Column("assigned_to", Integer, ForeignKey("users.id")), # Utilisateur qui a pris en charge la demande
|
||||
Column("status", String(50), default="pending") # Ex: "pending", "in_progress", "completed"
|
||||
)
|
||||
|
||||
# Table des signalements d'utilisateurs
|
||||
user_reports_table = Table(
|
||||
"user_reports",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("reporter_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("reported_user_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("reason", Text, nullable=False),
|
||||
Column("status", String(50), default="pending") # Ex: "pending", "resolved"
|
||||
)
|
||||
|
||||
# Table des problèmes techniques
|
||||
technical_issues_table = Table(
|
||||
"technical_issues",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("user_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("description", Text, nullable=False),
|
||||
Column("status", String(50), default="open") # Ex: "open", "in_progress", "resolved"
|
||||
)
|
||||
|
||||
# Table des points d'intérêt
|
||||
points_of_interest_table = Table(
|
||||
"points_of_interest",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("label", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("description", Text),
|
||||
Column("icon", String(255)), # URL de l'icône (VARCHAR(255))
|
||||
Column("organization", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100)
|
||||
Column("added_by", Integer, ForeignKey("users.id"), nullable=False)
|
||||
)
|
||||
|
||||
# Table des abris
|
||||
shelters_table = Table(
|
||||
"shelters",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("label", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("description", Text),
|
||||
Column("status", String(50), default="available"), # Ex: "available", "full", "closed"
|
||||
Column("contact_person", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100)
|
||||
Column("added_by", Integer, ForeignKey("users.id"), nullable=False)
|
||||
)
|
||||
|
||||
# Table des déclarations de personnes
|
||||
person_reports_table = Table(
|
||||
"person_reports",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("full_name", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("date_of_birth", DateTime, nullable=False),
|
||||
Column("status", String(50), nullable=False), # Ex: "missing", "safe", "deceased"
|
||||
Column("location", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100)), # VARCHAR(100)
|
||||
Column("photo_url", String(255)), # URL de la photo (VARCHAR(255))
|
||||
Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255)
|
||||
Column("created_at", DateTime, default=datetime.utcnow), # Date de création
|
||||
Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Date de mise à jour
|
||||
)
|
||||
|
||||
# Connexion à la base de données
|
||||
DATABASE_URL = settings.database_url
|
||||
engine = create_async_engine(DATABASE_URL, echo=True)
|
||||
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
||||
|
||||
# Fonction pour initialiser la base de données
|
||||
async def init_db():
|
||||
from models.db import metadata
|
||||
try:
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(metadata.create_all)
|
||||
|
|
@ -132,7 +20,6 @@ async def init_db():
|
|||
logger.error(f"Error creating database tables: {str(e)}")
|
||||
raise
|
||||
|
||||
# Fonction pour obtenir une session de base de données
|
||||
async def get_db():
|
||||
async with AsyncSessionLocal() as session:
|
||||
yield session
|
||||
yield session
|
||||
|
|
|
|||
108
models/db.py
108
models/db.py
|
|
@ -1,61 +1,49 @@
|
|||
from datetime import datetime
|
||||
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean, MetaData, ForeignKey, Text
|
||||
from config.settings import settings
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
# Configuration du logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Métadonnées pour les tables
|
||||
metadata = MetaData()
|
||||
|
||||
# Table des utilisateurs
|
||||
# Table definitions
|
||||
users_table = Table(
|
||||
"users",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("email", String(255), unique=True, nullable=False), # VARCHAR(255)
|
||||
Column("full_name", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("phone", String(20), nullable=False), # VARCHAR(20)
|
||||
Column("email", String(255), unique=True, nullable=False),
|
||||
Column("full_name", String(255), nullable=False),
|
||||
Column("phone", String(20), nullable=False),
|
||||
Column("date_of_birth", DateTime, nullable=False),
|
||||
Column("organization", String(255)), # VARCHAR(255)
|
||||
Column("hashed_password", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("role", String(50), default="user"), # VARCHAR(50)
|
||||
Column("organization", String(255)),
|
||||
Column("hashed_password", String(255), nullable=False),
|
||||
Column("role", String(50), default="user"),
|
||||
Column("is_blocked", Boolean, default=False),
|
||||
Column("is_deleted", Boolean, default=False)
|
||||
)
|
||||
|
||||
# Table des rôles
|
||||
roles_table = Table(
|
||||
"roles",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("name", String(50), unique=True, nullable=False), # VARCHAR(50)
|
||||
Column("permissions", Text) # Stocke les permissions sous forme de chaîne séparée par des virgules
|
||||
Column("name", String(50), unique=True, nullable=False),
|
||||
Column("permissions", Text)
|
||||
)
|
||||
|
||||
# Table des demandes de besoin
|
||||
need_requests_table = Table(
|
||||
"need_requests",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("category", String(50), nullable=False), # Ex: "water", "food", "medical assistance"
|
||||
Column("category", String(50), nullable=False),
|
||||
Column("description", Text, nullable=False),
|
||||
Column("adults", Integer, nullable=False),
|
||||
Column("children", Integer, nullable=False),
|
||||
Column("vulnerable", Integer, nullable=False),
|
||||
Column("location", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100)), # VARCHAR(100)
|
||||
Column("requester_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255)
|
||||
Column("assigned_to", Integer, ForeignKey("users.id")), # Utilisateur qui a pris en charge la demande
|
||||
Column("status", String(50), default="pending"), # Ex: "pending", "in_progress", "completed"
|
||||
Column("deleted", DateTime, default=None) # Marque la suppression logique
|
||||
Column("location", String(255), nullable=False),
|
||||
Column("gps_coordinates", String(100)),
|
||||
Column("requester_email", String(255), ForeignKey("users.email"), nullable=False),
|
||||
Column("assigned_to", Integer, ForeignKey("users.id")),
|
||||
Column("status", String(50), default="pending"),
|
||||
Column("deleted", DateTime, default=None)
|
||||
)
|
||||
|
||||
# Table des signalements d'utilisateurs
|
||||
user_reports_table = Table(
|
||||
"user_reports",
|
||||
metadata,
|
||||
|
|
@ -63,77 +51,53 @@ user_reports_table = Table(
|
|||
Column("reporter_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("reported_user_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("reason", Text, nullable=False),
|
||||
Column("status", String(50), default="pending") # Ex: "pending", "resolved"
|
||||
Column("status", String(50), default="pending")
|
||||
)
|
||||
|
||||
# Table des problèmes techniques
|
||||
technical_issues_table = Table(
|
||||
"technical_issues",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("user_id", Integer, ForeignKey("users.id"), nullable=False),
|
||||
Column("description", Text, nullable=False),
|
||||
Column("status", String(50), default="open") # Ex: "open", "in_progress", "resolved"
|
||||
Column("status", String(50), default="open")
|
||||
)
|
||||
|
||||
# Table des points d'intérêt
|
||||
points_of_interest_table = Table(
|
||||
"points_of_interest",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("label", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("label", String(255), nullable=False),
|
||||
Column("description", Text),
|
||||
Column("icon", String(255)), # URL de l'icône (VARCHAR(255))
|
||||
Column("organization", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100)
|
||||
Column("icon", String(255)),
|
||||
Column("organization", String(255)),
|
||||
Column("gps_coordinates", String(100), nullable=False),
|
||||
Column("added_by", Integer, ForeignKey("users.id"), nullable=False)
|
||||
)
|
||||
|
||||
# Table des abris
|
||||
shelters_table = Table(
|
||||
"shelters",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("label", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("label", String(255), nullable=False),
|
||||
Column("description", Text),
|
||||
Column("status", String(50), default="available"), # Ex: "available", "full", "closed"
|
||||
Column("contact_person", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100), nullable=False), # VARCHAR(100)
|
||||
Column("status", String(50), default="available"),
|
||||
Column("contact_person", String(255)),
|
||||
Column("gps_coordinates", String(100), nullable=False),
|
||||
Column("added_by", Integer, ForeignKey("users.id"), nullable=False)
|
||||
)
|
||||
|
||||
# Table des déclarations de personnes
|
||||
person_reports_table = Table(
|
||||
"person_reports",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True),
|
||||
Column("full_name", String(255), nullable=False), # VARCHAR(255)
|
||||
Column("full_name", String(255), nullable=False),
|
||||
Column("date_of_birth", DateTime, nullable=False),
|
||||
Column("status", String(50), nullable=False), # Ex: "missing", "safe", "deceased"
|
||||
Column("location", String(255)), # VARCHAR(255)
|
||||
Column("gps_coordinates", String(100)), # VARCHAR(100)
|
||||
Column("photo_url", String(255)), # URL de la photo (VARCHAR(255))
|
||||
Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False), # VARCHAR(255)
|
||||
Column("created_at", DateTime, default=datetime.utcnow), # Date de création
|
||||
Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Date de mise à jour
|
||||
)
|
||||
|
||||
# Connexion à la base de données
|
||||
DATABASE_URL = settings.database_url
|
||||
engine = create_async_engine(DATABASE_URL, echo=True)
|
||||
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
||||
|
||||
# Fonction pour initialiser la base de données
|
||||
async def init_db():
|
||||
try:
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(metadata.create_all)
|
||||
logger.info("Database tables created successfully.")
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating database tables: {str(e)}")
|
||||
raise
|
||||
|
||||
# Fonction pour obtenir une session de base de données
|
||||
async def get_db():
|
||||
async with AsyncSessionLocal() as session:
|
||||
yield session
|
||||
Column("status", String(50), nullable=False),
|
||||
Column("location", String(255)),
|
||||
Column("gps_coordinates", String(100)),
|
||||
Column("photo_url", String(255)),
|
||||
Column("reporter_email", String(255), ForeignKey("users.email"), nullable=False),
|
||||
Column("created_at", DateTime, default=datetime.utcnow),
|
||||
Column("updated_at", DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
)
|
||||
Loading…
Reference in New Issue