Proposals for workflow framework

Registered by Ilshad Khabibullin

Минималистичный, простой и гибкий в использовании workflow фреймвок (возможно, workflow в некоем своем понимании.)
В данный момент - для использования в построении модуля registrations как абсолютно гибкой и настраиваемой как угодно системы регистрации пользователей.

Идея:
  - класс Workflow;
  - подписные адаптеры(subscriber'ы) - правила (они же - статусы workflow).

Реализация:
  - Есть абстрактный класс Workflow, имплементирующий свой интерфейс, и предназначенный для подмешивания в любые другие классы, которые могут быть как локальными, так и глобальными утилитыми (зарегистрированными своим интерфейсом, но не IWorkflow, для workflow-функционала это и не нужно), а могут быть вообще не утилитами, а простым контентом или еще чем угодно. Короче, что-то, что мы хотим сделать "типом" workflow. Им - передаем в метод handle(doc) документы. Что именно делать с документом, Workflow решает сам в зависимости от статуса документа и определенного порядка правил workflow.
  - Соответственно, правила (WorkflowRule) суть подписные адаптеры, зарегистрированные на тот интерфейс, который предоставляет объект, основанный на Workflow.
  - Сам Workflow читает список зарегистрированных конкретно для него workflow rules подписчиков и можно выстраивать их в нужном порядке (zope.schema.List -> zope.schema.Choice + vocabulary).
   - при передаче в него какого-либо объекта, с которым можно и нужно что-либо делать, вызываются workflow rules в том порядке, который определен (программно или через форму).
   - таким образом, каждый раз, вызывая "handle(obj)" метод, его обрабатывает только один, очередной подписчик и сохраняет (в аннотации) статус.
   - для каждого статуса есть метод start, вызываемый когда его обрабатывает этот подписчик, и метод stop, вызываемый, когда его обрабатывает следующий по определенному порядку подписчик.
   - можно форсировать порядок, передав напрямую имя правила (подписчика). В этом случае порядок сохранится, но будет следовать (для данного документа) с нового правила и далее по обычному порядку.

Зависимости:
  - модуль ice.app.workflow получается независимый от всего остального что есть в ice.app. Но он настолько мал, что нет смысла выводить его в отдельное яйцо.

  - однако, в административном скине можно построить специальный вид - таблицу, в которой видны все существующие виды workflow в одной куче, и, выбирая их, можно настраивать правила и порядок их использования. Правда, для этого придется все workflow типы как-то зарегистрировать. Если сделать предположение, что это локальные утилиты, (как, например, уже существующая утилита для регистрации пользоватлей), то придется их добавочно регистрировать по интерфейсу IWorkflow.
Однако это решение пока мне не очень нравиться, надо как-то подругому выискивать все типы workflow, потому что это могут быть и не утилиты, и вообще не локальные объекты.
Правда, если они не локальные, то и порядок workflow rules не отредактируешь через форму.

Blueprint information

Status:
Complete
Approver:
None
Priority:
Undefined
Drafter:
None
Direction:
Needs approval
Assignee:
None
Definition:
New
Series goal:
None
Implementation:
Implemented
Milestone target:
None
Started by
Ilshad Khabibullin
Completed by
Ilshad Khabibullin

Related branches

Sprints

Whiteboard

Сам workflow фреймворк (пара интерфейсов, пара совсем маленьких абстрактных классов и vocabulary) - реализован.

Сейчас он используется как основная логическая база для утилиты регистрации пользователей.

С общей для всех workflow-типов таблицей в adminskin'е пока не ясно.

Сейчас, когда уже реализовано, всплыла одна интересная особенность: объект IWorkflow может и не быть им (т.е. не обязательно наследовать его класс от Workflow.)

Дело в том, что в подписные адаптеры - workflow rules - регистрируются не на IWorkflow, а на какой-либо иной интерфейс, предоставляемый объектом Workflow. В них, в подписчиках используется также паттерн адаптирования для контекста.

Это означает, что в любой момент можно любой объект в системе сделать Workflow-контекстом, не изменяя его структуру, а просто построив адаптер для него к интерфейсу IWorkflow и определить ему правила. А затем, в любой момент убрать все это - объект не будет изменен.

Также, и сами объекты-документы, передаваемые ему, тоже могут оставатья без каких-либо изменений, так как для них используетя адаптирование к IAnnotations (а оно может быть выстроено как угодно.)

Все это означает, что можно добавлять, удалять, изменать workflow как для контекстов, так и для самих учавствующих в нем документов когда угодно и как угодно.

(?)

Work Items

This blueprint contains Public information 
Everyone can see this information.

Subscribers

No subscribers.