diff --git a/app/api/organizations.py b/app/api/organizations.py index d6fb148..f7fdd88 100644 --- a/app/api/organizations.py +++ b/app/api/organizations.py @@ -22,7 +22,6 @@ async def list_organizations( select(Organization) .join(OrganizationMember) .where(OrganizationMember.user_id == user.id) - .where(Organization.is_active == True) ) return result.scalars().all() @@ -33,16 +32,33 @@ async def create_organization( db: AsyncSession = Depends(get_db) ): """Create a new organization.""" - # Check slug uniqueness - result = await db.execute(select(Organization).where(Organization.slug == org_in.slug)) - if result.scalar_one_or_none(): - raise HTTPException(status_code=400, detail="Slug already exists") + import re + + # Auto-generate slug if not provided + if not org_in.slug: + base_slug = re.sub(r'[^\w\s-]', '', org_in.name.lower()) + base_slug = re.sub(r'[-\s]+', '-', base_slug).strip('-') + + # Check uniqueness and add number if needed + slug = base_slug + counter = 1 + while True: + result = await db.execute(select(Organization).where(Organization.slug == slug)) + if not result.scalar_one_or_none(): + break + counter += 1 + slug = f"{base_slug}-{counter}" + else: + slug = org_in.slug + # Check slug uniqueness + result = await db.execute(select(Organization).where(Organization.slug == slug)) + if result.scalar_one_or_none(): + raise HTTPException(status_code=400, detail="Slug already exists") # Create org org = Organization( name=org_in.name, - slug=org_in.slug, - description=org_in.description + slug=slug ) db.add(org) await db.flush() diff --git a/app/schemas/organization.py b/app/schemas/organization.py index a3e1c92..4f326d8 100644 --- a/app/schemas/organization.py +++ b/app/schemas/organization.py @@ -9,7 +9,7 @@ class OrganizationBase(BaseModel): description: Optional[str] = None class OrganizationCreate(OrganizationBase): - slug: str + slug: Optional[str] = None # Auto-generated if not provided class OrganizationUpdate(BaseModel): name: Optional[str] = None @@ -22,8 +22,8 @@ class OrganizationRead(OrganizationBase): id: int slug: str logo_url: Optional[str] = None - plan: str - is_active: bool + plan: str = "free" + is_active: bool = True created_at: datetime member_count: Optional[int] = None @@ -44,4 +44,3 @@ class MemberRead(BaseModel): class Config: from_attributes = True -