rework the Update model (destructive changes)
Background: Initially I found out that Bodhi updates are not displayed in BBA
for Rawhide. While working on a fix, I realized that the whole Update model is
... slightly weird (esp. the `status` and `pending` fields didn't reflect the
Bodhi structures at all and were very confusing), and the fix would result in
an increasingly hard-to-manage pile of hacks. So I instead reworked the whole
model, trimmed unneeded stuff, made it consistent with Bodhi structures, added
safeguards and docstrings. It had rippling effects in controller and utils
functions, most had to be touched or rewritten. I decided to drop all updates
from the DB during this migration, otherwise the upgrade code would get even
more complex, and we need none of this stuff for historical purposes anyway.
High-level changes:
* `Update` now better reflects the upstream Bodhi structure, unnecessary values
are removed
* `sync-updates` no longer performs a useless sync for an active release with
all its milestones inactive (a common configuration mistake)
* Bodhi updates for Rawhide are now visible
* The Updates view now shows all relevant updates in a single table
* Test coverage is improved
* All synced updates are dropped during migration and need to be synced again
Models and tables:
* add `Update.updateid` to uniquely identify an Update (instead of `title`).
`updateid` is required to be present and has a uniqueness guarantee.
* change `Update.status` to have the same definition as in Bodhi structs
(incl. `pending` value). Change it to Enum and support just selected values
which we care about (anything else shouldn't be stored in DB).
* drop `Update.pending`, its logic was confusing and not matching Bodhi structs
* change `Update.request` also to Enum (support all possible values)
* drop `Update.date_*` except for `date_submitted`. The other values are not
important, we don't need to store them.
* drop `Update.milestones`. It was a relationship which was re-calculated on
each Update update, it was slightly confusing (Bodhi updates are not related
to milestones) and served only as a way to simplify certain queries. Because
there are just a couple of those queries, I opted for model simplification
and readjusted those queries instead. This also means "update_milestones"
table got dropped.
* make many Update fields `nullable=False` to ensure data consistency
* make some Update constructor values optional. Esp. nullable columns are not
necessary to provide. Reorder the call params order and also the attribute
order in the class, roughly by importance, optional ones last.
* add a primary key over both columns in "update_fixes" table, that ensures we
don't get a duplicate entry
* add `Bug.is_proposed_accepted`, which allows to massively simplify certain
queries
Controllers:
* rewrite affected `controllers/` functions with the new Update model in mind
* rename some controller functions to better indicate their purpose
* instead of `get_milestone_pending_stable_updates()` and
`get_milestone_updates_testing()`, which seemed to be providing little value
in this separation, create `get_milestone_updates()` which lists all relevant
updates and display that in the Update view
* remove a never used `display_updates_need_testing()` controller function
Views/templates:
* changed template filter `updatelabel()` into `updatestatus()`, which displays
Update's current status and request in a pretty way (same as in Bodhi). Used
it then across all related views (bug list, updates).
* in a similar fashion, display `updateid` as a fallback when `title` is not
defined for an Update in all related views.
* in bug list view, indicate if there are multiple related updates (and not just
one)
* in update list view, show a list of all "relevant" updates, instead of
splitting it into two categories (which don't even cover everything
important). For each update, show components for each bug tracked, not just
the first one.
* in blocker list view, swap Updates and Review columns to make the columns look
better aligned
* fixed a bug in `updatetype()` which was not aware of accepted0day/prevrel
blockers
Utils:
* rewrite `update_sync.py`. `extract_information()` is extremely simplified due
to model changes. `get_update()` is removed because nobody used it.
`search_updates()` now searches in containers as well, only searches for
updates with a supported `status`, and has better error checking.
`get_release_bugs()` is fixed to not return rejected bugs. `sync_updates()`
and `sync_bug_updates()` and merged into `sync_updates()` and has better error
checking.
Merges: https://pagure.io/fedora-qa/blockerbugs/pull-request/203