Изменения

BugzillaORM

4720 байтов добавлено, 09:09, 24 июля 2012
м
Обновление модели
Чем плоха текущая багзильная реализация этого «добра»?
 
Очень просто: '''почти ни хрена не настраивается''' - нельзя ни добавить свои возможности, ни отрубить ненужные встроенные. Ибо всё жёстко и криво (хардкод). А ещё:
* История хранится только для багов, но не для остальных объектов.
* Шаблоны переусложнены.
* Нет "объектов", есть «значения полей», соответсвенно, им не добавишь атрибутов и не навесишь логики.
 
* Значения кастом полей в таблице багов хранятся не ссылками по ID, а по именам, что создаёт геморрой для зависимых полей, так как чтобы точно идентифицировать значение, приходится брать ещё и значение поля, от которого оно зависит.
* «Поле» (селект и мультиселект) совмещено с объектом, соответственно, не добавишь дополнительных атрибутов объекту.* Для выпадающих списков есть как «контроль значений», так и «контроль видимости поля», что в корне '''''неверно'''''! Ибо что за бред — Типа поле скрыто, но при этом есть варианты, которые можно выбрать? Бред! Или наоборот — поле доступно, но из вариантов — только пустое значение.
* По факту, ни от чего, кроме продукта, зависимым значение не сделаешь.
* История хранится только для багов, но не для остальных объектов.
* Код полей не генерится автоматически, а ручками вписываются в шаблоны.
* На всё это навёрнута туча неструктурированного кода, определяющего поведение «встроенных» полей.
* Есть объекты. У объектов есть поля (разных типов). В том числе, есть типы «multi-select» и «single-select», ссылающиеся на другие объекты.
* Зависимости полей могут прописываться дополнительно, в виде ограничений вида: «баг.компонент.продукт == баг.продукт». Могут и не прописываться. Теоретически, могут прописываться несколько ограничений на одно поле, например, чтобы какой-нибудь атрибут зависел и от продукта, и от, скажем, операционной системы. Такое устройство наиболее гибкое и в частности позволяет багу иметь несколько полей, ссылающихся на один тип объектов.
* Поля могут скрываться в зависимости от значений других полей. Селект-поля скрываются, если в них по зависимостям нечего выбирать. На поля остальных типов можно вешать «настройку видимости», подобную текущей багзильной реализации — реализации — просто тупо «поле = одно из значений…».* HTML-код полей должен генерироваться автоматически. Также желательна возможность задавать группировку полей в интерфейсе — интерфейсе — например, опционально раскрываемые «Advanced Fields» (только общим fieldset’ом, а не как сейчас — сейчас — просто скрытие полей в разных местах формы).* На поля можно назначить дополнительные обработчики, задающие более хитрое поведение. Сами обработчики пишутся в коде, по возможности — возможности — максимально абстрагированно от конкретного поля. Назначаться они при этом должны не из кода, а из интерфейса конфигурации модели. На этих дополнительных обработчиках должно работать всё! Примеры:
** Платформа, ОС: функции угадывания значения по умолчанию на основе заголовков запроса.
** Статус: есть ограничения переходов из состояния в состояние (workflow). Возможно, его нужно попытаться вынести в базовые настройки модели.
* История хранится централизованно для всех объектов.
* Общий механизм рассылки изменений по почте для всех объектов каким-либо образом «связанным» пользователям. Настройки уведомлений на уровнях: событие (изменено значение поля, добавлена сущность) и отношение (собственно связь).
* Поиск: адаптировать сильно прокачанный движок поиска из [http://wiki.4intra.net/Bugzilla4Intranet Bugzilla4Intranet]. Адаптировать долго не придётся, потому что с точки зрения read-only все типы полей останутся, по сути, те же самые.С другой стороны, его нужно обобщить, так что кое-что сделать всё-таки будет нужно. Но зато в итоге получится супер-инструмент — система выборок, которая отлично хавает большие базы, сложные ''и произвольные'' структуры запросов и не давится :) (доказано Bugzilla4Intranet)* Права доступа: Нужна опять-таки общая схема для всех объектов, с одной стороны, простая для вычисления системой, а с другой стороны, дающая достаточную гибкость разных настроек. По всей видимости, нужны с одной стороны опять-таки «связанные» пользователи, а с другой стороны — стороны — роли. Причём, пользователи могут быть «связанные» через какое-то поле — поле — например, человек может быть связан с багом, потому что прописан как Global Watcher для продукта этого бага. Роли могут набираться из действий над полями различных объектов и права на просмотр объектов. Возможно, нужно давать возможность разграничивать доступ на просмотр к разным полям — полям — например, в Bugzilla только группа time-tracker’ов может посмотреть информацию о рабочем времени. Таким образом наш трекер превратится, по сути, в модульное приложение, построенное вокруг очень прокачанного автоинтерфейса полей и объектов. Естественно, это уже не Bugzilla ни разу, но зато чем-то похоже на [http://roundup.sourceforge.net/ Roundup] — «конструктор трекеров». Однако и с ним различий много — roundup не умеет зависимых селект-полей, модель задаётся в коде, права доступа слабые, поиск слабый. === Обновление модели === Обновление базы багзильское (тупая последовательность операций):* (+) Очевидный порядок обновлений, нет проблем с их зависимостями друг от друга (новые просто дописываются в конец, порядок всегда правильный)* (-) Не проверяется, корректна ли схема БД после обновлений* (-) Обновления задаются именно для SQL БД, а не для метамодели* (-) Не очень красивая портянка в функции обновления БД
Таким образом наш трекер превратится, по сутиОбновление базы наше:* AddType -> RenameFields -> AddFields -> ChangeFields -> DropFields* ChangeFields с помощью функций обновления* (???) Самый интересный вопрос - как сделать функции обновления не на SQL, в модульное приложение, построенное вокруг очень прокачанного автоинтерфейса полей условиях когда модель в неконсистентном и объектов. Естественно, это уже вообще не Bugzilla ни разузнает, но зато чем-то похоже на [http://roundup.sourceforge.net/ Roundup] — «конструктор трекеров». Однако в каком состоянии?* После каждого шага запуск хука* Переименования задаются декларативно* Возможность Dry Run, просмотра и с ним различий много — roundup не умеет зависимых селект-полейпроверки последовательности обновлений* Зависимости обновлений в рамках каждого шага можно задать декларативно (хотя ситуация редкая)*: А может, модель задаётся просто стоит задавать их в кодеассоциативном массиве по порядку* Ещё может быть, права доступа слабые, поиск слабый.что обновление одного типа зависит от обновления другого (причём это уже более частая ситуация)
=== Модель ===
** Название поля
** Тип поля
** Nullable? Т.е. разрешено ли пустое значение
** Поле этого же объекта, контролирующее видимость данного (для не-select полей)
** Связи поля (для select-полей)
** Ссылка на поле объекта (может быть пустая)
* Роли (или группы, что примерно то же самое)
** Включаемые роли
** Включаемые разрешения
* Разрешения (из которых состоят роли)
** Ссылка на связь
** Тип разрешения: просмотр/создание/удаление/изменение
** Ссылка на поле объекта (пустая = весь объект)
** Ссылка на значение поля (пустая = любое)
 
=== Типы полей ===
 
<tab sep="bar" class="wikitable" head="top">
Тип | Параметры | Представления
Строка | Длина | Input, textarea, rich edit
Логический | | Флажок
Числовой | Точность (M.N) | Input
Дата и/или время | Дата? Время? | Поле со всплывающим календарём, просто календарь, просто поле
Файл | | Поле загрузки файла
Single-select | Тип объекта | Радиобатон, HTML-селект
Multi-select | Тип объекта | HTML-мультиселект, флажки, комбо-бокс
</tab>
== Текущее состояние ==
** Canconfirm
** Editbugs
* Private комментарии — комментарии — видны только инсайдер-группе* Информация о таймтрекинге — таймтрекинге — видна только группе, списывающей время
* reporter_accessible, cclist_accessible на отдельных багах
* Опциональные группы на отдельных багах
* Права на правку отдельных групп
* Права editclassifications, editcomponents, editfields, editkeywords, editusers
 
=== Настройки оповещений о багах ===
 
Отношения:
* Assignee, QA, Reporter, CC
* Requestee или Setter флага (реально в Bugzilla прикручено сильно сбоку)
* По идее — также создатель аттачмента, коммента (если разрешать править)
* Watcher указанного выше
* Global Watcher
 
События:
* Добавлен/удалён из указанного выше
* Изменено одно из полей бага (м.б отдельные настройки, м.б вместе)
* Баг / блокирующий баг меняет статус с закрытого на открытый или обратно
* «Но кроме» UNCONFIRMED
* «Но кроме» своих изменений
== Что не так? ==