Files
opencloud-backend/app/seed.py
T
2026-07-18 20:32:51 +08:00

63 lines
3.4 KiB
Python

import asyncio
from sqlalchemy import select
from sqlalchemy.orm import selectinload
from app.config import settings
from app.database import SessionLocal
from app.models import CloudType, Profile, User
from app.security import hash_password, utc_now
CLOUD_TYPES = [
{"id": 1, "name": "积云", "name_en": "Cumulus", "genus": "低云族", "rarity": "common", "description": "轮廓分明、底部较平,常呈棉花团状的对流云。"},
{"id": 2, "name": "层云", "name_en": "Stratus", "genus": "低云族", "rarity": "common", "description": "低而均匀的灰色云层,常覆盖大部分天空。"},
{"id": 3, "name": "卷云", "name_en": "Cirrus", "genus": "高云族", "rarity": "common", "description": "由冰晶组成的纤细白色云丝,常呈羽毛或马尾状。"},
{"id": 4, "name": "积雨云", "name_en": "Cumulonimbus", "genus": "直展云族", "rarity": "uncommon", "description": "垂直发展旺盛的巨大云体,可能带来雷雨、冰雹和强风。"},
{"id": 5, "name": "层积云", "name_en": "Stratocumulus", "genus": "低云族", "rarity": "common", "description": "成片或成层排列的低云块,常带有明暗相间的纹理。"},
{"id": 6, "name": "高积云", "name_en": "Altocumulus", "genus": "中云族", "rarity": "common", "description": "由较小云块组成的中层云,常呈波纹或鱼鳞状。"},
{"id": 7, "name": "高层云", "name_en": "Altostratus", "genus": "中云族", "rarity": "uncommon", "description": "灰蓝色的中层云幕,太阳通常像隔着毛玻璃一样可见。"},
{"id": 8, "name": "雨层云", "name_en": "Nimbostratus", "genus": "中低云族", "rarity": "uncommon", "description": "厚而暗的降水云层,常带来持续性的雨或雪。"},
{"id": 9, "name": "卷层云", "name_en": "Cirrostratus", "genus": "高云族", "rarity": "rare", "description": "薄而透明的冰晶云幕,常在日月周围形成光环。"},
{"id": 10, "name": "卷积云", "name_en": "Cirrocumulus", "genus": "高云族", "rarity": "rare", "description": "细小白色云粒规则排列形成的高云,俗称鱼鳞天。"},
]
async def seed() -> None:
async with SessionLocal() as db:
for values in CLOUD_TYPES:
cloud_type = await db.get(CloudType, values["id"])
if cloud_type:
for key, value in values.items():
setattr(cloud_type, key, value)
else:
db.add(CloudType(**values))
if settings.admin_email and settings.admin_password:
email = settings.admin_email.strip().lower()
result = await db.execute(
select(User).options(selectinload(User.profile)).where(User.email == email)
)
admin = result.scalar_one_or_none()
if admin:
admin.profile.role = "admin"
admin.profile.is_disabled = False
admin.email_verified_at = admin.email_verified_at or utc_now()
else:
admin = User(
email=email,
password_hash=hash_password(settings.admin_password),
email_verified_at=utc_now(),
)
admin.profile = Profile(username=settings.admin_username, role="admin")
db.add(admin)
await db.commit()
def main() -> None:
asyncio.run(seed())
if __name__ == "__main__":
main()