factorisation db.py, database.py

main
Anaz 2025-01-10 10:00:13 +04:00
parent 1a7d66b09d
commit e3732e1c9a
2 changed files with 38 additions and 187 deletions

View File

@ -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

View File

@ -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)
)