Skip to content

angee.portfolio.models ​

Products, initiatives, reports, releases, and same-row planning donors.

Products are phasal subjects: their lifecycle carries no target date, health, or progress. Projects and initiatives are teleological and therefore own health reports. The project/task donors fold optional portfolio placement onto the upstream rows only when this addon is composed.

ProductLifecycle ​

python
class ProductLifecycle(models.TextChoices)

Phases in a Product's existence, never progress toward completion.

InitiativeStatus ​

python
class InitiativeStatus(models.TextChoices)

Coarse fulfillment lifecycle for strategic initiatives.

InitiativeHealth ​

python
class InitiativeHealth(models.TextChoices)

Latest reported health denormalized onto an Initiative.

InitiativeDateResolution ​

python
class InitiativeDateResolution(models.TextChoices)

Precision carried by an Initiative target date.

UpdateHealth ​

python
class UpdateHealth(models.TextChoices)

Health assertion required from every portfolio Update.

ReleaseStatus ​

python
class ReleaseStatus(models.TextChoices)

Lifecycle of a Product release artifact.

WorkspaceVisibleMixin ​

python
class WorkspaceVisibleMixin(models.Model)

Persist the R11 wildcard-reader tuple for a portfolio row.

Workspace visibility is posture data, so every one of the addon's five persisted resource definitions carries an explicit reader@auth/user:* tuple. Deployments may replace that tuple strategy without changing schema.

Meta ​

python
class Meta()

Django options for the tuple-reconciliation mixin.

save ​

python
def save(*args: Any, **kwargs: Any) -> None

Persist the row and idempotently reconcile its wildcard reader.

ProductManager ​

python
class ProductManager(AngeeManager)

Own the idempotent Project-to-Product maturation write.

from_project ​

python
def from_project(project: models.Model) -> models.Model

Return the one Product promoted from project with provenance.

Promotion deliberately requires both Project write and portfolio_admin: R11 strategy curation wins over owner prerogative at the Product rung.

Product ​

python
class Product(WorkspaceVisibleMixin, AuditMixin, AngeeDataModel)

A perpetual subject passing through phases rather than toward fulfillment.

Meta ​

python
class Meta()

Django options for phasal products.

__str__ ​

python
def __str__() -> str

Return the Product name.

Initiative ​

python
class Initiative(WorkspaceVisibleMixin, HierarchyMixin, AuditMixin,
                 AngeeDataModel)

A tree-shaped long-horizon intent whose pushes can be fulfilled.

Meta ​

python
class Meta(HierarchyMixin.Meta)

Django options carrying the hierarchy index and parent-rank invariant.

save ​

python
def save(*args: Any, **kwargs: Any) -> None

Persist the Initiative, rejecting ancestry-unsafe subtree moves.

__str__ ​

python
def __str__() -> str

Return the Initiative name.

InitiativeProject ​

python
class InitiativeProject(WorkspaceVisibleMixin, AuditMixin, AngeeDataModel)

An ordered Project placement on an ancestry-safe Initiative tree.

Meta ​

python
class Meta()

Django options for unique placement and per-Initiative ranks.

clean ​

python
def clean() -> None

Reject a second Project placement on the same ancestry path.

save ​

python
def save(*args: Any, **kwargs: Any) -> None

Persist only after serializing the ancestry-path validation.

after_resource_load ​

python
@classmethod
def after_resource_load(cls,
                        instances: Iterable[Any],
                        *,
                        tier: str,
                        source: str,
                        publish: bool = False) -> None

Seed one idempotent report for each side of demo placements.

UpdateManager ​

python
class UpdateManager(AngeeManager)

Own target validation, authorization, and health-report creation.

target_relation ​

python
@classmethod
def target_relation(cls, target: models.Model) -> str

Return the Update relation for one allowed teleological target.

target_model ​

python
@classmethod
def target_model(cls, model_label: str) -> type[models.Model]

Return the installed model for one allowed target label.

report ​

python
def report(*,
           target: models.Model,
           health: str | UpdateHealth,
           body: str = "") -> models.Model

Create one report on a writable Project or Initiative.

Update ​

python
class Update(WorkspaceVisibleMixin, AuditMixin, RecordRefMixin,
             AngeeDataModel)

A required-health report on a Project or Initiative, never a Product.

Meta ​

python
class Meta()

Django options for target-addressed health reports.

clean ​

python
def clean() -> None

Require health and a teleological target.

save ​

python
def save(*args: Any, **kwargs: Any) -> None

Persist the report, its target relation, and the latest-health denorm.

delete ​

python
def delete(*args: Any, **kwargs: Any) -> tuple[int, dict[str, int]]

Delete the report and restore its target's surviving latest health.

__str__ ​

python
def __str__() -> str

Return a readable target-qualified health assertion.

Release ​

python
class Release(WorkspaceVisibleMixin, AuditMixin, AngeeDataModel)

The named artifact a ship Project leaves on a Product timeline.

Meta ​

python
class Meta()

Django options for Product-scoped release names.

__str__ ​

python
def __str__() -> str

Return the Product-qualified release name.

ProjectPortfolio ​

python
class ProjectPortfolio(AngeeModel)

Same-row portfolio placement folded into projects.Project.

Placement (product, priority, and sort_order) is deliberately project-side.

Meta ​

python
class Meta()

Abstract donor options folded into the concrete Project table.

promote_to_product ​

python
def promote_to_product() -> models.Model

Return the one Product matured from this Project.

TaskPortfolio ​

python
class TaskPortfolio(AngeeModel)

Same-row release attribution folded into projects.Task.

Meta ​

python
class Meta()

Abstract donor options folded into the concrete Task table.

PortfolioRole ​

Table-less REBAC anchor for the const-backed portfolio-admin namespace.

Released under the AGPL-3.0 License.