from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean, MetaData, ForeignKey, Text from datetime import datetime, timezone metadata = MetaData() # Table definitions # Table des utilisateurs users_table = Table( 'users', metadata, Column('id', Integer, primary_key=True, autoincrement=True), Column('email', String(255), unique=True, nullable=False), Column('full_name', String(255), nullable=False), Column('phone', String(20)), Column('date_of_birth', String(20)), Column('organization', String(255)), Column('hashed_password', String(255), nullable=False), Column('role', String(50), nullable=False), Column('is_banned', Boolean, default=False), Column('is_deleted', Boolean, default=False) ) # Table des rôles roles_table = Table( 'roles', metadata, Column('id', Integer, primary_key=True, autoincrement=True), Column('name', String(50), unique=True, nullable=False) ) # Table des permissions permissions_table = Table( 'permissions', metadata, Column('id', Integer, primary_key=True, autoincrement=True), Column('name', String(100), unique=True, nullable=False) ) # Table d'association entre rôles et permissions role_permissions_table = Table( 'role_permissions', metadata, Column('role_id', Integer, ForeignKey('roles.id'), primary_key=True), Column('permission_id', Integer, ForeignKey('permissions.id'), primary_key=True) ) need_requests_table = Table( "need_requests", metadata, Column("id", Integer, primary_key=True), 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), 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) ) 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") ) 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") ) points_of_interest_table = Table( "points_of_interest", metadata, Column("id", Integer, primary_key=True), Column("label", String(255), nullable=False), Column("description", Text), Column("icon", String(255)), Column("organization", String(255)), Column("gps_coordinates", String(100), nullable=False), Column("added_by", Integer, ForeignKey("users.id"), nullable=False) ) shelters_table = Table( "shelters", metadata, Column("id", Integer, primary_key=True), Column("label", String(255), nullable=False), Column("description", Text), Column("status", String(50), default="available"), Column("contact_person", String(255)), Column('contact_email', String(255)), Column('contact_phone', String(20)), Column("gps_coordinates", String(100), nullable=False), Column("added_by", Integer, ForeignKey("users.id"), nullable=False) ) person_reports_table = Table( "person_reports", metadata, Column("id", Integer, primary_key=True), Column("full_name", String(255), nullable=False), Column("date_of_birth", DateTime, nullable=False), 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.now(timezone.utc)), Column("updated_at", DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) )