From e383613954c639a1424c2cffcecfa4cfa4668cf9 Mon Sep 17 00:00:00 2001 From: Mike Lang Date: Fri, 14 Jun 2019 09:37:33 -0700 Subject: [PATCH] database: Add constraints on edit inputs that they must be non-NULL if state != UNEDITED This should help prevent changing state to EDITED with any of these fields unset, which would blow up the cutter. We also fix up upload_location, which was set up as a sheet input (NOT NULL DEFAULT ''), and add a similar constraint saying any DONE columns must have non-NULL video link. --- DATABASE.md | 8 ++++---- common/common/database.py | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/DATABASE.md b/DATABASE.md index c3e7130..5a568d7 100644 --- a/DATABASE.md +++ b/DATABASE.md @@ -130,11 +130,11 @@ columns | type | role | `description` | `TEXT NOT NULL DEFAULT ''` | sheet input | Event description. Provides the default title and description for editors, and displayed on the public sheet. `submitter_winner` | `TEXT NOT NULL DEFAULT ''` | sheet input | A column detailing challenge submitter, auction winner, or other "associated person" data. This shouldn't be relied on in any processing but should be displayed on the public sheet. `poster_moment` | `BOOLEAN NOT NULL DEFAULT FALSE` | sheet input | Whether or not the event was featured on the poster. Used for building the postermap and also displayed on the public sheet. -`image_links` | `TEXT[] NOT NULL` | sheet input | Any additional gif or image links associated with the event. Displayed on the public sheet. +`image_links` | `TEXT[] NOT NULL` | sheet input | Any additional gif or image links associated with the event. Displayed on the public sheet. `notes` | `TEXT NOT NULL DEFAULT ''` | sheet input | Private notes on this event, used eg. to leave messages or special instructions. Displayed to the editor during editing, but otherwise unused. -`allow_holes` | `BOOLEAN NOT NULL DEFAULT FALSE` | edit input | If false, any missing segments encountered while cutting will cause the cut to fail. Setting this to true should be done by an operator to indicate that holes are expected in this range. It is also the operator's responsibility to ensure that all allowed cutters have all segments that they can get, since there is no guarentee that only the cutter with the least missing segments will get the cut job. -`uploader_whitelist` | `TEXT[]` | edit input | List of uploaders which are allowed to cut this entry, or NULL to indicate no restriction. This is useful if you are allowing holes and the amount of missing data differs between nodes (this shouldn't happen - this would mean replication is also failing), or if an operator is investigating a problem with a specific node. -`upload_location` | `TEXT NOT NULL DEFAULT ''` | edit input | The upload location to upload the cut video to. This is used by the cutter, and must match one of the cutter's configured upload locations. If it does not, the cutter will not claim the event. +`allow_holes` | `BOOLEAN NOT NULL DEFAULT FALSE` | edit input | If false, any missing segments encountered while cutting will cause the cut to fail. Setting this to true should be done by an operator to indicate that holes are expected in this range. It is also the operator's responsibility to ensure that all allowed cutters have all segments that they can get, since there is no guarentee that only the cutter with the least missing segments will get the cut job. +`uploader_whitelist` | `TEXT[]` | edit input | List of uploaders which are allowed to cut this entry, or NULL to indicate no restriction. This is useful if you are allowing holes and the amount of missing data differs between nodes (this shouldn't happen - this would mean replication is also failing), or if an operator is investigating a problem with a specific node. +`upload_location` | `TEXT` | edit input | The upload location to upload the cut video to. This is used by the cutter, and must match one of the cutter's configured upload locations. If it does not, the cutter will not claim the event. `video_start`, `video_end` | `TIMESTAMP` | edit input | Start and end time of the video to cut. If already set, used as the default trim times when editing. `video_title` | `TEXT` | edit input | The title of the video. If already set, used as the default title when editing instead of `description`. `video_description` | `TEXT` | edit input | The description field of the video. If already set, used as the default description when editing instead of `description`. diff --git a/common/common/database.py b/common/common/database.py index 1140857..548e8e2 100644 --- a/common/common/database.py +++ b/common/common/database.py @@ -42,18 +42,18 @@ CREATE TABLE IF NOT EXISTS events ( notes TEXT NOT NULL DEFAULT '', allow_holes BOOLEAN NOT NULL DEFAULT FALSE, uploader_whitelist TEXT[], - upload_location TEXT NOT NULL DEFAULT '', - video_start TIMESTAMP, - video_end TIMESTAMP, - video_title TEXT, - video_description TEXT, - video_channel TEXT, + upload_location TEXT CHECK (state = 'UNEDITED' OR upload_location IS NOT NULL), + video_start TIMESTAMP CHECK (state = 'UNEDITED' OR video_start IS NOT NULL), + video_end TIMESTAMP CHECK (state = 'UNEDITED' OR video_end IS NOT NULL), + video_title TEXT CHECK (state = 'UNEDITED' OR video_title IS NOT NULL), + video_description TEXT CHECK (state = 'UNEDITED' OR video_description IS NOT NULL), + video_channel TEXT CHECK (state = 'UNEDITED' OR video_channel IS NOT NULL), video_quality TEXT NOT NULL DEFAULT 'source', state event_state NOT NULL DEFAULT 'UNEDITED', uploader TEXT, error TEXT, video_id TEXT, - video_link TEXT + video_link TEXT CHECK (state != 'DONE' OR video_link IS NOT NULL) ); -- Index on state, since that's almost always what we're querying on besides id