Spaces:
Runtime error
Runtime error
File size: 13,996 Bytes
deb8048 9cf9a2a 7435134 deb8048 9cf9a2a deb8048 9cf9a2a deb8048 9cf9a2a deb8048 9cf9a2a deb8048 9cf9a2a deb8048 9cf9a2a deb8048 9cf9a2a 7435134 9cf9a2a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | """
Seed database with sample Cameroonian laws for testing.
Les categories sont les 14 domaines canoniques, crees PAR LEUR NOM s'ils
manquent, et les lois s'y rattachent par le nom. L'ancienne version semait
cinq categories aux identifiants fixes (1 a 5) et aux noms d'avant la
migration 013 : sur une base migree, elle en ajoutait une quinzieme, et ses
lois pointaient sur la categorie qui portait par hasard l'identifiant 1, 2
ou 3 — le defaut meme que la resolution par le nom a corrige dans le
pipeline.
"""
import asyncio
import sys
from pathlib import Path
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent))
from datetime import date
from app.core.database import AsyncSessionLocal, Base, engine
from app.models.law import Article, Category, Law
from app.services.legal_domain_classifier import (
AFFAIRES,
CANONICAL_DOMAINS,
CIVIL,
DESCRIPTIONS_DOMAINES,
PENAL,
)
SAMPLE_LAWS = [
{
"reference": "LOI-2024-001",
"title": "Code Civil Camerounais - Livre 1",
"type": "Loi",
"domaine": CIVIL,
"language": "fr",
"status": "published",
"publication_date": date(2024, 1, 15),
"content": """
LOI N° 2024-001 DU 15 JANVIER 2024
RELATIVE AU CODE CIVIL CAMEROUNAIS
TITRE PREMIER - DES PERSONNES
Article 1er. Tout individu possède la personnalité juridique dès sa naissance vivante et viable.
Article 2. La majorité est fixée à vingt et un ans accomplis. À cet âge, toute personne est capable d'exercer tous les droits dont elle jouit.
Article 3. Le domicile d'une personne est au lieu où elle a son principal établissement. Le domicile une fois établi subsiste tant qu'il n'en a pas été créé un autre.
TITRE II - DES BIENS
Article 4. Les biens sont meubles ou immeubles. Cette distinction s'applique à tous les biens corporels ou incorporels.
Article 5. Sont immeubles par nature les fonds de terre et les bâtiments. Sont immeubles par destination les objets mobiliers que le propriétaire a attachés au fonds à perpétuelle demeure.
Article 6. Tous les autres biens sont meubles. Sont réputés meubles par anticipation les récoltes pendantes et les fruits non encore cueillis.
TITRE III - DES OBLIGATIONS
Article 7. Les contrats légalement formés tiennent lieu de loi à ceux qui les ont faits. Ils ne peuvent être révoqués que de leur consentement mutuel ou pour les causes que la loi autorise.
Article 8. Les conventions doivent être exécutées de bonne foi. Elles obligent non seulement à ce qui y est exprimé, mais encore à toutes les suites que l'équité, l'usage ou la loi donnent à l'obligation.
Article 9. La responsabilité civile engage celui qui cause un dommage à autrui à le réparer. Chacun est responsable du dommage qu'il a causé non seulement par son fait, mais encore par sa négligence ou par son imprudence.
""",
"articles": [
{"number": "1", "title": "Personnalité juridique", "content": "Tout individu possède la personnalité juridique dès sa naissance vivante et viable.", "order": 1},
{"number": "2", "title": "Majorité", "content": "La majorité est fixée à vingt et un ans accomplis. À cet âge, toute personne est capable d'exercer tous les droits dont elle jouit.", "order": 2},
{"number": "3", "title": "Domicile", "content": "Le domicile d'une personne est au lieu où elle a son principal établissement. Le domicile une fois établi subsiste tant qu'il n'en a pas été créé un autre.", "order": 3},
{"number": "4", "title": "Classification des biens", "content": "Les biens sont meubles ou immeubles. Cette distinction s'applique à tous les biens corporels ou incorporels.", "order": 4},
{"number": "5", "title": "Immeubles", "content": "Sont immeubles par nature les fonds de terre et les bâtiments. Sont immeubles par destination les objets mobiliers que le propriétaire a attachés au fonds à perpétuelle demeure.", "order": 5},
{"number": "6", "title": "Meubles", "content": "Tous les autres biens sont meubles. Sont réputés meubles par anticipation les récoltes pendantes et les fruits non encore cueillis.", "order": 6},
{"number": "7", "title": "Force obligatoire des contrats", "content": "Les contrats légalement formés tiennent lieu de loi à ceux qui les ont faits. Ils ne peuvent être révoqués que de leur consentement mutuel ou pour les causes que la loi autorise.", "order": 7},
{"number": "8", "title": "Bonne foi", "content": "Les conventions doivent être exécutées de bonne foi. Elles obligent non seulement à ce qui y est exprimé, mais encore à toutes les suites que l'équité, l'usage ou la loi donnent à l'obligation.", "order": 8},
{"number": "9", "title": "Responsabilité civile", "content": "La responsabilité civile engage celui qui cause un dommage à autrui à le réparer. Chacun est responsable du dommage qu'il a causé non seulement par son fait, mais encore par sa négligence ou par son imprudence.", "order": 9},
]
},
{
"reference": "LOI-OHADA-2023-015",
"title": "Acte Uniforme OHADA - Droit Commercial",
"type": "Acte Uniforme",
"domaine": AFFAIRES,
"language": "fr",
"status": "published",
"publication_date": date(2023, 6, 20),
"content": """
ACTE UNIFORME OHADA N° 2023-015 DU 20 JUIN 2023
RELATIF AU DROIT COMMERCIAL GÉNÉRAL
LIVRE PREMIER - DU COMMERÇANT
Article 1er. Est commerçant celui qui fait de l'accomplissement d'actes de commerce par nature sa profession habituelle.
Article 2. Tout commerçant doit procéder à l'immatriculation au registre du commerce et du crédit mobilier dans le mois du commencement de son activité.
Article 3. Les sociétés commerciales jouissent de la personnalité juridique à compter de leur immatriculation au registre du commerce et du crédit mobilier.
LIVRE II - DES ACTES DE COMMERCE
Article 4. Sont réputés actes de commerce par nature : l'achat de biens meubles ou immeubles en vue de leur revente, les opérations de banque, les opérations de bourse.
Article 5. Les actes de commerce par accessoire sont ceux qui, accomplis par un commerçant pour les besoins de son commerce, constituent des actes de commerce.
LIVRE III - DES SOCIÉTÉS
Article 6. La société est créée par deux ou plusieurs personnes qui conviennent par un contrat d'affecter à une entreprise commune des biens ou leur industrie en vue de partager le bénéfice ou de profiter de l'économie qui pourra en résulter.
Article 7. Les formes de sociétés commerciales reconnues sont : la société en nom collectif, la société en commandite simple, la société à responsabilité limitée, et la société anonyme.
""",
"articles": [
{"number": "1", "title": "Définition du commerçant", "content": "Est commerçant celui qui fait de l'accomplissement d'actes de commerce par nature sa profession habituelle.", "order": 1},
{"number": "2", "title": "Immatriculation", "content": "Tout commerçant doit procéder à l'immatriculation au registre du commerce et du crédit mobilier dans le mois du commencement de son activité.", "order": 2},
{"number": "3", "title": "Personnalité juridique des sociétés", "content": "Les sociétés commerciales jouissent de la personnalité juridique à compter de leur immatriculation au registre du commerce et du crédit mobilier.", "order": 3},
{"number": "4", "title": "Actes de commerce par nature", "content": "Sont réputés actes de commerce par nature : l'achat de biens meubles ou immeubles en vue de leur revente, les opérations de banque, les opérations de bourse.", "order": 4},
{"number": "5", "title": "Actes de commerce par accessoire", "content": "Les actes de commerce par accessoire sont ceux qui, accomplis par un commerçant pour les besoins de son commerce, constituent des actes de commerce.", "order": 5},
{"number": "6", "title": "Définition de la société", "content": "La société est créée par deux ou plusieurs personnes qui conviennent par un contrat d'affecter à une entreprise commune des biens ou leur industrie en vue de partager le bénéfice ou de profiter de l'économie qui pourra en résulter.", "order": 6},
{"number": "7", "title": "Formes de sociétés", "content": "Les formes de sociétés commerciales reconnues sont : la société en nom collectif, la société en commandite simple, la société à responsabilité limitée, et la société anonyme.", "order": 7},
]
},
{
"reference": "LOI-2016-007",
"title": "Code Pénal Camerounais",
"type": "Loi",
"domaine": PENAL,
"language": "fr",
"status": "published",
"publication_date": date(2016, 7, 12),
"content": """
LOI N° 2016-007 DU 12 JUILLET 2016
PORTANT CODE PÉNAL
LIVRE PREMIER - DISPOSITIONS GÉNÉRALES
Article 1er. Nul ne peut être puni qu'en vertu d'une loi antérieure aux faits qui lui sont reprochés.
Article 2. Les infractions sont classées en trois catégories : les contraventions, les délits et les crimes.
Article 3. La tentative d'un crime est toujours punissable. La tentative d'un délit n'est punissable que si la loi le prévoit expressément.
LIVRE II - DES INFRACTIONS
Article 4. Le vol est la soustraction frauduleuse de la chose d'autrui. Il est puni d'un emprisonnement de six mois à cinq ans et d'une amende.
Article 5. L'escroquerie est le fait d'obtenir un bien ou un avantage par des manœuvres frauduleuses. Elle est punie d'un emprisonnement d'un à cinq ans.
Article 6. Le meurtre est le fait de donner volontairement la mort à autrui. Il est puni de la réclusion criminelle à perpétuité.
""",
"articles": [
{"number": "1", "title": "Principe de légalité", "content": "Nul ne peut être puni qu'en vertu d'une loi antérieure aux faits qui lui sont reprochés.", "order": 1},
{"number": "2", "title": "Classification des infractions", "content": "Les infractions sont classées en trois catégories : les contraventions, les délits et les crimes.", "order": 2},
{"number": "3", "title": "Tentative", "content": "La tentative d'un crime est toujours punissable. La tentative d'un délit n'est punissable que si la loi le prévoit expressément.", "order": 3},
{"number": "4", "title": "Vol", "content": "Le vol est la soustraction frauduleuse de la chose d'autrui. Il est puni d'un emprisonnement de six mois à cinq ans et d'une amende.", "order": 4},
{"number": "5", "title": "Escroquerie", "content": "L'escroquerie est le fait d'obtenir un bien ou un avantage par des manœuvres frauduleuses. Elle est punie d'un emprisonnement d'un à cinq ans.", "order": 5},
{"number": "6", "title": "Meurtre", "content": "Le meurtre est le fait de donner volontairement la mort à autrui. Il est puni de la réclusion criminelle à perpétuité.", "order": 6},
]
}
]
async def seed_database():
"""Seed the database with sample data."""
print("=" * 80)
print("SEEDING DATABASE WITH SAMPLE LAWS")
print("=" * 80)
# Create tables
print("\n[1/4] Creating database tables...")
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
print(" Tables created successfully")
async with AsyncSessionLocal() as session:
# Les 14 domaines, par leur nom : seuls les manquants sont crees.
print("\n[2/4] Creating categories...")
from sqlalchemy import select
presents = {
nom.lower(): identifiant
for nom, identifiant in (await session.execute(select(Category.name, Category.id))).all()
}
crees = 0
for ordre, nom in enumerate(CANONICAL_DOMAINS):
if nom.lower() not in presents:
session.add(Category(
name=nom, description=DESCRIPTIONS_DOMAINES[nom], display_order=ordre,
))
crees += 1
await session.commit()
ids = {
nom.lower(): identifiant
for nom, identifiant in (await session.execute(select(Category.name, Category.id))).all()
}
print(f" {crees} created, {len(CANONICAL_DOMAINS) - crees} already present")
# Create laws with articles
print("\n[3/4] Creating laws and articles...")
for law_data in SAMPLE_LAWS:
articles_data = law_data.pop("articles")
# Rattachement par le NOM du domaine, jamais par une position.
law_data["category_id"] = ids[law_data.pop("domaine").lower()]
law = Law(**law_data)
session.add(law)
await session.flush() # Get law ID
# Create articles
for art_data in articles_data:
article = Article(law_id=law.id, **art_data)
session.add(article)
print(f" Created law: {law.reference} with {len(articles_data)} articles")
await session.commit()
print(f" Total: {len(SAMPLE_LAWS)} laws created")
# Verify
print("\n[4/4] Verifying data...")
from sqlalchemy import func, select
result = await session.execute(select(func.count(Law.id)))
law_count = result.scalar()
result = await session.execute(select(func.count(Article.id)))
article_count = result.scalar()
result = await session.execute(select(func.count(Category.id)))
category_count = result.scalar()
print(f" Categories: {category_count}")
print(f" Laws: {law_count}")
print(f" Articles: {article_count}")
print("\n" + "=" * 80)
print("[SUCCESS] Database seeded successfully!")
print("=" * 80)
if __name__ == "__main__":
asyncio.run(seed_database())
|