Metadata-Version: 2.4
Name: djangoldp_tamis
Version: 1.1.4
Summary: djangoldp package for TAMIS
Home-page: https://git.startinblox.com/djangoldp-packages/djangoldp-tamis
Author: Startin'blox
Author-email: jbaptiste@startinblox.com
License: MIT
Classifier: Programming Language :: Python :: 3
Requires-Dist: djangoldp~=3.1.0
Requires-Dist: djangoldp_account~=3.1.0
Requires-Dist: djangoldp_dashboard~=3.0.0
Provides-Extra: include-package-data
Requires-Dist: True; extra == "include-package-data"

# DjangoLDP TAMIS

Django/[DjangoLDP](https://git.startinblox.com/djangoldp-packages/djangoldp) package that provides the backend data model for **TAMIS**, a workflow tool for audiovisual post-production. It exposes the domain as Linked Data Platform (LDP) resources so it can be consumed by the matching web-components package [`solid-tamis`](https://git.startinblox.com/components/solid-tamis).

## Functional overview

TAMIS coordinates **post-production work between a Client (who orders content finishing) and a Provider (who performs it)** — typically subtitling, dubbing, mix, conform, color, etc. Work is tracked against the broadcaster-style editorial hierarchy `Serie → Season → Programme → EditorialWork`, with standalone movies sitting directly as a `Programme` (no series); both shapes are first-class.

The unit of work is a **`Prestation`** — one contracted job attached to an `EditorialWork`. Prestations are grouped under a **`Commande`** (a purchase order between a specific `Client` and `Provider`) and cross-referenced to external systems via **`Identifiant`s** (issuer `Agent` + identifier string), which is how a TAMIS `EditorialWork` maps to a broadcaster's asset ID.

Every prestation carries an **ordered timeline of `Step`s** built from a template. Three steps are seeded at app startup — `Refusé`, `Validation`, `Livraison` — and the workflow is enforced by signals:

- the last two steps of any prestation are **always** `Livraison` (delivery) → `Validation` (client sign-off);
- adding a `Refusé` step (rejection) automatically re-queues `Livraison` + `Validation` after it, so a rejection cleanly restarts the delivery → validation loop without the operator having to rebuild the timeline;
- step ordering is renumbered after every change so the UI can render a stable sequence.

Each prestation produces **deliverables**: an empty `Asset` is auto-created on prestation creation; assets hold `MediaResource`s (the actual file: name, size, `Format`), broken down into `Track` / `AudioTrack` / `VideoTrack`. `EditorialWork.assets` is a computed rollup of every asset across the editorial work's prestations — the "all deliverables for this episode/film" view.

Access is **team-based, not ownership-based**. Every prestation owns three Django groups — `admins` / `editors` / `visitors` — wired to `ACLPermissions`. The same prestation can therefore have the client's QA reviewers as visitors, the provider's operators as editors, and a studio lead as admin. `TamisProfile` carries enterprise/title/job/phone so the UI can show who's who across organisations, and `Favourite` lets users pin prestations for quick access.

## What it provides

A Django app (`djangoldp_tamis`) that models the editorial hierarchy and the delivery workflow around it:

- **Editorial hierarchy** — `Serie` → `Season` → `Programme` → `EditorialWork`, typed against the [EBUCore Plus](http://www.ebu.ch/metadata/ontologies/ebucoreplus) ontology (`ec:Programme`, `ec:EditorialObject`, …).
- **Prestations** — a `Prestation` is a unit of work attached to an `EditorialWork`, with a template-driven ordered list of `Step`s (`StepToTemplate` → `PrestationStep`). Three seeded steps — `Refusé`, `Validation`, `Livraison` — are created automatically on app startup and their order is maintained by signals (a rejection re-appends `Livraison` + `Validation`; the last two steps are always guaranteed).
- **Per-prestation access control** — each `Prestation` owns three Django `Group`s (`admins`, `editors`, `visitors`) wired to `ACLPermissions`, so team membership (not object ownership) drives who can view/change/control a prestation. Memberships are exposed on `LDPUser.prestations` as a dynamic nested container.
- **Commandes** — `Commande` groups prestations under a `Client`/`Provider` pair, with free-form `Identifiant`s (issuer `Agent` + identifier string).
- **Assets & media** — `Asset` (inherits prestation permissions) → `MediaResource` → `Track` / `AudioTrack` / `VideoTrack`, with `Format` lookup. `EditorialWork.assets` is a computed nested container aggregating all assets across its prestations.
- **Profile** — `TamisProfile` (one-to-one with the user), auto-created on user save.
- **Admin** — registers all public models under `DjangoLDPAdmin` with inlines for prestation steps, assets, and media tracks; replaces the default `Group` admin with a read-only variant.

Installed via `djangoldp~=3.1.0`, `djangoldp_account~=3.1.0`, `djangoldp_dashboard~=3.0.0`.

## Installation

See the [server installation guide](https://git.startinblox.com/applications/tamis-poc/-/snippets/17) for the full DjangoLDP server setup.

## Sample data

A fixture provides one movie programme with one editorial work and one serie/season/programme with two editorial works, each with one prestation:

```sh
./manage.py loaddata sample_tamis
```

Also shipped under `djangoldp_tamis/fixtures/`: `tamis_dashboard.json` (dashboard layout) and RDF exports (`sample_tamis_data.ttl`, `sample_tamis_data.nt`).
