Volver a la wiki

Plan · Modelo core

Plan · Modelo core

Propósito

Plan define el nivel de suscripción de una organización SaaS. Actúa como configuración base de módulos: determina qué funcionalidades (SaaSModule) están disponibles de serie para las organizaciones del tier. Introducido en la migración 0013_module_gating, centraliza la lógica de acceso a funcionalidades evitando hardcoding por organización.

Contrato

Campos (core/models.py:27-47):

CampoTipoNotas
slugSlugField(50, unique)Identificador canónico: starter, pro, custom
nameCharField(100)Nombre legible
descriptionTextField(blank)Descripción opcional
modulesM2M(SaaSModule, related_name="plans", blank)Módulos incluidos por defecto en el plan
sort_orderIntegerField(default=0)Orden en listados

Tiers definidos (constante PLAN_CHOICES, no campo):

Meta: ordering = ["sort_order"]. Sin verbose_name explícito.

Dependencias entrantes

ArchivoUso
core/models.py:63 (Organization)FK plan con SET_NULL, null=True
core/api/signup.pyResuelve Plan.objects.filter(slug="starter").first(); asigna max_racks=10
core/admin.py (OrganizationAdmin.plan_modules_display)Itera Plan.objects.prefetch_related("modules") para mapa JS
core/admin.py (PlanAdmin)filter_horizontal = ("modules",), columnas module_count y org_count

Dependencias salientes

Ejemplos

# Signup self-service (core/api/signup.py)
PLAN_MAX_RACKS = {"starter": 10, "pro": 200, "custom": 200}
plan = Plan.objects.filter(slug="starter").first()
org = Organization.objects.create(
    name=org_name,
    plan=plan,
    max_racks=PLAN_MAX_RACKS.get(plan.slug, 10) if plan else 10,
)
# Sync extra_modules = core_modules ∪ plan_modules
core_pks = set(SaaSModule.objects.filter(is_core=True).values_list("pk", flat=True))
plan_pks = set(plan.modules.values_list("pk", flat=True))
org.extra_modules.set(core_pks | plan_pks)

# Admin — mapa de módulos por plan (core/admin.py)
for plan in Plan.objects.prefetch_related("modules").all():
    mod_names = sorted(set(core_names) | set(plan.modules.values_list("name", flat=True)))
    plan_data[str(plan.pk)] = {"label": ", ".join(mod_names), ...}

Véase también

Subir