From 69e5fc2893a7cc8c31875c3a2ea58cd58f6e8e74 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Fri, 16 Jan 2026 22:28:38 +0100 Subject: [PATCH 01/23] Change models for new vote service --- collections/ballot.yml | 37 ++ collections/meeting.yml | 167 ++++---- collections/meeting_user.yml | 20 +- collections/motion.yml | 22 +- collections/poll.yml | 147 ++----- collections/poll_candidate.yml | 35 -- collections/poll_candidate_list.yml | 29 -- collections/poll_config_approval.yml | 21 + collections/poll_config_option.yml | 32 ++ collections/poll_config_rating_approval.yml | 29 ++ collections/poll_config_rating_score.yml | 37 ++ collections/poll_config_selection.yml | 29 ++ collections/projection.yml | 50 ++- collections/user.yml | 31 +- models.yml | 411 +++++++++++--------- 15 files changed, 569 insertions(+), 528 deletions(-) create mode 100644 collections/ballot.yml delete mode 100644 collections/poll_candidate.yml delete mode 100644 collections/poll_candidate_list.yml create mode 100644 collections/poll_config_approval.yml create mode 100644 collections/poll_config_option.yml create mode 100644 collections/poll_config_rating_approval.yml create mode 100644 collections/poll_config_rating_score.yml create mode 100644 collections/poll_config_selection.yml diff --git a/collections/ballot.yml b/collections/ballot.yml new file mode 100644 index 00000000..01692735 --- /dev/null +++ b/collections/ballot.yml @@ -0,0 +1,37 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +weight: + type: decimal(6) + restriction_mode: B + constant: true + default: "1.000000" +split: + type: boolean + default: false + restriction_mode: B +value: + type: text + restriction_mode: B + constant: true +poll_id: + type: relation + reference: poll + to: poll/ballot_ids + equal_fields: meeting_id + required: true + restriction_mode: A + constant: true +acting_meeting_user_id: + type: relation + reference: meeting_user + to: meeting_user/acting_ballot_ids + restriction_mode: C +represented_meeting_user_id: + type: relation + reference: meeting_user + to: meeting_user/represented_ballot_ids + restriction_mode: C diff --git a/collections/meeting.yml b/collections/meeting.yml index 6652e201..0ce34948 100644 --- a/collections/meeting.yml +++ b/collections/meeting.yml @@ -60,13 +60,13 @@ language: type: string restriction_mode: F enum: - - en - - de - - it - - es - - ru - - cs - - fr + - en + - de + - it + - es + - ru + - cs + - fr default: "en" constant: true @@ -137,8 +137,8 @@ applause_enable: applause_type: type: string enum: - - applause-type-bar - - applause-type-particles + - applause-type-bar + - applause-type-particles default: applause-type-bar restriction_mode: C applause_show_level: @@ -181,8 +181,8 @@ projector_countdown_warning_time: export_csv_encoding: type: string enum: - - utf-8 - - iso-8859-15 + - utf-8 + - iso-8859-15 default: utf-8 restriction_mode: B export_csv_separator: @@ -192,17 +192,17 @@ export_csv_separator: export_pdf_pagenumber_alignment: type: string enum: - - left - - right - - center + - left + - right + - center default: center restriction_mode: B export_pdf_fontsize: type: number enum: - - 10 - - 11 - - 12 + - 10 + - 11 + - 12 default: 10 restriction_mode: B export_pdf_line_height: @@ -233,8 +233,8 @@ export_pdf_page_margin_bottom: export_pdf_pagesize: type: string enum: - - A4 - - A5 + - A4 + - A5 default: A4 restriction_mode: B @@ -254,25 +254,25 @@ agenda_number_prefix: agenda_numeral_system: type: string enum: - - arabic - - roman + - arabic + - roman default: arabic restriction_mode: B agenda_item_creation: type: string enum: - - always - - never - - default_yes - - default_no + - always + - never + - default_yes + - default_no default: default_no restriction_mode: B agenda_new_items_default_visibility: type: string enum: - - common - - internal - - hidden + - common + - internal + - hidden default: internal restriction_mode: B agenda_show_internal_items_on_projector: @@ -384,9 +384,9 @@ motions_preamble: motions_default_line_numbering: type: string enum: - - outside - - inline - - none + - outside + - inline + - none default: outside restriction_mode: A motions_line_length: @@ -447,25 +447,25 @@ motions_block_slide_columns: motions_recommendation_text_mode: type: string enum: - - original - - changed - - diff - - agreed + - original + - changed + - diff + - agreed default: diff restriction_mode: B motions_default_sorting: type: string enum: - - number - - weight + - number + - weight default: number restriction_mode: B motions_number_type: type: string enum: - - per_category - - serially_numbered - - manually + - per_category + - serially_numbered + - manually default: per_category restriction_mode: B motions_number_min_digits: @@ -495,9 +495,9 @@ motions_amendments_prefix: motions_amendments_text_mode: type: string enum: - - freestyle - - fulltext - - paragraph + - freestyle + - fulltext + - paragraph default: paragraph restriction_mode: B motions_amendments_multiple_paragraphs: @@ -541,9 +541,9 @@ motions_enable_restricted_editor_for_non_manager: motion_poll_ballot_paper_selection: type: string enum: &ballot_paper_selection - - NUMBER_OF_DELEGATES - - NUMBER_OF_ALL_PARTICIPANTS - - CUSTOM_NUMBER + - NUMBER_OF_DELEGATES + - NUMBER_OF_ALL_PARTICIPANTS + - CUSTOM_NUMBER default: CUSTOM_NUMBER restriction_mode: B motion_poll_ballot_paper_number: @@ -561,15 +561,15 @@ motion_poll_default_method: motion_poll_default_onehundred_percent_base: type: string enum: &onehundred_percent_bases - - "Y" - - "YN" - - "YNA" - - "N" - - "valid" - - "cast" - - "entitled" - - "entitled_present" - - "disabled" + - "Y" + - "YN" + - "YNA" + - "N" + - "valid" + - "cast" + - "entitled" + - "entitled_present" + - "disabled" default: YNA restriction_mode: B motion_poll_default_group_ids: @@ -579,15 +579,15 @@ motion_poll_default_group_ids: motion_poll_default_backend: type: string enum: &poll_backends - - long - - fast + - long + - fast default: fast restriction_mode: B motion_poll_projection_name_order_first: type: string enum: - - first_name - - last_name + - first_name + - last_name default: last_name required: true restriction_mode: B @@ -597,18 +597,6 @@ motion_poll_projection_max_columns: required: true restriction_mode: B - # poll list election -poll_candidate_list_ids: - type: relation-list - to: poll_candidate_list/meeting_id - reference: poll_candidate_list - restriction_mode: B -poll_candidate_ids: - type: relation-list - to: poll_candidate/meeting_id - reference: poll_candidate - restriction_mode: B - # Users meeting_user_ids: type: relation-list @@ -645,10 +633,10 @@ users_pdf_wlan_encryption: type: string default: WPA enum: - - "" - - WEP - - WPA - - nopass + - "" + - WEP + - WPA + - nopass restriction_mode: B users_email_sender: type: string @@ -777,16 +765,20 @@ poll_default_group_ids: type: relation-list to: group/used_as_poll_default_id restriction_mode: B -poll_default_backend: - type: string - enum: *poll_backends - default: fast - restriction_mode: B poll_default_live_voting_enabled: type: boolean default: false - description: Defines default 'poll.live_voting_enabled' option suggested to user. Is not used in the validations. + description: Defines default 'poll.published' before finished option suggested to user. Is not used in the validations. restriction_mode: B +poll_default_allow_invalid: + type: boolean + default: false + description: Defines defaut `poll.allow_invalid` option suggested to user. + restriction_mode: B +poll_default_allow_vote_split: + type: boolean + default: false + description: Defines defaut `poll.allow_vote_split` option suggested to user. poll_couple_countdown: type: boolean default: true @@ -940,18 +932,6 @@ poll_ids: reference: poll on_delete: CASCADE restriction_mode: B -option_ids: - type: relation-list - to: option/meeting_id - reference: option - on_delete: CASCADE - restriction_mode: B -vote_ids: - type: relation-list - to: vote/meeting_id - reference: vote - on_delete: CASCADE - restriction_mode: B assignment_ids: type: relation-list to: assignment/meeting_id @@ -1208,4 +1188,3 @@ relevant_history_entry_ids: type: relation-list to: history_entry/meeting_id restriction_mode: A - diff --git a/collections/meeting_user.yml b/collections/meeting_user.yml index 115bf1fc..f31a8072 100644 --- a/collections/meeting_user.yml +++ b/collections/meeting_user.yml @@ -5,7 +5,6 @@ id: constant: true required: true - comment: type: HTMLStrict restriction_mode: D @@ -85,6 +84,24 @@ vote_delegations_from_ids: to: meeting_user/vote_delegated_to_id equal_fields: meeting_id restriction_mode: A +poll_voted_ids: + type: relation-list + to: poll/voted_ids + restriction_mode: A +poll_option_ids: + type: relation-list + to: poll_config_option/meeting_user_id + reference: poll_config_option + required: false + restriction_mode: A +acting_ballot_ids: + type: relation-list + to: ballot/acting_meeting_user_id + restriction_mode: A +represented_ballot_ids: + type: relation-list + to: ballot/represented_meeting_user_id + restriction_mode: A chat_message_ids: type: relation-list to: chat_message/meeting_user_id @@ -100,4 +117,3 @@ structure_level_ids: equal_fields: meeting_id restriction_mode: A to: structure_level/meeting_user_ids - diff --git a/collections/motion.yml b/collections/motion.yml index f09db4f9..5cf41705 100644 --- a/collections/motion.yml +++ b/collections/motion.yml @@ -107,22 +107,22 @@ sort_child_ids: origin_id: type: relation reference: motion - to: motion/derived_motion_ids # Note: The related motions may not be in the same meeting + to: motion/derived_motion_ids # Note: The related motions may not be in the same meeting restriction_mode: A -origin_meeting_id: # The meeting of the motion in origin_id, if any +origin_meeting_id: # The meeting of the motion in origin_id, if any type: relation reference: meeting to: meeting/forwarded_motion_ids restriction_mode: A derived_motion_ids: type: relation-list - to: motion/origin_id # Note: The related motions may not be in the same meeting + to: motion/origin_id # Note: The related motions may not be in the same meeting restriction_mode: A -all_origin_ids: # Calculated: All parents (origin_id), grandparents, etc. of this motion. +all_origin_ids: # Calculated: All parents (origin_id), grandparents, etc. of this motion. type: relation-list to: motion/all_derived_motion_ids restriction_mode: A -all_derived_motion_ids: # Calculated: All children (derived_motion_ids), grandchildren, etc. of this motion. +all_derived_motion_ids: # Calculated: All children (derived_motion_ids), grandchildren, etc. of this motion. type: relation-list to: motion/all_origin_ids restriction_mode: A @@ -147,7 +147,7 @@ state_extension_reference_ids: type: generic-relation-list to: collections: - - motion + - motion field: referenced_in_motion_state_extension_ids equal_fields: meeting_id restriction_mode: C @@ -160,7 +160,7 @@ recommendation_extension_reference_ids: type: generic-relation-list to: collections: - - motion + - motion field: referenced_in_motion_recommendation_extension_ids equal_fields: meeting_id restriction_mode: C @@ -211,13 +211,6 @@ poll_ids: on_delete: CASCADE equal_fields: meeting_id restriction_mode: C -option_ids: - type: relation-list - to: option/content_object_id - reference: option - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: C change_recommendation_ids: type: relation-list to: motion_change_recommendation/motion_id @@ -278,4 +271,3 @@ history_entry_ids: type: relation-list to: history_entry/model_id restriction_mode: A - diff --git a/collections/poll.yml b/collections/poll.yml index 1b910d47..b6afad28 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -4,116 +4,60 @@ id: restriction_mode: A constant: true required: true - title: type: string required: true restriction_mode: A -description: - type: string - restriction_mode: A -type: - type: string - required: true - enum: - - analog - - named - - pseudoanonymous - - cryptographic - restriction_mode: A -backend: - type: string +config_id: + type: generic-relation + to: + - poll_config_approval/poll_id + - poll_config_selection/poll_id + - poll_config_rating_score/poll_id + - poll_config_rating_approval/poll_id + reference: + - poll_config_approval + - poll_config_selection + - poll_config_rating_score + - poll_config_rating_approval required: true - enum: - - long - - fast - default: fast restriction_mode: A -is_pseudoanonymized: - type: boolean - restriction_mode: A -pollmethod: +visibility: type: string required: true enum: - - "Y" - - "YN" - - "YNA" - - "N" + - manually + - named + - open + - secret restriction_mode: A state: type: string enum: - - created - - started - - finished - - published + - created + - started + - finished default: created restriction_mode: A -min_votes_amount: - type: number - default: 1 - minimum: 1 - restriction_mode: A -max_votes_amount: - type: number - default: 1 - minimum: 1 - restriction_mode: A -max_votes_per_option: - type: number - default: 1 - minimum: 1 - restriction_mode: A -global_yes: - type: boolean - default: false - restriction_mode: A -global_no: +result: + type: text + description: Calculated result. The format depends on the value in poll/method. Can be manually set when visibility is set to manually. + restriction_mode: B +published: type: boolean default: false + description: If true, users can see the result. restriction_mode: A -global_abstain: +allow_invalid: type: boolean default: false + description: If true, the vote service does not validate. This is always the case for secret polls. restriction_mode: A -onehundred_percent_base: - type: string - required: true - enum: - - "Y" - - "YN" - - "YNA" - - "N" - - "valid" - - "cast" - - "entitled" - - "entitled_present" - - "disabled" - default: disabled - restriction_mode: A -votesvalid: - type: decimal(6) - restriction_mode: B -votesinvalid: - type: decimal(6) - restriction_mode: B -votescast: - type: decimal(6) - restriction_mode: D -entitled_users_at_stop: - type: JSON - restriction_mode: A -live_voting_enabled: +allow_vote_split: type: boolean default: false - description: If true, the vote service sends the votes of the users to the autoupdate service. + description: If true, users can split there vote. restriction_mode: A -live_votes: - type: JSON - calculated: true - description: dict from user to their vote. The value is null, when live voting is disabled. - restriction_mode: C sequential_number: type: number sequence_scope: meeting_id @@ -125,38 +69,30 @@ sequential_number: content_object_id: type: generic-relation reference: - - motion - - assignment - - topic - to: - collections: - motion - assignment - topic + to: + collections: + - motion + - assignment + - topic field: poll_ids equal_fields: meeting_id restriction_mode: A required: true constant: true -option_ids: +ballot_ids: type: relation-list - to: option/poll_id - reference: option - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: A -global_option_id: - type: relation - to: option/used_as_global_option_in_poll_id - reference: option + to: ballot/poll_id + reference: ballot on_delete: CASCADE equal_fields: meeting_id restriction_mode: A - constant: true voted_ids: type: relation-list - to: user/poll_voted_ids - restriction_mode: A + to: meeting_user/poll_voted_ids + restriction_mode: B entitled_group_ids: type: relation-list to: group/poll_ids @@ -170,9 +106,8 @@ projection_ids: restriction_mode: A meeting_id: type: relation - to: meeting/poll_ids reference: meeting + to: meeting/poll_ids restriction_mode: A required: true constant: true - diff --git a/collections/poll_candidate.yml b/collections/poll_candidate.yml deleted file mode 100644 index d3868084..00000000 --- a/collections/poll_candidate.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: - type: number - restriction_mode: A - constant: true - required: true - -poll_candidate_list_id: - type: relation - to: poll_candidate_list/poll_candidate_ids - reference: poll_candidate_list - equal_fields: meeting_id - restriction_mode: A - required: true - constant: true -user_id: - type: relation - to: user/poll_candidate_ids - reference: user - restriction_mode: A - constant: true -weight: - type: number - required: true - restriction_mode: A -meeting_id: - type: relation - to: meeting/poll_candidate_ids - reference: meeting - required: true - restriction_mode: A - constant: true - -# Mediafiles are delivered by the mediafile server with the URL -# `/media//path` diff --git a/collections/poll_candidate_list.yml b/collections/poll_candidate_list.yml deleted file mode 100644 index bf4c742f..00000000 --- a/collections/poll_candidate_list.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: - type: number - restriction_mode: A - constant: true - required: true - -poll_candidate_ids: - type: relation-list - to: poll_candidate/poll_candidate_list_id - reference: poll_candidate - on_delete: CASCADE - restriction_mode: A - equal_fields: meeting_id -meeting_id: - type: relation - to: meeting/poll_candidate_list_ids - reference: meeting - required: true - restriction_mode: A - constant: true -option_id: - type: relation - to: option/content_object_id - equal_fields: meeting_id - required: true - restriction_mode: A - constant: true - diff --git a/collections/poll_config_approval.yml b/collections/poll_config_approval.yml new file mode 100644 index 00000000..1d7bacca --- /dev/null +++ b/collections/poll_config_approval.yml @@ -0,0 +1,21 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A +option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A +allow_abstain: + type: boolean + default: true + restriction_mode: A diff --git a/collections/poll_config_option.yml b/collections/poll_config_option.yml new file mode 100644 index 00000000..0badbc7d --- /dev/null +++ b/collections/poll_config_option.yml @@ -0,0 +1,32 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +poll_config_id: + type: generic-relation + to: + - poll_config_approval/option_ids + - poll_config_selection/option_ids + - poll_config_rating_score/option_ids + - poll_config_rating_approval/option_ids + reference: + - poll_config_approval + - poll_config_selection + - poll_config_rating_score + - poll_config_rating_approval + required: true + restriction_mode: A +weight: + type: number + restriction_mode: A +text: + type: string + restriction_mode: A +meeting_user_id: + type: relation + to: meeting_user/poll_option_ids + reference: meeting_user + required: false + restriction_mode: A diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml new file mode 100644 index 00000000..82ae62c8 --- /dev/null +++ b/collections/poll_config_rating_approval.yml @@ -0,0 +1,29 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A +option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A +max_options_amount: + type: number + default: 0 + restriction_mode: A +min_options_amount: + type: number + default: 0 + restriction_mode: A +allow_abstain: + type: boolean + default: true + restriction_mode: A diff --git a/collections/poll_config_rating_score.yml b/collections/poll_config_rating_score.yml new file mode 100644 index 00000000..68534b2d --- /dev/null +++ b/collections/poll_config_rating_score.yml @@ -0,0 +1,37 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A +option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A +max_options_amount: + type: number + default: 0 + restriction_mode: A +min_options_amount: + type: number + default: 0 + restriction_mode: A +max_votes_per_option: + type: number + default: 0 + restriction_mode: A +max_vote_sum: + type: number + default: 0 + restriction_mode: A +min_vote_sum: + type: number + default: 0 + restriction_mode: A diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml new file mode 100644 index 00000000..8152efd9 --- /dev/null +++ b/collections/poll_config_selection.yml @@ -0,0 +1,29 @@ +--- +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A +option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A +max_options_amount: + type: number + default: 0 + restriction_mode: A +min_options_amount: + type: number + default: 0 + restriction_mode: A +allow_nota: + type: boolean + default: false + restriction_mode: A diff --git a/collections/projection.yml b/collections/projection.yml index 1eee130f..a4042ca1 100644 --- a/collections/projection.yml +++ b/collections/projection.yml @@ -19,11 +19,6 @@ type: type: string restriction_mode: A -content: - type: JSON - calculated: true - restriction_mode: A - current_projector_id: type: relation reference: projector @@ -45,29 +40,29 @@ history_projector_id: content_object_id: type: generic-relation reference: - - meeting - - motion - - meeting_mediafile - - list_of_speakers - - motion_block - - assignment - - agenda_item - - topic - - poll - - projector_message - - projector_countdown + - meeting + - motion + - meeting_mediafile + - list_of_speakers + - motion_block + - assignment + - agenda_item + - topic + - poll + - projector_message + - projector_countdown to: - - meeting/projection_ids - - motion/projection_ids - - meeting_mediafile/projection_ids - - list_of_speakers/projection_ids - - motion_block/projection_ids - - assignment/projection_ids - - agenda_item/projection_ids - - topic/projection_ids - - poll/projection_ids - - projector_message/projection_ids - - projector_countdown/projection_ids + - meeting/projection_ids + - motion/projection_ids + - meeting_mediafile/projection_ids + - list_of_speakers/projection_ids + - motion_block/projection_ids + - assignment/projection_ids + - agenda_item/projection_ids + - topic/projection_ids + - poll/projection_ids + - projector_message/projection_ids + - projector_countdown/projection_ids equal_fields: meeting_id restriction_mode: A required: true @@ -79,4 +74,3 @@ meeting_id: required: true restriction_mode: A constant: true - diff --git a/collections/user.yml b/collections/user.yml index 8397a100..dd6a1903 100644 --- a/collections/user.yml +++ b/collections/user.yml @@ -80,9 +80,9 @@ organization_management_level: type: string description: Hierarchical permission level for the whole organization. enum: - - superadmin - - can_manage_organization - - can_manage_users + - superadmin + - can_manage_organization + - can_manage_users restriction_mode: B is_present_in_meeting_ids: type: relation-list @@ -136,30 +136,6 @@ meeting_user_ids: to: meeting_user/user_id restriction_mode: A on_delete: CASCADE -poll_voted_ids: - type: relation-list - to: poll/voted_ids - restriction_mode: A -option_ids: - type: relation-list - to: option/content_object_id - reference: option - restriction_mode: A -vote_ids: - type: relation-list - to: vote/user_id - reference: vote - restriction_mode: A -delegated_vote_ids: - type: relation-list - to: vote/delegated_user_id - reference: vote - restriction_mode: A -poll_candidate_ids: - type: relation-list - to: poll_candidate/user_id - reference: poll_candidate - restriction_mode: A home_committee_id: type: relation to: committee/native_user_ids @@ -195,4 +171,3 @@ organization_id: required: true restriction_mode: F constant: true - diff --git a/models.yml b/models.yml index 347b97ad..831d3d8e 100644 --- a/models.yml +++ b/models.yml @@ -287,6 +287,43 @@ assignment_candidate: required: true restriction_mode: A constant: true +ballot: + id: + type: number + restriction_mode: A + constant: true + required: true + weight: + type: decimal(6) + restriction_mode: B + constant: true + default: '1.000000' + split: + type: boolean + default: false + restriction_mode: B + value: + type: text + restriction_mode: B + constant: true + poll_id: + type: relation + reference: poll + to: poll/ballot_ids + equal_fields: meeting_id + required: true + restriction_mode: A + constant: true + acting_meeting_user_id: + type: relation + reference: meeting_user + to: meeting_user/acting_ballot_ids + restriction_mode: C + represented_meeting_user_id: + type: relation + reference: meeting_user + to: meeting_user/represented_ballot_ids + restriction_mode: C chat_group: id: type: number @@ -1419,16 +1456,6 @@ meeting: default: 6 required: true restriction_mode: B - poll_candidate_list_ids: - type: relation-list - to: poll_candidate_list/meeting_id - reference: poll_candidate_list - restriction_mode: B - poll_candidate_ids: - type: relation-list - to: poll_candidate/meeting_id - reference: poll_candidate - restriction_mode: B meeting_user_ids: type: relation-list to: meeting_user/meeting_id @@ -1589,17 +1616,21 @@ meeting: type: relation-list to: group/used_as_poll_default_id restriction_mode: B - poll_default_backend: - type: string - enum: *id003 - default: fast - restriction_mode: B poll_default_live_voting_enabled: type: boolean default: false - description: Defines default 'poll.live_voting_enabled' option suggested to user. - Is not used in the validations. + description: Defines default 'poll.published' before finished option suggested + to user. Is not used in the validations. restriction_mode: B + poll_default_allow_invalid: + type: boolean + default: false + description: Defines defaut `poll.allow_invalid` option suggested to user. + restriction_mode: B + poll_default_allow_vote_split: + type: boolean + default: false + description: Defines defaut `poll.allow_vote_split` option suggested to user. poll_couple_countdown: type: boolean default: true @@ -1749,18 +1780,6 @@ meeting: reference: poll on_delete: CASCADE restriction_mode: B - option_ids: - type: relation-list - to: option/meeting_id - reference: option - on_delete: CASCADE - restriction_mode: B - vote_ids: - type: relation-list - to: vote/meeting_id - reference: vote - on_delete: CASCADE - restriction_mode: B assignment_ids: type: relation-list to: assignment/meeting_id @@ -2220,6 +2239,24 @@ meeting_user: to: meeting_user/vote_delegated_to_id equal_fields: meeting_id restriction_mode: A + poll_voted_ids: + type: relation-list + to: poll/voted_ids + restriction_mode: A + poll_option_ids: + type: relation-list + to: poll_config_option/meeting_user_id + reference: poll_config_option + required: false + restriction_mode: A + acting_ballot_ids: + type: relation-list + to: ballot/acting_meeting_user_id + restriction_mode: A + represented_ballot_ids: + type: relation-list + to: ballot/represented_meeting_user_id + restriction_mode: A chat_message_ids: type: relation-list to: chat_message/meeting_user_id @@ -2449,13 +2486,6 @@ motion: on_delete: CASCADE equal_fields: meeting_id restriction_mode: C - option_ids: - type: relation-list - to: option/content_object_id - reference: option - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: C change_recommendation_ids: type: relation-list to: motion_change_recommendation/motion_id @@ -3401,37 +3431,28 @@ poll: type: string required: true restriction_mode: A - description: - type: string - restriction_mode: A - type: - type: string - required: true - enum: - - analog - - named - - pseudoanonymous - - cryptographic - restriction_mode: A - backend: - type: string + config_id: + type: generic-relation + to: + - poll_config_approval/poll_id + - poll_config_selection/poll_id + - poll_config_rating_score/poll_id + - poll_config_rating_approval/poll_id + reference: + - poll_config_approval + - poll_config_selection + - poll_config_rating_score + - poll_config_rating_approval required: true - enum: - - long - - fast - default: fast - restriction_mode: A - is_pseudoanonymized: - type: boolean restriction_mode: A - pollmethod: + visibility: type: string required: true enum: - - Y - - YN - - YNA - - N + - manually + - named + - open + - secret restriction_mode: A state: type: string @@ -3439,75 +3460,29 @@ poll: - created - started - finished - - published default: created restriction_mode: A - min_votes_amount: - type: number - default: 1 - minimum: 1 - restriction_mode: A - max_votes_amount: - type: number - default: 1 - minimum: 1 - restriction_mode: A - max_votes_per_option: - type: number - default: 1 - minimum: 1 - restriction_mode: A - global_yes: + result: + type: text + description: Calculated result. The format depends on the value in poll/method. + Can be manually set when visibility is set to manually. + restriction_mode: B + published: type: boolean default: false + description: If true, users can see the result. restriction_mode: A - global_no: + allow_invalid: type: boolean default: false + description: If true, the vote service does not validate. This is always the case + for secret polls. restriction_mode: A - global_abstain: + allow_vote_split: type: boolean default: false + description: If true, users can split there vote. restriction_mode: A - onehundred_percent_base: - type: string - required: true - enum: - - Y - - YN - - YNA - - N - - valid - - cast - - entitled - - entitled_present - - disabled - default: disabled - restriction_mode: A - votesvalid: - type: decimal(6) - restriction_mode: B - votesinvalid: - type: decimal(6) - restriction_mode: B - votescast: - type: decimal(6) - restriction_mode: D - entitled_users_at_stop: - type: JSON - restriction_mode: A - live_voting_enabled: - type: boolean - default: false - description: If true, the vote service sends the votes of the users to the autoupdate - service. - restriction_mode: A - live_votes: - type: JSON - calculated: true - description: dict from user to their vote. The value is null, when live voting - is disabled. - restriction_mode: C sequential_number: type: number sequence_scope: meeting_id @@ -3533,25 +3508,17 @@ poll: restriction_mode: A required: true constant: true - option_ids: + ballot_ids: type: relation-list - to: option/poll_id - reference: option + to: ballot/poll_id + reference: ballot on_delete: CASCADE equal_fields: meeting_id restriction_mode: A - global_option_id: - type: relation - to: option/used_as_global_option_in_poll_id - reference: option - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: A - constant: true voted_ids: type: relation-list - to: user/poll_voted_ids - restriction_mode: A + to: meeting_user/poll_voted_ids + restriction_mode: B entitled_group_ids: type: relation-list to: group/poll_ids @@ -3565,69 +3532,159 @@ poll: restriction_mode: A meeting_id: type: relation - to: meeting/poll_ids reference: meeting + to: meeting/poll_ids restriction_mode: A required: true constant: true -poll_candidate: +poll_config_approval: id: type: number restriction_mode: A constant: true required: true - poll_candidate_list_id: + poll_id: type: relation - to: poll_candidate_list/poll_candidate_ids - reference: poll_candidate_list - equal_fields: meeting_id - restriction_mode: A + to: poll/config_id + reference: poll required: true - constant: true - user_id: - type: relation - to: user/poll_candidate_ids - reference: user + restriction_mode: A + option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A + allow_abstain: + type: boolean + default: true + restriction_mode: A +poll_config_option: + id: + type: number restriction_mode: A constant: true + required: true + poll_config_id: + type: generic-relation + to: + - poll_config_approval/option_ids + - poll_config_selection/option_ids + - poll_config_rating_score/option_ids + - poll_config_rating_approval/option_ids + reference: + - poll_config_approval + - poll_config_selection + - poll_config_rating_score + - poll_config_rating_approval + required: true + restriction_mode: A weight: type: number - required: true restriction_mode: A - meeting_id: + text: + type: string + restriction_mode: A + meeting_user_id: type: relation - to: meeting/poll_candidate_ids - reference: meeting - required: true + to: meeting_user/poll_option_ids + reference: meeting_user + required: false restriction_mode: A - constant: true -poll_candidate_list: +poll_config_rating_approval: id: type: number restriction_mode: A constant: true required: true - poll_candidate_ids: + poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A + option_ids: type: relation-list - to: poll_candidate/poll_candidate_list_id - reference: poll_candidate + to: poll_config_option/poll_config_id on_delete: CASCADE restriction_mode: A - equal_fields: meeting_id - meeting_id: + max_options_amount: + type: number + default: 0 + restriction_mode: A + min_options_amount: + type: number + default: 0 + restriction_mode: A + allow_abstain: + type: boolean + default: true + restriction_mode: A +poll_config_rating_score: + id: + type: number + restriction_mode: A + constant: true + required: true + poll_id: type: relation - to: meeting/poll_candidate_list_ids - reference: meeting + to: poll/config_id + reference: poll required: true restriction_mode: A + option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A + max_options_amount: + type: number + default: 0 + restriction_mode: A + min_options_amount: + type: number + default: 0 + restriction_mode: A + max_votes_per_option: + type: number + default: 0 + restriction_mode: A + max_vote_sum: + type: number + default: 0 + restriction_mode: A + min_vote_sum: + type: number + default: 0 + restriction_mode: A +poll_config_selection: + id: + type: number + restriction_mode: A constant: true - option_id: + required: true + poll_id: type: relation - to: option/content_object_id - equal_fields: meeting_id + to: poll/config_id + reference: poll required: true restriction_mode: A - constant: true + option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A + max_options_amount: + type: number + default: 0 + restriction_mode: A + min_options_amount: + type: number + default: 0 + restriction_mode: A + allow_nota: + type: boolean + default: false + restriction_mode: A projection: id: type: number @@ -3647,10 +3704,6 @@ projection: type: type: string restriction_mode: A - content: - type: JSON - calculated: true - restriction_mode: A current_projector_id: type: relation reference: projector @@ -4496,30 +4549,6 @@ user: to: meeting_user/user_id restriction_mode: A on_delete: CASCADE - poll_voted_ids: - type: relation-list - to: poll/voted_ids - restriction_mode: A - option_ids: - type: relation-list - to: option/content_object_id - reference: option - restriction_mode: A - vote_ids: - type: relation-list - to: vote/user_id - reference: vote - restriction_mode: A - delegated_vote_ids: - type: relation-list - to: vote/delegated_user_id - reference: vote - restriction_mode: A - poll_candidate_ids: - type: relation-list - to: poll_candidate/user_id - reference: poll_candidate - restriction_mode: A home_committee_id: type: relation to: committee/native_user_ids From cea96684d0ada5403a46c060fb7a1209d624c144 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Fri, 16 Jan 2026 23:12:13 +0100 Subject: [PATCH 02/23] Generate schema --- collections/meeting.yml | 1 + collections/option.yml | 66 - collections/vote.yml | 47 - dev/requirements.txt | 2 +- dev/sql/schema_relational.sql | 3363 +++++++++++++++++---------------- models.yml | 108 +- 6 files changed, 1691 insertions(+), 1896 deletions(-) delete mode 100644 collections/option.yml delete mode 100644 collections/vote.yml diff --git a/collections/meeting.yml b/collections/meeting.yml index 0ce34948..0f89c812 100644 --- a/collections/meeting.yml +++ b/collections/meeting.yml @@ -779,6 +779,7 @@ poll_default_allow_vote_split: type: boolean default: false description: Defines defaut `poll.allow_vote_split` option suggested to user. + restriction_mode: B poll_couple_countdown: type: boolean default: true diff --git a/collections/option.yml b/collections/option.yml deleted file mode 100644 index 46587585..00000000 --- a/collections/option.yml +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: - type: number - restriction_mode: A - constant: true - required: true - -weight: - type: number - default: 10000 - restriction_mode: A -text: - type: HTMLStrict - restriction_mode: A -"yes": - type: decimal(6) - restriction_mode: B -"no": - type: decimal(6) - restriction_mode: B -abstain: - type: decimal(6) - restriction_mode: B - -poll_id: - type: relation - to: poll/option_ids - reference: poll - equal_fields: meeting_id - restriction_mode: A - constant: true -used_as_global_option_in_poll_id: - type: relation - to: poll/global_option_id - reference: poll - equal_fields: meeting_id - restriction_mode: A - constant: true -vote_ids: - type: relation-list - to: vote/option_id - reference: vote - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: A -content_object_id: - type: generic-relation - to: - - motion/option_ids - - user/option_ids - - poll_candidate_list/option_id - reference: - - motion - - user - - poll_candidate_list - equal_fields: meeting_id - restriction_mode: A - constant: true -meeting_id: - type: relation - to: meeting/option_ids - reference: meeting - required: true - restriction_mode: A - constant: true - diff --git a/collections/vote.yml b/collections/vote.yml deleted file mode 100644 index a49c63c4..00000000 --- a/collections/vote.yml +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: - type: number - restriction_mode: A - constant: true - required: true - -weight: - type: decimal(6) - restriction_mode: A - constant: true -value: - type: string - restriction_mode: A - constant: true -user_token: - type: string - required: true - restriction_mode: B - constant: true - -option_id: - type: relation - to: option/vote_ids - reference: option - equal_fields: meeting_id - required: true - restriction_mode: A - constant: true -user_id: - type: relation - to: user/vote_ids - reference: user - restriction_mode: A -delegated_user_id: - type: relation - to: user/delegated_vote_ids - reference: user - restriction_mode: A -meeting_id: - type: relation - to: meeting/vote_ids - reference: meeting - required: true - restriction_mode: A - constant: true - diff --git a/dev/requirements.txt b/dev/requirements.txt index 8d283236..91897f10 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -10,7 +10,7 @@ pyyaml==6.0.3 simplejson==3.20.2 debugpy==1.8.0 requests==2.31.0 -psycopg[binary]==3.2.6 +psycopg[binary]==3.3.2 python-sql==1.5.1 # typing diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 7a50c3c6..3873157e 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'cf9d9816258d1c3187d3dbc536233389' +-- MODELS_YML_CHECKSUM = 'b3abfb9e566aebc0ac740c5536365ea8' -- Function and meta table definitions @@ -244,169 +244,109 @@ $not_null_trigger$ language plpgsql; -- Table definitions -CREATE TABLE organization_t ( +CREATE TABLE action_worker_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256), - description text, - legal_notice text, - privacy_policy text, - login_text text, - reset_password_verbose_errors boolean, - disable_forward_with_attachments boolean, - enable_electronic_voting boolean, - enable_chat boolean, - limit_of_meetings integer CONSTRAINT minimum_limit_of_meetings CHECK (limit_of_meetings >= 0) DEFAULT 0, - limit_of_users integer CONSTRAINT minimum_limit_of_users CHECK (limit_of_users >= 0) DEFAULT 0, - default_language varchar(256) CONSTRAINT enum_organization_default_language CHECK (default_language IN ('en', 'de', 'it', 'es', 'ru', 'cs', 'fr')) DEFAULT 'en', - require_duplicate_from boolean, - enable_anonymous boolean, - saml_enabled boolean, - saml_login_button_text varchar(256) DEFAULT 'SAML login', - saml_attr_mapping jsonb, - saml_metadata_idp text, - saml_metadata_sp text, - saml_private_key text, - theme_id integer NOT NULL UNIQUE, - users_email_sender varchar(256) DEFAULT 'OpenSlides', - users_email_replyto varchar(256), - users_email_subject varchar(256) DEFAULT 'OpenSlides access data', - users_email_body text DEFAULT 'Dear {name}, + name varchar(256) NOT NULL, + state varchar(256) NOT NULL CONSTRAINT enum_action_worker_state CHECK (state IN ('running', 'end', 'aborted')), + created timestamptz NOT NULL, + timestamp timestamptz NOT NULL, + result jsonb, + user_id integer NOT NULL +); -this is your personal OpenSlides login: -{url} -Username: {username} -Password: {password} +comment on column action_worker_t.user_id is 'Id of the calling user. If the action is called via internal route, the value will be -1.'; -This email was generated automatically.', - url varchar(256) DEFAULT 'https://example.com' + +CREATE TABLE agenda_item_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + item_number varchar(256), + comment varchar(256), + closed boolean DEFAULT False, + type varchar(256) CONSTRAINT enum_agenda_item_type CHECK (type IN ('common', 'internal', 'hidden')) DEFAULT 'common', + duration integer CONSTRAINT minimum_duration CHECK (duration >= 0), + is_internal boolean, + is_hidden boolean, + level integer, + weight integer, + content_object_id varchar(100) NOT NULL, + content_object_id_motion_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_motion_block_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_assignment_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_topic_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','motion_block','assignment','topic')), + parent_id integer, + meeting_id integer NOT NULL ); -comment on column organization_t.limit_of_meetings is 'Maximum of active meetings for the whole organization. 0 means no limitation at all'; -comment on column organization_t.limit_of_users is 'Maximum of active users for the whole organization. 0 means no limitation at all'; +comment on column agenda_item_t.duration is 'Given in seconds'; +comment on column agenda_item_t.is_internal is 'Calculated by the server'; +comment on column agenda_item_t.is_hidden is 'Calculated by the server'; +comment on column agenda_item_t.level is 'Calculated by the server'; -CREATE TABLE user_t ( +CREATE TABLE assignment_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - username varchar(256) NOT NULL, - member_number varchar(256), - saml_id varchar(256) CONSTRAINT minlength_saml_id CHECK (char_length(saml_id) >= 1), - pronoun varchar(32), - title varchar(256), - first_name varchar(256), - last_name varchar(256), - is_active boolean DEFAULT True, - is_physical_person boolean DEFAULT True, - password varchar(256), - default_password varchar(256), - can_change_own_password boolean DEFAULT True, - email varchar(256), - default_vote_weight decimal(16,6) CONSTRAINT minimum_default_vote_weight CHECK (default_vote_weight >= 0.000001) DEFAULT '1.000000', - last_email_sent timestamptz, - is_demo_user boolean, - last_login timestamptz, - external boolean, - gender_id integer, - organization_management_level varchar(256) CONSTRAINT enum_user_organization_management_level CHECK (organization_management_level IN ('superadmin', 'can_manage_organization', 'can_manage_users')), - home_committee_id integer, - organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL + title varchar(256) NOT NULL, + description text, + open_posts integer CONSTRAINT minimum_open_posts CHECK (open_posts >= 0) DEFAULT 0, + phase varchar(256) CONSTRAINT enum_assignment_phase CHECK (phase IN ('search', 'voting', 'finished')) DEFAULT 'search', + default_poll_description text, + number_poll_candidates boolean, + sequential_number integer NOT NULL, + CONSTRAINT unique_assignment_sequential_number UNIQUE (sequential_number, meeting_id), + meeting_id integer NOT NULL ); -comment on column user_t.saml_id is 'unique-key from IdP for SAML login'; -comment on column user_t.organization_management_level is 'Hierarchical permission level for the whole organization.'; +comment on column assignment_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE meeting_user_t ( +CREATE TABLE assignment_candidate_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - comment text, - number varchar(256), - about_me text, - vote_weight decimal(16,6) CONSTRAINT minimum_vote_weight CHECK (vote_weight >= 0.000001), - locked_out boolean, - user_id integer NOT NULL, - meeting_id integer NOT NULL, - vote_delegated_to_id integer + weight integer DEFAULT 10000, + assignment_id integer NOT NULL, + meeting_user_id integer, + meeting_id integer NOT NULL ); -CREATE TABLE gender_t ( +CREATE TABLE ballot_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL, - organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL + weight decimal(16,6) DEFAULT '1.000000', + split boolean DEFAULT False, + value text, + poll_id integer NOT NULL, + acting_meeting_user_id integer, + represented_meeting_user_id integer ); -comment on column gender_t.name is 'unique'; - -CREATE TABLE organization_tag_t ( +CREATE TABLE chat_group_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, name varchar(256) NOT NULL, - color varchar(7) CHECK (color is null or color ~* '^#[a-f0-9]{6}$') NOT NULL, - organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL + weight integer DEFAULT 10000, + meeting_id integer NOT NULL ); -CREATE TABLE theme_t ( +CREATE TABLE chat_message_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL, - accent_100 varchar(7) CHECK (accent_100 is null or accent_100 ~* '^#[a-f0-9]{6}$'), - accent_200 varchar(7) CHECK (accent_200 is null or accent_200 ~* '^#[a-f0-9]{6}$'), - accent_300 varchar(7) CHECK (accent_300 is null or accent_300 ~* '^#[a-f0-9]{6}$'), - accent_400 varchar(7) CHECK (accent_400 is null or accent_400 ~* '^#[a-f0-9]{6}$'), - accent_50 varchar(7) CHECK (accent_50 is null or accent_50 ~* '^#[a-f0-9]{6}$'), - accent_500 varchar(7) CHECK (accent_500 is null or accent_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#2196f3', - accent_600 varchar(7) CHECK (accent_600 is null or accent_600 ~* '^#[a-f0-9]{6}$'), - accent_700 varchar(7) CHECK (accent_700 is null or accent_700 ~* '^#[a-f0-9]{6}$'), - accent_800 varchar(7) CHECK (accent_800 is null or accent_800 ~* '^#[a-f0-9]{6}$'), - accent_900 varchar(7) CHECK (accent_900 is null or accent_900 ~* '^#[a-f0-9]{6}$'), - accent_a100 varchar(7) CHECK (accent_a100 is null or accent_a100 ~* '^#[a-f0-9]{6}$'), - accent_a200 varchar(7) CHECK (accent_a200 is null or accent_a200 ~* '^#[a-f0-9]{6}$'), - accent_a400 varchar(7) CHECK (accent_a400 is null or accent_a400 ~* '^#[a-f0-9]{6}$'), - accent_a700 varchar(7) CHECK (accent_a700 is null or accent_a700 ~* '^#[a-f0-9]{6}$'), - primary_100 varchar(7) CHECK (primary_100 is null or primary_100 ~* '^#[a-f0-9]{6}$'), - primary_200 varchar(7) CHECK (primary_200 is null or primary_200 ~* '^#[a-f0-9]{6}$'), - primary_300 varchar(7) CHECK (primary_300 is null or primary_300 ~* '^#[a-f0-9]{6}$'), - primary_400 varchar(7) CHECK (primary_400 is null or primary_400 ~* '^#[a-f0-9]{6}$'), - primary_50 varchar(7) CHECK (primary_50 is null or primary_50 ~* '^#[a-f0-9]{6}$'), - primary_500 varchar(7) CHECK (primary_500 is null or primary_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#317796', - primary_600 varchar(7) CHECK (primary_600 is null or primary_600 ~* '^#[a-f0-9]{6}$'), - primary_700 varchar(7) CHECK (primary_700 is null or primary_700 ~* '^#[a-f0-9]{6}$'), - primary_800 varchar(7) CHECK (primary_800 is null or primary_800 ~* '^#[a-f0-9]{6}$'), - primary_900 varchar(7) CHECK (primary_900 is null or primary_900 ~* '^#[a-f0-9]{6}$'), - primary_a100 varchar(7) CHECK (primary_a100 is null or primary_a100 ~* '^#[a-f0-9]{6}$'), - primary_a200 varchar(7) CHECK (primary_a200 is null or primary_a200 ~* '^#[a-f0-9]{6}$'), - primary_a400 varchar(7) CHECK (primary_a400 is null or primary_a400 ~* '^#[a-f0-9]{6}$'), - primary_a700 varchar(7) CHECK (primary_a700 is null or primary_a700 ~* '^#[a-f0-9]{6}$'), - warn_100 varchar(7) CHECK (warn_100 is null or warn_100 ~* '^#[a-f0-9]{6}$'), - warn_200 varchar(7) CHECK (warn_200 is null or warn_200 ~* '^#[a-f0-9]{6}$'), - warn_300 varchar(7) CHECK (warn_300 is null or warn_300 ~* '^#[a-f0-9]{6}$'), - warn_400 varchar(7) CHECK (warn_400 is null or warn_400 ~* '^#[a-f0-9]{6}$'), - warn_50 varchar(7) CHECK (warn_50 is null or warn_50 ~* '^#[a-f0-9]{6}$'), - warn_500 varchar(7) CHECK (warn_500 is null or warn_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#f06400', - warn_600 varchar(7) CHECK (warn_600 is null or warn_600 ~* '^#[a-f0-9]{6}$'), - warn_700 varchar(7) CHECK (warn_700 is null or warn_700 ~* '^#[a-f0-9]{6}$'), - warn_800 varchar(7) CHECK (warn_800 is null or warn_800 ~* '^#[a-f0-9]{6}$'), - warn_900 varchar(7) CHECK (warn_900 is null or warn_900 ~* '^#[a-f0-9]{6}$'), - warn_a100 varchar(7) CHECK (warn_a100 is null or warn_a100 ~* '^#[a-f0-9]{6}$'), - warn_a200 varchar(7) CHECK (warn_a200 is null or warn_a200 ~* '^#[a-f0-9]{6}$'), - warn_a400 varchar(7) CHECK (warn_a400 is null or warn_a400 ~* '^#[a-f0-9]{6}$'), - warn_a700 varchar(7) CHECK (warn_a700 is null or warn_a700 ~* '^#[a-f0-9]{6}$'), - headbar varchar(7) CHECK (headbar is null or headbar ~* '^#[a-f0-9]{6}$'), - yes varchar(7) CHECK (yes is null or yes ~* '^#[a-f0-9]{6}$'), - no varchar(7) CHECK (no is null or no ~* '^#[a-f0-9]{6}$'), - abstain varchar(7) CHECK (abstain is null or abstain ~* '^#[a-f0-9]{6}$'), - organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL + content text NOT NULL, + created timestamptz NOT NULL, + meeting_user_id integer, + chat_group_id integer NOT NULL, + meeting_id integer NOT NULL ); @@ -427,6 +367,118 @@ CREATE TABLE committee_t ( comment on column committee_t.external_id is 'unique'; +CREATE TABLE gender_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name varchar(256) NOT NULL, + organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL +); + + + +comment on column gender_t.name is 'unique'; + + +CREATE TABLE group_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + external_id varchar(256), + name varchar(256) NOT NULL, + permissions varchar(256)[] CONSTRAINT enum_group_permissions CHECK (permissions <@ ARRAY['agenda_item.can_manage', 'agenda_item.can_see', 'agenda_item.can_see_internal', 'assignment.can_manage', 'assignment.can_manage_polls', 'assignment.can_nominate_other', 'assignment.can_nominate_self', 'assignment.can_see', 'chat.can_manage', 'list_of_speakers.can_be_speaker', 'list_of_speakers.can_manage', 'list_of_speakers.can_see', 'list_of_speakers.can_manage_moderator_notes', 'list_of_speakers.can_see_moderator_notes', 'mediafile.can_manage', 'mediafile.can_see', 'meeting.can_manage_logos_and_fonts', 'meeting.can_manage_settings', 'meeting.can_see_autopilot', 'meeting.can_see_frontpage', 'meeting.can_see_history', 'meeting.can_see_livestream', 'motion.can_create', 'motion.can_create_amendments', 'motion.can_forward', 'motion.can_manage', 'motion.can_manage_metadata', 'motion.can_manage_polls', 'motion.can_see', 'motion.can_see_internal', 'motion.can_see_origin', 'motion.can_support', 'poll.can_manage', 'poll.can_see_progress', 'projector.can_manage', 'projector.can_see', 'tag.can_manage', 'user.can_manage', 'user.can_manage_presence', 'user.can_see_sensitive_data', 'user.can_see', 'user.can_update', 'user.can_edit_own_delegation']::varchar[]), + weight integer, + used_as_motion_poll_default_id integer, + used_as_assignment_poll_default_id integer, + used_as_topic_poll_default_id integer, + used_as_poll_default_id integer, + meeting_id integer NOT NULL +); + + + +comment on column group_t.external_id is 'unique in meeting'; + + +CREATE TABLE history_entry_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + entries text[], + original_model_id varchar(256), + model_id varchar(100), + model_id_user_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'user' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + model_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'motion' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + model_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'assignment' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_model_id_part1 CHECK (split_part(model_id, '/', 1) IN ('user','motion','assignment')), + position_id integer NOT NULL, + meeting_id integer +); + + + + +CREATE TABLE history_position_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + timestamp timestamptz, + original_user_id integer, + user_id integer +); + + + + +CREATE TABLE import_preview_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name varchar(256) NOT NULL CONSTRAINT enum_import_preview_name CHECK (name IN ('account', 'participant', 'topic', 'committee', 'motion')), + state varchar(256) NOT NULL CONSTRAINT enum_import_preview_state CHECK (state IN ('warning', 'error', 'done')), + created timestamptz NOT NULL, + result jsonb +); + + + + +CREATE TABLE list_of_speakers_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + closed boolean DEFAULT False, + sequential_number integer NOT NULL, + CONSTRAINT unique_list_of_speakers_sequential_number UNIQUE (sequential_number, meeting_id), + moderator_notes text, + content_object_id varchar(100) NOT NULL, + content_object_id_motion_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_motion_block_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_assignment_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_topic_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_meeting_mediafile_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting_mediafile' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','motion_block','assignment','topic','meeting_mediafile')), + meeting_id integer NOT NULL +); + + + +comment on column list_of_speakers_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; + + +CREATE TABLE mediafile_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + title varchar(256), + is_directory boolean, + filesize integer, + filename varchar(256), + mimetype varchar(256), + pdf_information jsonb, + create_timestamp timestamptz, + token varchar(256), + published_to_meetings_in_organization_id integer, + parent_id integer, + owner_id varchar(100) NOT NULL, + owner_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(owner_id, '/', 1) = 'meeting' THEN cast(split_part(owner_id, '/', 2) AS INTEGER) ELSE null END) STORED, + owner_id_organization_id integer GENERATED ALWAYS AS (CASE WHEN split_part(owner_id, '/', 1) = 'organization' THEN cast(split_part(owner_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_owner_id_part1 CHECK (split_part(owner_id, '/', 1) IN ('meeting','organization')) +); + + + +comment on column mediafile_t.title is 'Title and parent_id must be unique.'; +comment on column mediafile_t.filesize is 'In bytes, not the human readable format anymore.'; +comment on column mediafile_t.filename is 'The uploaded filename. Will be used for downloading. Only writeable on create.'; + + CREATE TABLE meeting_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, external_id varchar(256), @@ -592,8 +644,9 @@ This email was generated automatically.', poll_default_type varchar(256) DEFAULT 'analog', poll_default_method varchar(256), poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_poll_default_onehundred_percent_base CHECK (poll_default_onehundred_percent_base IN ('Y', 'YN', 'YNA', 'N', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'YNA', - poll_default_backend varchar(256) CONSTRAINT enum_meeting_poll_default_backend CHECK (poll_default_backend IN ('long', 'fast')) DEFAULT 'fast', poll_default_live_voting_enabled boolean DEFAULT False, + poll_default_allow_invalid boolean DEFAULT False, + poll_default_allow_vote_split boolean DEFAULT False, poll_couple_countdown boolean DEFAULT True, logo_projector_main_id integer UNIQUE, logo_projector_header_id integer UNIQUE, @@ -627,175 +680,37 @@ comment on column meeting_t.is_active_in_organization_id is 'Backrelation and bo comment on column meeting_t.is_archived_in_organization_id is 'Backrelation and boolean flag at once'; comment on column meeting_t.list_of_speakers_default_structure_level_time is '0 disables structure level countdowns.'; comment on column meeting_t.list_of_speakers_intervention_time is '0 disables intervention speakers.'; -comment on column meeting_t.poll_default_live_voting_enabled is 'Defines default ''poll.live_voting_enabled'' option suggested to user. Is not used in the validations.'; - - -CREATE TABLE structure_level_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL, - color varchar(7) CHECK (color is null or color ~* '^#[a-f0-9]{6}$'), - default_time integer CONSTRAINT minimum_default_time CHECK (default_time >= 0), - meeting_id integer NOT NULL -); - - - - -CREATE TABLE group_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - external_id varchar(256), - name varchar(256) NOT NULL, - permissions varchar(256)[] CONSTRAINT enum_group_permissions CHECK (permissions <@ ARRAY['agenda_item.can_manage', 'agenda_item.can_see', 'agenda_item.can_see_internal', 'assignment.can_manage', 'assignment.can_manage_polls', 'assignment.can_nominate_other', 'assignment.can_nominate_self', 'assignment.can_see', 'chat.can_manage', 'list_of_speakers.can_be_speaker', 'list_of_speakers.can_manage', 'list_of_speakers.can_see', 'list_of_speakers.can_manage_moderator_notes', 'list_of_speakers.can_see_moderator_notes', 'mediafile.can_manage', 'mediafile.can_see', 'meeting.can_manage_logos_and_fonts', 'meeting.can_manage_settings', 'meeting.can_see_autopilot', 'meeting.can_see_frontpage', 'meeting.can_see_history', 'meeting.can_see_livestream', 'motion.can_create', 'motion.can_create_amendments', 'motion.can_forward', 'motion.can_manage', 'motion.can_manage_metadata', 'motion.can_manage_polls', 'motion.can_see', 'motion.can_see_internal', 'motion.can_see_origin', 'motion.can_support', 'poll.can_manage', 'poll.can_see_progress', 'projector.can_manage', 'projector.can_see', 'tag.can_manage', 'user.can_manage', 'user.can_manage_presence', 'user.can_see_sensitive_data', 'user.can_see', 'user.can_update', 'user.can_edit_own_delegation']::varchar[]), - weight integer, - used_as_motion_poll_default_id integer, - used_as_assignment_poll_default_id integer, - used_as_topic_poll_default_id integer, - used_as_poll_default_id integer, - meeting_id integer NOT NULL -); - - - -comment on column group_t.external_id is 'unique in meeting'; - - -CREATE TABLE personal_note_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - note text, - star boolean, - meeting_user_id integer NOT NULL, - content_object_id varchar(100), - content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion')), - meeting_id integer NOT NULL -); - - - - -CREATE TABLE tag_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL, - meeting_id integer NOT NULL -); - - - - -CREATE TABLE agenda_item_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - item_number varchar(256), - comment varchar(256), - closed boolean DEFAULT False, - type varchar(256) CONSTRAINT enum_agenda_item_type CHECK (type IN ('common', 'internal', 'hidden')) DEFAULT 'common', - duration integer CONSTRAINT minimum_duration CHECK (duration >= 0), - is_internal boolean, - is_hidden boolean, - level integer, - weight integer, - content_object_id varchar(100) NOT NULL, - content_object_id_motion_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_motion_block_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_assignment_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_topic_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','motion_block','assignment','topic')), - parent_id integer, - meeting_id integer NOT NULL -); - - - -comment on column agenda_item_t.duration is 'Given in seconds'; -comment on column agenda_item_t.is_internal is 'Calculated by the server'; -comment on column agenda_item_t.is_hidden is 'Calculated by the server'; -comment on column agenda_item_t.level is 'Calculated by the server'; - - -CREATE TABLE list_of_speakers_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - closed boolean DEFAULT False, - sequential_number integer NOT NULL, - CONSTRAINT unique_list_of_speakers_sequential_number UNIQUE (sequential_number, meeting_id), - moderator_notes text, - content_object_id varchar(100) NOT NULL, - content_object_id_motion_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_motion_block_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_assignment_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_topic_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_meeting_mediafile_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting_mediafile' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','motion_block','assignment','topic','meeting_mediafile')), - meeting_id integer NOT NULL -); - - - -comment on column list_of_speakers_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; - - -CREATE TABLE structure_level_list_of_speakers_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - structure_level_id integer NOT NULL, - list_of_speakers_id integer NOT NULL, - initial_time integer NOT NULL CONSTRAINT minimum_initial_time CHECK (initial_time >= 1), - additional_time double precision, - remaining_time double precision NOT NULL, - current_start_time timestamptz, - meeting_id integer NOT NULL -); +comment on column meeting_t.poll_default_live_voting_enabled is 'Defines default ''poll.published'' before finished option suggested to user. Is not used in the validations.'; +comment on column meeting_t.poll_default_allow_invalid is 'Defines defaut `poll.allow_invalid` option suggested to user.'; +comment on column meeting_t.poll_default_allow_vote_split is 'Defines defaut `poll.allow_vote_split` option suggested to user.'; - -comment on column structure_level_list_of_speakers_t.initial_time is 'The initial time of this structure_level for this LoS'; -comment on column structure_level_list_of_speakers_t.additional_time is 'The summed added time of this structure_level for this LoS'; -comment on column structure_level_list_of_speakers_t.remaining_time is 'The currently remaining time of this structure_level for this LoS'; -comment on column structure_level_list_of_speakers_t.current_start_time is 'The current start time of a speaker for this structure_level. Is only set if a currently speaking speaker exists'; - - -CREATE TABLE point_of_order_category_t ( +CREATE TABLE meeting_mediafile_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - text varchar(256) NOT NULL, - rank integer NOT NULL, - meeting_id integer NOT NULL + mediafile_id integer NOT NULL, + meeting_id integer NOT NULL, + is_public boolean NOT NULL ); - -CREATE TABLE speaker_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - begin_time timestamptz, - end_time timestamptz, - pause_time timestamptz, - unpause_time timestamptz, - total_pause integer, - weight integer DEFAULT 10000, - speech_state varchar(256) CONSTRAINT enum_speaker_speech_state CHECK (speech_state IN ('contribution', 'pro', 'contra', 'intervention', 'interposed_question')), - answer boolean, - note varchar(250), - point_of_order boolean, - list_of_speakers_id integer NOT NULL, - structure_level_list_of_speakers_id integer, - meeting_user_id integer, - point_of_order_category_id integer, - meeting_id integer NOT NULL -); - - +comment on column meeting_mediafile_t.is_public is 'Calculated in actions. Used to discern whether the (meeting-)mediafile can be seen by everyone, because, in the case of inherited_access_group_ids == [], it would otherwise not be clear. inherited_access_group_ids == [] can have two causes: cancelling access groups (=> is_public := false) or no access groups at all (=> is_public := true)'; -CREATE TABLE topic_t ( +CREATE TABLE meeting_user_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - title varchar(256) NOT NULL, - text text, - sequential_number integer NOT NULL, - CONSTRAINT unique_topic_sequential_number UNIQUE (sequential_number, meeting_id), - meeting_id integer NOT NULL + comment text, + number varchar(256), + about_me text, + vote_weight decimal(16,6) CONSTRAINT minimum_vote_weight CHECK (vote_weight >= 0.000001), + locked_out boolean, + user_id integer NOT NULL, + meeting_id integer NOT NULL, + vote_delegated_to_id integer ); -comment on column topic_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; - CREATE TABLE motion_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -826,54 +741,60 @@ CREATE TABLE motion_t ( origin_meeting_id integer, state_id integer NOT NULL, recommendation_id integer, - category_id integer, - block_id integer, - meeting_id integer NOT NULL -); - - - -comment on column motion_t.number_value is 'The number value of this motion. This number is auto-generated and read-only.'; -comment on column motion_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -comment on column motion_t.marked_forwarded is 'Forwarded amendments can be marked as such. This is just optional, however. Forwarded amendments can also have this field set to false.'; - - -CREATE TABLE motion_submitter_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight integer, - meeting_user_id integer, - motion_id integer NOT NULL, + category_id integer, + block_id integer, meeting_id integer NOT NULL ); +comment on column motion_t.number_value is 'The number value of this motion. This number is auto-generated and read-only.'; +comment on column motion_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; +comment on column motion_t.marked_forwarded is 'Forwarded amendments can be marked as such. This is just optional, however. Forwarded amendments can also have this field set to false.'; + -CREATE TABLE motion_supporter_t ( +CREATE TABLE motion_block_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - meeting_user_id integer, - motion_id integer NOT NULL, + title varchar(256) NOT NULL, + internal boolean, + sequential_number integer NOT NULL, + CONSTRAINT unique_motion_block_sequential_number UNIQUE (sequential_number, meeting_id), meeting_id integer NOT NULL ); +comment on column motion_block_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE motion_editor_t ( + +CREATE TABLE motion_category_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight integer, - meeting_user_id integer, - motion_id integer NOT NULL, + name varchar(256) NOT NULL, + prefix varchar(256), + weight integer DEFAULT 10000, + level integer, + sequential_number integer NOT NULL, + CONSTRAINT unique_motion_category_sequential_number UNIQUE (sequential_number, meeting_id), + parent_id integer, meeting_id integer NOT NULL ); +comment on column motion_category_t.level is 'Calculated field.'; +comment on column motion_category_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE motion_working_group_speaker_t ( + +CREATE TABLE motion_change_recommendation_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight integer, - meeting_user_id integer, + rejected boolean DEFAULT False, + internal boolean DEFAULT False, + type varchar(256) CONSTRAINT enum_motion_change_recommendation_type CHECK (type IN ('replacement', 'insertion', 'deletion', 'other')) DEFAULT 'replacement', + other_description varchar(256), + line_from integer CONSTRAINT minimum_line_from CHECK (line_from >= 0), + line_to integer CONSTRAINT minimum_line_to CHECK (line_to >= 0), + text text, + creation_time timestamptz, motion_id integer NOT NULL, meeting_id integer NOT NULL ); @@ -907,48 +828,10 @@ CREATE TABLE motion_comment_section_t ( comment on column motion_comment_section_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE motion_category_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL, - prefix varchar(256), - weight integer DEFAULT 10000, - level integer, - sequential_number integer NOT NULL, - CONSTRAINT unique_motion_category_sequential_number UNIQUE (sequential_number, meeting_id), - parent_id integer, - meeting_id integer NOT NULL -); - - - -comment on column motion_category_t.level is 'Calculated field.'; -comment on column motion_category_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; - - -CREATE TABLE motion_block_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - title varchar(256) NOT NULL, - internal boolean, - sequential_number integer NOT NULL, - CONSTRAINT unique_motion_block_sequential_number UNIQUE (sequential_number, meeting_id), - meeting_id integer NOT NULL -); - - - -comment on column motion_block_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; - - -CREATE TABLE motion_change_recommendation_t ( +CREATE TABLE motion_editor_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - rejected boolean DEFAULT False, - internal boolean DEFAULT False, - type varchar(256) CONSTRAINT enum_motion_change_recommendation_type CHECK (type IN ('replacement', 'insertion', 'deletion', 'other')) DEFAULT 'replacement', - other_description varchar(256), - line_from integer CONSTRAINT minimum_line_from CHECK (line_from >= 0), - line_to integer CONSTRAINT minimum_line_to CHECK (line_to >= 0), - text text, - creation_time timestamptz, + weight integer, + meeting_user_id integer, motion_id integer NOT NULL, meeting_id integer NOT NULL ); @@ -983,6 +866,27 @@ CREATE TABLE motion_state_t ( +CREATE TABLE motion_submitter_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + weight integer, + meeting_user_id integer, + motion_id integer NOT NULL, + meeting_id integer NOT NULL +); + + + + +CREATE TABLE motion_supporter_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + meeting_user_id integer, + motion_id integer NOT NULL, + meeting_id integer NOT NULL +); + + + + CREATE TABLE motion_workflow_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, name varchar(256) NOT NULL, @@ -997,168 +901,217 @@ CREATE TABLE motion_workflow_t ( comment on column motion_workflow_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE poll_t ( +CREATE TABLE motion_working_group_speaker_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - title varchar(256) NOT NULL, - description varchar(256), - type varchar(256) NOT NULL CONSTRAINT enum_poll_type CHECK (type IN ('analog', 'named', 'pseudoanonymous', 'cryptographic')), - backend varchar(256) NOT NULL CONSTRAINT enum_poll_backend CHECK (backend IN ('long', 'fast')) DEFAULT 'fast', - is_pseudoanonymized boolean, - pollmethod varchar(256) NOT NULL CONSTRAINT enum_poll_pollmethod CHECK (pollmethod IN ('Y', 'YN', 'YNA', 'N')), - state varchar(256) CONSTRAINT enum_poll_state CHECK (state IN ('created', 'started', 'finished', 'published')) DEFAULT 'created', - min_votes_amount integer CONSTRAINT minimum_min_votes_amount CHECK (min_votes_amount >= 1) DEFAULT 1, - max_votes_amount integer CONSTRAINT minimum_max_votes_amount CHECK (max_votes_amount >= 1) DEFAULT 1, - max_votes_per_option integer CONSTRAINT minimum_max_votes_per_option CHECK (max_votes_per_option >= 1) DEFAULT 1, - global_yes boolean DEFAULT False, - global_no boolean DEFAULT False, - global_abstain boolean DEFAULT False, - onehundred_percent_base varchar(256) NOT NULL CONSTRAINT enum_poll_onehundred_percent_base CHECK (onehundred_percent_base IN ('Y', 'YN', 'YNA', 'N', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'disabled', - votesvalid decimal(16,6), - votesinvalid decimal(16,6), - votescast decimal(16,6), - entitled_users_at_stop jsonb, - live_voting_enabled boolean DEFAULT False, - sequential_number integer NOT NULL, - CONSTRAINT unique_poll_sequential_number UNIQUE (sequential_number, meeting_id), - content_object_id varchar(100) NOT NULL, - content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','assignment','topic')), - global_option_id integer UNIQUE, + weight integer, + meeting_user_id integer, + motion_id integer NOT NULL, meeting_id integer NOT NULL ); -comment on column poll_t.live_voting_enabled is 'If true, the vote service sends the votes of the users to the autoupdate service.'; -comment on column poll_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -/* - Fields without SQL definition for table poll +CREATE TABLE organization_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name varchar(256), + description text, + legal_notice text, + privacy_policy text, + login_text text, + reset_password_verbose_errors boolean, + disable_forward_with_attachments boolean, + enable_electronic_voting boolean, + enable_chat boolean, + limit_of_meetings integer CONSTRAINT minimum_limit_of_meetings CHECK (limit_of_meetings >= 0) DEFAULT 0, + limit_of_users integer CONSTRAINT minimum_limit_of_users CHECK (limit_of_users >= 0) DEFAULT 0, + default_language varchar(256) CONSTRAINT enum_organization_default_language CHECK (default_language IN ('en', 'de', 'it', 'es', 'ru', 'cs', 'fr')) DEFAULT 'en', + require_duplicate_from boolean, + enable_anonymous boolean, + saml_enabled boolean, + saml_login_button_text varchar(256) DEFAULT 'SAML login', + saml_attr_mapping jsonb, + saml_metadata_idp text, + saml_metadata_sp text, + saml_private_key text, + theme_id integer NOT NULL UNIQUE, + users_email_sender varchar(256) DEFAULT 'OpenSlides', + users_email_replyto varchar(256), + users_email_subject varchar(256) DEFAULT 'OpenSlides access data', + users_email_body text DEFAULT 'Dear {name}, - poll/live_votes: type:JSON is marked as a calculated field and not generated in schema +this is your personal OpenSlides login: -*/ +{url} +Username: {username} +Password: {password} + + +This email was generated automatically.', + url varchar(256) DEFAULT 'https://example.com' +); -CREATE TABLE option_t ( + + +comment on column organization_t.limit_of_meetings is 'Maximum of active meetings for the whole organization. 0 means no limitation at all'; +comment on column organization_t.limit_of_users is 'Maximum of active users for the whole organization. 0 means no limitation at all'; + + +CREATE TABLE organization_tag_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight integer DEFAULT 10000, - text text, - yes decimal(16,6), - no decimal(16,6), - abstain decimal(16,6), - poll_id integer, - used_as_global_option_in_poll_id integer UNIQUE, + name varchar(256) NOT NULL, + color varchar(7) CHECK (color is null or color ~* '^#[a-f0-9]{6}$') NOT NULL, + organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL +); + + + + +CREATE TABLE personal_note_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + note text, + star boolean, + meeting_user_id integer NOT NULL, content_object_id varchar(100), content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_user_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'user' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_poll_candidate_list_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'poll_candidate_list' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','user','poll_candidate_list')), + CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion')), meeting_id integer NOT NULL ); -CREATE TABLE vote_t ( +CREATE TABLE point_of_order_category_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight decimal(16,6), - value varchar(256), - user_token varchar(256) NOT NULL, - option_id integer NOT NULL, - user_id integer, - delegated_user_id integer, + text varchar(256) NOT NULL, + rank integer NOT NULL, meeting_id integer NOT NULL ); -CREATE TABLE assignment_t ( +CREATE TABLE poll_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, title varchar(256) NOT NULL, - description text, - open_posts integer CONSTRAINT minimum_open_posts CHECK (open_posts >= 0) DEFAULT 0, - phase varchar(256) CONSTRAINT enum_assignment_phase CHECK (phase IN ('search', 'voting', 'finished')) DEFAULT 'search', - default_poll_description text, - number_poll_candidates boolean, + config_id varchar(100) NOT NULL, + config_id_poll_config_approval_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_approval' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + config_id_poll_config_selection_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + config_id_poll_config_rating_score_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + config_id_poll_config_rating_approval_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_approval' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_config_id_part1 CHECK (split_part(config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval')), + visibility varchar(256) NOT NULL CONSTRAINT enum_poll_visibility CHECK (visibility IN ('manually', 'named', 'open', 'secret')), + state varchar(256) CONSTRAINT enum_poll_state CHECK (state IN ('created', 'started', 'finished')) DEFAULT 'created', + result text, + published boolean DEFAULT False, + allow_invalid boolean DEFAULT False, + allow_vote_split boolean DEFAULT False, sequential_number integer NOT NULL, - CONSTRAINT unique_assignment_sequential_number UNIQUE (sequential_number, meeting_id), + CONSTRAINT unique_poll_sequential_number UNIQUE (sequential_number, meeting_id), + content_object_id varchar(100) NOT NULL, + content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('motion','assignment','topic')), meeting_id integer NOT NULL ); -comment on column assignment_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; +comment on column poll_t.result is 'Calculated result. The format depends on the value in poll/method. Can be manually set when visibility is set to manually.'; +comment on column poll_t.published is 'If true, users can see the result.'; +comment on column poll_t.allow_invalid is 'If true, the vote service does not validate. This is always the case for secret polls.'; +comment on column poll_t.allow_vote_split is 'If true, users can split there vote.'; +comment on column poll_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE assignment_candidate_t ( +CREATE TABLE poll_config_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight integer DEFAULT 10000, - assignment_id integer NOT NULL, - meeting_user_id integer, - meeting_id integer NOT NULL + poll_id integer NOT NULL UNIQUE, + allow_abstain boolean DEFAULT True ); -CREATE TABLE poll_candidate_list_t ( +CREATE TABLE poll_config_option_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - meeting_id integer NOT NULL + poll_config_id varchar(100) NOT NULL, + poll_config_id_poll_config_approval_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_approval' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + poll_config_id_poll_config_selection_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + poll_config_id_poll_config_rating_score_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + poll_config_id_poll_config_rating_approval_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_approval' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_poll_config_id_part1 CHECK (split_part(poll_config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval')), + weight integer, + text varchar(256), + meeting_user_id integer ); -CREATE TABLE poll_candidate_t ( +CREATE TABLE poll_config_rating_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_candidate_list_id integer NOT NULL, - user_id integer, - weight integer NOT NULL, - meeting_id integer NOT NULL + poll_id integer NOT NULL UNIQUE, + max_options_amount integer DEFAULT 0, + min_options_amount integer DEFAULT 0, + allow_abstain boolean DEFAULT True ); -CREATE TABLE mediafile_t ( +CREATE TABLE poll_config_rating_score_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - title varchar(256), - is_directory boolean, - filesize integer, - filename varchar(256), - mimetype varchar(256), - pdf_information jsonb, - create_timestamp timestamptz, - token varchar(256), - published_to_meetings_in_organization_id integer, - parent_id integer, - owner_id varchar(100) NOT NULL, - owner_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(owner_id, '/', 1) = 'meeting' THEN cast(split_part(owner_id, '/', 2) AS INTEGER) ELSE null END) STORED, - owner_id_organization_id integer GENERATED ALWAYS AS (CASE WHEN split_part(owner_id, '/', 1) = 'organization' THEN cast(split_part(owner_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_owner_id_part1 CHECK (split_part(owner_id, '/', 1) IN ('meeting','organization')) + poll_id integer NOT NULL UNIQUE, + max_options_amount integer DEFAULT 0, + min_options_amount integer DEFAULT 0, + max_votes_per_option integer DEFAULT 0, + max_vote_sum integer DEFAULT 0, + min_vote_sum integer DEFAULT 0 ); -comment on column mediafile_t.title is 'Title and parent_id must be unique.'; -comment on column mediafile_t.filesize is 'In bytes, not the human readable format anymore.'; -comment on column mediafile_t.filename is 'The uploaded filename. Will be used for downloading. Only writeable on create.'; +CREATE TABLE poll_config_selection_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + poll_id integer NOT NULL UNIQUE, + max_options_amount integer DEFAULT 0, + min_options_amount integer DEFAULT 0, + allow_nota boolean DEFAULT False +); -CREATE TABLE meeting_mediafile_t ( + + + +CREATE TABLE projection_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - mediafile_id integer NOT NULL, - meeting_id integer NOT NULL, - is_public boolean NOT NULL + options jsonb, + stable boolean DEFAULT False, + weight integer, + type varchar(256), + current_projector_id integer, + preview_projector_id integer, + history_projector_id integer, + content_object_id varchar(100) NOT NULL, + content_object_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_meeting_mediafile_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting_mediafile' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_list_of_speakers_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'list_of_speakers' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_motion_block_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'agenda_item' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_poll_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'poll' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_projector_message_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'projector_message' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + content_object_id_projector_countdown_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'projector_countdown' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('meeting','motion','meeting_mediafile','list_of_speakers','motion_block','assignment','agenda_item','topic','poll','projector_message','projector_countdown')), + meeting_id integer NOT NULL ); -comment on column meeting_mediafile_t.is_public is 'Calculated in actions. Used to discern whether the (meeting-)mediafile can be seen by everyone, because, in the case of inherited_access_group_ids == [], it would otherwise not be clear. inherited_access_group_ids == [] can have two causes: cancelling access groups (=> is_public := false) or no access groups at all (=> is_public := true)'; - CREATE TABLE projector_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -1206,39 +1159,18 @@ CREATE TABLE projector_t ( comment on column projector_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE projection_t ( +CREATE TABLE projector_countdown_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - options jsonb, - stable boolean DEFAULT False, - weight integer, - type varchar(256), - current_projector_id integer, - preview_projector_id integer, - history_projector_id integer, - content_object_id varchar(100) NOT NULL, - content_object_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_meeting_mediafile_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'meeting_mediafile' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_list_of_speakers_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'list_of_speakers' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_motion_block_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'motion_block' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'assignment' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'agenda_item' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'topic' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_poll_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'poll' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_projector_message_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'projector_message' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - content_object_id_projector_countdown_id integer GENERATED ALWAYS AS (CASE WHEN split_part(content_object_id, '/', 1) = 'projector_countdown' THEN cast(split_part(content_object_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_content_object_id_part1 CHECK (split_part(content_object_id, '/', 1) IN ('meeting','motion','meeting_mediafile','list_of_speakers','motion_block','assignment','agenda_item','topic','poll','projector_message','projector_countdown')), + title varchar(256) NOT NULL, + description varchar(256) DEFAULT '', + default_time integer, + countdown_time double precision DEFAULT 60, + running boolean DEFAULT False, meeting_id integer NOT NULL ); -/* - Fields without SQL definition for table projection - - projection/content: type:JSON is marked as a calculated field and not generated in schema - -*/ CREATE TABLE projector_message_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -1249,110 +1181,181 @@ CREATE TABLE projector_message_t ( -CREATE TABLE projector_countdown_t ( +CREATE TABLE speaker_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - title varchar(256) NOT NULL, - description varchar(256) DEFAULT '', - default_time integer, - countdown_time double precision DEFAULT 60, - running boolean DEFAULT False, + begin_time timestamptz, + end_time timestamptz, + pause_time timestamptz, + unpause_time timestamptz, + total_pause integer, + weight integer DEFAULT 10000, + speech_state varchar(256) CONSTRAINT enum_speaker_speech_state CHECK (speech_state IN ('contribution', 'pro', 'contra', 'intervention', 'interposed_question')), + answer boolean, + note varchar(250), + point_of_order boolean, + list_of_speakers_id integer NOT NULL, + structure_level_list_of_speakers_id integer, + meeting_user_id integer, + point_of_order_category_id integer, meeting_id integer NOT NULL ); -CREATE TABLE chat_group_t ( +CREATE TABLE structure_level_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, name varchar(256) NOT NULL, - weight integer DEFAULT 10000, + color varchar(7) CHECK (color is null or color ~* '^#[a-f0-9]{6}$'), + default_time integer CONSTRAINT minimum_default_time CHECK (default_time >= 0), meeting_id integer NOT NULL ); -CREATE TABLE chat_message_t ( +CREATE TABLE structure_level_list_of_speakers_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - content text NOT NULL, - created timestamptz NOT NULL, - meeting_user_id integer, - chat_group_id integer NOT NULL, + structure_level_id integer NOT NULL, + list_of_speakers_id integer NOT NULL, + initial_time integer NOT NULL CONSTRAINT minimum_initial_time CHECK (initial_time >= 1), + additional_time double precision, + remaining_time double precision NOT NULL, + current_start_time timestamptz, meeting_id integer NOT NULL ); +comment on column structure_level_list_of_speakers_t.initial_time is 'The initial time of this structure_level for this LoS'; +comment on column structure_level_list_of_speakers_t.additional_time is 'The summed added time of this structure_level for this LoS'; +comment on column structure_level_list_of_speakers_t.remaining_time is 'The currently remaining time of this structure_level for this LoS'; +comment on column structure_level_list_of_speakers_t.current_start_time is 'The current start time of a speaker for this structure_level. Is only set if a currently speaking speaker exists'; -CREATE TABLE action_worker_t ( + +CREATE TABLE tag_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, name varchar(256) NOT NULL, - state varchar(256) NOT NULL CONSTRAINT enum_action_worker_state CHECK (state IN ('running', 'end', 'aborted')), - created timestamptz NOT NULL, - timestamp timestamptz NOT NULL, - result jsonb, - user_id integer NOT NULL + meeting_id integer NOT NULL ); -comment on column action_worker_t.user_id is 'Id of the calling user. If the action is called via internal route, the value will be -1.'; - -CREATE TABLE import_preview_t ( +CREATE TABLE theme_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name varchar(256) NOT NULL CONSTRAINT enum_import_preview_name CHECK (name IN ('account', 'participant', 'topic', 'committee', 'motion')), - state varchar(256) NOT NULL CONSTRAINT enum_import_preview_state CHECK (state IN ('warning', 'error', 'done')), - created timestamptz NOT NULL, - result jsonb + name varchar(256) NOT NULL, + accent_100 varchar(7) CHECK (accent_100 is null or accent_100 ~* '^#[a-f0-9]{6}$'), + accent_200 varchar(7) CHECK (accent_200 is null or accent_200 ~* '^#[a-f0-9]{6}$'), + accent_300 varchar(7) CHECK (accent_300 is null or accent_300 ~* '^#[a-f0-9]{6}$'), + accent_400 varchar(7) CHECK (accent_400 is null or accent_400 ~* '^#[a-f0-9]{6}$'), + accent_50 varchar(7) CHECK (accent_50 is null or accent_50 ~* '^#[a-f0-9]{6}$'), + accent_500 varchar(7) CHECK (accent_500 is null or accent_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#2196f3', + accent_600 varchar(7) CHECK (accent_600 is null or accent_600 ~* '^#[a-f0-9]{6}$'), + accent_700 varchar(7) CHECK (accent_700 is null or accent_700 ~* '^#[a-f0-9]{6}$'), + accent_800 varchar(7) CHECK (accent_800 is null or accent_800 ~* '^#[a-f0-9]{6}$'), + accent_900 varchar(7) CHECK (accent_900 is null or accent_900 ~* '^#[a-f0-9]{6}$'), + accent_a100 varchar(7) CHECK (accent_a100 is null or accent_a100 ~* '^#[a-f0-9]{6}$'), + accent_a200 varchar(7) CHECK (accent_a200 is null or accent_a200 ~* '^#[a-f0-9]{6}$'), + accent_a400 varchar(7) CHECK (accent_a400 is null or accent_a400 ~* '^#[a-f0-9]{6}$'), + accent_a700 varchar(7) CHECK (accent_a700 is null or accent_a700 ~* '^#[a-f0-9]{6}$'), + primary_100 varchar(7) CHECK (primary_100 is null or primary_100 ~* '^#[a-f0-9]{6}$'), + primary_200 varchar(7) CHECK (primary_200 is null or primary_200 ~* '^#[a-f0-9]{6}$'), + primary_300 varchar(7) CHECK (primary_300 is null or primary_300 ~* '^#[a-f0-9]{6}$'), + primary_400 varchar(7) CHECK (primary_400 is null or primary_400 ~* '^#[a-f0-9]{6}$'), + primary_50 varchar(7) CHECK (primary_50 is null or primary_50 ~* '^#[a-f0-9]{6}$'), + primary_500 varchar(7) CHECK (primary_500 is null or primary_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#317796', + primary_600 varchar(7) CHECK (primary_600 is null or primary_600 ~* '^#[a-f0-9]{6}$'), + primary_700 varchar(7) CHECK (primary_700 is null or primary_700 ~* '^#[a-f0-9]{6}$'), + primary_800 varchar(7) CHECK (primary_800 is null or primary_800 ~* '^#[a-f0-9]{6}$'), + primary_900 varchar(7) CHECK (primary_900 is null or primary_900 ~* '^#[a-f0-9]{6}$'), + primary_a100 varchar(7) CHECK (primary_a100 is null or primary_a100 ~* '^#[a-f0-9]{6}$'), + primary_a200 varchar(7) CHECK (primary_a200 is null or primary_a200 ~* '^#[a-f0-9]{6}$'), + primary_a400 varchar(7) CHECK (primary_a400 is null or primary_a400 ~* '^#[a-f0-9]{6}$'), + primary_a700 varchar(7) CHECK (primary_a700 is null or primary_a700 ~* '^#[a-f0-9]{6}$'), + warn_100 varchar(7) CHECK (warn_100 is null or warn_100 ~* '^#[a-f0-9]{6}$'), + warn_200 varchar(7) CHECK (warn_200 is null or warn_200 ~* '^#[a-f0-9]{6}$'), + warn_300 varchar(7) CHECK (warn_300 is null or warn_300 ~* '^#[a-f0-9]{6}$'), + warn_400 varchar(7) CHECK (warn_400 is null or warn_400 ~* '^#[a-f0-9]{6}$'), + warn_50 varchar(7) CHECK (warn_50 is null or warn_50 ~* '^#[a-f0-9]{6}$'), + warn_500 varchar(7) CHECK (warn_500 is null or warn_500 ~* '^#[a-f0-9]{6}$') DEFAULT '#f06400', + warn_600 varchar(7) CHECK (warn_600 is null or warn_600 ~* '^#[a-f0-9]{6}$'), + warn_700 varchar(7) CHECK (warn_700 is null or warn_700 ~* '^#[a-f0-9]{6}$'), + warn_800 varchar(7) CHECK (warn_800 is null or warn_800 ~* '^#[a-f0-9]{6}$'), + warn_900 varchar(7) CHECK (warn_900 is null or warn_900 ~* '^#[a-f0-9]{6}$'), + warn_a100 varchar(7) CHECK (warn_a100 is null or warn_a100 ~* '^#[a-f0-9]{6}$'), + warn_a200 varchar(7) CHECK (warn_a200 is null or warn_a200 ~* '^#[a-f0-9]{6}$'), + warn_a400 varchar(7) CHECK (warn_a400 is null or warn_a400 ~* '^#[a-f0-9]{6}$'), + warn_a700 varchar(7) CHECK (warn_a700 is null or warn_a700 ~* '^#[a-f0-9]{6}$'), + headbar varchar(7) CHECK (headbar is null or headbar ~* '^#[a-f0-9]{6}$'), + yes varchar(7) CHECK (yes is null or yes ~* '^#[a-f0-9]{6}$'), + no varchar(7) CHECK (no is null or no ~* '^#[a-f0-9]{6}$'), + abstain varchar(7) CHECK (abstain is null or abstain ~* '^#[a-f0-9]{6}$'), + organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL ); -CREATE TABLE history_position_t ( +CREATE TABLE topic_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - timestamp timestamptz, - original_user_id integer, - user_id integer + title varchar(256) NOT NULL, + text text, + sequential_number integer NOT NULL, + CONSTRAINT unique_topic_sequential_number UNIQUE (sequential_number, meeting_id), + meeting_id integer NOT NULL ); +comment on column topic_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; -CREATE TABLE history_entry_t ( + +CREATE TABLE user_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - entries text[], - original_model_id varchar(256), - model_id varchar(100), - model_id_user_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'user' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, - model_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'motion' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, - model_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'assignment' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_model_id_part1 CHECK (split_part(model_id, '/', 1) IN ('user','motion','assignment')), - position_id integer NOT NULL, - meeting_id integer + username varchar(256) NOT NULL, + member_number varchar(256), + saml_id varchar(256) CONSTRAINT minlength_saml_id CHECK (char_length(saml_id) >= 1), + pronoun varchar(32), + title varchar(256), + first_name varchar(256), + last_name varchar(256), + is_active boolean DEFAULT True, + is_physical_person boolean DEFAULT True, + password varchar(256), + default_password varchar(256), + can_change_own_password boolean DEFAULT True, + email varchar(256), + default_vote_weight decimal(16,6) CONSTRAINT minimum_default_vote_weight CHECK (default_vote_weight >= 0.000001) DEFAULT '1.000000', + last_email_sent timestamptz, + is_demo_user boolean, + last_login timestamptz, + external boolean, + gender_id integer, + organization_management_level varchar(256) CONSTRAINT enum_user_organization_management_level CHECK (organization_management_level IN ('superadmin', 'can_manage_organization', 'can_manage_users')), + home_committee_id integer, + organization_id integer GENERATED ALWAYS AS (1) STORED NOT NULL ); +comment on column user_t.saml_id is 'unique-key from IdP for SAML login'; +comment on column user_t.organization_management_level is 'Hierarchical permission level for the whole organization.'; + -- Intermediate table definitions -CREATE TABLE nm_meeting_user_structure_level_ids_structure_level_t ( - meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - structure_level_id integer NOT NULL REFERENCES structure_level_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (meeting_user_id, structure_level_id) +CREATE TABLE nm_chat_group_read_group_ids_group_t ( + chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (chat_group_id, group_id) ); -CREATE TABLE gm_organization_tag_tagged_ids_t ( - id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, - organization_tag_id integer NOT NULL REFERENCES organization_tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id varchar(100) NOT NULL, - tagged_id_committee_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'committee' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES committee_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'meeting' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES meeting_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('committee', 'meeting')), - CONSTRAINT unique_$organization_tag_id_$tagged_id UNIQUE (organization_tag_id, tagged_id) +CREATE TABLE nm_chat_group_write_group_ids_group_t ( + chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (chat_group_id, group_id) ); CREATE TABLE nm_committee_manager_ids_user_t ( @@ -1373,12 +1376,6 @@ CREATE TABLE nm_committee_forward_to_committee_ids_committee_t ( PRIMARY KEY (forward_to_committee_id, receive_forwardings_from_committee_id) ); -CREATE TABLE nm_meeting_present_user_ids_user_t ( - meeting_id integer NOT NULL REFERENCES meeting_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - user_id integer NOT NULL REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (meeting_id, user_id) -); - CREATE TABLE nm_group_meeting_user_ids_meeting_user_t ( group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, @@ -1415,15 +1412,33 @@ CREATE TABLE nm_group_poll_ids_poll_t ( PRIMARY KEY (group_id, poll_id) ); -CREATE TABLE gm_tag_tagged_ids_t ( +CREATE TABLE nm_meeting_present_user_ids_user_t ( + meeting_id integer NOT NULL REFERENCES meeting_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + user_id integer NOT NULL REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (meeting_id, user_id) +); + +CREATE TABLE gm_meeting_mediafile_attachment_ids_t ( id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, - tag_id integer NOT NULL REFERENCES tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id varchar(100) NOT NULL, - tagged_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'agenda_item' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES agenda_item_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'assignment' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'motion' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('agenda_item', 'assignment', 'motion')), - CONSTRAINT unique_$tag_id_$tagged_id UNIQUE (tag_id, tagged_id) + meeting_mediafile_id integer NOT NULL REFERENCES meeting_mediafile_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id varchar(100) NOT NULL, + attachment_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'motion' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'topic' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES topic_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'assignment' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + CONSTRAINT valid_attachment_id_part1 CHECK (split_part(attachment_id, '/', 1) IN ('motion', 'topic', 'assignment')), + CONSTRAINT unique_$meeting_mediafile_id_$attachment_id UNIQUE (meeting_mediafile_id, attachment_id) +); + +CREATE TABLE nm_meeting_user_poll_voted_ids_poll_t ( + meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + poll_id integer NOT NULL REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (meeting_user_id, poll_id) +); + +CREATE TABLE nm_meeting_user_structure_level_ids_structure_level_t ( + meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + structure_level_id integer NOT NULL REFERENCES structure_level_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (meeting_user_id, structure_level_id) ); CREATE TABLE nm_motion_all_derived_motion_ids_motion_t ( @@ -1458,132 +1473,70 @@ CREATE TABLE gm_motion_recommendation_extension_reference_ids_t ( CREATE TABLE nm_motion_state_next_state_ids_motion_state_t ( next_state_id integer NOT NULL REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - previous_state_id integer NOT NULL REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (next_state_id, previous_state_id) -); - -CREATE TABLE nm_poll_voted_ids_user_t ( - poll_id integer NOT NULL REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - user_id integer NOT NULL REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (poll_id, user_id) + previous_state_id integer NOT NULL REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + PRIMARY KEY (next_state_id, previous_state_id) ); -CREATE TABLE gm_meeting_mediafile_attachment_ids_t ( +CREATE TABLE gm_organization_tag_tagged_ids_t ( id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, - meeting_mediafile_id integer NOT NULL REFERENCES meeting_mediafile_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - attachment_id varchar(100) NOT NULL, - attachment_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'motion' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - attachment_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'topic' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES topic_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - attachment_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'assignment' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - CONSTRAINT valid_attachment_id_part1 CHECK (split_part(attachment_id, '/', 1) IN ('motion', 'topic', 'assignment')), - CONSTRAINT unique_$meeting_mediafile_id_$attachment_id UNIQUE (meeting_mediafile_id, attachment_id) -); - -CREATE TABLE nm_chat_group_read_group_ids_group_t ( - chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (chat_group_id, group_id) + organization_tag_id integer NOT NULL REFERENCES organization_tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id varchar(100) NOT NULL, + tagged_id_committee_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'committee' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES committee_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'meeting' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES meeting_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('committee', 'meeting')), + CONSTRAINT unique_$organization_tag_id_$tagged_id UNIQUE (organization_tag_id, tagged_id) ); -CREATE TABLE nm_chat_group_write_group_ids_group_t ( - chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - PRIMARY KEY (chat_group_id, group_id) +CREATE TABLE gm_tag_tagged_ids_t ( + id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + tag_id integer NOT NULL REFERENCES tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id varchar(100) NOT NULL, + tagged_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'agenda_item' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES agenda_item_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'assignment' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'motion' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('agenda_item', 'assignment', 'motion')), + CONSTRAINT unique_$tag_id_$tagged_id UNIQUE (tag_id, tagged_id) ); -- View definitions -CREATE VIEW "organization" AS SELECT *, -(select array_agg(g.id ORDER BY g.id) from gender_t g where g.organization_id = o.id) as gender_ids, -(select array_agg(c.id ORDER BY c.id) from committee_t c where c.organization_id = o.id) as committee_ids, -(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.is_active_in_organization_id = o.id) as active_meeting_ids, -(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.is_archived_in_organization_id = o.id) as archived_meeting_ids, -(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.template_for_organization_id = o.id) as template_meeting_ids, -(select array_agg(ot.id ORDER BY ot.id) from organization_tag_t ot where ot.organization_id = o.id) as organization_tag_ids, -(select array_agg(t.id ORDER BY t.id) from theme_t t where t.organization_id = o.id) as theme_ids, -(select array_agg(m.id ORDER BY m.id) from mediafile_t m where m.owner_id_organization_id = o.id) as mediafile_ids, -(select array_agg(m.id ORDER BY m.id) from mediafile_t m where m.published_to_meetings_in_organization_id = o.id) as published_mediafile_ids, -(select array_agg(u.id ORDER BY u.id) from user_t u where u.organization_id = o.id) as user_ids -FROM organization_t o; - - -CREATE VIEW "user" AS SELECT *, -(select array_agg(n.meeting_id ORDER BY n.meeting_id) from nm_meeting_present_user_ids_user_t n where n.user_id = u.id) as is_present_in_meeting_ids, -( - SELECT array_agg(DISTINCT committee_id ORDER BY committee_id) - FROM ( - -- Select committee_ids from meetings the user is part of - SELECT m.committee_id - FROM meeting_user_t AS mu - INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id - INNER JOIN meeting_t AS m ON m.id = mu.meeting_id - WHERE mu.user_id = u.id - - UNION +CREATE VIEW "action_worker" AS SELECT * FROM action_worker_t a; - -- Select committee_ids from committee managers - SELECT cmu.committee_id - FROM nm_committee_manager_ids_user_t cmu - WHERE cmu.user_id = u.id - UNION +CREATE VIEW "agenda_item" AS SELECT *, +(select array_agg(ai.id ORDER BY ai.id) from agenda_item_t ai where ai.parent_id = a.id) as child_ids, +(select array_agg(g.tag_id ORDER BY g.tag_id) from gm_tag_tagged_ids_t g where g.tagged_id_agenda_item_id = a.id) as tag_ids, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_agenda_item_id = a.id) as projection_ids +FROM agenda_item_t a; - -- Select home_committee_id from user - SELECT u.home_committee_id - WHERE u.home_committee_id IS NOT NULL - ) _ -) AS committee_ids -, -(select array_agg(n.committee_id ORDER BY n.committee_id) from nm_committee_manager_ids_user_t n where n.user_id = u.id) as committee_management_ids, -(select array_agg(m.id ORDER BY m.id) from meeting_user_t m where m.user_id = u.id) as meeting_user_ids, -(select array_agg(n.poll_id ORDER BY n.poll_id) from nm_poll_voted_ids_user_t n where n.user_id = u.id) as poll_voted_ids, -(select array_agg(o.id ORDER BY o.id) from option_t o where o.content_object_id_user_id = u.id) as option_ids, -(select array_agg(v.id ORDER BY v.id) from vote_t v where v.user_id = u.id) as vote_ids, -(select array_agg(v.id ORDER BY v.id) from vote_t v where v.delegated_user_id = u.id) as delegated_vote_ids, -(select array_agg(p.id ORDER BY p.id) from poll_candidate_t p where p.user_id = u.id) as poll_candidate_ids, -(select array_agg(h.id ORDER BY h.id) from history_position_t h where h.user_id = u.id) as history_position_ids, -(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.model_id_user_id = u.id) as history_entry_ids, -( - SELECT array_agg(DISTINCT mu.meeting_id ORDER BY mu.meeting_id) - FROM meeting_user_t mu - INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id - WHERE mu.user_id = u.id -) AS meeting_ids -FROM user_t u; +CREATE VIEW "assignment" AS SELECT *, +(select array_agg(ac.id ORDER BY ac.id) from assignment_candidate_t ac where ac.assignment_id = a.id) as candidate_ids, +(select array_agg(p.id ORDER BY p.id) from poll_t p where p.content_object_id_assignment_id = a.id) as poll_ids, +(select ai.id from agenda_item_t ai where ai.content_object_id_assignment_id = a.id) as agenda_item_id, +(select l.id from list_of_speakers_t l where l.content_object_id_assignment_id = a.id) as list_of_speakers_id, +(select array_agg(g.tag_id ORDER BY g.tag_id) from gm_tag_tagged_ids_t g where g.tagged_id_assignment_id = a.id) as tag_ids, +(select array_agg(g.meeting_mediafile_id ORDER BY g.meeting_mediafile_id) from gm_meeting_mediafile_attachment_ids_t g where g.attachment_id_assignment_id = a.id) as attachment_meeting_mediafile_ids, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_assignment_id = a.id) as projection_ids, +(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.model_id_assignment_id = a.id) as history_entry_ids +FROM assignment_t a; -comment on column "user".committee_ids is 'Calculated field: Returns committee_ids, where the user is manager or member in a meeting'; -comment on column "user".meeting_ids is 'Calculated. All ids from meetings calculated via meeting_user and group_ids as integers.'; -CREATE VIEW "meeting_user" AS SELECT *, -(select array_agg(p.id ORDER BY p.id) from personal_note_t p where p.meeting_user_id = m.id) as personal_note_ids, -(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.meeting_user_id = m.id) as speaker_ids, -(select array_agg(ms.id ORDER BY ms.id) from motion_supporter_t ms where ms.meeting_user_id = m.id) as motion_supporter_ids, -(select array_agg(me.id ORDER BY me.id) from motion_editor_t me where me.meeting_user_id = m.id) as motion_editor_ids, -(select array_agg(mw.id ORDER BY mw.id) from motion_working_group_speaker_t mw where mw.meeting_user_id = m.id) as motion_working_group_speaker_ids, -(select array_agg(ms.id ORDER BY ms.id) from motion_submitter_t ms where ms.meeting_user_id = m.id) as motion_submitter_ids, -(select array_agg(a.id ORDER BY a.id) from assignment_candidate_t a where a.meeting_user_id = m.id) as assignment_candidate_ids, -(select array_agg(mu.id ORDER BY mu.id) from meeting_user_t mu where mu.vote_delegated_to_id = m.id) as vote_delegations_from_ids, -(select array_agg(c.id ORDER BY c.id) from chat_message_t c where c.meeting_user_id = m.id) as chat_message_ids, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_meeting_user_ids_meeting_user_t n where n.meeting_user_id = m.id) as group_ids, -(select array_agg(n.structure_level_id ORDER BY n.structure_level_id) from nm_meeting_user_structure_level_ids_structure_level_t n where n.meeting_user_id = m.id) as structure_level_ids -FROM meeting_user_t m; +CREATE VIEW "assignment_candidate" AS SELECT * FROM assignment_candidate_t a; -CREATE VIEW "gender" AS SELECT *, -(select array_agg(u.id ORDER BY u.id) from user_t u where u.gender_id = g.id) as user_ids -FROM gender_t g; +CREATE VIEW "ballot" AS SELECT * FROM ballot_t b; -CREATE VIEW "organization_tag" AS SELECT *, -(select array_agg(g.tagged_id ORDER BY g.tagged_id) from gm_organization_tag_tagged_ids_t g where g.organization_tag_id = o.id) as tagged_ids -FROM organization_tag_t o; +CREATE VIEW "chat_group" AS SELECT *, +(select array_agg(cm.id ORDER BY cm.id) from chat_message_t cm where cm.chat_group_id = c.id) as chat_message_ids, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_chat_group_read_group_ids_group_t n where n.chat_group_id = c.id) as read_group_ids, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_chat_group_write_group_ids_group_t n where n.chat_group_id = c.id) as write_group_ids +FROM chat_group_t c; -CREATE VIEW "theme" AS SELECT *, -(select o.id from organization_t o where o.theme_id = t.id) as theme_for_organization_id -FROM theme_t t; +CREATE VIEW "chat_message" AS SELECT * FROM chat_message_t c; CREATE VIEW "committee" AS SELECT *, @@ -1624,10 +1577,53 @@ FROM committee_t c; comment on column "committee".user_ids is 'Calculated field: All users which are in a group of a meeting, belonging to the committee or beeing manager of the committee'; +CREATE VIEW "gender" AS SELECT *, +(select array_agg(u.id ORDER BY u.id) from user_t u where u.gender_id = g.id) as user_ids +FROM gender_t g; + + +CREATE VIEW "group" AS SELECT *, +(select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_group_meeting_user_ids_meeting_user_t n where n.group_id = g.id) as meeting_user_ids, +(select m.id from meeting_t m where m.default_group_id = g.id) as default_group_for_meeting_id, +(select m.id from meeting_t m where m.admin_group_id = g.id) as admin_group_for_meeting_id, +(select m.id from meeting_t m where m.anonymous_group_id = g.id) as anonymous_group_for_meeting_id, +(select array_agg(n.meeting_mediafile_id ORDER BY n.meeting_mediafile_id) from nm_group_mmagi_meeting_mediafile_t n where n.group_id = g.id) as meeting_mediafile_access_group_ids, +(select array_agg(n.meeting_mediafile_id ORDER BY n.meeting_mediafile_id) from nm_group_mmiagi_meeting_mediafile_t n where n.group_id = g.id) as meeting_mediafile_inherited_access_group_ids, +(select array_agg(n.motion_comment_section_id ORDER BY n.motion_comment_section_id) from nm_group_read_comment_section_ids_motion_comment_section_t n where n.group_id = g.id) as read_comment_section_ids, +(select array_agg(n.motion_comment_section_id ORDER BY n.motion_comment_section_id) from nm_group_write_comment_section_ids_motion_comment_section_t n where n.group_id = g.id) as write_comment_section_ids, +(select array_agg(n.chat_group_id ORDER BY n.chat_group_id) from nm_chat_group_read_group_ids_group_t n where n.group_id = g.id) as read_chat_group_ids, +(select array_agg(n.chat_group_id ORDER BY n.chat_group_id) from nm_chat_group_write_group_ids_group_t n where n.group_id = g.id) as write_chat_group_ids, +(select array_agg(n.poll_id ORDER BY n.poll_id) from nm_group_poll_ids_poll_t n where n.group_id = g.id) as poll_ids +FROM group_t g; + +comment on column "group".meeting_mediafile_inherited_access_group_ids is 'Calculated field.'; + +CREATE VIEW "history_entry" AS SELECT * FROM history_entry_t h; + + +CREATE VIEW "history_position" AS SELECT *, +(select array_agg(he.id ORDER BY he.id) from history_entry_t he where he.position_id = h.id) as entry_ids +FROM history_position_t h; + + +CREATE VIEW "import_preview" AS SELECT * FROM import_preview_t i; + + +CREATE VIEW "list_of_speakers" AS SELECT *, +(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.list_of_speakers_id = l.id) as speaker_ids, +(select array_agg(s.id ORDER BY s.id) from structure_level_list_of_speakers_t s where s.list_of_speakers_id = l.id) as structure_level_list_of_speakers_ids, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_list_of_speakers_id = l.id) as projection_ids +FROM list_of_speakers_t l; + + +CREATE VIEW "mediafile" AS SELECT *, +(select array_agg(mt.id ORDER BY mt.id) from mediafile_t mt where mt.parent_id = m.id) as child_ids, +(select array_agg(mm.id ORDER BY mm.id) from meeting_mediafile_t mm where mm.mediafile_id = m.id) as meeting_mediafile_ids +FROM mediafile_t m; + + CREATE VIEW "meeting" AS SELECT *, (select array_agg(g.id ORDER BY g.id) from group_t g where g.used_as_motion_poll_default_id = m.id) as motion_poll_default_group_ids, -(select array_agg(p.id ORDER BY p.id) from poll_candidate_list_t p where p.meeting_id = m.id) as poll_candidate_list_ids, -(select array_agg(p.id ORDER BY p.id) from poll_candidate_t p where p.meeting_id = m.id) as poll_candidate_ids, (select array_agg(mu.id ORDER BY mu.id) from meeting_user_t mu where mu.meeting_id = m.id) as meeting_user_ids, (select array_agg(g.id ORDER BY g.id) from group_t g where g.used_as_assignment_poll_default_id = m.id) as assignment_poll_default_group_ids, (select array_agg(g.id ORDER BY g.id) from group_t g where g.used_as_poll_default_id = m.id) as poll_default_group_ids, @@ -1660,8 +1656,6 @@ CREATE VIEW "meeting" AS SELECT *, (select array_agg(mc.id ORDER BY mc.id) from motion_change_recommendation_t mc where mc.meeting_id = m.id) as motion_change_recommendation_ids, (select array_agg(ms.id ORDER BY ms.id) from motion_state_t ms where ms.meeting_id = m.id) as motion_state_ids, (select array_agg(p.id ORDER BY p.id) from poll_t p where p.meeting_id = m.id) as poll_ids, -(select array_agg(o.id ORDER BY o.id) from option_t o where o.meeting_id = m.id) as option_ids, -(select array_agg(v.id ORDER BY v.id) from vote_t v where v.meeting_id = m.id) as vote_ids, (select array_agg(a.id ORDER BY a.id) from assignment_t a where a.meeting_id = m.id) as assignment_ids, (select array_agg(a.id ORDER BY a.id) from assignment_candidate_t a where a.meeting_id = m.id) as assignment_candidate_ids, (select array_agg(p.id ORDER BY p.id) from personal_note_t p where p.meeting_id = m.id) as personal_note_ids, @@ -1673,97 +1667,76 @@ CREATE VIEW "meeting" AS SELECT *, (select array_agg(n.user_id ORDER BY n.user_id) from nm_meeting_present_user_ids_user_t n where n.meeting_id = m.id) as present_user_ids, ( SELECT array_agg(DISTINCT mu.user_id ORDER BY mu.user_id) - FROM meeting_user_t mu - INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id - WHERE mu.meeting_id = m.id -) AS user_ids -, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_meeting_id = m.id) as projection_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_agenda_item_list_in_meeting_id = m.id) as default_projector_agenda_item_list_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_topic_in_meeting_id = m.id) as default_projector_topic_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_list_of_speakers_in_meeting_id = m.id) as default_projector_list_of_speakers_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_current_los_in_meeting_id = m.id) as default_projector_current_los_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_in_meeting_id = m.id) as default_projector_motion_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_amendment_in_meeting_id = m.id) as default_projector_amendment_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_block_in_meeting_id = m.id) as default_projector_motion_block_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_assignment_in_meeting_id = m.id) as default_projector_assignment_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_mediafile_in_meeting_id = m.id) as default_projector_mediafile_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_message_in_meeting_id = m.id) as default_projector_message_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_countdown_in_meeting_id = m.id) as default_projector_countdown_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_assignment_poll_in_meeting_id = m.id) as default_projector_assignment_poll_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_poll_in_meeting_id = m.id) as default_projector_motion_poll_ids, -(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_poll_in_meeting_id = m.id) as default_projector_poll_ids, -(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.meeting_id = m.id) as relevant_history_entry_ids -FROM meeting_t m; - -comment on column "meeting_t".is_active_in_organization_id is 'Backrelation and boolean flag at once'; -comment on column "meeting_t".is_archived_in_organization_id is 'Backrelation and boolean flag at once'; -comment on column "meeting".user_ids is 'Calculated. All user ids from all users assigned to groups of this meeting.'; - -CREATE VIEW "structure_level" AS SELECT *, -(select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_structure_level_ids_structure_level_t n where n.structure_level_id = s.id) as meeting_user_ids, -(select array_agg(sl.id ORDER BY sl.id) from structure_level_list_of_speakers_t sl where sl.structure_level_id = s.id) as structure_level_list_of_speakers_ids -FROM structure_level_t s; - - -CREATE VIEW "group" AS SELECT *, -(select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_group_meeting_user_ids_meeting_user_t n where n.group_id = g.id) as meeting_user_ids, -(select m.id from meeting_t m where m.default_group_id = g.id) as default_group_for_meeting_id, -(select m.id from meeting_t m where m.admin_group_id = g.id) as admin_group_for_meeting_id, -(select m.id from meeting_t m where m.anonymous_group_id = g.id) as anonymous_group_for_meeting_id, -(select array_agg(n.meeting_mediafile_id ORDER BY n.meeting_mediafile_id) from nm_group_mmagi_meeting_mediafile_t n where n.group_id = g.id) as meeting_mediafile_access_group_ids, -(select array_agg(n.meeting_mediafile_id ORDER BY n.meeting_mediafile_id) from nm_group_mmiagi_meeting_mediafile_t n where n.group_id = g.id) as meeting_mediafile_inherited_access_group_ids, -(select array_agg(n.motion_comment_section_id ORDER BY n.motion_comment_section_id) from nm_group_read_comment_section_ids_motion_comment_section_t n where n.group_id = g.id) as read_comment_section_ids, -(select array_agg(n.motion_comment_section_id ORDER BY n.motion_comment_section_id) from nm_group_write_comment_section_ids_motion_comment_section_t n where n.group_id = g.id) as write_comment_section_ids, -(select array_agg(n.chat_group_id ORDER BY n.chat_group_id) from nm_chat_group_read_group_ids_group_t n where n.group_id = g.id) as read_chat_group_ids, -(select array_agg(n.chat_group_id ORDER BY n.chat_group_id) from nm_chat_group_write_group_ids_group_t n where n.group_id = g.id) as write_chat_group_ids, -(select array_agg(n.poll_id ORDER BY n.poll_id) from nm_group_poll_ids_poll_t n where n.group_id = g.id) as poll_ids -FROM group_t g; - -comment on column "group".meeting_mediafile_inherited_access_group_ids is 'Calculated field.'; - -CREATE VIEW "personal_note" AS SELECT * FROM personal_note_t p; - - -CREATE VIEW "tag" AS SELECT *, -(select array_agg(g.tagged_id ORDER BY g.tagged_id) from gm_tag_tagged_ids_t g where g.tag_id = t.id) as tagged_ids -FROM tag_t t; - - -CREATE VIEW "agenda_item" AS SELECT *, -(select array_agg(ai.id ORDER BY ai.id) from agenda_item_t ai where ai.parent_id = a.id) as child_ids, -(select array_agg(g.tag_id ORDER BY g.tag_id) from gm_tag_tagged_ids_t g where g.tagged_id_agenda_item_id = a.id) as tag_ids, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_agenda_item_id = a.id) as projection_ids -FROM agenda_item_t a; - - -CREATE VIEW "list_of_speakers" AS SELECT *, -(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.list_of_speakers_id = l.id) as speaker_ids, -(select array_agg(s.id ORDER BY s.id) from structure_level_list_of_speakers_t s where s.list_of_speakers_id = l.id) as structure_level_list_of_speakers_ids, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_list_of_speakers_id = l.id) as projection_ids -FROM list_of_speakers_t l; - - -CREATE VIEW "structure_level_list_of_speakers" AS SELECT *, -(select array_agg(st.id ORDER BY st.id) from speaker_t st where st.structure_level_list_of_speakers_id = s.id) as speaker_ids -FROM structure_level_list_of_speakers_t s; - - -CREATE VIEW "point_of_order_category" AS SELECT *, -(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.point_of_order_category_id = p.id) as speaker_ids -FROM point_of_order_category_t p; + FROM meeting_user_t mu + INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id + WHERE mu.meeting_id = m.id +) AS user_ids +, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_meeting_id = m.id) as projection_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_agenda_item_list_in_meeting_id = m.id) as default_projector_agenda_item_list_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_topic_in_meeting_id = m.id) as default_projector_topic_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_list_of_speakers_in_meeting_id = m.id) as default_projector_list_of_speakers_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_current_los_in_meeting_id = m.id) as default_projector_current_los_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_in_meeting_id = m.id) as default_projector_motion_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_amendment_in_meeting_id = m.id) as default_projector_amendment_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_block_in_meeting_id = m.id) as default_projector_motion_block_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_assignment_in_meeting_id = m.id) as default_projector_assignment_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_mediafile_in_meeting_id = m.id) as default_projector_mediafile_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_message_in_meeting_id = m.id) as default_projector_message_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_countdown_in_meeting_id = m.id) as default_projector_countdown_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_assignment_poll_in_meeting_id = m.id) as default_projector_assignment_poll_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_motion_poll_in_meeting_id = m.id) as default_projector_motion_poll_ids, +(select array_agg(p.id ORDER BY p.id) from projector_t p where p.used_as_default_projector_for_poll_in_meeting_id = m.id) as default_projector_poll_ids, +(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.meeting_id = m.id) as relevant_history_entry_ids +FROM meeting_t m; +comment on column "meeting_t".is_active_in_organization_id is 'Backrelation and boolean flag at once'; +comment on column "meeting_t".is_archived_in_organization_id is 'Backrelation and boolean flag at once'; +comment on column "meeting".user_ids is 'Calculated. All user ids from all users assigned to groups of this meeting.'; -CREATE VIEW "speaker" AS SELECT * FROM speaker_t s; +CREATE VIEW "meeting_mediafile" AS SELECT *, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_mmiagi_meeting_mediafile_t n where n.meeting_mediafile_id = m.id) as inherited_access_group_ids, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_mmagi_meeting_mediafile_t n where n.meeting_mediafile_id = m.id) as access_group_ids, +(select l.id from list_of_speakers_t l where l.content_object_id_meeting_mediafile_id = m.id) as list_of_speakers_id, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_meeting_mediafile_id = m.id) as projection_ids, +(select array_agg(g.attachment_id ORDER BY g.attachment_id) from gm_meeting_mediafile_attachment_ids_t g where g.meeting_mediafile_id = m.id) as attachment_ids, +(select m1.id from meeting_t m1 where m1.logo_projector_main_id = m.id) as used_as_logo_projector_main_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_projector_header_id = m.id) as used_as_logo_projector_header_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_web_header_id = m.id) as used_as_logo_web_header_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_pdf_header_l_id = m.id) as used_as_logo_pdf_header_l_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_pdf_header_r_id = m.id) as used_as_logo_pdf_header_r_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_pdf_footer_l_id = m.id) as used_as_logo_pdf_footer_l_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_pdf_footer_r_id = m.id) as used_as_logo_pdf_footer_r_in_meeting_id, +(select m1.id from meeting_t m1 where m1.logo_pdf_ballot_paper_id = m.id) as used_as_logo_pdf_ballot_paper_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_regular_id = m.id) as used_as_font_regular_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_italic_id = m.id) as used_as_font_italic_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_bold_id = m.id) as used_as_font_bold_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_bold_italic_id = m.id) as used_as_font_bold_italic_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_monospace_id = m.id) as used_as_font_monospace_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_chyron_speaker_name_id = m.id) as used_as_font_chyron_speaker_name_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_projector_h1_id = m.id) as used_as_font_projector_h1_in_meeting_id, +(select m1.id from meeting_t m1 where m1.font_projector_h2_id = m.id) as used_as_font_projector_h2_in_meeting_id +FROM meeting_mediafile_t m; +comment on column "meeting_mediafile".inherited_access_group_ids is 'Calculated in actions. Shows what access group permissions are actually relevant. Calculated as the intersection of this meeting_mediafiles access_group_ids and the related mediafiles potential parent mediafiles inherited_access_group_ids. If the parent has no meeting_mediafile for this meeting, its inherited access group is assumed to be the meetings admin group. If there is no parent, the inherited_access_group_ids is equal to the access_group_ids. If the access_group_ids are empty, the interpretations is that every group has access rights, therefore the parent inherited_access_group_ids are used as-is.'; -CREATE VIEW "topic" AS SELECT *, -(select array_agg(g.meeting_mediafile_id ORDER BY g.meeting_mediafile_id) from gm_meeting_mediafile_attachment_ids_t g where g.attachment_id_topic_id = t.id) as attachment_meeting_mediafile_ids, -(select a.id from agenda_item_t a where a.content_object_id_topic_id = t.id) as agenda_item_id, -(select l.id from list_of_speakers_t l where l.content_object_id_topic_id = t.id) as list_of_speakers_id, -(select array_agg(p.id ORDER BY p.id) from poll_t p where p.content_object_id_topic_id = t.id) as poll_ids, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_topic_id = t.id) as projection_ids -FROM topic_t t; +CREATE VIEW "meeting_user" AS SELECT *, +(select array_agg(p.id ORDER BY p.id) from personal_note_t p where p.meeting_user_id = m.id) as personal_note_ids, +(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.meeting_user_id = m.id) as speaker_ids, +(select array_agg(ms.id ORDER BY ms.id) from motion_supporter_t ms where ms.meeting_user_id = m.id) as motion_supporter_ids, +(select array_agg(me.id ORDER BY me.id) from motion_editor_t me where me.meeting_user_id = m.id) as motion_editor_ids, +(select array_agg(mw.id ORDER BY mw.id) from motion_working_group_speaker_t mw where mw.meeting_user_id = m.id) as motion_working_group_speaker_ids, +(select array_agg(ms.id ORDER BY ms.id) from motion_submitter_t ms where ms.meeting_user_id = m.id) as motion_submitter_ids, +(select array_agg(a.id ORDER BY a.id) from assignment_candidate_t a where a.meeting_user_id = m.id) as assignment_candidate_ids, +(select array_agg(mu.id ORDER BY mu.id) from meeting_user_t mu where mu.vote_delegated_to_id = m.id) as vote_delegations_from_ids, +(select array_agg(n.poll_id ORDER BY n.poll_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.meeting_user_id = m.id) as poll_voted_ids, +(select array_agg(p.id ORDER BY p.id) from poll_config_option_t p where p.meeting_user_id = m.id) as poll_option_ids, +(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.acting_meeting_user_id = m.id) as acting_ballot_ids, +(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.represented_meeting_user_id = m.id) as represented_ballot_ids, +(select array_agg(c.id ORDER BY c.id) from chat_message_t c where c.meeting_user_id = m.id) as chat_message_ids, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_meeting_user_ids_meeting_user_t n where n.meeting_user_id = m.id) as group_ids, +(select array_agg(n.structure_level_id ORDER BY n.structure_level_id) from nm_meeting_user_structure_level_ids_structure_level_t n where n.meeting_user_id = m.id) as structure_level_ids +FROM meeting_user_t m; CREATE VIEW "motion" AS SELECT *, @@ -1782,7 +1755,6 @@ CREATE VIEW "motion" AS SELECT *, (select array_agg(me.id ORDER BY me.id) from motion_editor_t me where me.motion_id = m.id) as editor_ids, (select array_agg(mw.id ORDER BY mw.id) from motion_working_group_speaker_t mw where mw.motion_id = m.id) as working_group_speaker_ids, (select array_agg(p.id ORDER BY p.id) from poll_t p where p.content_object_id_motion_id = m.id) as poll_ids, -(select array_agg(o.id ORDER BY o.id) from option_t o where o.content_object_id_motion_id = m.id) as option_ids, (select array_agg(mc.id ORDER BY mc.id) from motion_change_recommendation_t mc where mc.motion_id = m.id) as change_recommendation_ids, (select array_agg(mc.id ORDER BY mc.id) from motion_comment_t mc where mc.motion_id = m.id) as comment_ids, (select a.id from agenda_item_t a where a.content_object_id_motion_id = m.id) as agenda_item_id, @@ -1795,16 +1767,21 @@ CREATE VIEW "motion" AS SELECT *, FROM motion_t m; -CREATE VIEW "motion_submitter" AS SELECT * FROM motion_submitter_t m; - - -CREATE VIEW "motion_supporter" AS SELECT * FROM motion_supporter_t m; +CREATE VIEW "motion_block" AS SELECT *, +(select array_agg(mt.id ORDER BY mt.id) from motion_t mt where mt.block_id = m.id) as motion_ids, +(select a.id from agenda_item_t a where a.content_object_id_motion_block_id = m.id) as agenda_item_id, +(select l.id from list_of_speakers_t l where l.content_object_id_motion_block_id = m.id) as list_of_speakers_id, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_motion_block_id = m.id) as projection_ids +FROM motion_block_t m; -CREATE VIEW "motion_editor" AS SELECT * FROM motion_editor_t m; +CREATE VIEW "motion_category" AS SELECT *, +(select array_agg(mc.id ORDER BY mc.id) from motion_category_t mc where mc.parent_id = m.id) as child_ids, +(select array_agg(mt.id ORDER BY mt.id) from motion_t mt where mt.category_id = m.id) as motion_ids +FROM motion_category_t m; -CREATE VIEW "motion_working_group_speaker" AS SELECT * FROM motion_working_group_speaker_t m; +CREATE VIEW "motion_change_recommendation" AS SELECT * FROM motion_change_recommendation_t m; CREATE VIEW "motion_comment" AS SELECT * FROM motion_comment_t m; @@ -1817,21 +1794,7 @@ CREATE VIEW "motion_comment_section" AS SELECT *, FROM motion_comment_section_t m; -CREATE VIEW "motion_category" AS SELECT *, -(select array_agg(mc.id ORDER BY mc.id) from motion_category_t mc where mc.parent_id = m.id) as child_ids, -(select array_agg(mt.id ORDER BY mt.id) from motion_t mt where mt.category_id = m.id) as motion_ids -FROM motion_category_t m; - - -CREATE VIEW "motion_block" AS SELECT *, -(select array_agg(mt.id ORDER BY mt.id) from motion_t mt where mt.block_id = m.id) as motion_ids, -(select a.id from agenda_item_t a where a.content_object_id_motion_block_id = m.id) as agenda_item_id, -(select l.id from list_of_speakers_t l where l.content_object_id_motion_block_id = m.id) as list_of_speakers_id, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_motion_block_id = m.id) as projection_ids -FROM motion_block_t m; - - -CREATE VIEW "motion_change_recommendation" AS SELECT * FROM motion_change_recommendation_t m; +CREATE VIEW "motion_editor" AS SELECT * FROM motion_editor_t m; CREATE VIEW "motion_state" AS SELECT *, @@ -1844,6 +1807,12 @@ CREATE VIEW "motion_state" AS SELECT *, FROM motion_state_t m; +CREATE VIEW "motion_submitter" AS SELECT * FROM motion_submitter_t m; + + +CREATE VIEW "motion_supporter" AS SELECT * FROM motion_supporter_t m; + + CREATE VIEW "motion_workflow" AS SELECT *, (select array_agg(ms.id ORDER BY ms.id) from motion_state_t ms where ms.workflow_id = m.id) as state_ids, (select m1.id from meeting_t m1 where m1.motions_default_workflow_id = m.id) as default_workflow_meeting_id, @@ -1851,77 +1820,69 @@ CREATE VIEW "motion_workflow" AS SELECT *, FROM motion_workflow_t m; -CREATE VIEW "poll" AS SELECT *, -(select array_agg(o.id ORDER BY o.id) from option_t o where o.poll_id = p.id) as option_ids, -(select array_agg(n.user_id ORDER BY n.user_id) from nm_poll_voted_ids_user_t n where n.poll_id = p.id) as voted_ids, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_poll_ids_poll_t n where n.poll_id = p.id) as entitled_group_ids, -(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_poll_id = p.id) as projection_ids -FROM poll_t p; +CREATE VIEW "motion_working_group_speaker" AS SELECT * FROM motion_working_group_speaker_t m; + + +CREATE VIEW "organization" AS SELECT *, +(select array_agg(g.id ORDER BY g.id) from gender_t g where g.organization_id = o.id) as gender_ids, +(select array_agg(c.id ORDER BY c.id) from committee_t c where c.organization_id = o.id) as committee_ids, +(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.is_active_in_organization_id = o.id) as active_meeting_ids, +(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.is_archived_in_organization_id = o.id) as archived_meeting_ids, +(select array_agg(m.id ORDER BY m.id) from meeting_t m where m.template_for_organization_id = o.id) as template_meeting_ids, +(select array_agg(ot.id ORDER BY ot.id) from organization_tag_t ot where ot.organization_id = o.id) as organization_tag_ids, +(select array_agg(t.id ORDER BY t.id) from theme_t t where t.organization_id = o.id) as theme_ids, +(select array_agg(m.id ORDER BY m.id) from mediafile_t m where m.owner_id_organization_id = o.id) as mediafile_ids, +(select array_agg(m.id ORDER BY m.id) from mediafile_t m where m.published_to_meetings_in_organization_id = o.id) as published_mediafile_ids, +(select array_agg(u.id ORDER BY u.id) from user_t u where u.organization_id = o.id) as user_ids +FROM organization_t o; -CREATE VIEW "option" AS SELECT *, -(select array_agg(v.id ORDER BY v.id) from vote_t v where v.option_id = o.id) as vote_ids -FROM option_t o; +CREATE VIEW "organization_tag" AS SELECT *, +(select array_agg(g.tagged_id ORDER BY g.tagged_id) from gm_organization_tag_tagged_ids_t g where g.organization_tag_id = o.id) as tagged_ids +FROM organization_tag_t o; -CREATE VIEW "vote" AS SELECT * FROM vote_t v; +CREATE VIEW "personal_note" AS SELECT * FROM personal_note_t p; -CREATE VIEW "assignment" AS SELECT *, -(select array_agg(ac.id ORDER BY ac.id) from assignment_candidate_t ac where ac.assignment_id = a.id) as candidate_ids, -(select array_agg(p.id ORDER BY p.id) from poll_t p where p.content_object_id_assignment_id = a.id) as poll_ids, -(select ai.id from agenda_item_t ai where ai.content_object_id_assignment_id = a.id) as agenda_item_id, -(select l.id from list_of_speakers_t l where l.content_object_id_assignment_id = a.id) as list_of_speakers_id, -(select array_agg(g.tag_id ORDER BY g.tag_id) from gm_tag_tagged_ids_t g where g.tagged_id_assignment_id = a.id) as tag_ids, -(select array_agg(g.meeting_mediafile_id ORDER BY g.meeting_mediafile_id) from gm_meeting_mediafile_attachment_ids_t g where g.attachment_id_assignment_id = a.id) as attachment_meeting_mediafile_ids, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_assignment_id = a.id) as projection_ids, -(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.model_id_assignment_id = a.id) as history_entry_ids -FROM assignment_t a; +CREATE VIEW "point_of_order_category" AS SELECT *, +(select array_agg(s.id ORDER BY s.id) from speaker_t s where s.point_of_order_category_id = p.id) as speaker_ids +FROM point_of_order_category_t p; -CREATE VIEW "assignment_candidate" AS SELECT * FROM assignment_candidate_t a; +CREATE VIEW "poll" AS SELECT *, +(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.poll_id = p.id) as ballot_ids, +(select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.poll_id = p.id) as voted_ids, +(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_poll_ids_poll_t n where n.poll_id = p.id) as entitled_group_ids, +(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_poll_id = p.id) as projection_ids +FROM poll_t p; -CREATE VIEW "poll_candidate_list" AS SELECT *, -(select array_agg(pc.id ORDER BY pc.id) from poll_candidate_t pc where pc.poll_candidate_list_id = p.id) as poll_candidate_ids, -(select o.id from option_t o where o.content_object_id_poll_candidate_list_id = p.id) as option_id -FROM poll_candidate_list_t p; +CREATE VIEW "poll_config_approval" AS SELECT *, +(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_approval_id = p.id) as option_ids +FROM poll_config_approval_t p; -CREATE VIEW "poll_candidate" AS SELECT * FROM poll_candidate_t p; +CREATE VIEW "poll_config_option" AS SELECT * FROM poll_config_option_t p; -CREATE VIEW "mediafile" AS SELECT *, -(select array_agg(mt.id ORDER BY mt.id) from mediafile_t mt where mt.parent_id = m.id) as child_ids, -(select array_agg(mm.id ORDER BY mm.id) from meeting_mediafile_t mm where mm.mediafile_id = m.id) as meeting_mediafile_ids -FROM mediafile_t m; +CREATE VIEW "poll_config_rating_approval" AS SELECT *, +(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_approval_id = p.id) as option_ids +FROM poll_config_rating_approval_t p; -CREATE VIEW "meeting_mediafile" AS SELECT *, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_mmiagi_meeting_mediafile_t n where n.meeting_mediafile_id = m.id) as inherited_access_group_ids, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_group_mmagi_meeting_mediafile_t n where n.meeting_mediafile_id = m.id) as access_group_ids, -(select l.id from list_of_speakers_t l where l.content_object_id_meeting_mediafile_id = m.id) as list_of_speakers_id, -(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_meeting_mediafile_id = m.id) as projection_ids, -(select array_agg(g.attachment_id ORDER BY g.attachment_id) from gm_meeting_mediafile_attachment_ids_t g where g.meeting_mediafile_id = m.id) as attachment_ids, -(select m1.id from meeting_t m1 where m1.logo_projector_main_id = m.id) as used_as_logo_projector_main_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_projector_header_id = m.id) as used_as_logo_projector_header_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_web_header_id = m.id) as used_as_logo_web_header_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_pdf_header_l_id = m.id) as used_as_logo_pdf_header_l_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_pdf_header_r_id = m.id) as used_as_logo_pdf_header_r_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_pdf_footer_l_id = m.id) as used_as_logo_pdf_footer_l_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_pdf_footer_r_id = m.id) as used_as_logo_pdf_footer_r_in_meeting_id, -(select m1.id from meeting_t m1 where m1.logo_pdf_ballot_paper_id = m.id) as used_as_logo_pdf_ballot_paper_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_regular_id = m.id) as used_as_font_regular_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_italic_id = m.id) as used_as_font_italic_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_bold_id = m.id) as used_as_font_bold_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_bold_italic_id = m.id) as used_as_font_bold_italic_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_monospace_id = m.id) as used_as_font_monospace_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_chyron_speaker_name_id = m.id) as used_as_font_chyron_speaker_name_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_projector_h1_id = m.id) as used_as_font_projector_h1_in_meeting_id, -(select m1.id from meeting_t m1 where m1.font_projector_h2_id = m.id) as used_as_font_projector_h2_in_meeting_id -FROM meeting_mediafile_t m; +CREATE VIEW "poll_config_rating_score" AS SELECT *, +(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_score_id = p.id) as option_ids +FROM poll_config_rating_score_t p; + + +CREATE VIEW "poll_config_selection" AS SELECT *, +(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_selection_id = p.id) as option_ids +FROM poll_config_selection_t p; + + +CREATE VIEW "projection" AS SELECT * FROM projection_t p; -comment on column "meeting_mediafile".inherited_access_group_ids is 'Calculated in actions. Shows what access group permissions are actually relevant. Calculated as the intersection of this meeting_mediafiles access_group_ids and the related mediafiles potential parent mediafiles inherited_access_group_ids. If the parent has no meeting_mediafile for this meeting, its inherited access group is assumed to be the meetings admin group. If there is no parent, the inherited_access_group_ids is equal to the access_group_ids. If the access_group_ids are empty, the interpretations is that every group has access rights, therefore the parent inherited_access_group_ids are used as-is.'; CREATE VIEW "projector" AS SELECT *, (select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.current_projector_id = p.id) as current_projection_ids, @@ -1931,7 +1892,11 @@ CREATE VIEW "projector" AS SELECT *, FROM projector_t p; -CREATE VIEW "projection" AS SELECT * FROM projection_t p; +CREATE VIEW "projector_countdown" AS SELECT *, +(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_projector_countdown_id = p.id) as projection_ids, +(select m.id from meeting_t m where m.list_of_speakers_countdown_id = p.id) as used_as_list_of_speakers_countdown_meeting_id, +(select m.id from meeting_t m where m.poll_countdown_id = p.id) as used_as_poll_countdown_meeting_id +FROM projector_countdown_t p; CREATE VIEW "projector_message" AS SELECT *, @@ -1939,50 +1904,135 @@ CREATE VIEW "projector_message" AS SELECT *, FROM projector_message_t p; -CREATE VIEW "projector_countdown" AS SELECT *, -(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_projector_countdown_id = p.id) as projection_ids, -(select m.id from meeting_t m where m.list_of_speakers_countdown_id = p.id) as used_as_list_of_speakers_countdown_meeting_id, -(select m.id from meeting_t m where m.poll_countdown_id = p.id) as used_as_poll_countdown_meeting_id -FROM projector_countdown_t p; +CREATE VIEW "speaker" AS SELECT * FROM speaker_t s; -CREATE VIEW "chat_group" AS SELECT *, -(select array_agg(cm.id ORDER BY cm.id) from chat_message_t cm where cm.chat_group_id = c.id) as chat_message_ids, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_chat_group_read_group_ids_group_t n where n.chat_group_id = c.id) as read_group_ids, -(select array_agg(n.group_id ORDER BY n.group_id) from nm_chat_group_write_group_ids_group_t n where n.chat_group_id = c.id) as write_group_ids -FROM chat_group_t c; +CREATE VIEW "structure_level" AS SELECT *, +(select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_structure_level_ids_structure_level_t n where n.structure_level_id = s.id) as meeting_user_ids, +(select array_agg(sl.id ORDER BY sl.id) from structure_level_list_of_speakers_t sl where sl.structure_level_id = s.id) as structure_level_list_of_speakers_ids +FROM structure_level_t s; + + +CREATE VIEW "structure_level_list_of_speakers" AS SELECT *, +(select array_agg(st.id ORDER BY st.id) from speaker_t st where st.structure_level_list_of_speakers_id = s.id) as speaker_ids +FROM structure_level_list_of_speakers_t s; + + +CREATE VIEW "tag" AS SELECT *, +(select array_agg(g.tagged_id ORDER BY g.tagged_id) from gm_tag_tagged_ids_t g where g.tag_id = t.id) as tagged_ids +FROM tag_t t; + + +CREATE VIEW "theme" AS SELECT *, +(select o.id from organization_t o where o.theme_id = t.id) as theme_for_organization_id +FROM theme_t t; + + +CREATE VIEW "topic" AS SELECT *, +(select array_agg(g.meeting_mediafile_id ORDER BY g.meeting_mediafile_id) from gm_meeting_mediafile_attachment_ids_t g where g.attachment_id_topic_id = t.id) as attachment_meeting_mediafile_ids, +(select a.id from agenda_item_t a where a.content_object_id_topic_id = t.id) as agenda_item_id, +(select l.id from list_of_speakers_t l where l.content_object_id_topic_id = t.id) as list_of_speakers_id, +(select array_agg(p.id ORDER BY p.id) from poll_t p where p.content_object_id_topic_id = t.id) as poll_ids, +(select array_agg(p.id ORDER BY p.id) from projection_t p where p.content_object_id_topic_id = t.id) as projection_ids +FROM topic_t t; + + +CREATE VIEW "user" AS SELECT *, +(select array_agg(n.meeting_id ORDER BY n.meeting_id) from nm_meeting_present_user_ids_user_t n where n.user_id = u.id) as is_present_in_meeting_ids, +( + SELECT array_agg(DISTINCT committee_id ORDER BY committee_id) + FROM ( + -- Select committee_ids from meetings the user is part of + SELECT m.committee_id + FROM meeting_user_t AS mu + INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id + INNER JOIN meeting_t AS m ON m.id = mu.meeting_id + WHERE mu.user_id = u.id + + UNION + + -- Select committee_ids from committee managers + SELECT cmu.committee_id + FROM nm_committee_manager_ids_user_t cmu + WHERE cmu.user_id = u.id + UNION + + -- Select home_committee_id from user + SELECT u.home_committee_id + WHERE u.home_committee_id IS NOT NULL + ) _ +) AS committee_ids +, +(select array_agg(n.committee_id ORDER BY n.committee_id) from nm_committee_manager_ids_user_t n where n.user_id = u.id) as committee_management_ids, +(select array_agg(m.id ORDER BY m.id) from meeting_user_t m where m.user_id = u.id) as meeting_user_ids, +(select array_agg(h.id ORDER BY h.id) from history_position_t h where h.user_id = u.id) as history_position_ids, +(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.model_id_user_id = u.id) as history_entry_ids, +( + SELECT array_agg(DISTINCT mu.meeting_id ORDER BY mu.meeting_id) + FROM meeting_user_t mu + INNER JOIN nm_group_meeting_user_ids_meeting_user_t AS gmu ON mu.id = gmu.meeting_user_id + WHERE mu.user_id = u.id +) AS meeting_ids -CREATE VIEW "chat_message" AS SELECT * FROM chat_message_t c; +FROM user_t u; +comment on column "user".committee_ids is 'Calculated field: Returns committee_ids, where the user is manager or member in a meeting'; +comment on column "user".meeting_ids is 'Calculated. All ids from meetings calculated via meeting_user and group_ids as integers.'; -CREATE VIEW "action_worker" AS SELECT * FROM action_worker_t a; +-- Alter table relations +ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +ALTER TABLE agenda_item_t ADD FOREIGN KEY(parent_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; +ALTER TABLE agenda_item_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE VIEW "import_preview" AS SELECT * FROM import_preview_t i; +ALTER TABLE assignment_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE VIEW "history_position" AS SELECT *, -(select array_agg(he.id ORDER BY he.id) from history_entry_t he where he.position_id = h.id) as entry_ids -FROM history_position_t h; +ALTER TABLE ballot_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +ALTER TABLE ballot_t ADD FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE ballot_t ADD FOREIGN KEY(represented_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE chat_group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE VIEW "history_entry" AS SELECT * FROM history_entry_t h; +ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE chat_message_t ADD FOREIGN KEY(chat_group_id) REFERENCES chat_group_t(id) INITIALLY DEFERRED; +ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE committee_t ADD FOREIGN KEY(default_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE committee_t ADD FOREIGN KEY(parent_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +ALTER TABLE group_t ADD FOREIGN KEY(used_as_motion_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE group_t ADD FOREIGN KEY(used_as_assignment_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE group_t ADD FOREIGN KEY(used_as_topic_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE group_t ADD FOREIGN KEY(used_as_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; --- Alter table relations -ALTER TABLE organization_t ADD FOREIGN KEY(theme_id) REFERENCES theme_t(id) INITIALLY DEFERRED; +ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +ALTER TABLE history_entry_t ADD FOREIGN KEY(position_id) REFERENCES history_position_t(id) INITIALLY DEFERRED; +ALTER TABLE history_entry_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE user_t ADD FOREIGN KEY(gender_id) REFERENCES gender_t(id) INITIALLY DEFERRED; -ALTER TABLE user_t ADD FOREIGN KEY(home_committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +ALTER TABLE history_position_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE meeting_user_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE meeting_user_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE meeting_user_t ADD FOREIGN KEY(vote_delegated_to_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE committee_t ADD FOREIGN KEY(default_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE committee_t ADD FOREIGN KEY(parent_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +ALTER TABLE mediafile_t ADD FOREIGN KEY(published_to_meetings_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +ALTER TABLE mediafile_t ADD FOREIGN KEY(parent_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; +ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; ALTER TABLE meeting_t ADD FOREIGN KEY(is_active_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; ALTER TABLE meeting_t ADD FOREIGN KEY(is_archived_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; @@ -2013,47 +2063,12 @@ ALTER TABLE meeting_t ADD FOREIGN KEY(default_group_id) REFERENCES group_t(id) I ALTER TABLE meeting_t ADD FOREIGN KEY(admin_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; ALTER TABLE meeting_t ADD FOREIGN KEY(anonymous_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; -ALTER TABLE structure_level_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE group_t ADD FOREIGN KEY(used_as_motion_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE group_t ADD FOREIGN KEY(used_as_assignment_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE group_t ADD FOREIGN KEY(used_as_topic_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE group_t ADD FOREIGN KEY(used_as_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE personal_note_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE tag_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -ALTER TABLE agenda_item_t ADD FOREIGN KEY(parent_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; -ALTER TABLE agenda_item_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(structure_level_id) REFERENCES structure_level_t(id) INITIALLY DEFERRED; -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE point_of_order_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE speaker_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -ALTER TABLE speaker_t ADD FOREIGN KEY(structure_level_list_of_speakers_id) REFERENCES structure_level_list_of_speakers_t(id) INITIALLY DEFERRED; -ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE speaker_t ADD FOREIGN KEY(point_of_order_category_id) REFERENCES point_of_order_category_t(id) INITIALLY DEFERRED; -ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(mediafile_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; +ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE topic_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE meeting_user_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +ALTER TABLE meeting_user_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE meeting_user_t ADD FOREIGN KEY(vote_delegated_to_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; ALTER TABLE motion_t ADD FOREIGN KEY(lead_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; ALTER TABLE motion_t ADD FOREIGN KEY(sort_parent_id) REFERENCES motion_t(id) INITIALLY DEFERRED; @@ -2065,21 +2080,13 @@ ALTER TABLE motion_t ADD FOREIGN KEY(category_id) REFERENCES motion_category_t(i ALTER TABLE motion_t ADD FOREIGN KEY(block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; ALTER TABLE motion_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_block_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_editor_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_category_t ADD FOREIGN KEY(parent_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE motion_comment_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; ALTER TABLE motion_comment_t ADD FOREIGN KEY(section_id) REFERENCES motion_comment_section_t(id) INITIALLY DEFERRED; @@ -2087,58 +2094,75 @@ ALTER TABLE motion_comment_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id ALTER TABLE motion_comment_section_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_category_t ADD FOREIGN KEY(parent_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE motion_block_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_editor_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE motion_state_t ADD FOREIGN KEY(submitter_withdraw_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; ALTER TABLE motion_state_t ADD FOREIGN KEY(workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; ALTER TABLE motion_state_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_submitter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + +ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_supporter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + ALTER TABLE motion_workflow_t ADD FOREIGN KEY(first_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; ALTER TABLE motion_workflow_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + +ALTER TABLE organization_t ADD FOREIGN KEY(theme_id) REFERENCES theme_t(id) INITIALLY DEFERRED; + +ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE personal_note_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + +ALTER TABLE point_of_order_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + +ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -ALTER TABLE poll_t ADD FOREIGN KEY(global_option_id) REFERENCES option_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(used_as_global_option_in_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(content_object_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(content_object_id_poll_candidate_list_id) REFERENCES poll_candidate_list_t(id) INITIALLY DEFERRED; -ALTER TABLE option_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_approval_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE vote_t ADD FOREIGN KEY(option_id) REFERENCES option_t(id) INITIALLY DEFERRED; -ALTER TABLE vote_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE vote_t ADD FOREIGN KEY(delegated_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE vote_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE assignment_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; - -ALTER TABLE poll_candidate_list_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_rating_approval_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE poll_candidate_t ADD FOREIGN KEY(poll_candidate_list_id) REFERENCES poll_candidate_list_t(id) INITIALLY DEFERRED; -ALTER TABLE poll_candidate_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE poll_candidate_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_rating_score_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE mediafile_t ADD FOREIGN KEY(published_to_meetings_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -ALTER TABLE mediafile_t ADD FOREIGN KEY(parent_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; -ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_selection_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(mediafile_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; -ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(history_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_agenda_item_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_message_id) REFERENCES projector_message_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; +ALTER TABLE projection_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_agenda_item_list_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_topic_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; @@ -2156,62 +2180,51 @@ ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_motion_pol ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE projector_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(history_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_agenda_item_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_message_id) REFERENCES projector_message_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; -ALTER TABLE projection_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE projector_countdown_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; ALTER TABLE projector_message_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE projector_countdown_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE speaker_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +ALTER TABLE speaker_t ADD FOREIGN KEY(structure_level_list_of_speakers_id) REFERENCES structure_level_list_of_speakers_t(id) INITIALLY DEFERRED; +ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +ALTER TABLE speaker_t ADD FOREIGN KEY(point_of_order_category_id) REFERENCES point_of_order_category_t(id) INITIALLY DEFERRED; +ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE chat_group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE structure_level_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -ALTER TABLE chat_message_t ADD FOREIGN KEY(chat_group_id) REFERENCES chat_group_t(id) INITIALLY DEFERRED; -ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(structure_level_id) REFERENCES structure_level_t(id) INITIALLY DEFERRED; +ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE history_position_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +ALTER TABLE tag_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -ALTER TABLE history_entry_t ADD FOREIGN KEY(position_id) REFERENCES history_position_t(id) INITIALLY DEFERRED; -ALTER TABLE history_entry_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +ALTER TABLE topic_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; + +ALTER TABLE user_t ADD FOREIGN KEY(gender_id) REFERENCES gender_t(id) INITIALLY DEFERRED; +ALTER TABLE user_t ADD FOREIGN KEY(home_committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; -- Create triggers generating partitioned sequences +-- definition trigger generate partitioned sequence number for assignment_t.sequential_number partitioned by meeting_id +CREATE TRIGGER tr_generate_sequence_assignment_sequential_number BEFORE INSERT ON assignment_t +FOR EACH ROW EXECUTE FUNCTION generate_sequence('assignment_t', 'sequential_number', 'meeting_id'); + + -- definition trigger generate partitioned sequence number for list_of_speakers_t.sequential_number partitioned by meeting_id CREATE TRIGGER tr_generate_sequence_list_of_speakers_sequential_number BEFORE INSERT ON list_of_speakers_t FOR EACH ROW EXECUTE FUNCTION generate_sequence('list_of_speakers_t', 'sequential_number', 'meeting_id'); --- definition trigger generate partitioned sequence number for topic_t.sequential_number partitioned by meeting_id -CREATE TRIGGER tr_generate_sequence_topic_sequential_number BEFORE INSERT ON topic_t -FOR EACH ROW EXECUTE FUNCTION generate_sequence('topic_t', 'sequential_number', 'meeting_id'); - - -- definition trigger generate partitioned sequence number for motion_t.sequential_number partitioned by meeting_id CREATE TRIGGER tr_generate_sequence_motion_sequential_number BEFORE INSERT ON motion_t FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_t', 'sequential_number', 'meeting_id'); --- definition trigger generate partitioned sequence number for motion_comment_section_t.sequential_number partitioned by meeting_id -CREATE TRIGGER tr_generate_sequence_motion_comment_section_sequential_number BEFORE INSERT ON motion_comment_section_t -FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_comment_section_t', 'sequential_number', 'meeting_id'); +-- definition trigger generate partitioned sequence number for motion_block_t.sequential_number partitioned by meeting_id +CREATE TRIGGER tr_generate_sequence_motion_block_sequential_number BEFORE INSERT ON motion_block_t +FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_block_t', 'sequential_number', 'meeting_id'); -- definition trigger generate partitioned sequence number for motion_category_t.sequential_number partitioned by meeting_id @@ -2219,9 +2232,9 @@ CREATE TRIGGER tr_generate_sequence_motion_category_sequential_number BEFORE INS FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_category_t', 'sequential_number', 'meeting_id'); --- definition trigger generate partitioned sequence number for motion_block_t.sequential_number partitioned by meeting_id -CREATE TRIGGER tr_generate_sequence_motion_block_sequential_number BEFORE INSERT ON motion_block_t -FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_block_t', 'sequential_number', 'meeting_id'); +-- definition trigger generate partitioned sequence number for motion_comment_section_t.sequential_number partitioned by meeting_id +CREATE TRIGGER tr_generate_sequence_motion_comment_section_sequential_number BEFORE INSERT ON motion_comment_section_t +FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_comment_section_t', 'sequential_number', 'meeting_id'); -- definition trigger generate partitioned sequence number for motion_workflow_t.sequential_number partitioned by meeting_id @@ -2231,12 +2244,7 @@ FOR EACH ROW EXECUTE FUNCTION generate_sequence('motion_workflow_t', 'sequential -- definition trigger generate partitioned sequence number for poll_t.sequential_number partitioned by meeting_id CREATE TRIGGER tr_generate_sequence_poll_sequential_number BEFORE INSERT ON poll_t -FOR EACH ROW EXECUTE FUNCTION generate_sequence('poll_t', 'sequential_number', 'meeting_id'); - - --- definition trigger generate partitioned sequence number for assignment_t.sequential_number partitioned by meeting_id -CREATE TRIGGER tr_generate_sequence_assignment_sequential_number BEFORE INSERT ON assignment_t -FOR EACH ROW EXECUTE FUNCTION generate_sequence('assignment_t', 'sequential_number', 'meeting_id'); +FOR EACH ROW EXECUTE FUNCTION generate_sequence('poll_t', 'sequential_number', 'meeting_id'); -- definition trigger generate partitioned sequence number for projector_t.sequential_number partitioned by meeting_id @@ -2244,22 +2252,20 @@ CREATE TRIGGER tr_generate_sequence_projector_sequential_number BEFORE INSERT ON FOR EACH ROW EXECUTE FUNCTION generate_sequence('projector_t', 'sequential_number', 'meeting_id'); +-- definition trigger generate partitioned sequence number for topic_t.sequential_number partitioned by meeting_id +CREATE TRIGGER tr_generate_sequence_topic_sequential_number BEFORE INSERT ON topic_t +FOR EACH ROW EXECUTE FUNCTION generate_sequence('topic_t', 'sequential_number', 'meeting_id'); --- Create triggers checking foreign_id not null for view-relations and no duplicates in 1:1 relationships --- definition trigger not null for topic.agenda_item_id against agenda_item.content_object_id_topic_id -CREATE CONSTRAINT TRIGGER tr_i_topic_agenda_item_id AFTER INSERT ON topic_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'agenda_item_id', ''); -CREATE CONSTRAINT TRIGGER tr_ud_topic_agenda_item_id AFTER UPDATE OF content_object_id_topic_id OR DELETE ON agenda_item_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'agenda_item_id', 'content_object_id_topic_id'); +-- Create triggers checking foreign_id not null for view-relations and no duplicates in 1:1 relationships --- definition trigger not null for topic.list_of_speakers_id against list_of_speakers.content_object_id_topic_id -CREATE CONSTRAINT TRIGGER tr_i_topic_list_of_speakers_id AFTER INSERT ON topic_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'list_of_speakers_id', ''); +-- definition trigger not null for assignment.list_of_speakers_id against list_of_speakers.content_object_id_assignment_id +CREATE CONSTRAINT TRIGGER tr_i_assignment_list_of_speakers_id AFTER INSERT ON assignment_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('assignment', 'list_of_speakers_id', ''); -CREATE CONSTRAINT TRIGGER tr_ud_topic_list_of_speakers_id AFTER UPDATE OF content_object_id_topic_id OR DELETE ON list_of_speakers_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'list_of_speakers_id', 'content_object_id_topic_id'); +CREATE CONSTRAINT TRIGGER tr_ud_assignment_list_of_speakers_id AFTER UPDATE OF content_object_id_assignment_id OR DELETE ON list_of_speakers_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('assignment', 'list_of_speakers_id', 'content_object_id_assignment_id'); -- definition trigger not null for motion.list_of_speakers_id against list_of_speakers.content_object_id_motion_id @@ -2278,20 +2284,19 @@ CREATE CONSTRAINT TRIGGER tr_ud_motion_block_list_of_speakers_id AFTER UPDATE OF FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('motion_block', 'list_of_speakers_id', 'content_object_id_motion_block_id'); --- definition trigger not null for assignment.list_of_speakers_id against list_of_speakers.content_object_id_assignment_id -CREATE CONSTRAINT TRIGGER tr_i_assignment_list_of_speakers_id AFTER INSERT ON assignment_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('assignment', 'list_of_speakers_id', ''); - -CREATE CONSTRAINT TRIGGER tr_ud_assignment_list_of_speakers_id AFTER UPDATE OF content_object_id_assignment_id OR DELETE ON list_of_speakers_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('assignment', 'list_of_speakers_id', 'content_object_id_assignment_id'); +-- definition trigger not null for topic.agenda_item_id against agenda_item.content_object_id_topic_id +CREATE CONSTRAINT TRIGGER tr_i_topic_agenda_item_id AFTER INSERT ON topic_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'agenda_item_id', ''); +CREATE CONSTRAINT TRIGGER tr_ud_topic_agenda_item_id AFTER UPDATE OF content_object_id_topic_id OR DELETE ON agenda_item_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'agenda_item_id', 'content_object_id_topic_id'); --- definition trigger not null for poll_candidate_list.option_id against option.content_object_id_poll_candidate_list_id -CREATE CONSTRAINT TRIGGER tr_i_poll_candidate_list_option_id AFTER INSERT ON poll_candidate_list_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_candidate_list', 'option_id', ''); +-- definition trigger not null for topic.list_of_speakers_id against list_of_speakers.content_object_id_topic_id +CREATE CONSTRAINT TRIGGER tr_i_topic_list_of_speakers_id AFTER INSERT ON topic_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'list_of_speakers_id', ''); -CREATE CONSTRAINT TRIGGER tr_ud_poll_candidate_list_option_id AFTER UPDATE OF content_object_id_poll_candidate_list_id OR DELETE ON option_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_candidate_list', 'option_id', 'content_object_id_poll_candidate_list_id'); +CREATE CONSTRAINT TRIGGER tr_ud_topic_list_of_speakers_id AFTER UPDATE OF content_object_id_topic_id OR DELETE ON list_of_speakers_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'list_of_speakers_id', 'content_object_id_topic_id'); @@ -2421,65 +2426,95 @@ FOR EACH ROW EXECUTE FUNCTION check_unique_ids_pair('identical_motion_id'); -- Create triggers for notify -CREATE TRIGGER tr_log_organization AFTER INSERT OR UPDATE OR DELETE ON organization_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('organization'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON organization_t +CREATE TRIGGER tr_log_action_worker AFTER INSERT OR UPDATE OR DELETE ON action_worker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('action_worker'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON action_worker_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_organization_t_theme_id AFTER INSERT OR UPDATE OF theme_id OR DELETE ON organization_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('theme', 'theme_id'); - -CREATE TRIGGER tr_log_user AFTER INSERT OR UPDATE OR DELETE ON user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('user'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON user_t +CREATE TRIGGER tr_log_agenda_item AFTER INSERT OR UPDATE OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('agenda_item'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON agenda_item_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_user_t_gender_id AFTER INSERT OR UPDATE OF gender_id OR DELETE ON user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('gender', 'gender_id'); -CREATE TRIGGER tr_log_user_t_home_committee_id AFTER INSERT OR UPDATE OF home_committee_id OR DELETE ON user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('committee', 'home_committee_id'); -CREATE TRIGGER tr_log_meeting_user AFTER INSERT OR UPDATE OR DELETE ON meeting_user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('meeting_user'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON meeting_user_t +CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); + +CREATE TRIGGER tr_log_motion_block_content_object_id_motion_block_id AFTER INSERT OR UPDATE OF content_object_id_motion_block_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_block','content_object_id_motion_block_id'); + +CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); + +CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); +CREATE TRIGGER tr_log_agenda_item_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('agenda_item', 'parent_id'); +CREATE TRIGGER tr_log_agenda_item_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON agenda_item_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_assignment AFTER INSERT OR UPDATE OR DELETE ON assignment_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('assignment'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON assignment_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_meeting_user_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON meeting_user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); -CREATE TRIGGER tr_log_meeting_user_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON meeting_user_t +CREATE TRIGGER tr_log_assignment_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON assignment_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_meeting_user_t_vote_delegated_to_id AFTER INSERT OR UPDATE OF vote_delegated_to_id OR DELETE ON meeting_user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'vote_delegated_to_id'); -CREATE TRIGGER tr_log_nm_meeting_user_structure_level_ids_structure_level_t AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_structure_level_ids_structure_level_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user','meeting_user_id','structure_level','structure_level_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_structure_level_ids_structure_level_t +CREATE TRIGGER tr_log_assignment_candidate AFTER INSERT OR UPDATE OR DELETE ON assignment_candidate_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('assignment_candidate'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON assignment_candidate_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_gender AFTER INSERT OR UPDATE OR DELETE ON gender_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('gender'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gender_t +CREATE TRIGGER tr_log_assignment_candidate_t_assignment_id AFTER INSERT OR UPDATE OF assignment_id OR DELETE ON assignment_candidate_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment', 'assignment_id'); +CREATE TRIGGER tr_log_assignment_candidate_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON assignment_candidate_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_assignment_candidate_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON assignment_candidate_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_ballot AFTER INSERT OR UPDATE OR DELETE ON ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('ballot'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON ballot_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_organization_tag AFTER INSERT OR UPDATE OR DELETE ON organization_tag_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('organization_tag'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON organization_tag_t +CREATE TRIGGER tr_log_ballot_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); +CREATE TRIGGER tr_log_ballot_t_acting_meeting_user_id AFTER INSERT OR UPDATE OF acting_meeting_user_id OR DELETE ON ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'acting_meeting_user_id'); +CREATE TRIGGER tr_log_ballot_t_represented_meeting_user_id AFTER INSERT OR UPDATE OF represented_meeting_user_id OR DELETE ON ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'represented_meeting_user_id'); + +CREATE TRIGGER tr_log_chat_group AFTER INSERT OR UPDATE OR DELETE ON chat_group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('chat_group'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON chat_group_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_tagged_id_committee_id_gm_organization_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_committee_id OR DELETE ON gm_organization_tag_tagged_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization_tag','organization_tag_id','committee','tagged_id_committee_id'); +CREATE TRIGGER tr_log_nm_chat_group_read_group_ids_group_t AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_read_group_ids_group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group','chat_group_id','group','group_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_read_group_ids_group_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_tagged_id_meeting_id_gm_organization_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_meeting_id OR DELETE ON gm_organization_tag_tagged_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization_tag','organization_tag_id','meeting','tagged_id_meeting_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_organization_tag_tagged_ids_t +CREATE TRIGGER tr_log_nm_chat_group_write_group_ids_group_t AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_write_group_ids_group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group','chat_group_id','group','group_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_write_group_ids_group_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_chat_group_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON chat_group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_theme AFTER INSERT OR UPDATE OR DELETE ON theme_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('theme'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON theme_t +CREATE TRIGGER tr_log_chat_message AFTER INSERT OR UPDATE OR DELETE ON chat_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('chat_message'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON chat_message_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_chat_message_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON chat_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_chat_message_t_chat_group_id AFTER INSERT OR UPDATE OF chat_group_id OR DELETE ON chat_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group', 'chat_group_id'); +CREATE TRIGGER tr_log_chat_message_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON chat_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + CREATE TRIGGER tr_log_committee AFTER INSERT OR UPDATE OR DELETE ON committee_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('committee'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON committee_t @@ -2505,6 +2540,128 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('committee','forward_t CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_committee_forward_to_committee_ids_committee_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_gender AFTER INSERT OR UPDATE OR DELETE ON gender_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('gender'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gender_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_group AFTER INSERT OR UPDATE OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('group'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON group_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + + +CREATE TRIGGER tr_log_nm_group_meeting_user_ids_meeting_user_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_meeting_user_ids_meeting_user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_user','meeting_user_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_meeting_user_ids_meeting_user_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_nm_group_mmagi_meeting_mediafile_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmagi_meeting_mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_mediafile','meeting_mediafile_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmagi_meeting_mediafile_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_nm_group_mmiagi_meeting_mediafile_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmiagi_meeting_mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_mediafile','meeting_mediafile_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmiagi_meeting_mediafile_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_nm_group_read_comment_section_ids_motion_comment_section_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_read_comment_section_ids_motion_comment_section_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','motion_comment_section','motion_comment_section_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_read_comment_section_ids_motion_comment_section_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_nm_group_write_comment_section_ids_motion_comment_section_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_write_comment_section_ids_motion_comment_section_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','motion_comment_section','motion_comment_section_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_write_comment_section_ids_motion_comment_section_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_nm_group_poll_ids_poll_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_poll_ids_poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','poll','poll_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_poll_ids_poll_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_group_t_used_as_motion_poll_default_id AFTER INSERT OR UPDATE OF used_as_motion_poll_default_id OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_motion_poll_default_id'); +CREATE TRIGGER tr_log_group_t_used_as_assignment_poll_default_id AFTER INSERT OR UPDATE OF used_as_assignment_poll_default_id OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_assignment_poll_default_id'); +CREATE TRIGGER tr_log_group_t_used_as_topic_poll_default_id AFTER INSERT OR UPDATE OF used_as_topic_poll_default_id OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_topic_poll_default_id'); +CREATE TRIGGER tr_log_group_t_used_as_poll_default_id AFTER INSERT OR UPDATE OF used_as_poll_default_id OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_poll_default_id'); +CREATE TRIGGER tr_log_group_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON group_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_history_entry AFTER INSERT OR UPDATE OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('history_entry'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON history_entry_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + + +CREATE TRIGGER tr_log_user_model_id_user_id AFTER INSERT OR UPDATE OF model_id_user_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user','model_id_user_id'); + +CREATE TRIGGER tr_log_motion_model_id_motion_id AFTER INSERT OR UPDATE OF model_id_motion_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','model_id_motion_id'); + +CREATE TRIGGER tr_log_assignment_model_id_assignment_id AFTER INSERT OR UPDATE OF model_id_assignment_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','model_id_assignment_id'); +CREATE TRIGGER tr_log_history_entry_t_position_id AFTER INSERT OR UPDATE OF position_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('history_position', 'position_id'); +CREATE TRIGGER tr_log_history_entry_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_history_position AFTER INSERT OR UPDATE OR DELETE ON history_position_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('history_position'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON history_position_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_history_position_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON history_position_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); + +CREATE TRIGGER tr_log_import_preview AFTER INSERT OR UPDATE OR DELETE ON import_preview_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('import_preview'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON import_preview_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_list_of_speakers AFTER INSERT OR UPDATE OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('list_of_speakers'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON list_of_speakers_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + + +CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); + +CREATE TRIGGER tr_log_motion_block_content_object_id_motion_block_id AFTER INSERT OR UPDATE OF content_object_id_motion_block_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_block','content_object_id_motion_block_id'); + +CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); + +CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); + +CREATE TRIGGER tr_log_meeting_mediafile_content_object_id_meeting_mediafile_id AFTER INSERT OR UPDATE OF content_object_id_meeting_mediafile_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','content_object_id_meeting_mediafile_id'); +CREATE TRIGGER tr_log_list_of_speakers_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_mediafile AFTER INSERT OR UPDATE OR DELETE ON mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('mediafile'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON mediafile_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_mediafile_t_published_to_meetings_in_organization_id AFTER INSERT OR UPDATE OF published_to_meetings_in_organization_id OR DELETE ON mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization', 'published_to_meetings_in_organization_id'); +CREATE TRIGGER tr_log_mediafile_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('mediafile', 'parent_id'); + +CREATE TRIGGER tr_log_meeting_owner_id_meeting_id AFTER INSERT OR UPDATE OF owner_id_meeting_id OR DELETE ON mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting','owner_id_meeting_id'); + +CREATE TRIGGER tr_log_organization_owner_id_organization_id AFTER INSERT OR UPDATE OF owner_id_organization_id OR DELETE ON mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization','owner_id_organization_id'); + CREATE TRIGGER tr_log_meeting AFTER INSERT OR UPDATE OR DELETE ON meeting_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('meeting'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON meeting_t @@ -2572,181 +2729,49 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group', 'admin_group_ CREATE TRIGGER tr_log_meeting_t_anonymous_group_id AFTER INSERT OR UPDATE OF anonymous_group_id OR DELETE ON meeting_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group', 'anonymous_group_id'); -CREATE TRIGGER tr_log_structure_level AFTER INSERT OR UPDATE OR DELETE ON structure_level_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('structure_level'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON structure_level_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_structure_level_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON structure_level_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_group AFTER INSERT OR UPDATE OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('group'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON group_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - - -CREATE TRIGGER tr_log_nm_group_meeting_user_ids_meeting_user_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_meeting_user_ids_meeting_user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_user','meeting_user_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_meeting_user_ids_meeting_user_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_nm_group_mmagi_meeting_mediafile_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmagi_meeting_mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_mediafile','meeting_mediafile_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmagi_meeting_mediafile_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_nm_group_mmiagi_meeting_mediafile_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmiagi_meeting_mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','meeting_mediafile','meeting_mediafile_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_mmiagi_meeting_mediafile_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_nm_group_read_comment_section_ids_motion_comment_section_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_read_comment_section_ids_motion_comment_section_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','motion_comment_section','motion_comment_section_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_read_comment_section_ids_motion_comment_section_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_nm_group_write_comment_section_ids_motion_comment_section_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_write_comment_section_ids_motion_comment_section_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','motion_comment_section','motion_comment_section_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_write_comment_section_ids_motion_comment_section_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_nm_group_poll_ids_poll_t AFTER INSERT OR UPDATE OR DELETE ON nm_group_poll_ids_poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('group','group_id','poll','poll_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_group_poll_ids_poll_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_group_t_used_as_motion_poll_default_id AFTER INSERT OR UPDATE OF used_as_motion_poll_default_id OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_motion_poll_default_id'); -CREATE TRIGGER tr_log_group_t_used_as_assignment_poll_default_id AFTER INSERT OR UPDATE OF used_as_assignment_poll_default_id OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_assignment_poll_default_id'); -CREATE TRIGGER tr_log_group_t_used_as_topic_poll_default_id AFTER INSERT OR UPDATE OF used_as_topic_poll_default_id OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_topic_poll_default_id'); -CREATE TRIGGER tr_log_group_t_used_as_poll_default_id AFTER INSERT OR UPDATE OF used_as_poll_default_id OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_poll_default_id'); -CREATE TRIGGER tr_log_group_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_personal_note AFTER INSERT OR UPDATE OR DELETE ON personal_note_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('personal_note'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON personal_note_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_personal_note_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON personal_note_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); - -CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON personal_note_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); -CREATE TRIGGER tr_log_personal_note_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON personal_note_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_tag AFTER INSERT OR UPDATE OR DELETE ON tag_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('tag'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON tag_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - - -CREATE TRIGGER tr_log_tagged_id_agenda_item_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_agenda_item_id OR DELETE ON gm_tag_tagged_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','agenda_item','tagged_id_agenda_item_id'); - -CREATE TRIGGER tr_log_tagged_id_assignment_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_assignment_id OR DELETE ON gm_tag_tagged_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','assignment','tagged_id_assignment_id'); - -CREATE TRIGGER tr_log_tagged_id_motion_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_motion_id OR DELETE ON gm_tag_tagged_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','motion','tagged_id_motion_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_tag_tagged_ids_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_tag_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON tag_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_agenda_item AFTER INSERT OR UPDATE OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('agenda_item'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON agenda_item_t +CREATE TRIGGER tr_log_meeting_mediafile AFTER INSERT OR UPDATE OR DELETE ON meeting_mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('meeting_mediafile'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON meeting_mediafile_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); - -CREATE TRIGGER tr_log_motion_block_content_object_id_motion_block_id AFTER INSERT OR UPDATE OF content_object_id_motion_block_id OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_block','content_object_id_motion_block_id'); - -CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); - -CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); -CREATE TRIGGER tr_log_agenda_item_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON agenda_item_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('agenda_item', 'parent_id'); -CREATE TRIGGER tr_log_agenda_item_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON agenda_item_t +CREATE TRIGGER tr_log_meeting_mediafile_t_mediafile_id AFTER INSERT OR UPDATE OF mediafile_id OR DELETE ON meeting_mediafile_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('mediafile', 'mediafile_id'); +CREATE TRIGGER tr_log_meeting_mediafile_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON meeting_mediafile_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_list_of_speakers AFTER INSERT OR UPDATE OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('list_of_speakers'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON list_of_speakers_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - - -CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); - -CREATE TRIGGER tr_log_motion_block_content_object_id_motion_block_id AFTER INSERT OR UPDATE OF content_object_id_motion_block_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_block','content_object_id_motion_block_id'); - -CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); - -CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); +CREATE TRIGGER tr_log_attachment_id_motion_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_motion_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','motion','attachment_id_motion_id'); -CREATE TRIGGER tr_log_meeting_mediafile_content_object_id_meeting_mediafile_id AFTER INSERT OR UPDATE OF content_object_id_meeting_mediafile_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','content_object_id_meeting_mediafile_id'); -CREATE TRIGGER tr_log_list_of_speakers_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_attachment_id_topic_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_topic_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','topic','attachment_id_topic_id'); -CREATE TRIGGER tr_log_structure_level_list_of_speakers AFTER INSERT OR UPDATE OR DELETE ON structure_level_list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('structure_level_list_of_speakers'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON structure_level_list_of_speakers_t +CREATE TRIGGER tr_log_attachment_id_assignment_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_assignment_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','assignment','attachment_id_assignment_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_meeting_mediafile_attachment_ids_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_structure_level_id AFTER INSERT OR UPDATE OF structure_level_id OR DELETE ON structure_level_list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('structure_level', 'structure_level_id'); -CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_list_of_speakers_id AFTER INSERT OR UPDATE OF list_of_speakers_id OR DELETE ON structure_level_list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('list_of_speakers', 'list_of_speakers_id'); -CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON structure_level_list_of_speakers_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_point_of_order_category AFTER INSERT OR UPDATE OR DELETE ON point_of_order_category_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('point_of_order_category'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON point_of_order_category_t +CREATE TRIGGER tr_log_meeting_user AFTER INSERT OR UPDATE OR DELETE ON meeting_user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('meeting_user'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON meeting_user_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_point_of_order_category_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON point_of_order_category_t +CREATE TRIGGER tr_log_meeting_user_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON meeting_user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); +CREATE TRIGGER tr_log_meeting_user_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON meeting_user_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_meeting_user_t_vote_delegated_to_id AFTER INSERT OR UPDATE OF vote_delegated_to_id OR DELETE ON meeting_user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'vote_delegated_to_id'); -CREATE TRIGGER tr_log_speaker AFTER INSERT OR UPDATE OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('speaker'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON speaker_t +CREATE TRIGGER tr_log_nm_meeting_user_poll_voted_ids_poll_t AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_poll_voted_ids_poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user','meeting_user_id','poll','poll_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_poll_voted_ids_poll_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_speaker_t_list_of_speakers_id AFTER INSERT OR UPDATE OF list_of_speakers_id OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('list_of_speakers', 'list_of_speakers_id'); -CREATE TRIGGER tr_log_speaker_t_structure_level_list_of_speakers_id AFTER INSERT OR UPDATE OF structure_level_list_of_speakers_id OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('structure_level_list_of_speakers', 'structure_level_list_of_speakers_id'); -CREATE TRIGGER tr_log_speaker_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_speaker_t_point_of_order_category_id AFTER INSERT OR UPDATE OF point_of_order_category_id OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('point_of_order_category', 'point_of_order_category_id'); -CREATE TRIGGER tr_log_speaker_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_topic AFTER INSERT OR UPDATE OR DELETE ON topic_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('topic'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON topic_t +CREATE TRIGGER tr_log_nm_meeting_user_structure_level_ids_structure_level_t AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_structure_level_ids_structure_level_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user','meeting_user_id','structure_level','structure_level_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_meeting_user_structure_level_ids_structure_level_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_topic_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON topic_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - CREATE TRIGGER tr_log_motion AFTER INSERT OR UPDATE OR DELETE ON motion_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_t @@ -2791,52 +2816,32 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_block', 'block CREATE TRIGGER tr_log_motion_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_motion_submitter AFTER INSERT OR UPDATE OR DELETE ON motion_submitter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_submitter'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_submitter_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_motion_submitter_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_submitter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_motion_submitter_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_submitter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); -CREATE TRIGGER tr_log_motion_submitter_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_submitter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_motion_supporter AFTER INSERT OR UPDATE OR DELETE ON motion_supporter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_supporter'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_supporter_t +CREATE TRIGGER tr_log_motion_block AFTER INSERT OR UPDATE OR DELETE ON motion_block_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_block'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_block_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_motion_supporter_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_supporter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_motion_supporter_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_supporter_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); -CREATE TRIGGER tr_log_motion_supporter_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_supporter_t +CREATE TRIGGER tr_log_motion_block_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_block_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_motion_editor AFTER INSERT OR UPDATE OR DELETE ON motion_editor_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_editor'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_editor_t +CREATE TRIGGER tr_log_motion_category AFTER INSERT OR UPDATE OR DELETE ON motion_category_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_category'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_category_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_motion_editor_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_editor_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_motion_editor_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_editor_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); -CREATE TRIGGER tr_log_motion_editor_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_editor_t +CREATE TRIGGER tr_log_motion_category_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON motion_category_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_category', 'parent_id'); +CREATE TRIGGER tr_log_motion_category_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_category_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_motion_working_group_speaker AFTER INSERT OR UPDATE OR DELETE ON motion_working_group_speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_working_group_speaker'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_working_group_speaker_t +CREATE TRIGGER tr_log_motion_change_recommendation AFTER INSERT OR UPDATE OR DELETE ON motion_change_recommendation_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_change_recommendation'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_change_recommendation_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_motion_working_group_speaker_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_working_group_speaker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_motion_working_group_speaker_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_working_group_speaker_t +CREATE TRIGGER tr_log_motion_change_recommendation_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_change_recommendation_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); -CREATE TRIGGER tr_log_motion_working_group_speaker_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_working_group_speaker_t +CREATE TRIGGER tr_log_motion_change_recommendation_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_change_recommendation_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); CREATE TRIGGER tr_log_motion_comment AFTER INSERT OR UPDATE OR DELETE ON motion_comment_t @@ -2850,41 +2855,25 @@ CREATE TRIGGER tr_log_motion_comment_t_section_id AFTER INSERT OR UPDATE OF sect FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_comment_section', 'section_id'); CREATE TRIGGER tr_log_motion_comment_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_comment_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_motion_comment_section AFTER INSERT OR UPDATE OR DELETE ON motion_comment_section_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_comment_section'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_comment_section_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_motion_comment_section_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_comment_section_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_motion_category AFTER INSERT OR UPDATE OR DELETE ON motion_category_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_category'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_category_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_motion_category_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON motion_category_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_category', 'parent_id'); -CREATE TRIGGER tr_log_motion_category_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_category_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); - -CREATE TRIGGER tr_log_motion_block AFTER INSERT OR UPDATE OR DELETE ON motion_block_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_block'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_block_t + +CREATE TRIGGER tr_log_motion_comment_section AFTER INSERT OR UPDATE OR DELETE ON motion_comment_section_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_comment_section'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_comment_section_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_motion_block_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_block_t +CREATE TRIGGER tr_log_motion_comment_section_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_comment_section_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_motion_change_recommendation AFTER INSERT OR UPDATE OR DELETE ON motion_change_recommendation_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_change_recommendation'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_change_recommendation_t +CREATE TRIGGER tr_log_motion_editor AFTER INSERT OR UPDATE OR DELETE ON motion_editor_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_editor'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_editor_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_motion_change_recommendation_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_change_recommendation_t +CREATE TRIGGER tr_log_motion_editor_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_editor_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_motion_editor_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_editor_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); -CREATE TRIGGER tr_log_motion_change_recommendation_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_change_recommendation_t +CREATE TRIGGER tr_log_motion_editor_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_editor_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); CREATE TRIGGER tr_log_motion_state AFTER INSERT OR UPDATE OR DELETE ON motion_state_t @@ -2904,6 +2893,30 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_workflow', 'wo CREATE TRIGGER tr_log_motion_state_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_state_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_motion_submitter AFTER INSERT OR UPDATE OR DELETE ON motion_submitter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_submitter'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_submitter_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_motion_submitter_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_submitter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_motion_submitter_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_submitter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); +CREATE TRIGGER tr_log_motion_submitter_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_submitter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_motion_supporter AFTER INSERT OR UPDATE OR DELETE ON motion_supporter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_supporter'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_supporter_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_motion_supporter_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_supporter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_motion_supporter_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_supporter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); +CREATE TRIGGER tr_log_motion_supporter_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_supporter_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + CREATE TRIGGER tr_log_motion_workflow AFTER INSERT OR UPDATE OR DELETE ON motion_workflow_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_workflow'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_workflow_t @@ -2914,177 +2927,141 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion_state', 'first CREATE TRIGGER tr_log_motion_workflow_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_workflow_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_poll AFTER INSERT OR UPDATE OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_t +CREATE TRIGGER tr_log_motion_working_group_speaker AFTER INSERT OR UPDATE OR DELETE ON motion_working_group_speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('motion_working_group_speaker'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON motion_working_group_speaker_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_motion_working_group_speaker_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON motion_working_group_speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_motion_working_group_speaker_t_motion_id AFTER INSERT OR UPDATE OF motion_id OR DELETE ON motion_working_group_speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion', 'motion_id'); +CREATE TRIGGER tr_log_motion_working_group_speaker_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON motion_working_group_speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); +CREATE TRIGGER tr_log_organization AFTER INSERT OR UPDATE OR DELETE ON organization_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('organization'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON organization_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); +CREATE TRIGGER tr_log_organization_t_theme_id AFTER INSERT OR UPDATE OF theme_id OR DELETE ON organization_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('theme', 'theme_id'); -CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); -CREATE TRIGGER tr_log_poll_t_global_option_id AFTER INSERT OR UPDATE OF global_option_id OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('option', 'global_option_id'); +CREATE TRIGGER tr_log_organization_tag AFTER INSERT OR UPDATE OR DELETE ON organization_tag_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('organization_tag'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON organization_tag_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + + +CREATE TRIGGER tr_log_tagged_id_committee_id_gm_organization_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_committee_id OR DELETE ON gm_organization_tag_tagged_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization_tag','organization_tag_id','committee','tagged_id_committee_id'); -CREATE TRIGGER tr_log_nm_poll_voted_ids_user_t AFTER INSERT OR UPDATE OR DELETE ON nm_poll_voted_ids_user_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll','poll_id','user','user_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_poll_voted_ids_user_t +CREATE TRIGGER tr_log_tagged_id_meeting_id_gm_organization_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_meeting_id OR DELETE ON gm_organization_tag_tagged_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization_tag','organization_tag_id','meeting','tagged_id_meeting_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_organization_tag_tagged_ids_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON poll_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_option AFTER INSERT OR UPDATE OR DELETE ON option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('option'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON option_t +CREATE TRIGGER tr_log_personal_note AFTER INSERT OR UPDATE OR DELETE ON personal_note_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('personal_note'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON personal_note_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_option_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); -CREATE TRIGGER tr_log_option_t_used_as_global_option_in_poll_id AFTER INSERT OR UPDATE OF used_as_global_option_in_poll_id OR DELETE ON option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'used_as_global_option_in_poll_id'); +CREATE TRIGGER tr_log_personal_note_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON personal_note_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON option_t +CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON personal_note_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); - -CREATE TRIGGER tr_log_user_content_object_id_user_id AFTER INSERT OR UPDATE OF content_object_id_user_id OR DELETE ON option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user','content_object_id_user_id'); - -CREATE TRIGGER tr_log_poll_candidate_list_content_object_id_poll_candidate_list_id AFTER INSERT OR UPDATE OF content_object_id_poll_candidate_list_id OR DELETE ON option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_candidate_list','content_object_id_poll_candidate_list_id'); -CREATE TRIGGER tr_log_option_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON option_t +CREATE TRIGGER tr_log_personal_note_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON personal_note_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_vote AFTER INSERT OR UPDATE OR DELETE ON vote_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('vote'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON vote_t +CREATE TRIGGER tr_log_point_of_order_category AFTER INSERT OR UPDATE OR DELETE ON point_of_order_category_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('point_of_order_category'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON point_of_order_category_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_vote_t_option_id AFTER INSERT OR UPDATE OF option_id OR DELETE ON vote_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('option', 'option_id'); -CREATE TRIGGER tr_log_vote_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON vote_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); -CREATE TRIGGER tr_log_vote_t_delegated_user_id AFTER INSERT OR UPDATE OF delegated_user_id OR DELETE ON vote_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'delegated_user_id'); -CREATE TRIGGER tr_log_vote_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON vote_t +CREATE TRIGGER tr_log_point_of_order_category_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON point_of_order_category_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_assignment AFTER INSERT OR UPDATE OR DELETE ON assignment_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('assignment'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON assignment_t +CREATE TRIGGER tr_log_poll AFTER INSERT OR UPDATE OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_assignment_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON assignment_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_assignment_candidate AFTER INSERT OR UPDATE OR DELETE ON assignment_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('assignment_candidate'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON assignment_candidate_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_poll_config_approval_config_id_poll_config_approval_id AFTER INSERT OR UPDATE OF config_id_poll_config_approval_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_approval','config_id_poll_config_approval_id'); -CREATE TRIGGER tr_log_assignment_candidate_t_assignment_id AFTER INSERT OR UPDATE OF assignment_id OR DELETE ON assignment_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment', 'assignment_id'); -CREATE TRIGGER tr_log_assignment_candidate_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON assignment_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_assignment_candidate_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON assignment_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_poll_config_selection_config_id_poll_config_selection_id AFTER INSERT OR UPDATE OF config_id_poll_config_selection_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_selection','config_id_poll_config_selection_id'); -CREATE TRIGGER tr_log_poll_candidate_list AFTER INSERT OR UPDATE OR DELETE ON poll_candidate_list_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_candidate_list'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_candidate_list_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_poll_config_rating_score_config_id_poll_config_rating_score_id AFTER INSERT OR UPDATE OF config_id_poll_config_rating_score_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_score','config_id_poll_config_rating_score_id'); + +CREATE TRIGGER tr_log_poll_config_rating_approval_config_id_poll_config_rating_approval_id AFTER INSERT OR UPDATE OF config_id_poll_config_rating_approval_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_approval','config_id_poll_config_rating_approval_id'); + +CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); + +CREATE TRIGGER tr_log_assignment_content_object_id_assignment_id AFTER INSERT OR UPDATE OF content_object_id_assignment_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','content_object_id_assignment_id'); -CREATE TRIGGER tr_log_poll_candidate_list_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON poll_candidate_list_t +CREATE TRIGGER tr_log_topic_content_object_id_topic_id AFTER INSERT OR UPDATE OF content_object_id_topic_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_object_id_topic_id'); +CREATE TRIGGER tr_log_poll_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON poll_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_poll_candidate AFTER INSERT OR UPDATE OR DELETE ON poll_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_candidate'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_candidate_t +CREATE TRIGGER tr_log_poll_config_approval AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_approval'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_candidate_t_poll_candidate_list_id AFTER INSERT OR UPDATE OF poll_candidate_list_id OR DELETE ON poll_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_candidate_list', 'poll_candidate_list_id'); -CREATE TRIGGER tr_log_poll_candidate_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON poll_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); -CREATE TRIGGER tr_log_poll_candidate_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON poll_candidate_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_poll_config_approval_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_approval_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); -CREATE TRIGGER tr_log_mediafile AFTER INSERT OR UPDATE OR DELETE ON mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('mediafile'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON mediafile_t +CREATE TRIGGER tr_log_poll_config_option AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_option'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_mediafile_t_published_to_meetings_in_organization_id AFTER INSERT OR UPDATE OF published_to_meetings_in_organization_id OR DELETE ON mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization', 'published_to_meetings_in_organization_id'); -CREATE TRIGGER tr_log_mediafile_t_parent_id AFTER INSERT OR UPDATE OF parent_id OR DELETE ON mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('mediafile', 'parent_id'); -CREATE TRIGGER tr_log_meeting_owner_id_meeting_id AFTER INSERT OR UPDATE OF owner_id_meeting_id OR DELETE ON mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting','owner_id_meeting_id'); +CREATE TRIGGER tr_log_poll_config_approval_poll_config_id_poll_config_approval_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_approval_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_approval','poll_config_id_poll_config_approval_id'); -CREATE TRIGGER tr_log_organization_owner_id_organization_id AFTER INSERT OR UPDATE OF owner_id_organization_id OR DELETE ON mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('organization','owner_id_organization_id'); +CREATE TRIGGER tr_log_poll_config_selection_poll_config_id_poll_config_selection_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_selection_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_selection','poll_config_id_poll_config_selection_id'); -CREATE TRIGGER tr_log_meeting_mediafile AFTER INSERT OR UPDATE OR DELETE ON meeting_mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('meeting_mediafile'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON meeting_mediafile_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_poll_config_rating_score_poll_config_id_poll_config_rating_score_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_rating_score_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_score','poll_config_id_poll_config_rating_score_id'); -CREATE TRIGGER tr_log_meeting_mediafile_t_mediafile_id AFTER INSERT OR UPDATE OF mediafile_id OR DELETE ON meeting_mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('mediafile', 'mediafile_id'); -CREATE TRIGGER tr_log_meeting_mediafile_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON meeting_mediafile_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_poll_config_rating_approval_poll_config_id_poll_config_rating_approval_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_rating_approval_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_approval','poll_config_id_poll_config_rating_approval_id'); +CREATE TRIGGER tr_log_poll_config_option_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_attachment_id_motion_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_motion_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','motion','attachment_id_motion_id'); +CREATE TRIGGER tr_log_poll_config_rating_approval AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_approval_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_rating_approval'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_approval_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_attachment_id_topic_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_topic_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','topic','attachment_id_topic_id'); +CREATE TRIGGER tr_log_poll_config_rating_approval_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_rating_approval_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); -CREATE TRIGGER tr_log_attachment_id_assignment_id_gm_meeting_mediafile_attachment_ids_t AFTER INSERT OR UPDATE OF attachment_id_assignment_id OR DELETE ON gm_meeting_mediafile_attachment_ids_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_mediafile','meeting_mediafile_id','assignment','attachment_id_assignment_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_meeting_mediafile_attachment_ids_t +CREATE TRIGGER tr_log_poll_config_rating_score AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_score_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_rating_score'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_score_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_projector AFTER INSERT OR UPDATE OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('projector'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projector_t +CREATE TRIGGER tr_log_poll_config_rating_score_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_rating_score_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); + +CREATE TRIGGER tr_log_poll_config_selection AFTER INSERT OR UPDATE OR DELETE ON poll_config_selection_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_selection'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_selection_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_agenda_item_li AFTER INSERT OR UPDATE OF used_as_default_projector_for_agenda_item_list_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_agenda_item_list_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_topic_in_meeti AFTER INSERT OR UPDATE OF used_as_default_projector_for_topic_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_topic_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_list_of_speake AFTER INSERT OR UPDATE OF used_as_default_projector_for_list_of_speakers_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_list_of_speakers_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_current_los_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_current_los_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_current_los_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_in_meet AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_amendment_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_amendment_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_amendment_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_block_i AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_block_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_block_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_in_ AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_mediafile_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_mediafile_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_mediafile_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_message_in_mee AFTER INSERT OR UPDATE OF used_as_default_projector_for_message_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_message_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_countdown_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_countdown_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_countdown_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_pol AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_poll_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_poll_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_poll_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_poll_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_poll_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_poll_in_meetin AFTER INSERT OR UPDATE OF used_as_default_projector_for_poll_in_meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_poll_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_poll_config_selection_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_selection_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); CREATE TRIGGER tr_log_projection AFTER INSERT OR UPDATE OR DELETE ON projection_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('projection'); @@ -3133,12 +3110,40 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('projector_countdown', CREATE TRIGGER tr_log_projection_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projection_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_projector_message AFTER INSERT OR UPDATE OR DELETE ON projector_message_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('projector_message'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projector_message_t +CREATE TRIGGER tr_log_projector AFTER INSERT OR UPDATE OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('projector'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projector_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_projector_message_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_message_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_agenda_item_li AFTER INSERT OR UPDATE OF used_as_default_projector_for_agenda_item_list_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_agenda_item_list_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_topic_in_meeti AFTER INSERT OR UPDATE OF used_as_default_projector_for_topic_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_topic_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_list_of_speake AFTER INSERT OR UPDATE OF used_as_default_projector_for_list_of_speakers_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_list_of_speakers_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_current_los_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_current_los_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_current_los_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_in_meet AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_amendment_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_amendment_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_amendment_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_block_i AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_block_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_block_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_in_ AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_mediafile_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_mediafile_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_mediafile_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_message_in_mee AFTER INSERT OR UPDATE OF used_as_default_projector_for_message_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_message_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_countdown_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_countdown_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_countdown_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_pol AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_poll_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_poll_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_poll_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_poll_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_poll_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_poll_in_meetin AFTER INSERT OR UPDATE OF used_as_default_projector_for_poll_in_meeting_id OR DELETE ON projector_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_poll_in_meeting_id'); +CREATE TRIGGER tr_log_projector_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); CREATE TRIGGER tr_log_projector_countdown AFTER INSERT OR UPDATE OR DELETE ON projector_countdown_t @@ -3149,73 +3154,92 @@ DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_e CREATE TRIGGER tr_log_projector_countdown_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_countdown_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_chat_group AFTER INSERT OR UPDATE OR DELETE ON chat_group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('chat_group'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON chat_group_t +CREATE TRIGGER tr_log_projector_message AFTER INSERT OR UPDATE OR DELETE ON projector_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('projector_message'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projector_message_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_projector_message_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_message_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_nm_chat_group_read_group_ids_group_t AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_read_group_ids_group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group','chat_group_id','group','group_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_read_group_ids_group_t +CREATE TRIGGER tr_log_speaker AFTER INSERT OR UPDATE OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('speaker'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON speaker_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_nm_chat_group_write_group_ids_group_t AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_write_group_ids_group_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group','chat_group_id','group','group_id'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON nm_chat_group_write_group_ids_group_t +CREATE TRIGGER tr_log_speaker_t_list_of_speakers_id AFTER INSERT OR UPDATE OF list_of_speakers_id OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('list_of_speakers', 'list_of_speakers_id'); +CREATE TRIGGER tr_log_speaker_t_structure_level_list_of_speakers_id AFTER INSERT OR UPDATE OF structure_level_list_of_speakers_id OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('structure_level_list_of_speakers', 'structure_level_list_of_speakers_id'); +CREATE TRIGGER tr_log_speaker_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); +CREATE TRIGGER tr_log_speaker_t_point_of_order_category_id AFTER INSERT OR UPDATE OF point_of_order_category_id OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('point_of_order_category', 'point_of_order_category_id'); +CREATE TRIGGER tr_log_speaker_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON speaker_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); + +CREATE TRIGGER tr_log_structure_level AFTER INSERT OR UPDATE OR DELETE ON structure_level_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('structure_level'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON structure_level_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_chat_group_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON chat_group_t + +CREATE TRIGGER tr_log_structure_level_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON structure_level_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_chat_message AFTER INSERT OR UPDATE OR DELETE ON chat_message_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('chat_message'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON chat_message_t +CREATE TRIGGER tr_log_structure_level_list_of_speakers AFTER INSERT OR UPDATE OR DELETE ON structure_level_list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('structure_level_list_of_speakers'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON structure_level_list_of_speakers_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_chat_message_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON chat_message_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); -CREATE TRIGGER tr_log_chat_message_t_chat_group_id AFTER INSERT OR UPDATE OF chat_group_id OR DELETE ON chat_message_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('chat_group', 'chat_group_id'); -CREATE TRIGGER tr_log_chat_message_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON chat_message_t +CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_structure_level_id AFTER INSERT OR UPDATE OF structure_level_id OR DELETE ON structure_level_list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('structure_level', 'structure_level_id'); +CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_list_of_speakers_id AFTER INSERT OR UPDATE OF list_of_speakers_id OR DELETE ON structure_level_list_of_speakers_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('list_of_speakers', 'list_of_speakers_id'); +CREATE TRIGGER tr_log_structure_level_list_of_speakers_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON structure_level_list_of_speakers_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); -CREATE TRIGGER tr_log_action_worker AFTER INSERT OR UPDATE OR DELETE ON action_worker_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('action_worker'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON action_worker_t +CREATE TRIGGER tr_log_tag AFTER INSERT OR UPDATE OR DELETE ON tag_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('tag'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON tag_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_import_preview AFTER INSERT OR UPDATE OR DELETE ON import_preview_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('import_preview'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON import_preview_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_history_position AFTER INSERT OR UPDATE OR DELETE ON history_position_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('history_position'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON history_position_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_tagged_id_agenda_item_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_agenda_item_id OR DELETE ON gm_tag_tagged_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','agenda_item','tagged_id_agenda_item_id'); -CREATE TRIGGER tr_log_history_position_t_user_id AFTER INSERT OR UPDATE OF user_id OR DELETE ON history_position_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user', 'user_id'); +CREATE TRIGGER tr_log_tagged_id_assignment_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_assignment_id OR DELETE ON gm_tag_tagged_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','assignment','tagged_id_assignment_id'); -CREATE TRIGGER tr_log_history_entry AFTER INSERT OR UPDATE OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('history_entry'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON history_entry_t +CREATE TRIGGER tr_log_tagged_id_motion_id_gm_tag_tagged_ids_t AFTER INSERT OR UPDATE OF tagged_id_motion_id OR DELETE ON gm_tag_tagged_ids_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('tag','tag_id','motion','tagged_id_motion_id'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON gm_tag_tagged_ids_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_tag_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON tag_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_theme AFTER INSERT OR UPDATE OR DELETE ON theme_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('theme'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON theme_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_user_model_id_user_id AFTER INSERT OR UPDATE OF model_id_user_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user','model_id_user_id'); - -CREATE TRIGGER tr_log_motion_model_id_motion_id AFTER INSERT OR UPDATE OF model_id_motion_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','model_id_motion_id'); +CREATE TRIGGER tr_log_topic AFTER INSERT OR UPDATE OR DELETE ON topic_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('topic'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON topic_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_assignment_model_id_assignment_id AFTER INSERT OR UPDATE OF model_id_assignment_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','model_id_assignment_id'); -CREATE TRIGGER tr_log_history_entry_t_position_id AFTER INSERT OR UPDATE OF position_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('history_position', 'position_id'); -CREATE TRIGGER tr_log_history_entry_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON history_entry_t +CREATE TRIGGER tr_log_topic_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON topic_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); +CREATE TRIGGER tr_log_user AFTER INSERT OR UPDATE OR DELETE ON user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('user'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON user_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_user_t_gender_id AFTER INSERT OR UPDATE OF gender_id OR DELETE ON user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('gender', 'gender_id'); +CREATE TRIGGER tr_log_user_t_home_committee_id AFTER INSERT OR UPDATE OF home_committee_id OR DELETE ON user_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('committee', 'home_committee_id'); + /* Relation-list infos Generated: What will be generated for left field @@ -3236,53 +3260,39 @@ Model.Field -> Model.Field */ /* -SQL nr:1rR => organization/gender_ids:-> gender/organization_id -SQL nr:1rR => organization/committee_ids:-> committee/organization_id -SQL nt:1r => organization/active_meeting_ids:-> meeting/is_active_in_organization_id -SQL nt:1r => organization/archived_meeting_ids:-> meeting/is_archived_in_organization_id -SQL nt:1r => organization/template_meeting_ids:-> meeting/template_for_organization_id -SQL nr:1rR => organization/organization_tag_ids:-> organization_tag/organization_id -FIELD 1rR:1t => organization/theme_id:-> theme/theme_for_organization_id -SQL nr:1rR => organization/theme_ids:-> theme/organization_id -SQL nt:1GrR => organization/mediafile_ids:-> mediafile/owner_id -SQL nt:1r => organization/published_mediafile_ids:-> mediafile/published_to_meetings_in_organization_id -SQL nr:1rR => organization/user_ids:-> user/organization_id +FIELD 1GrR:1t,1t,1t,1tR => agenda_item/content_object_id:-> motion/agenda_item_id,motion_block/agenda_item_id,assignment/agenda_item_id,topic/agenda_item_id +FIELD 1r:nt => agenda_item/parent_id:-> agenda_item/child_ids +SQL nt:1r => agenda_item/child_ids:-> agenda_item/parent_id +SQL nt:nGt => agenda_item/tag_ids:-> tag/tagged_ids +SQL nt:1GrR => agenda_item/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => agenda_item/meeting_id:-> meeting/agenda_item_ids -FIELD 1r:nr => user/gender_id:-> gender/user_ids -SQL nt:nt => user/is_present_in_meeting_ids:-> meeting/present_user_ids -SQL nts:nts => user/committee_ids:-> committee/user_ids -SQL nt:nt => user/committee_management_ids:-> committee/manager_ids -SQL nt:1rR => user/meeting_user_ids:-> meeting_user/user_id -SQL nt:nt => user/poll_voted_ids:-> poll/voted_ids -SQL nr:1Gr => user/option_ids:-> option/content_object_id -SQL nr:1r => user/vote_ids:-> vote/user_id -SQL nr:1r => user/delegated_vote_ids:-> vote/delegated_user_id -SQL nr:1r => user/poll_candidate_ids:-> poll_candidate/user_id -FIELD 1r:nt => user/home_committee_id:-> committee/native_user_ids -SQL nt:1r => user/history_position_ids:-> history_position/user_id -SQL nt:1Gr => user/history_entry_ids:-> history_entry/model_id -SQL nts:nts => user/meeting_ids:-> meeting/user_ids +SQL nt:1rR => assignment/candidate_ids:-> assignment_candidate/assignment_id +SQL nt:1GrR => assignment/poll_ids:-> poll/content_object_id +SQL 1t:1GrR => assignment/agenda_item_id:-> agenda_item/content_object_id +SQL 1tR:1GrR => assignment/list_of_speakers_id:-> list_of_speakers/content_object_id +SQL nt:nGt => assignment/tag_ids:-> tag/tagged_ids +SQL nt:nGt => assignment/attachment_meeting_mediafile_ids:-> meeting_mediafile/attachment_ids +SQL nt:1GrR => assignment/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => assignment/meeting_id:-> meeting/assignment_ids +SQL nt:1Gr => assignment/history_entry_ids:-> history_entry/model_id -FIELD 1rR:nt => meeting_user/user_id:-> user/meeting_user_ids -FIELD 1rR:nt => meeting_user/meeting_id:-> meeting/meeting_user_ids -SQL nt:1rR => meeting_user/personal_note_ids:-> personal_note/meeting_user_id -SQL nt:1r => meeting_user/speaker_ids:-> speaker/meeting_user_id -SQL nt:1r => meeting_user/motion_supporter_ids:-> motion_supporter/meeting_user_id -SQL nt:1r => meeting_user/motion_editor_ids:-> motion_editor/meeting_user_id -SQL nt:1r => meeting_user/motion_working_group_speaker_ids:-> motion_working_group_speaker/meeting_user_id -SQL nt:1r => meeting_user/motion_submitter_ids:-> motion_submitter/meeting_user_id -SQL nt:1r => meeting_user/assignment_candidate_ids:-> assignment_candidate/meeting_user_id -FIELD 1r:nt => meeting_user/vote_delegated_to_id:-> meeting_user/vote_delegations_from_ids -SQL nt:1r => meeting_user/vote_delegations_from_ids:-> meeting_user/vote_delegated_to_id -SQL nt:1r => meeting_user/chat_message_ids:-> chat_message/meeting_user_id -SQL nt:nt => meeting_user/group_ids:-> group/meeting_user_ids -SQL nt:nt => meeting_user/structure_level_ids:-> structure_level/meeting_user_ids +FIELD 1rR:nt => assignment_candidate/assignment_id:-> assignment/candidate_ids +FIELD 1r:nt => assignment_candidate/meeting_user_id:-> meeting_user/assignment_candidate_ids +FIELD 1rR:nt => assignment_candidate/meeting_id:-> meeting/assignment_candidate_ids -SQL nr:1r => gender/user_ids:-> user/gender_id +FIELD 1rR:nr => ballot/poll_id:-> poll/ballot_ids +FIELD 1r:nt => ballot/acting_meeting_user_id:-> meeting_user/acting_ballot_ids +FIELD 1r:nt => ballot/represented_meeting_user_id:-> meeting_user/represented_ballot_ids -SQL nGt:nt,nt => organization_tag/tagged_ids:-> committee/organization_tag_ids,meeting/organization_tag_ids +SQL nt:1rR => chat_group/chat_message_ids:-> chat_message/chat_group_id +SQL nt:nt => chat_group/read_group_ids:-> group/read_chat_group_ids +SQL nt:nt => chat_group/write_group_ids:-> group/write_chat_group_ids +FIELD 1rR:nt => chat_group/meeting_id:-> meeting/chat_group_ids -SQL 1t:1rR => theme/theme_for_organization_id:-> organization/theme_id +FIELD 1r:nt => chat_message/meeting_user_id:-> meeting_user/chat_message_ids +FIELD 1rR:nt => chat_message/chat_group_id:-> chat_group/chat_message_ids +FIELD 1rR:nt => chat_message/meeting_id:-> meeting/chat_message_ids SQL nt:1rR => committee/meeting_ids:-> meeting/committee_id FIELD 1r:1t => committee/default_meeting_id:-> meeting/default_meeting_for_committee_id @@ -3297,14 +3307,50 @@ SQL nt:nt => committee/forward_to_committee_ids:-> committee/receive_forwardings SQL nt:nt => committee/receive_forwardings_from_committee_ids:-> committee/forward_to_committee_ids SQL nt:nGt => committee/organization_tag_ids:-> organization_tag/tagged_ids +SQL nr:1r => gender/user_ids:-> user/gender_id + +SQL nt:nt => group/meeting_user_ids:-> meeting_user/group_ids +SQL 1t:1rR => group/default_group_for_meeting_id:-> meeting/default_group_id +SQL 1t:1r => group/admin_group_for_meeting_id:-> meeting/admin_group_id +SQL 1t:1r => group/anonymous_group_for_meeting_id:-> meeting/anonymous_group_id +SQL nt:nt => group/meeting_mediafile_access_group_ids:-> meeting_mediafile/access_group_ids +SQL nt:nt => group/meeting_mediafile_inherited_access_group_ids:-> meeting_mediafile/inherited_access_group_ids +SQL nt:nt => group/read_comment_section_ids:-> motion_comment_section/read_group_ids +SQL nt:nt => group/write_comment_section_ids:-> motion_comment_section/write_group_ids +SQL nt:nt => group/read_chat_group_ids:-> chat_group/read_group_ids +SQL nt:nt => group/write_chat_group_ids:-> chat_group/write_group_ids +SQL nt:nt => group/poll_ids:-> poll/entitled_group_ids +FIELD 1r:nt => group/used_as_motion_poll_default_id:-> meeting/motion_poll_default_group_ids +FIELD 1r:nt => group/used_as_assignment_poll_default_id:-> meeting/assignment_poll_default_group_ids +FIELD 1r:nt => group/used_as_topic_poll_default_id:-> meeting/topic_poll_default_group_ids +FIELD 1r:nt => group/used_as_poll_default_id:-> meeting/poll_default_group_ids +FIELD 1rR:nt => group/meeting_id:-> meeting/group_ids + +FIELD 1Gr:nt,nt,nt => history_entry/model_id:-> user/history_entry_ids,motion/history_entry_ids,assignment/history_entry_ids +FIELD 1rR:nt => history_entry/position_id:-> history_position/entry_ids +FIELD 1r:nt => history_entry/meeting_id:-> meeting/relevant_history_entry_ids + +FIELD 1r:nt => history_position/user_id:-> user/history_position_ids +SQL nt:1rR => history_position/entry_ids:-> history_entry/position_id + +FIELD 1GrR:1tR,1tR,1tR,1tR,1t => list_of_speakers/content_object_id:-> motion/list_of_speakers_id,motion_block/list_of_speakers_id,assignment/list_of_speakers_id,topic/list_of_speakers_id,meeting_mediafile/list_of_speakers_id +SQL nt:1rR => list_of_speakers/speaker_ids:-> speaker/list_of_speakers_id +SQL nt:1rR => list_of_speakers/structure_level_list_of_speakers_ids:-> structure_level_list_of_speakers/list_of_speakers_id +SQL nt:1GrR => list_of_speakers/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => list_of_speakers/meeting_id:-> meeting/list_of_speakers_ids + +FIELD 1r:nt => mediafile/published_to_meetings_in_organization_id:-> organization/published_mediafile_ids +FIELD 1r:nt => mediafile/parent_id:-> mediafile/child_ids +SQL nt:1r => mediafile/child_ids:-> mediafile/parent_id +FIELD 1GrR:nt,nt => mediafile/owner_id:-> meeting/mediafile_ids,organization/mediafile_ids +SQL nt:1rR => mediafile/meeting_mediafile_ids:-> meeting_mediafile/mediafile_id + FIELD 1r:nt => meeting/is_active_in_organization_id:-> organization/active_meeting_ids FIELD 1r:nt => meeting/is_archived_in_organization_id:-> organization/archived_meeting_ids FIELD 1r:nt => meeting/template_for_organization_id:-> organization/template_meeting_ids FIELD 1rR:1t => meeting/motions_default_workflow_id:-> motion_workflow/default_workflow_meeting_id FIELD 1rR:1t => meeting/motions_default_amendment_workflow_id:-> motion_workflow/default_amendment_workflow_meeting_id SQL nt:1r => meeting/motion_poll_default_group_ids:-> group/used_as_motion_poll_default_id -SQL nr:1rR => meeting/poll_candidate_list_ids:-> poll_candidate_list/meeting_id -SQL nr:1rR => meeting/poll_candidate_ids:-> poll_candidate/meeting_id SQL nt:1rR => meeting/meeting_user_ids:-> meeting_user/meeting_id SQL nt:1r => meeting/assignment_poll_default_group_ids:-> group/used_as_assignment_poll_default_id SQL nt:1r => meeting/poll_default_group_ids:-> group/used_as_poll_default_id @@ -3337,8 +3383,6 @@ SQL nt:1rR => meeting/motion_working_group_speaker_ids:-> motion_working_group_s SQL nt:1rR => meeting/motion_change_recommendation_ids:-> motion_change_recommendation/meeting_id SQL nt:1rR => meeting/motion_state_ids:-> motion_state/meeting_id SQL nr:1rR => meeting/poll_ids:-> poll/meeting_id -SQL nr:1rR => meeting/option_ids:-> option/meeting_id -SQL nr:1rR => meeting/vote_ids:-> vote/meeting_id SQL nt:1rR => meeting/assignment_ids:-> assignment/meeting_id SQL nt:1rR => meeting/assignment_candidate_ids:-> assignment_candidate/meeting_id SQL nt:1rR => meeting/personal_note_ids:-> personal_note/meeting_id @@ -3359,97 +3403,78 @@ FIELD 1r:1t => meeting/font_bold_id:-> meeting_mediafile/used_as_font_bold_in_me FIELD 1r:1t => meeting/font_bold_italic_id:-> meeting_mediafile/used_as_font_bold_italic_in_meeting_id FIELD 1r:1t => meeting/font_monospace_id:-> meeting_mediafile/used_as_font_monospace_in_meeting_id FIELD 1r:1t => meeting/font_chyron_speaker_name_id:-> meeting_mediafile/used_as_font_chyron_speaker_name_in_meeting_id -FIELD 1r:1t => meeting/font_projector_h1_id:-> meeting_mediafile/used_as_font_projector_h1_in_meeting_id -FIELD 1r:1t => meeting/font_projector_h2_id:-> meeting_mediafile/used_as_font_projector_h2_in_meeting_id -FIELD 1rR:nt => meeting/committee_id:-> committee/meeting_ids -SQL 1t:1r => meeting/default_meeting_for_committee_id:-> committee/default_meeting_id -SQL nt:nGt => meeting/organization_tag_ids:-> organization_tag/tagged_ids -SQL nt:nt => meeting/present_user_ids:-> user/is_present_in_meeting_ids -SQL nts:nts => meeting/user_ids:-> user/meeting_ids -FIELD 1rR:1t => meeting/reference_projector_id:-> projector/used_as_reference_projector_meeting_id -FIELD 1r:1t => meeting/list_of_speakers_countdown_id:-> projector_countdown/used_as_list_of_speakers_countdown_meeting_id -FIELD 1r:1t => meeting/poll_countdown_id:-> projector_countdown/used_as_poll_countdown_meeting_id -SQL nt:1GrR => meeting/projection_ids:-> projection/content_object_id -SQL ntR:1r => meeting/default_projector_agenda_item_list_ids:-> projector/used_as_default_projector_for_agenda_item_list_in_meeting_id -SQL ntR:1r => meeting/default_projector_topic_ids:-> projector/used_as_default_projector_for_topic_in_meeting_id -SQL ntR:1r => meeting/default_projector_list_of_speakers_ids:-> projector/used_as_default_projector_for_list_of_speakers_in_meeting_id -SQL ntR:1r => meeting/default_projector_current_los_ids:-> projector/used_as_default_projector_for_current_los_in_meeting_id -SQL ntR:1r => meeting/default_projector_motion_ids:-> projector/used_as_default_projector_for_motion_in_meeting_id -SQL ntR:1r => meeting/default_projector_amendment_ids:-> projector/used_as_default_projector_for_amendment_in_meeting_id -SQL ntR:1r => meeting/default_projector_motion_block_ids:-> projector/used_as_default_projector_for_motion_block_in_meeting_id -SQL ntR:1r => meeting/default_projector_assignment_ids:-> projector/used_as_default_projector_for_assignment_in_meeting_id -SQL ntR:1r => meeting/default_projector_mediafile_ids:-> projector/used_as_default_projector_for_mediafile_in_meeting_id -SQL ntR:1r => meeting/default_projector_message_ids:-> projector/used_as_default_projector_for_message_in_meeting_id -SQL ntR:1r => meeting/default_projector_countdown_ids:-> projector/used_as_default_projector_for_countdown_in_meeting_id -SQL ntR:1r => meeting/default_projector_assignment_poll_ids:-> projector/used_as_default_projector_for_assignment_poll_in_meeting_id -SQL ntR:1r => meeting/default_projector_motion_poll_ids:-> projector/used_as_default_projector_for_motion_poll_in_meeting_id -SQL ntR:1r => meeting/default_projector_poll_ids:-> projector/used_as_default_projector_for_poll_in_meeting_id -FIELD 1rR:1t => meeting/default_group_id:-> group/default_group_for_meeting_id -FIELD 1r:1t => meeting/admin_group_id:-> group/admin_group_for_meeting_id -FIELD 1r:1t => meeting/anonymous_group_id:-> group/anonymous_group_for_meeting_id -SQL nt:1r => meeting/relevant_history_entry_ids:-> history_entry/meeting_id - -SQL nt:nt => structure_level/meeting_user_ids:-> meeting_user/structure_level_ids -SQL nt:1rR => structure_level/structure_level_list_of_speakers_ids:-> structure_level_list_of_speakers/structure_level_id -FIELD 1rR:nt => structure_level/meeting_id:-> meeting/structure_level_ids - -SQL nt:nt => group/meeting_user_ids:-> meeting_user/group_ids -SQL 1t:1rR => group/default_group_for_meeting_id:-> meeting/default_group_id -SQL 1t:1r => group/admin_group_for_meeting_id:-> meeting/admin_group_id -SQL 1t:1r => group/anonymous_group_for_meeting_id:-> meeting/anonymous_group_id -SQL nt:nt => group/meeting_mediafile_access_group_ids:-> meeting_mediafile/access_group_ids -SQL nt:nt => group/meeting_mediafile_inherited_access_group_ids:-> meeting_mediafile/inherited_access_group_ids -SQL nt:nt => group/read_comment_section_ids:-> motion_comment_section/read_group_ids -SQL nt:nt => group/write_comment_section_ids:-> motion_comment_section/write_group_ids -SQL nt:nt => group/read_chat_group_ids:-> chat_group/read_group_ids -SQL nt:nt => group/write_chat_group_ids:-> chat_group/write_group_ids -SQL nt:nt => group/poll_ids:-> poll/entitled_group_ids -FIELD 1r:nt => group/used_as_motion_poll_default_id:-> meeting/motion_poll_default_group_ids -FIELD 1r:nt => group/used_as_assignment_poll_default_id:-> meeting/assignment_poll_default_group_ids -FIELD 1r:nt => group/used_as_topic_poll_default_id:-> meeting/topic_poll_default_group_ids -FIELD 1r:nt => group/used_as_poll_default_id:-> meeting/poll_default_group_ids -FIELD 1rR:nt => group/meeting_id:-> meeting/group_ids - -FIELD 1rR:nt => personal_note/meeting_user_id:-> meeting_user/personal_note_ids -FIELD 1Gr:nt => personal_note/content_object_id:-> motion/personal_note_ids -FIELD 1rR:nt => personal_note/meeting_id:-> meeting/personal_note_ids - -SQL nGt:nt,nt,nt => tag/tagged_ids:-> agenda_item/tag_ids,assignment/tag_ids,motion/tag_ids -FIELD 1rR:nt => tag/meeting_id:-> meeting/tag_ids - -FIELD 1GrR:1t,1t,1t,1tR => agenda_item/content_object_id:-> motion/agenda_item_id,motion_block/agenda_item_id,assignment/agenda_item_id,topic/agenda_item_id -FIELD 1r:nt => agenda_item/parent_id:-> agenda_item/child_ids -SQL nt:1r => agenda_item/child_ids:-> agenda_item/parent_id -SQL nt:nGt => agenda_item/tag_ids:-> tag/tagged_ids -SQL nt:1GrR => agenda_item/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => agenda_item/meeting_id:-> meeting/agenda_item_ids - -FIELD 1GrR:1tR,1tR,1tR,1tR,1t => list_of_speakers/content_object_id:-> motion/list_of_speakers_id,motion_block/list_of_speakers_id,assignment/list_of_speakers_id,topic/list_of_speakers_id,meeting_mediafile/list_of_speakers_id -SQL nt:1rR => list_of_speakers/speaker_ids:-> speaker/list_of_speakers_id -SQL nt:1rR => list_of_speakers/structure_level_list_of_speakers_ids:-> structure_level_list_of_speakers/list_of_speakers_id -SQL nt:1GrR => list_of_speakers/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => list_of_speakers/meeting_id:-> meeting/list_of_speakers_ids - -FIELD 1rR:nt => structure_level_list_of_speakers/structure_level_id:-> structure_level/structure_level_list_of_speakers_ids -FIELD 1rR:nt => structure_level_list_of_speakers/list_of_speakers_id:-> list_of_speakers/structure_level_list_of_speakers_ids -SQL nt:1r => structure_level_list_of_speakers/speaker_ids:-> speaker/structure_level_list_of_speakers_id -FIELD 1rR:nt => structure_level_list_of_speakers/meeting_id:-> meeting/structure_level_list_of_speakers_ids - -FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_category_ids -SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id +FIELD 1r:1t => meeting/font_projector_h1_id:-> meeting_mediafile/used_as_font_projector_h1_in_meeting_id +FIELD 1r:1t => meeting/font_projector_h2_id:-> meeting_mediafile/used_as_font_projector_h2_in_meeting_id +FIELD 1rR:nt => meeting/committee_id:-> committee/meeting_ids +SQL 1t:1r => meeting/default_meeting_for_committee_id:-> committee/default_meeting_id +SQL nt:nGt => meeting/organization_tag_ids:-> organization_tag/tagged_ids +SQL nt:nt => meeting/present_user_ids:-> user/is_present_in_meeting_ids +SQL nts:nts => meeting/user_ids:-> user/meeting_ids +FIELD 1rR:1t => meeting/reference_projector_id:-> projector/used_as_reference_projector_meeting_id +FIELD 1r:1t => meeting/list_of_speakers_countdown_id:-> projector_countdown/used_as_list_of_speakers_countdown_meeting_id +FIELD 1r:1t => meeting/poll_countdown_id:-> projector_countdown/used_as_poll_countdown_meeting_id +SQL nt:1GrR => meeting/projection_ids:-> projection/content_object_id +SQL ntR:1r => meeting/default_projector_agenda_item_list_ids:-> projector/used_as_default_projector_for_agenda_item_list_in_meeting_id +SQL ntR:1r => meeting/default_projector_topic_ids:-> projector/used_as_default_projector_for_topic_in_meeting_id +SQL ntR:1r => meeting/default_projector_list_of_speakers_ids:-> projector/used_as_default_projector_for_list_of_speakers_in_meeting_id +SQL ntR:1r => meeting/default_projector_current_los_ids:-> projector/used_as_default_projector_for_current_los_in_meeting_id +SQL ntR:1r => meeting/default_projector_motion_ids:-> projector/used_as_default_projector_for_motion_in_meeting_id +SQL ntR:1r => meeting/default_projector_amendment_ids:-> projector/used_as_default_projector_for_amendment_in_meeting_id +SQL ntR:1r => meeting/default_projector_motion_block_ids:-> projector/used_as_default_projector_for_motion_block_in_meeting_id +SQL ntR:1r => meeting/default_projector_assignment_ids:-> projector/used_as_default_projector_for_assignment_in_meeting_id +SQL ntR:1r => meeting/default_projector_mediafile_ids:-> projector/used_as_default_projector_for_mediafile_in_meeting_id +SQL ntR:1r => meeting/default_projector_message_ids:-> projector/used_as_default_projector_for_message_in_meeting_id +SQL ntR:1r => meeting/default_projector_countdown_ids:-> projector/used_as_default_projector_for_countdown_in_meeting_id +SQL ntR:1r => meeting/default_projector_assignment_poll_ids:-> projector/used_as_default_projector_for_assignment_poll_in_meeting_id +SQL ntR:1r => meeting/default_projector_motion_poll_ids:-> projector/used_as_default_projector_for_motion_poll_in_meeting_id +SQL ntR:1r => meeting/default_projector_poll_ids:-> projector/used_as_default_projector_for_poll_in_meeting_id +FIELD 1rR:1t => meeting/default_group_id:-> group/default_group_for_meeting_id +FIELD 1r:1t => meeting/admin_group_id:-> group/admin_group_for_meeting_id +FIELD 1r:1t => meeting/anonymous_group_id:-> group/anonymous_group_for_meeting_id +SQL nt:1r => meeting/relevant_history_entry_ids:-> history_entry/meeting_id -FIELD 1rR:nt => speaker/list_of_speakers_id:-> list_of_speakers/speaker_ids -FIELD 1r:nt => speaker/structure_level_list_of_speakers_id:-> structure_level_list_of_speakers/speaker_ids -FIELD 1r:nt => speaker/meeting_user_id:-> meeting_user/speaker_ids -FIELD 1r:nt => speaker/point_of_order_category_id:-> point_of_order_category/speaker_ids -FIELD 1rR:nt => speaker/meeting_id:-> meeting/speaker_ids +FIELD 1rR:nt => meeting_mediafile/mediafile_id:-> mediafile/meeting_mediafile_ids +FIELD 1rR:nt => meeting_mediafile/meeting_id:-> meeting/meeting_mediafile_ids +SQL nt:nt => meeting_mediafile/inherited_access_group_ids:-> group/meeting_mediafile_inherited_access_group_ids +SQL nt:nt => meeting_mediafile/access_group_ids:-> group/meeting_mediafile_access_group_ids +SQL 1t:1GrR => meeting_mediafile/list_of_speakers_id:-> list_of_speakers/content_object_id +SQL nt:1GrR => meeting_mediafile/projection_ids:-> projection/content_object_id +SQL nGt:nt,nt,nt => meeting_mediafile/attachment_ids:-> motion/attachment_meeting_mediafile_ids,topic/attachment_meeting_mediafile_ids,assignment/attachment_meeting_mediafile_ids +SQL 1t:1r => meeting_mediafile/used_as_logo_projector_main_in_meeting_id:-> meeting/logo_projector_main_id +SQL 1t:1r => meeting_mediafile/used_as_logo_projector_header_in_meeting_id:-> meeting/logo_projector_header_id +SQL 1t:1r => meeting_mediafile/used_as_logo_web_header_in_meeting_id:-> meeting/logo_web_header_id +SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_header_l_in_meeting_id:-> meeting/logo_pdf_header_l_id +SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_header_r_in_meeting_id:-> meeting/logo_pdf_header_r_id +SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_footer_l_in_meeting_id:-> meeting/logo_pdf_footer_l_id +SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_footer_r_in_meeting_id:-> meeting/logo_pdf_footer_r_id +SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_ballot_paper_in_meeting_id:-> meeting/logo_pdf_ballot_paper_id +SQL 1t:1r => meeting_mediafile/used_as_font_regular_in_meeting_id:-> meeting/font_regular_id +SQL 1t:1r => meeting_mediafile/used_as_font_italic_in_meeting_id:-> meeting/font_italic_id +SQL 1t:1r => meeting_mediafile/used_as_font_bold_in_meeting_id:-> meeting/font_bold_id +SQL 1t:1r => meeting_mediafile/used_as_font_bold_italic_in_meeting_id:-> meeting/font_bold_italic_id +SQL 1t:1r => meeting_mediafile/used_as_font_monospace_in_meeting_id:-> meeting/font_monospace_id +SQL 1t:1r => meeting_mediafile/used_as_font_chyron_speaker_name_in_meeting_id:-> meeting/font_chyron_speaker_name_id +SQL 1t:1r => meeting_mediafile/used_as_font_projector_h1_in_meeting_id:-> meeting/font_projector_h1_id +SQL 1t:1r => meeting_mediafile/used_as_font_projector_h2_in_meeting_id:-> meeting/font_projector_h2_id -SQL nt:nGt => topic/attachment_meeting_mediafile_ids:-> meeting_mediafile/attachment_ids -SQL 1tR:1GrR => topic/agenda_item_id:-> agenda_item/content_object_id -SQL 1tR:1GrR => topic/list_of_speakers_id:-> list_of_speakers/content_object_id -SQL nt:1GrR => topic/poll_ids:-> poll/content_object_id -SQL nt:1GrR => topic/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => topic/meeting_id:-> meeting/topic_ids +FIELD 1rR:nt => meeting_user/user_id:-> user/meeting_user_ids +FIELD 1rR:nt => meeting_user/meeting_id:-> meeting/meeting_user_ids +SQL nt:1rR => meeting_user/personal_note_ids:-> personal_note/meeting_user_id +SQL nt:1r => meeting_user/speaker_ids:-> speaker/meeting_user_id +SQL nt:1r => meeting_user/motion_supporter_ids:-> motion_supporter/meeting_user_id +SQL nt:1r => meeting_user/motion_editor_ids:-> motion_editor/meeting_user_id +SQL nt:1r => meeting_user/motion_working_group_speaker_ids:-> motion_working_group_speaker/meeting_user_id +SQL nt:1r => meeting_user/motion_submitter_ids:-> motion_submitter/meeting_user_id +SQL nt:1r => meeting_user/assignment_candidate_ids:-> assignment_candidate/meeting_user_id +FIELD 1r:nt => meeting_user/vote_delegated_to_id:-> meeting_user/vote_delegations_from_ids +SQL nt:1r => meeting_user/vote_delegations_from_ids:-> meeting_user/vote_delegated_to_id +SQL nt:nt => meeting_user/poll_voted_ids:-> poll/voted_ids +SQL nr:1r => meeting_user/poll_option_ids:-> poll_config_option/meeting_user_id +SQL nt:1r => meeting_user/acting_ballot_ids:-> ballot/acting_meeting_user_id +SQL nt:1r => meeting_user/represented_ballot_ids:-> ballot/represented_meeting_user_id +SQL nt:1r => meeting_user/chat_message_ids:-> chat_message/meeting_user_id +SQL nt:nt => meeting_user/group_ids:-> group/meeting_user_ids +SQL nt:nt => meeting_user/structure_level_ids:-> structure_level/meeting_user_ids FIELD 1r:nt => motion/lead_motion_id:-> motion/amendment_ids SQL nt:1r => motion/amendment_ids:-> motion/lead_motion_id @@ -3474,7 +3499,6 @@ SQL nt:1rR => motion/supporter_ids:-> motion_supporter/motion_id SQL nt:1rR => motion/editor_ids:-> motion_editor/motion_id SQL nt:1rR => motion/working_group_speaker_ids:-> motion_working_group_speaker/motion_id SQL nt:1GrR => motion/poll_ids:-> poll/content_object_id -SQL nr:1Gr => motion/option_ids:-> option/content_object_id SQL nt:1rR => motion/change_recommendation_ids:-> motion_change_recommendation/motion_id SQL nt:1rR => motion/comment_ids:-> motion_comment/motion_id SQL 1t:1GrR => motion/agenda_item_id:-> agenda_item/content_object_id @@ -3486,21 +3510,19 @@ SQL nt:1Gr => motion/personal_note_ids:-> personal_note/content_object_id FIELD 1rR:nt => motion/meeting_id:-> meeting/motion_ids SQL nt:1Gr => motion/history_entry_ids:-> history_entry/model_id -FIELD 1r:nt => motion_submitter/meeting_user_id:-> meeting_user/motion_submitter_ids -FIELD 1rR:nt => motion_submitter/motion_id:-> motion/submitter_ids -FIELD 1rR:nt => motion_submitter/meeting_id:-> meeting/motion_submitter_ids - -FIELD 1r:nt => motion_supporter/meeting_user_id:-> meeting_user/motion_supporter_ids -FIELD 1rR:nt => motion_supporter/motion_id:-> motion/supporter_ids -FIELD 1rR:nt => motion_supporter/meeting_id:-> meeting/motion_supporter_ids +SQL nt:1r => motion_block/motion_ids:-> motion/block_id +SQL 1t:1GrR => motion_block/agenda_item_id:-> agenda_item/content_object_id +SQL 1tR:1GrR => motion_block/list_of_speakers_id:-> list_of_speakers/content_object_id +SQL nt:1GrR => motion_block/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => motion_block/meeting_id:-> meeting/motion_block_ids -FIELD 1r:nt => motion_editor/meeting_user_id:-> meeting_user/motion_editor_ids -FIELD 1rR:nt => motion_editor/motion_id:-> motion/editor_ids -FIELD 1rR:nt => motion_editor/meeting_id:-> meeting/motion_editor_ids +FIELD 1r:nt => motion_category/parent_id:-> motion_category/child_ids +SQL nt:1r => motion_category/child_ids:-> motion_category/parent_id +SQL nt:1r => motion_category/motion_ids:-> motion/category_id +FIELD 1rR:nt => motion_category/meeting_id:-> meeting/motion_category_ids -FIELD 1r:nt => motion_working_group_speaker/meeting_user_id:-> meeting_user/motion_working_group_speaker_ids -FIELD 1rR:nt => motion_working_group_speaker/motion_id:-> motion/working_group_speaker_ids -FIELD 1rR:nt => motion_working_group_speaker/meeting_id:-> meeting/motion_working_group_speaker_ids +FIELD 1rR:nt => motion_change_recommendation/motion_id:-> motion/change_recommendation_ids +FIELD 1rR:nt => motion_change_recommendation/meeting_id:-> meeting/motion_change_recommendation_ids FIELD 1rR:nt => motion_comment/motion_id:-> motion/comment_ids FIELD 1rR:nt => motion_comment/section_id:-> motion_comment_section/comment_ids @@ -3511,19 +3533,9 @@ SQL nt:nt => motion_comment_section/read_group_ids:-> group/read_comment_section SQL nt:nt => motion_comment_section/write_group_ids:-> group/write_comment_section_ids FIELD 1rR:nt => motion_comment_section/meeting_id:-> meeting/motion_comment_section_ids -FIELD 1r:nt => motion_category/parent_id:-> motion_category/child_ids -SQL nt:1r => motion_category/child_ids:-> motion_category/parent_id -SQL nt:1r => motion_category/motion_ids:-> motion/category_id -FIELD 1rR:nt => motion_category/meeting_id:-> meeting/motion_category_ids - -SQL nt:1r => motion_block/motion_ids:-> motion/block_id -SQL 1t:1GrR => motion_block/agenda_item_id:-> agenda_item/content_object_id -SQL 1tR:1GrR => motion_block/list_of_speakers_id:-> list_of_speakers/content_object_id -SQL nt:1GrR => motion_block/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => motion_block/meeting_id:-> meeting/motion_block_ids - -FIELD 1rR:nt => motion_change_recommendation/motion_id:-> motion/change_recommendation_ids -FIELD 1rR:nt => motion_change_recommendation/meeting_id:-> meeting/motion_change_recommendation_ids +FIELD 1r:nt => motion_editor/meeting_user_id:-> meeting_user/motion_editor_ids +FIELD 1rR:nt => motion_editor/motion_id:-> motion/editor_ids +FIELD 1rR:nt => motion_editor/meeting_id:-> meeting/motion_editor_ids FIELD 1r:nt => motion_state/submitter_withdraw_state_id:-> motion_state/submitter_withdraw_back_ids SQL nt:1r => motion_state/submitter_withdraw_back_ids:-> motion_state/submitter_withdraw_state_id @@ -3535,82 +3547,73 @@ FIELD 1rR:nt => motion_state/workflow_id:-> motion_workflow/state_ids SQL 1t:1rR => motion_state/first_state_of_workflow_id:-> motion_workflow/first_state_id FIELD 1rR:nt => motion_state/meeting_id:-> meeting/motion_state_ids +FIELD 1r:nt => motion_submitter/meeting_user_id:-> meeting_user/motion_submitter_ids +FIELD 1rR:nt => motion_submitter/motion_id:-> motion/submitter_ids +FIELD 1rR:nt => motion_submitter/meeting_id:-> meeting/motion_submitter_ids + +FIELD 1r:nt => motion_supporter/meeting_user_id:-> meeting_user/motion_supporter_ids +FIELD 1rR:nt => motion_supporter/motion_id:-> motion/supporter_ids +FIELD 1rR:nt => motion_supporter/meeting_id:-> meeting/motion_supporter_ids + SQL nt:1rR => motion_workflow/state_ids:-> motion_state/workflow_id FIELD 1rR:1t => motion_workflow/first_state_id:-> motion_state/first_state_of_workflow_id SQL 1t:1rR => motion_workflow/default_workflow_meeting_id:-> meeting/motions_default_workflow_id SQL 1t:1rR => motion_workflow/default_amendment_workflow_meeting_id:-> meeting/motions_default_amendment_workflow_id FIELD 1rR:nt => motion_workflow/meeting_id:-> meeting/motion_workflow_ids +FIELD 1r:nt => motion_working_group_speaker/meeting_user_id:-> meeting_user/motion_working_group_speaker_ids +FIELD 1rR:nt => motion_working_group_speaker/motion_id:-> motion/working_group_speaker_ids +FIELD 1rR:nt => motion_working_group_speaker/meeting_id:-> meeting/motion_working_group_speaker_ids + +SQL nr:1rR => organization/gender_ids:-> gender/organization_id +SQL nr:1rR => organization/committee_ids:-> committee/organization_id +SQL nt:1r => organization/active_meeting_ids:-> meeting/is_active_in_organization_id +SQL nt:1r => organization/archived_meeting_ids:-> meeting/is_archived_in_organization_id +SQL nt:1r => organization/template_meeting_ids:-> meeting/template_for_organization_id +SQL nr:1rR => organization/organization_tag_ids:-> organization_tag/organization_id +FIELD 1rR:1t => organization/theme_id:-> theme/theme_for_organization_id +SQL nr:1rR => organization/theme_ids:-> theme/organization_id +SQL nt:1GrR => organization/mediafile_ids:-> mediafile/owner_id +SQL nt:1r => organization/published_mediafile_ids:-> mediafile/published_to_meetings_in_organization_id +SQL nr:1rR => organization/user_ids:-> user/organization_id + +SQL nGt:nt,nt => organization_tag/tagged_ids:-> committee/organization_tag_ids,meeting/organization_tag_ids + +FIELD 1rR:nt => personal_note/meeting_user_id:-> meeting_user/personal_note_ids +FIELD 1Gr:nt => personal_note/content_object_id:-> motion/personal_note_ids +FIELD 1rR:nt => personal_note/meeting_id:-> meeting/personal_note_ids + +FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_category_ids +SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id + +FIELD 1GrR:1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids -SQL nr:1r => poll/option_ids:-> option/poll_id -FIELD 1r:1r => poll/global_option_id:-> option/used_as_global_option_in_poll_id -SQL nt:nt => poll/voted_ids:-> user/poll_voted_ids +SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id +SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids SQL nt:nt => poll/entitled_group_ids:-> group/poll_ids SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids -FIELD 1r:nr => option/poll_id:-> poll/option_ids -FIELD 1r:1r => option/used_as_global_option_in_poll_id:-> poll/global_option_id -SQL nr:1rR => option/vote_ids:-> vote/option_id -FIELD 1Gr:nr,nr,1tR => option/content_object_id:-> motion/option_ids,user/option_ids,poll_candidate_list/option_id -FIELD 1rR:nr => option/meeting_id:-> meeting/option_ids - -FIELD 1rR:nr => vote/option_id:-> option/vote_ids -FIELD 1r:nr => vote/user_id:-> user/vote_ids -FIELD 1r:nr => vote/delegated_user_id:-> user/delegated_vote_ids -FIELD 1rR:nr => vote/meeting_id:-> meeting/vote_ids - -SQL nt:1rR => assignment/candidate_ids:-> assignment_candidate/assignment_id -SQL nt:1GrR => assignment/poll_ids:-> poll/content_object_id -SQL 1t:1GrR => assignment/agenda_item_id:-> agenda_item/content_object_id -SQL 1tR:1GrR => assignment/list_of_speakers_id:-> list_of_speakers/content_object_id -SQL nt:nGt => assignment/tag_ids:-> tag/tagged_ids -SQL nt:nGt => assignment/attachment_meeting_mediafile_ids:-> meeting_mediafile/attachment_ids -SQL nt:1GrR => assignment/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => assignment/meeting_id:-> meeting/assignment_ids -SQL nt:1Gr => assignment/history_entry_ids:-> history_entry/model_id +FIELD 1rR:1GrR => poll_config_approval/poll_id:-> poll/config_id +SQL nt:1GrR => poll_config_approval/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:nt => assignment_candidate/assignment_id:-> assignment/candidate_ids -FIELD 1r:nt => assignment_candidate/meeting_user_id:-> meeting_user/assignment_candidate_ids -FIELD 1rR:nt => assignment_candidate/meeting_id:-> meeting/assignment_candidate_ids +FIELD 1GrR:nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids +FIELD 1r:nr => poll_config_option/meeting_user_id:-> meeting_user/poll_option_ids -SQL nr:1rR => poll_candidate_list/poll_candidate_ids:-> poll_candidate/poll_candidate_list_id -FIELD 1rR:nr => poll_candidate_list/meeting_id:-> meeting/poll_candidate_list_ids -SQL 1tR:1Gr => poll_candidate_list/option_id:-> option/content_object_id +FIELD 1rR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id +SQL nt:1GrR => poll_config_rating_approval/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:nr => poll_candidate/poll_candidate_list_id:-> poll_candidate_list/poll_candidate_ids -FIELD 1r:nr => poll_candidate/user_id:-> user/poll_candidate_ids -FIELD 1rR:nr => poll_candidate/meeting_id:-> meeting/poll_candidate_ids +FIELD 1rR:1GrR => poll_config_rating_score/poll_id:-> poll/config_id +SQL nt:1GrR => poll_config_rating_score/option_ids:-> poll_config_option/poll_config_id -FIELD 1r:nt => mediafile/published_to_meetings_in_organization_id:-> organization/published_mediafile_ids -FIELD 1r:nt => mediafile/parent_id:-> mediafile/child_ids -SQL nt:1r => mediafile/child_ids:-> mediafile/parent_id -FIELD 1GrR:nt,nt => mediafile/owner_id:-> meeting/mediafile_ids,organization/mediafile_ids -SQL nt:1rR => mediafile/meeting_mediafile_ids:-> meeting_mediafile/mediafile_id +FIELD 1rR:1GrR => poll_config_selection/poll_id:-> poll/config_id +SQL nt:1GrR => poll_config_selection/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:nt => meeting_mediafile/mediafile_id:-> mediafile/meeting_mediafile_ids -FIELD 1rR:nt => meeting_mediafile/meeting_id:-> meeting/meeting_mediafile_ids -SQL nt:nt => meeting_mediafile/inherited_access_group_ids:-> group/meeting_mediafile_inherited_access_group_ids -SQL nt:nt => meeting_mediafile/access_group_ids:-> group/meeting_mediafile_access_group_ids -SQL 1t:1GrR => meeting_mediafile/list_of_speakers_id:-> list_of_speakers/content_object_id -SQL nt:1GrR => meeting_mediafile/projection_ids:-> projection/content_object_id -SQL nGt:nt,nt,nt => meeting_mediafile/attachment_ids:-> motion/attachment_meeting_mediafile_ids,topic/attachment_meeting_mediafile_ids,assignment/attachment_meeting_mediafile_ids -SQL 1t:1r => meeting_mediafile/used_as_logo_projector_main_in_meeting_id:-> meeting/logo_projector_main_id -SQL 1t:1r => meeting_mediafile/used_as_logo_projector_header_in_meeting_id:-> meeting/logo_projector_header_id -SQL 1t:1r => meeting_mediafile/used_as_logo_web_header_in_meeting_id:-> meeting/logo_web_header_id -SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_header_l_in_meeting_id:-> meeting/logo_pdf_header_l_id -SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_header_r_in_meeting_id:-> meeting/logo_pdf_header_r_id -SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_footer_l_in_meeting_id:-> meeting/logo_pdf_footer_l_id -SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_footer_r_in_meeting_id:-> meeting/logo_pdf_footer_r_id -SQL 1t:1r => meeting_mediafile/used_as_logo_pdf_ballot_paper_in_meeting_id:-> meeting/logo_pdf_ballot_paper_id -SQL 1t:1r => meeting_mediafile/used_as_font_regular_in_meeting_id:-> meeting/font_regular_id -SQL 1t:1r => meeting_mediafile/used_as_font_italic_in_meeting_id:-> meeting/font_italic_id -SQL 1t:1r => meeting_mediafile/used_as_font_bold_in_meeting_id:-> meeting/font_bold_id -SQL 1t:1r => meeting_mediafile/used_as_font_bold_italic_in_meeting_id:-> meeting/font_bold_italic_id -SQL 1t:1r => meeting_mediafile/used_as_font_monospace_in_meeting_id:-> meeting/font_monospace_id -SQL 1t:1r => meeting_mediafile/used_as_font_chyron_speaker_name_in_meeting_id:-> meeting/font_chyron_speaker_name_id -SQL 1t:1r => meeting_mediafile/used_as_font_projector_h1_in_meeting_id:-> meeting/font_projector_h1_id -SQL 1t:1r => meeting_mediafile/used_as_font_projector_h2_in_meeting_id:-> meeting/font_projector_h2_id +FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids +FIELD 1r:nt => projection/preview_projector_id:-> projector/preview_projection_ids +FIELD 1r:nt => projection/history_projector_id:-> projector/history_projection_ids +FIELD 1GrR:nt,nt,nt,nt,nt,nt,nt,nt,nt,nt,nt => projection/content_object_id:-> meeting/projection_ids,motion/projection_ids,meeting_mediafile/projection_ids,list_of_speakers/projection_ids,motion_block/projection_ids,assignment/projection_ids,agenda_item/projection_ids,topic/projection_ids,poll/projection_ids,projector_message/projection_ids,projector_countdown/projection_ids +FIELD 1rR:nt => projection/meeting_id:-> meeting/all_projection_ids SQL nt:1r => projector/current_projection_ids:-> projection/current_projector_id SQL nt:1r => projector/preview_projection_ids:-> projection/preview_projector_id @@ -3632,41 +3635,51 @@ FIELD 1r:ntR => projector/used_as_default_projector_for_motion_poll_in_meeting_i FIELD 1r:ntR => projector/used_as_default_projector_for_poll_in_meeting_id:-> meeting/default_projector_poll_ids FIELD 1rR:nt => projector/meeting_id:-> meeting/projector_ids -FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids -FIELD 1r:nt => projection/preview_projector_id:-> projector/preview_projection_ids -FIELD 1r:nt => projection/history_projector_id:-> projector/history_projection_ids -FIELD 1GrR:nt,nt,nt,nt,nt,nt,nt,nt,nt,nt,nt => projection/content_object_id:-> meeting/projection_ids,motion/projection_ids,meeting_mediafile/projection_ids,list_of_speakers/projection_ids,motion_block/projection_ids,assignment/projection_ids,agenda_item/projection_ids,topic/projection_ids,poll/projection_ids,projector_message/projection_ids,projector_countdown/projection_ids -FIELD 1rR:nt => projection/meeting_id:-> meeting/all_projection_ids - -SQL nt:1GrR => projector_message/projection_ids:-> projection/content_object_id -FIELD 1rR:nt => projector_message/meeting_id:-> meeting/projector_message_ids - SQL nt:1GrR => projector_countdown/projection_ids:-> projection/content_object_id SQL 1t:1r => projector_countdown/used_as_list_of_speakers_countdown_meeting_id:-> meeting/list_of_speakers_countdown_id SQL 1t:1r => projector_countdown/used_as_poll_countdown_meeting_id:-> meeting/poll_countdown_id FIELD 1rR:nt => projector_countdown/meeting_id:-> meeting/projector_countdown_ids -SQL nt:1rR => chat_group/chat_message_ids:-> chat_message/chat_group_id -SQL nt:nt => chat_group/read_group_ids:-> group/read_chat_group_ids -SQL nt:nt => chat_group/write_group_ids:-> group/write_chat_group_ids -FIELD 1rR:nt => chat_group/meeting_id:-> meeting/chat_group_ids +SQL nt:1GrR => projector_message/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => projector_message/meeting_id:-> meeting/projector_message_ids -FIELD 1r:nt => chat_message/meeting_user_id:-> meeting_user/chat_message_ids -FIELD 1rR:nt => chat_message/chat_group_id:-> chat_group/chat_message_ids -FIELD 1rR:nt => chat_message/meeting_id:-> meeting/chat_message_ids +FIELD 1rR:nt => speaker/list_of_speakers_id:-> list_of_speakers/speaker_ids +FIELD 1r:nt => speaker/structure_level_list_of_speakers_id:-> structure_level_list_of_speakers/speaker_ids +FIELD 1r:nt => speaker/meeting_user_id:-> meeting_user/speaker_ids +FIELD 1r:nt => speaker/point_of_order_category_id:-> point_of_order_category/speaker_ids +FIELD 1rR:nt => speaker/meeting_id:-> meeting/speaker_ids -FIELD 1r:nt => history_position/user_id:-> user/history_position_ids -SQL nt:1rR => history_position/entry_ids:-> history_entry/position_id +SQL nt:nt => structure_level/meeting_user_ids:-> meeting_user/structure_level_ids +SQL nt:1rR => structure_level/structure_level_list_of_speakers_ids:-> structure_level_list_of_speakers/structure_level_id +FIELD 1rR:nt => structure_level/meeting_id:-> meeting/structure_level_ids -FIELD 1Gr:nt,nt,nt => history_entry/model_id:-> user/history_entry_ids,motion/history_entry_ids,assignment/history_entry_ids -FIELD 1rR:nt => history_entry/position_id:-> history_position/entry_ids -FIELD 1r:nt => history_entry/meeting_id:-> meeting/relevant_history_entry_ids +FIELD 1rR:nt => structure_level_list_of_speakers/structure_level_id:-> structure_level/structure_level_list_of_speakers_ids +FIELD 1rR:nt => structure_level_list_of_speakers/list_of_speakers_id:-> list_of_speakers/structure_level_list_of_speakers_ids +SQL nt:1r => structure_level_list_of_speakers/speaker_ids:-> speaker/structure_level_list_of_speakers_id +FIELD 1rR:nt => structure_level_list_of_speakers/meeting_id:-> meeting/structure_level_list_of_speakers_ids + +SQL nGt:nt,nt,nt => tag/tagged_ids:-> agenda_item/tag_ids,assignment/tag_ids,motion/tag_ids +FIELD 1rR:nt => tag/meeting_id:-> meeting/tag_ids + +SQL 1t:1rR => theme/theme_for_organization_id:-> organization/theme_id + +SQL nt:nGt => topic/attachment_meeting_mediafile_ids:-> meeting_mediafile/attachment_ids +SQL 1tR:1GrR => topic/agenda_item_id:-> agenda_item/content_object_id +SQL 1tR:1GrR => topic/list_of_speakers_id:-> list_of_speakers/content_object_id +SQL nt:1GrR => topic/poll_ids:-> poll/content_object_id +SQL nt:1GrR => topic/projection_ids:-> projection/content_object_id +FIELD 1rR:nt => topic/meeting_id:-> meeting/topic_ids + +FIELD 1r:nr => user/gender_id:-> gender/user_ids +SQL nt:nt => user/is_present_in_meeting_ids:-> meeting/present_user_ids +SQL nts:nts => user/committee_ids:-> committee/user_ids +SQL nt:nt => user/committee_management_ids:-> committee/manager_ids +SQL nt:1rR => user/meeting_user_ids:-> meeting_user/user_id +FIELD 1r:nt => user/home_committee_id:-> committee/native_user_ids +SQL nt:1r => user/history_position_ids:-> history_position/user_id +SQL nt:1Gr => user/history_entry_ids:-> history_entry/model_id +SQL nts:nts => user/meeting_ids:-> meeting/user_ids -*/ -/* -There are 2 errors/warnings - poll/live_votes: type:JSON is marked as a calculated field and not generated in schema - projection/content: type:JSON is marked as a calculated field and not generated in schema */ -/* Missing attribute handling for constant, on_delete, equal_fields, deferred */ \ No newline at end of file +/* Missing attribute handling for constant, equal_fields, on_delete, deferred */ \ No newline at end of file diff --git a/models.yml b/models.yml index 831d3d8e..1440d91e 100644 --- a/models.yml +++ b/models.yml @@ -1631,6 +1631,7 @@ meeting: type: boolean default: false description: Defines defaut `poll.allow_vote_split` option suggested to user. + restriction_mode: B poll_couple_countdown: type: boolean default: true @@ -3097,69 +3098,6 @@ motion_working_group_speaker: required: true restriction_mode: A constant: true -option: - id: - type: number - restriction_mode: A - constant: true - required: true - weight: - type: number - default: 10000 - restriction_mode: A - text: - type: HTMLStrict - restriction_mode: A - 'yes': - type: decimal(6) - restriction_mode: B - 'no': - type: decimal(6) - restriction_mode: B - abstain: - type: decimal(6) - restriction_mode: B - poll_id: - type: relation - to: poll/option_ids - reference: poll - equal_fields: meeting_id - restriction_mode: A - constant: true - used_as_global_option_in_poll_id: - type: relation - to: poll/global_option_id - reference: poll - equal_fields: meeting_id - restriction_mode: A - constant: true - vote_ids: - type: relation-list - to: vote/option_id - reference: vote - on_delete: CASCADE - equal_fields: meeting_id - restriction_mode: A - content_object_id: - type: generic-relation - to: - - motion/option_ids - - user/option_ids - - poll_candidate_list/option_id - reference: - - motion - - user - - poll_candidate_list - equal_fields: meeting_id - restriction_mode: A - constant: true - meeting_id: - type: relation - to: meeting/option_ids - reference: meeting - required: true - restriction_mode: A - constant: true organization: id: type: number @@ -4579,47 +4517,3 @@ user: required: true restriction_mode: F constant: true -vote: - id: - type: number - restriction_mode: A - constant: true - required: true - weight: - type: decimal(6) - restriction_mode: A - constant: true - value: - type: string - restriction_mode: A - constant: true - user_token: - type: string - required: true - restriction_mode: B - constant: true - option_id: - type: relation - to: option/vote_ids - reference: option - equal_fields: meeting_id - required: true - restriction_mode: A - constant: true - user_id: - type: relation - to: user/vote_ids - reference: user - restriction_mode: A - delegated_user_id: - type: relation - to: user/delegated_vote_ids - reference: user - restriction_mode: A - meeting_id: - type: relation - to: meeting/vote_ids - reference: meeting - required: true - restriction_mode: A - constant: true From 24e47fce8bcec81f0ffc2bb809e0991c9e84a082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Sat, 17 Jan 2026 14:41:28 +0100 Subject: [PATCH 03/23] Added config for new poll method scottish stv. (#371) --- collections/poll.yml | 2 ++ collections/poll_config_option.yml | 2 ++ collections/poll_config_stv_scottish.yml | 21 +++++++++++++++++++ models.yml | 26 ++++++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 collections/poll_config_stv_scottish.yml diff --git a/collections/poll.yml b/collections/poll.yml index 4b3e04c6..7def96ff 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -14,11 +14,13 @@ config_id: - poll_config_selection/poll_id - poll_config_rating_score/poll_id - poll_config_rating_approval/poll_id + - poll_config_stv_scottish/poll_id reference: - poll_config_approval - poll_config_selection - poll_config_rating_score - poll_config_rating_approval + - poll_config_stv_scottish required: true restriction_mode: A visibility: diff --git a/collections/poll_config_option.yml b/collections/poll_config_option.yml index a3ee69dd..929b0556 100644 --- a/collections/poll_config_option.yml +++ b/collections/poll_config_option.yml @@ -10,11 +10,13 @@ poll_config_id: - poll_config_selection/option_ids - poll_config_rating_score/option_ids - poll_config_rating_approval/option_ids + - poll_config_stv_scottish/option_ids reference: - poll_config_approval - poll_config_selection - poll_config_rating_score - poll_config_rating_approval + - poll_config_stv_scottish required: true restriction_mode: A weight: diff --git a/collections/poll_config_stv_scottish.yml b/collections/poll_config_stv_scottish.yml new file mode 100644 index 00000000..762c74fa --- /dev/null +++ b/collections/poll_config_stv_scottish.yml @@ -0,0 +1,21 @@ +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A +option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A +posts: + type: number + minimum: 1 + default: 1 + restriction_mode: A diff --git a/models.yml b/models.yml index 1440d91e..df34f388 100644 --- a/models.yml +++ b/models.yml @@ -3376,11 +3376,13 @@ poll: - poll_config_selection/poll_id - poll_config_rating_score/poll_id - poll_config_rating_approval/poll_id + - poll_config_stv_scottish/poll_id reference: - poll_config_approval - poll_config_selection - poll_config_rating_score - poll_config_rating_approval + - poll_config_stv_scottish required: true restriction_mode: A visibility: @@ -3509,11 +3511,13 @@ poll_config_option: - poll_config_selection/option_ids - poll_config_rating_score/option_ids - poll_config_rating_approval/option_ids + - poll_config_stv_scottish/option_ids reference: - poll_config_approval - poll_config_selection - poll_config_rating_score - poll_config_rating_approval + - poll_config_stv_scottish required: true restriction_mode: A weight: @@ -3623,6 +3627,28 @@ poll_config_selection: type: boolean default: false restriction_mode: A +poll_config_stv_scottish: + id: + type: number + restriction_mode: A + constant: true + required: true + poll_id: + type: relation + to: poll/config_id + reference: poll + required: true + restriction_mode: A + option_ids: + type: relation-list + to: poll_config_option/poll_config_id + on_delete: CASCADE + restriction_mode: A + posts: + type: number + minimum: 1 + default: 1 + restriction_mode: A projection: id: type: number From 0365ee015daf413932aef2c9a5709c51e94e7807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Sat, 17 Jan 2026 14:49:35 +0100 Subject: [PATCH 04/23] Add generated relational schema after inserting stv scottish config. (#373) --- dev/sql/schema_relational.sql | 47 +++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 3873157e..be15a81a 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'b3abfb9e566aebc0ac740c5536365ea8' +-- MODELS_YML_CHECKSUM = 'cd1529f73158bde0c3215e6b88832722' -- Function and meta table definitions @@ -999,7 +999,8 @@ CREATE TABLE poll_t ( config_id_poll_config_selection_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_rating_score_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_rating_approval_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_approval' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_config_id_part1 CHECK (split_part(config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval')), + config_id_poll_config_stv_scottish_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_stv_scottish' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_config_id_part1 CHECK (split_part(config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval','poll_config_stv_scottish')), visibility varchar(256) NOT NULL CONSTRAINT enum_poll_visibility CHECK (visibility IN ('manually', 'named', 'open', 'secret')), state varchar(256) CONSTRAINT enum_poll_state CHECK (state IN ('created', 'started', 'finished')) DEFAULT 'created', result text, @@ -1041,7 +1042,8 @@ CREATE TABLE poll_config_option_t ( poll_config_id_poll_config_selection_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, poll_config_id_poll_config_rating_score_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, poll_config_id_poll_config_rating_approval_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_approval' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_poll_config_id_part1 CHECK (split_part(poll_config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval')), + poll_config_id_poll_config_stv_scottish_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_stv_scottish' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_poll_config_id_part1 CHECK (split_part(poll_config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval','poll_config_stv_scottish')), weight integer, text varchar(256), meeting_user_id integer @@ -1085,6 +1087,15 @@ CREATE TABLE poll_config_selection_t ( +CREATE TABLE poll_config_stv_scottish_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + poll_id integer NOT NULL UNIQUE, + posts integer CONSTRAINT minimum_posts CHECK (posts >= 1) DEFAULT 1 +); + + + + CREATE TABLE projection_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, options jsonb, @@ -1881,6 +1892,11 @@ CREATE VIEW "poll_config_selection" AS SELECT *, FROM poll_config_selection_t p; +CREATE VIEW "poll_config_stv_scottish" AS SELECT *, +(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_stv_scottish_id = p.id) as option_ids +FROM poll_config_stv_scottish_t p; + + CREATE VIEW "projection" AS SELECT * FROM projection_t p; @@ -2129,6 +2145,7 @@ ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_approval_id) REFERENCES ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; @@ -2140,6 +2157,7 @@ ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_appr ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; ALTER TABLE poll_config_option_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; ALTER TABLE poll_config_rating_approval_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; @@ -2148,6 +2166,8 @@ ALTER TABLE poll_config_rating_score_t ADD FOREIGN KEY(poll_id) REFERENCES poll_ ALTER TABLE poll_config_selection_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +ALTER TABLE poll_config_stv_scottish_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; + ALTER TABLE projection_t ADD FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; ALTER TABLE projection_t ADD FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; ALTER TABLE projection_t ADD FOREIGN KEY(history_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; @@ -3000,6 +3020,9 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_sc CREATE TRIGGER tr_log_poll_config_rating_approval_config_id_poll_config_rating_approval_id AFTER INSERT OR UPDATE OF config_id_poll_config_rating_approval_id OR DELETE ON poll_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_approval','config_id_poll_config_rating_approval_id'); +CREATE TRIGGER tr_log_poll_config_stv_scottish_config_id_poll_config_stv_scottish_id AFTER INSERT OR UPDATE OF config_id_poll_config_stv_scottish_id OR DELETE ON poll_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_stv_scottish','config_id_poll_config_stv_scottish_id'); + CREATE TRIGGER tr_log_motion_content_object_id_motion_id AFTER INSERT OR UPDATE OF content_object_id_motion_id OR DELETE ON poll_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','content_object_id_motion_id'); @@ -3036,6 +3059,9 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_sc CREATE TRIGGER tr_log_poll_config_rating_approval_poll_config_id_poll_config_rating_approval_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_rating_approval_id OR DELETE ON poll_config_option_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_approval','poll_config_id_poll_config_rating_approval_id'); + +CREATE TRIGGER tr_log_poll_config_stv_scottish_poll_config_id_poll_config_stv_scottish_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_stv_scottish_id OR DELETE ON poll_config_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_stv_scottish','poll_config_id_poll_config_stv_scottish_id'); CREATE TRIGGER tr_log_poll_config_option_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON poll_config_option_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id'); @@ -3063,6 +3089,14 @@ DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_e CREATE TRIGGER tr_log_poll_config_selection_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_selection_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); +CREATE TRIGGER tr_log_poll_config_stv_scottish AFTER INSERT OR UPDATE OR DELETE ON poll_config_stv_scottish_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_stv_scottish'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_stv_scottish_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_poll_config_stv_scottish_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_stv_scottish_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); + CREATE TRIGGER tr_log_projection AFTER INSERT OR UPDATE OR DELETE ON projection_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('projection'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projection_t @@ -3586,7 +3620,7 @@ FIELD 1rR:nt => personal_note/meeting_id:-> meeting/personal_note_ids FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_category_ids SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id -FIELD 1GrR:1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id +FIELD 1GrR:1rR,1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids @@ -3597,7 +3631,7 @@ FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids FIELD 1rR:1GrR => poll_config_approval/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_approval/option_ids:-> poll_config_option/poll_config_id -FIELD 1GrR:nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids +FIELD 1GrR:nt,nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids,poll_config_stv_scottish/option_ids FIELD 1r:nr => poll_config_option/meeting_user_id:-> meeting_user/poll_option_ids FIELD 1rR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id @@ -3609,6 +3643,9 @@ SQL nt:1GrR => poll_config_rating_score/option_ids:-> poll_config_option/poll_co FIELD 1rR:1GrR => poll_config_selection/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_selection/option_ids:-> poll_config_option/poll_config_id +FIELD 1rR:1GrR => poll_config_stv_scottish/poll_id:-> poll/config_id +SQL nt:1GrR => poll_config_stv_scottish/option_ids:-> poll_config_option/poll_config_id + FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids FIELD 1r:nt => projection/preview_projector_id:-> projector/preview_projection_ids FIELD 1r:nt => projection/history_projector_id:-> projector/history_projection_ids From 77b136d59c677e90be28592fdd86d4a8ab47faa8 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Mon, 23 Feb 2026 17:04:51 +0100 Subject: [PATCH 05/23] Make poll config_id non required (#395) --- collections/poll.yml | 2 +- dev/sql/schema_relational.sql | 16 ++++++++-------- models.yml | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/collections/poll.yml b/collections/poll.yml index 7def96ff..9eea1098 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -21,7 +21,7 @@ config_id: - poll_config_rating_score - poll_config_rating_approval - poll_config_stv_scottish - required: true + required: false restriction_mode: A visibility: type: string diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index c48838e3..1cae4d5b 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '6037c1b6cfd87a108359937ba81b64b2' +-- MODELS_YML_CHECKSUM = 'c9d3c87f20a7178b1f223ddf5909af25' -- Function and meta table definitions @@ -1091,7 +1091,7 @@ CREATE TABLE point_of_order_category_t ( CREATE TABLE poll_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, title varchar(256) NOT NULL, - config_id varchar(100) NOT NULL, + config_id varchar(100), config_id_poll_config_approval_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_approval' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_selection_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_rating_score_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, @@ -3943,7 +3943,7 @@ FIELD 1rR:nt => personal_note/meeting_id:-> meeting/personal_note_ids FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_category_ids SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id -FIELD 1GrR:1rR,1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id +FIELD 1Gr:1rR,1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids @@ -3951,22 +3951,22 @@ SQL nt:nt => poll/entitled_group_ids:-> group/poll_ids SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids -FIELD 1rR:1GrR => poll_config_approval/poll_id:-> poll/config_id +FIELD 1rR:1Gr => poll_config_approval/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_approval/option_ids:-> poll_config_option/poll_config_id FIELD 1GrR:nt,nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids,poll_config_stv_scottish/option_ids FIELD 1r:nr => poll_config_option/meeting_user_id:-> meeting_user/poll_option_ids -FIELD 1rR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id +FIELD 1rR:1Gr => poll_config_rating_approval/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_rating_approval/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1GrR => poll_config_rating_score/poll_id:-> poll/config_id +FIELD 1rR:1Gr => poll_config_rating_score/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_rating_score/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1GrR => poll_config_selection/poll_id:-> poll/config_id +FIELD 1rR:1Gr => poll_config_selection/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_selection/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1GrR => poll_config_stv_scottish/poll_id:-> poll/config_id +FIELD 1rR:1Gr => poll_config_stv_scottish/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_stv_scottish/option_ids:-> poll_config_option/poll_config_id FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids diff --git a/models.yml b/models.yml index 9b78e179..d6969332 100644 --- a/models.yml +++ b/models.yml @@ -3388,7 +3388,7 @@ poll: - poll_config_rating_score - poll_config_rating_approval - poll_config_stv_scottish - required: true + required: false restriction_mode: A visibility: type: string From 9b2534cfd090041bb55a0719649d23ce93e2f216 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Sun, 1 Mar 2026 11:51:15 +0100 Subject: [PATCH 06/23] Make poll config required again (#403) --- collections/poll.yml | 2 +- collections/poll_config_approval.yml | 1 - collections/poll_config_rating_approval.yml | 1 - collections/poll_config_rating_score.yml | 1 - collections/poll_config_selection.yml | 1 - collections/poll_config_stv_scottish.yml | 1 - dev/sql/schema_relational.sql | 96 ++++++++++++--------- models.yml | 7 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/collections/poll.yml b/collections/poll.yml index 9eea1098..7def96ff 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -21,7 +21,7 @@ config_id: - poll_config_rating_score - poll_config_rating_approval - poll_config_stv_scottish - required: false + required: true restriction_mode: A visibility: type: string diff --git a/collections/poll_config_approval.yml b/collections/poll_config_approval.yml index fb243fdf..02b1bf90 100644 --- a/collections/poll_config_approval.yml +++ b/collections/poll_config_approval.yml @@ -6,7 +6,6 @@ id: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml index d592a3b1..6fec262a 100644 --- a/collections/poll_config_rating_approval.yml +++ b/collections/poll_config_rating_approval.yml @@ -6,7 +6,6 @@ id: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: diff --git a/collections/poll_config_rating_score.yml b/collections/poll_config_rating_score.yml index e2ac9e8a..c851ec23 100644 --- a/collections/poll_config_rating_score.yml +++ b/collections/poll_config_rating_score.yml @@ -6,7 +6,6 @@ id: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml index 2e0e7ad9..81de41ee 100644 --- a/collections/poll_config_selection.yml +++ b/collections/poll_config_selection.yml @@ -6,7 +6,6 @@ id: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: diff --git a/collections/poll_config_stv_scottish.yml b/collections/poll_config_stv_scottish.yml index 762c74fa..82b6b44e 100644 --- a/collections/poll_config_stv_scottish.yml +++ b/collections/poll_config_stv_scottish.yml @@ -6,7 +6,6 @@ id: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 1cae4d5b..fa5434d1 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'c9d3c87f20a7178b1f223ddf5909af25' +-- MODELS_YML_CHECKSUM = '329f48f7e4c49f9c8439cd1ef4aa37b1' -- Function and meta table definitions @@ -1091,7 +1091,7 @@ CREATE TABLE point_of_order_category_t ( CREATE TABLE poll_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, title varchar(256) NOT NULL, - config_id varchar(100), + config_id varchar(100) NOT NULL, config_id_poll_config_approval_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_approval' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_selection_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, config_id_poll_config_rating_score_id integer UNIQUE GENERATED ALWAYS AS (CASE WHEN split_part(config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(config_id, '/', 2) AS INTEGER) ELSE null END) STORED, @@ -1125,7 +1125,6 @@ comment on column poll_t.sequential_number is 'The (positive) serial number of t CREATE TABLE poll_config_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_id integer NOT NULL UNIQUE, allow_abstain boolean DEFAULT True ); @@ -1151,7 +1150,6 @@ CREATE TABLE poll_config_option_t ( CREATE TABLE poll_config_rating_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_id integer NOT NULL UNIQUE, max_options_amount integer DEFAULT 0, min_options_amount integer DEFAULT 0, allow_abstain boolean DEFAULT True @@ -1162,7 +1160,6 @@ CREATE TABLE poll_config_rating_approval_t ( CREATE TABLE poll_config_rating_score_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_id integer NOT NULL UNIQUE, max_options_amount integer DEFAULT 0, min_options_amount integer DEFAULT 0, max_votes_per_option integer DEFAULT 0, @@ -1175,7 +1172,6 @@ CREATE TABLE poll_config_rating_score_t ( CREATE TABLE poll_config_selection_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_id integer NOT NULL UNIQUE, max_options_amount integer DEFAULT 0, min_options_amount integer DEFAULT 0, allow_nota boolean DEFAULT False @@ -1186,7 +1182,6 @@ CREATE TABLE poll_config_selection_t ( CREATE TABLE poll_config_stv_scottish_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_id integer NOT NULL UNIQUE, posts integer CONSTRAINT minimum_posts CHECK (posts >= 1) DEFAULT 1 ); @@ -2004,6 +1999,7 @@ FROM poll_t p; CREATE VIEW "poll_config_approval" AS SELECT *, +(select p1.id from poll_t p1 where p1.config_id_poll_config_approval_id = p.id) as poll_id, (select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_approval_id = p.id) as option_ids FROM poll_config_approval_t p; @@ -2012,21 +2008,25 @@ CREATE VIEW "poll_config_option" AS SELECT * FROM poll_config_option_t p; CREATE VIEW "poll_config_rating_approval" AS SELECT *, +(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_approval_id = p.id) as poll_id, (select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_approval_id = p.id) as option_ids FROM poll_config_rating_approval_t p; CREATE VIEW "poll_config_rating_score" AS SELECT *, +(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_score_id = p.id) as poll_id, (select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_score_id = p.id) as option_ids FROM poll_config_rating_score_t p; CREATE VIEW "poll_config_selection" AS SELECT *, +(select p1.id from poll_t p1 where p1.config_id_poll_config_selection_id = p.id) as poll_id, (select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_selection_id = p.id) as option_ids FROM poll_config_selection_t p; CREATE VIEW "poll_config_stv_scottish" AS SELECT *, +(select p1.id from poll_t p1 where p1.config_id_poll_config_stv_scottish_id = p.id) as poll_id, (select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_stv_scottish_id = p.id) as option_ids FROM poll_config_stv_scottish_t p; @@ -2406,9 +2406,6 @@ CREATE INDEX ON poll_t (content_object_id_topic_id); ALTER TABLE poll_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX ON poll_t (meeting_id); -ALTER TABLE poll_config_approval_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_approval_t (poll_id); - ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_approval_id); ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; @@ -2422,18 +2419,6 @@ CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_stv_scottish_id ALTER TABLE poll_config_option_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; CREATE INDEX ON poll_config_option_t (meeting_user_id); -ALTER TABLE poll_config_rating_approval_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_rating_approval_t (poll_id); - -ALTER TABLE poll_config_rating_score_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_rating_score_t (poll_id); - -ALTER TABLE poll_config_selection_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_selection_t (poll_id); - -ALTER TABLE poll_config_stv_scottish_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_stv_scottish_t (poll_id); - ALTER TABLE projection_t ADD FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; CREATE INDEX ON projection_t (current_projector_id); ALTER TABLE projection_t ADD FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; @@ -2615,6 +2600,46 @@ CREATE CONSTRAINT TRIGGER tr_ud_motion_block_list_of_speakers_id AFTER UPDATE OF FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('motion_block', 'list_of_speakers_id', 'list_of_speakers', 'content_object_id_motion_block_id'); +-- definition trigger not null for poll_config_approval.poll_id against poll.config_id_poll_config_approval_id +CREATE CONSTRAINT TRIGGER tr_i_poll_config_approval_poll_id AFTER INSERT ON poll_config_approval_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_approval', 'poll_id'); + +CREATE CONSTRAINT TRIGGER tr_ud_poll_config_approval_poll_id AFTER UPDATE OF config_id_poll_config_approval_id OR DELETE ON poll_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_approval', 'poll_id', 'poll', 'config_id_poll_config_approval_id'); + + +-- definition trigger not null for poll_config_rating_approval.poll_id against poll.config_id_poll_config_rating_approval_id +CREATE CONSTRAINT TRIGGER tr_i_poll_config_rating_approval_poll_id AFTER INSERT ON poll_config_rating_approval_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_rating_approval', 'poll_id'); + +CREATE CONSTRAINT TRIGGER tr_ud_poll_config_rating_approval_poll_id AFTER UPDATE OF config_id_poll_config_rating_approval_id OR DELETE ON poll_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_rating_approval', 'poll_id', 'poll', 'config_id_poll_config_rating_approval_id'); + + +-- definition trigger not null for poll_config_rating_score.poll_id against poll.config_id_poll_config_rating_score_id +CREATE CONSTRAINT TRIGGER tr_i_poll_config_rating_score_poll_id AFTER INSERT ON poll_config_rating_score_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_rating_score', 'poll_id'); + +CREATE CONSTRAINT TRIGGER tr_ud_poll_config_rating_score_poll_id AFTER UPDATE OF config_id_poll_config_rating_score_id OR DELETE ON poll_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_rating_score', 'poll_id', 'poll', 'config_id_poll_config_rating_score_id'); + + +-- definition trigger not null for poll_config_selection.poll_id against poll.config_id_poll_config_selection_id +CREATE CONSTRAINT TRIGGER tr_i_poll_config_selection_poll_id AFTER INSERT ON poll_config_selection_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_selection', 'poll_id'); + +CREATE CONSTRAINT TRIGGER tr_ud_poll_config_selection_poll_id AFTER UPDATE OF config_id_poll_config_selection_id OR DELETE ON poll_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_selection', 'poll_id', 'poll', 'config_id_poll_config_selection_id'); + + +-- definition trigger not null for poll_config_stv_scottish.poll_id against poll.config_id_poll_config_stv_scottish_id +CREATE CONSTRAINT TRIGGER tr_i_poll_config_stv_scottish_poll_id AFTER INSERT ON poll_config_stv_scottish_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_stv_scottish', 'poll_id'); + +CREATE CONSTRAINT TRIGGER tr_ud_poll_config_stv_scottish_poll_id AFTER UPDATE OF config_id_poll_config_stv_scottish_id OR DELETE ON poll_t INITIALLY DEFERRED +FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('poll_config_stv_scottish', 'poll_id', 'poll', 'config_id_poll_config_stv_scottish_id'); + + -- definition trigger not null for topic.agenda_item_id against agenda_item.content_object_id_topic_id CREATE CONSTRAINT TRIGGER tr_i_topic_agenda_item_id AFTER INSERT ON topic_t INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('topic', 'agenda_item_id'); @@ -3362,9 +3387,6 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_approval'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_approval_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_approval_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); - CREATE TRIGGER tr_log_poll_config_option AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_option'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t @@ -3393,33 +3415,21 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_rating_approval') CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_approval_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_rating_approval_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_rating_approval_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); - CREATE TRIGGER tr_log_poll_config_rating_score AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_score_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_rating_score'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_score_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_rating_score_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_rating_score_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); - CREATE TRIGGER tr_log_poll_config_selection AFTER INSERT OR UPDATE OR DELETE ON poll_config_selection_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_selection'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_selection_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_selection_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_selection_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); - CREATE TRIGGER tr_log_poll_config_stv_scottish AFTER INSERT OR UPDATE OR DELETE ON poll_config_stv_scottish_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_stv_scottish'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_stv_scottish_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_stv_scottish_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_config_stv_scottish_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id'); - CREATE TRIGGER tr_log_projection AFTER INSERT OR UPDATE OR DELETE ON projection_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('projection'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projection_t @@ -3943,7 +3953,7 @@ FIELD 1rR:nt => personal_note/meeting_id:-> meeting/personal_note_ids FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_category_ids SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id -FIELD 1Gr:1rR,1rR,1rR,1rR,1rR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id +FIELD 1GrR:1tR,1tR,1tR,1tR,1tR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids @@ -3951,22 +3961,22 @@ SQL nt:nt => poll/entitled_group_ids:-> group/poll_ids SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids -FIELD 1rR:1Gr => poll_config_approval/poll_id:-> poll/config_id +SQL 1tR:1GrR => poll_config_approval/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_approval/option_ids:-> poll_config_option/poll_config_id FIELD 1GrR:nt,nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids,poll_config_stv_scottish/option_ids FIELD 1r:nr => poll_config_option/meeting_user_id:-> meeting_user/poll_option_ids -FIELD 1rR:1Gr => poll_config_rating_approval/poll_id:-> poll/config_id +SQL 1tR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_rating_approval/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1Gr => poll_config_rating_score/poll_id:-> poll/config_id +SQL 1tR:1GrR => poll_config_rating_score/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_rating_score/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1Gr => poll_config_selection/poll_id:-> poll/config_id +SQL 1tR:1GrR => poll_config_selection/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_selection/option_ids:-> poll_config_option/poll_config_id -FIELD 1rR:1Gr => poll_config_stv_scottish/poll_id:-> poll/config_id +SQL 1tR:1GrR => poll_config_stv_scottish/poll_id:-> poll/config_id SQL nt:1GrR => poll_config_stv_scottish/option_ids:-> poll_config_option/poll_config_id FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids diff --git a/models.yml b/models.yml index d6969332..6f72d2e6 100644 --- a/models.yml +++ b/models.yml @@ -3388,7 +3388,7 @@ poll: - poll_config_rating_score - poll_config_rating_approval - poll_config_stv_scottish - required: false + required: true restriction_mode: A visibility: type: string @@ -3491,7 +3491,6 @@ poll_config_approval: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: @@ -3546,7 +3545,6 @@ poll_config_rating_approval: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: @@ -3575,7 +3573,6 @@ poll_config_rating_score: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: @@ -3612,7 +3609,6 @@ poll_config_selection: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: @@ -3641,7 +3637,6 @@ poll_config_stv_scottish: poll_id: type: relation to: poll/config_id - reference: poll required: true restriction_mode: A option_ids: From 95f672cf080b19c9fdd83d717204af9855c5ccfe Mon Sep 17 00:00:00 2001 From: Viktoriia Krasnovyd <114735598+vkrasnovyd@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:27:56 +0100 Subject: [PATCH 07/23] Merge 'main' into feature/vote --- .github/workflows/continuous_integration.yml | 2 +- .github/workflows/test-sql.yml | 2 +- dev/requirements.txt | 18 +- dev/sql/schema_relational.sql | 998 ++++++++++--------- dev/src/generate_sql_schema.py | 204 ++-- dev/src/helper_get_names.py | 130 ++- dev/src/join_models_yml.py | 30 +- dev/src/validate.py | 6 +- dev/tests/base.py | 2 +- 9 files changed, 720 insertions(+), 672 deletions(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index 64537d94..a08cbf88 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -54,7 +54,7 @@ jobs: run: make validate-models - name: Generate models.yml from collections - run: python src/join_models_yml.py + run: python -m src.join_models_yml - name: Check if models.yml is up-to-date run: | diff --git a/.github/workflows/test-sql.yml b/.github/workflows/test-sql.yml index 608a50aa..371d8408 100644 --- a/.github/workflows/test-sql.yml +++ b/.github/workflows/test-sql.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Install psql run: | diff --git a/dev/requirements.txt b/dev/requirements.txt index 91897f10..35242fb1 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -1,19 +1,19 @@ -autoflake==2.3.1 -black==25.12.0 +autoflake==2.3.3 +black==26.1.0 flake8==7.3.0 -isort==7.0.0 -sqlfluff==3.4.2 +isort==8.0.0 +sqlfluff==4.0.4 mypy==1.19.1 pytest==9.0.2 pyupgrade==3.21.2 pyyaml==6.0.3 simplejson==3.20.2 -debugpy==1.8.0 -requests==2.31.0 -psycopg[binary]==3.3.2 -python-sql==1.5.1 +debugpy==1.8.20 +requests==2.32.5 +psycopg[binary]==3.3.3 +python-sql==1.7.0 # typing types-PyYAML==6.0.12.20250915 types-simplejson==3.20.0.20250822 -types-requests==2.31.0.20240125 +types-requests==2.32.4.20260107 diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index fa5434d1..aa92f25e 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1450,195 +1450,205 @@ comment on column user_t.organization_management_level is 'Hierarchical permissi -- Intermediate table definitions CREATE TABLE nm_chat_group_read_group_ids_group_t ( - chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + chat_group_id integer NOT NULL CONSTRAINT fk_nm_chat_group_read_group_ids_group_t_chat_group_id_chc0b2569 REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_chat_group_read_group_ids_group_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (chat_group_id, group_id) ); -CREATE INDEX ON nm_chat_group_read_group_ids_group_t (chat_group_id); -CREATE INDEX ON nm_chat_group_read_group_ids_group_t (group_id); +CREATE INDEX idx_nm_chat_group_read_group_ids_group_t_chat_group_id ON nm_chat_group_read_group_ids_group_t (chat_group_id); +CREATE INDEX idx_nm_chat_group_read_group_ids_group_t_group_id ON nm_chat_group_read_group_ids_group_t (group_id); CREATE TABLE nm_chat_group_write_group_ids_group_t ( - chat_group_id integer NOT NULL REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + chat_group_id integer NOT NULL CONSTRAINT fk_nm_chat_group_write_group_ids_group_t_chat_group_id_cc085d6c REFERENCES chat_group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_chat_group_write_group_ids_group_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (chat_group_id, group_id) ); -CREATE INDEX ON nm_chat_group_write_group_ids_group_t (chat_group_id); -CREATE INDEX ON nm_chat_group_write_group_ids_group_t (group_id); +CREATE INDEX idx_nm_chat_group_write_group_ids_group_t_chat_group_id ON nm_chat_group_write_group_ids_group_t (chat_group_id); +CREATE INDEX idx_nm_chat_group_write_group_ids_group_t_group_id ON nm_chat_group_write_group_ids_group_t (group_id); CREATE TABLE nm_committee_manager_ids_user_t ( - committee_id integer NOT NULL REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - user_id integer NOT NULL REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + committee_id integer NOT NULL CONSTRAINT fk_nm_committee_manager_ids_user_t_committee_id_committee_t_id REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + user_id integer NOT NULL CONSTRAINT fk_nm_committee_manager_ids_user_t_user_id_user_t_id REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (committee_id, user_id) ); -CREATE INDEX ON nm_committee_manager_ids_user_t (committee_id); -CREATE INDEX ON nm_committee_manager_ids_user_t (user_id); +CREATE INDEX idx_nm_committee_manager_ids_user_t_committee_id ON nm_committee_manager_ids_user_t (committee_id); +CREATE INDEX idx_nm_committee_manager_ids_user_t_user_id ON nm_committee_manager_ids_user_t (user_id); CREATE TABLE nm_committee_all_child_ids_committee_t ( - all_child_id integer NOT NULL REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - all_parent_id integer NOT NULL REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + all_child_id integer NOT NULL CONSTRAINT fk_nm_committee_all_child_ids_committee_t_all_child_id_cc86a8b2 REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + all_parent_id integer NOT NULL CONSTRAINT fk_nm_committee_all_child_ids_committee_t_all_parent_id_014ed42 REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (all_child_id, all_parent_id) ); -CREATE INDEX ON nm_committee_all_child_ids_committee_t (all_child_id); -CREATE INDEX ON nm_committee_all_child_ids_committee_t (all_parent_id); +CREATE INDEX idx_nm_committee_all_child_ids_committee_t_all_child_id ON nm_committee_all_child_ids_committee_t (all_child_id); +CREATE INDEX idx_nm_committee_all_child_ids_committee_t_all_parent_id ON nm_committee_all_child_ids_committee_t (all_parent_id); CREATE TABLE nm_committee_forward_to_committee_ids_committee_t ( - forward_to_committee_id integer NOT NULL REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - receive_forwardings_from_committee_id integer NOT NULL REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + forward_to_committee_id integer NOT NULL CONSTRAINT fk_nm_committee_forward_to_committee_ids_committee_t_fora987475 REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + receive_forwardings_from_committee_id integer NOT NULL CONSTRAINT fk_nm_committee_forward_to_committee_ids_committee_t_rec0dc00a3 REFERENCES committee_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (forward_to_committee_id, receive_forwardings_from_committee_id) ); -CREATE INDEX ON nm_committee_forward_to_committee_ids_committee_t (forward_to_committee_id); -CREATE INDEX ON nm_committee_forward_to_committee_ids_committee_t (receive_forwardings_from_committee_id); +CREATE INDEX idx_nm_committee_forward_to_committee_ids_committee_t_fo5507b60 ON nm_committee_forward_to_committee_ids_committee_t (forward_to_committee_id); +CREATE INDEX idx_nm_committee_forward_to_committee_ids_committee_t_re9215b1e ON nm_committee_forward_to_committee_ids_committee_t (receive_forwardings_from_committee_id); CREATE TABLE nm_group_meeting_user_ids_meeting_user_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_meeting_user_ids_meeting_user_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_user_id integer NOT NULL CONSTRAINT fk_nm_group_meeting_user_ids_meeting_user_t_meeting_userd442927 REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, meeting_user_id) ); -CREATE INDEX ON nm_group_meeting_user_ids_meeting_user_t (group_id); -CREATE INDEX ON nm_group_meeting_user_ids_meeting_user_t (meeting_user_id); +CREATE INDEX idx_nm_group_meeting_user_ids_meeting_user_t_group_id ON nm_group_meeting_user_ids_meeting_user_t (group_id); +CREATE INDEX idx_nm_group_meeting_user_ids_meeting_user_t_meeting_user_id ON nm_group_meeting_user_ids_meeting_user_t (meeting_user_id); CREATE TABLE nm_group_mmagi_meeting_mediafile_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - meeting_mediafile_id integer NOT NULL REFERENCES meeting_mediafile_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_mmagi_meeting_mediafile_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_mediafile_id integer NOT NULL CONSTRAINT fk_nm_group_mmagi_meeting_mediafile_t_meeting_mediafile_6a1f41a REFERENCES meeting_mediafile_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, meeting_mediafile_id) ); -CREATE INDEX ON nm_group_mmagi_meeting_mediafile_t (group_id); -CREATE INDEX ON nm_group_mmagi_meeting_mediafile_t (meeting_mediafile_id); +CREATE INDEX idx_nm_group_mmagi_meeting_mediafile_t_group_id ON nm_group_mmagi_meeting_mediafile_t (group_id); +CREATE INDEX idx_nm_group_mmagi_meeting_mediafile_t_meeting_mediafile_id ON nm_group_mmagi_meeting_mediafile_t (meeting_mediafile_id); CREATE TABLE nm_group_mmiagi_meeting_mediafile_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - meeting_mediafile_id integer NOT NULL REFERENCES meeting_mediafile_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_mmiagi_meeting_mediafile_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_mediafile_id integer NOT NULL CONSTRAINT fk_nm_group_mmiagi_meeting_mediafile_t_meeting_mediafile1728d31 REFERENCES meeting_mediafile_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, meeting_mediafile_id) ); -CREATE INDEX ON nm_group_mmiagi_meeting_mediafile_t (group_id); -CREATE INDEX ON nm_group_mmiagi_meeting_mediafile_t (meeting_mediafile_id); +CREATE INDEX idx_nm_group_mmiagi_meeting_mediafile_t_group_id ON nm_group_mmiagi_meeting_mediafile_t (group_id); +CREATE INDEX idx_nm_group_mmiagi_meeting_mediafile_t_meeting_mediafile_id ON nm_group_mmiagi_meeting_mediafile_t (meeting_mediafile_id); CREATE TABLE nm_group_read_comment_section_ids_motion_comment_section_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - motion_comment_section_id integer NOT NULL REFERENCES motion_comment_section_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_read_comment_section_ids_motion_comment_sectd992bd3 REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + motion_comment_section_id integer NOT NULL CONSTRAINT fk_nm_group_read_comment_section_ids_motion_comment_sect2d17ce5 REFERENCES motion_comment_section_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, motion_comment_section_id) ); -CREATE INDEX ON nm_group_read_comment_section_ids_motion_comment_section_t (group_id); -CREATE INDEX ON nm_group_read_comment_section_ids_motion_comment_section_t (motion_comment_section_id); +CREATE INDEX idx_nm_group_read_comment_section_ids_motion_comment_secb9c23c0 ON nm_group_read_comment_section_ids_motion_comment_section_t (group_id); +CREATE INDEX idx_nm_group_read_comment_section_ids_motion_comment_sec520054a ON nm_group_read_comment_section_ids_motion_comment_section_t (motion_comment_section_id); CREATE TABLE nm_group_write_comment_section_ids_motion_comment_section_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - motion_comment_section_id integer NOT NULL REFERENCES motion_comment_section_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_write_comment_section_ids_motion_comment_sec39cad7b REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + motion_comment_section_id integer NOT NULL CONSTRAINT fk_nm_group_write_comment_section_ids_motion_comment_sec9ffa691 REFERENCES motion_comment_section_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, motion_comment_section_id) ); -CREATE INDEX ON nm_group_write_comment_section_ids_motion_comment_section_t (group_id); -CREATE INDEX ON nm_group_write_comment_section_ids_motion_comment_section_t (motion_comment_section_id); +CREATE INDEX idx_nm_group_write_comment_section_ids_motion_comment_sed5732f3 ON nm_group_write_comment_section_ids_motion_comment_section_t (group_id); +CREATE INDEX idx_nm_group_write_comment_section_ids_motion_comment_se3ab0450 ON nm_group_write_comment_section_ids_motion_comment_section_t (motion_comment_section_id); CREATE TABLE nm_group_poll_ids_poll_t ( - group_id integer NOT NULL REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - poll_id integer NOT NULL REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + group_id integer NOT NULL CONSTRAINT fk_nm_group_poll_ids_poll_t_group_id_group_t_id REFERENCES group_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + poll_id integer NOT NULL CONSTRAINT fk_nm_group_poll_ids_poll_t_poll_id_poll_t_id REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (group_id, poll_id) ); -CREATE INDEX ON nm_group_poll_ids_poll_t (group_id); -CREATE INDEX ON nm_group_poll_ids_poll_t (poll_id); +CREATE INDEX idx_nm_group_poll_ids_poll_t_group_id ON nm_group_poll_ids_poll_t (group_id); +CREATE INDEX idx_nm_group_poll_ids_poll_t_poll_id ON nm_group_poll_ids_poll_t (poll_id); CREATE TABLE nm_meeting_present_user_ids_user_t ( - meeting_id integer NOT NULL REFERENCES meeting_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - user_id integer NOT NULL REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_id integer NOT NULL CONSTRAINT fk_nm_meeting_present_user_ids_user_t_meeting_id_meeting_t_id REFERENCES meeting_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + user_id integer NOT NULL CONSTRAINT fk_nm_meeting_present_user_ids_user_t_user_id_user_t_id REFERENCES user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (meeting_id, user_id) ); -CREATE INDEX ON nm_meeting_present_user_ids_user_t (meeting_id); -CREATE INDEX ON nm_meeting_present_user_ids_user_t (user_id); +CREATE INDEX idx_nm_meeting_present_user_ids_user_t_meeting_id ON nm_meeting_present_user_ids_user_t (meeting_id); +CREATE INDEX idx_nm_meeting_present_user_ids_user_t_user_id ON nm_meeting_present_user_ids_user_t (user_id); CREATE TABLE gm_meeting_mediafile_attachment_ids_t ( - meeting_mediafile_id integer NOT NULL REFERENCES meeting_mediafile_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_mediafile_id integer NOT NULL CONSTRAINT fk_gm_meeting_mediafile_attachment_ids_t_meeting_mediaficc00c2e REFERENCES meeting_mediafile_t(id) ON DELETE CASCADE INITIALLY DEFERRED, attachment_id varchar(100) NOT NULL, - attachment_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'motion' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - attachment_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'topic' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES topic_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - attachment_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'assignment' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'motion' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_meeting_mediafile_attachment_ids_t_attachment_id_mec23f0c REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id_topic_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'topic' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_meeting_mediafile_attachment_ids_t_attachment_id_tf2c2308 REFERENCES topic_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + attachment_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(attachment_id, '/', 1) = 'assignment' THEN cast(split_part(attachment_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_meeting_mediafile_attachment_ids_t_attachment_id_af0f87e8 REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, CONSTRAINT valid_attachment_id_part1 CHECK (split_part(attachment_id, '/', 1) IN ('motion', 'topic', 'assignment')), CONSTRAINT unique_$meeting_mediafile_id_$attachment_id UNIQUE (meeting_mediafile_id, attachment_id) ); -CREATE INDEX ON gm_meeting_mediafile_attachment_ids_t (meeting_mediafile_id); -CREATE INDEX ON gm_meeting_mediafile_attachment_ids_t (attachment_id); +CREATE INDEX idx_gm_meeting_mediafile_attachment_ids_t_meeting_mediafile_id ON gm_meeting_mediafile_attachment_ids_t (meeting_mediafile_id); +CREATE INDEX idx_gm_meeting_mediafile_attachment_ids_t_attachment_id ON gm_meeting_mediafile_attachment_ids_t (attachment_id); +CREATE INDEX idx_gm_meeting_mediafile_attachment_ids_t_attachment_id_3c67b77 ON gm_meeting_mediafile_attachment_ids_t (attachment_id_motion_id); +CREATE INDEX idx_gm_meeting_mediafile_attachment_ids_t_attachment_id_8abf47a ON gm_meeting_mediafile_attachment_ids_t (attachment_id_topic_id); +CREATE INDEX idx_gm_meeting_mediafile_attachment_ids_t_attachment_id_66fb18e ON gm_meeting_mediafile_attachment_ids_t (attachment_id_assignment_id); CREATE TABLE nm_meeting_user_poll_voted_ids_poll_t ( - meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - poll_id integer NOT NULL REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_user_id integer NOT NULL CONSTRAINT fk_nm_meeting_user_poll_voted_ids_poll_t_meeting_user_id44ef71d REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + poll_id integer NOT NULL CONSTRAINT fk_nm_meeting_user_poll_voted_ids_poll_t_poll_id_poll_t_id REFERENCES poll_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (meeting_user_id, poll_id) ); -CREATE INDEX ON nm_meeting_user_poll_voted_ids_poll_t (meeting_user_id); -CREATE INDEX ON nm_meeting_user_poll_voted_ids_poll_t (poll_id); +CREATE INDEX idx_nm_meeting_user_poll_voted_ids_poll_t_meeting_user_id ON nm_meeting_user_poll_voted_ids_poll_t (meeting_user_id); +CREATE INDEX idx_nm_meeting_user_poll_voted_ids_poll_t_poll_id ON nm_meeting_user_poll_voted_ids_poll_t (poll_id); CREATE TABLE nm_meeting_user_structure_level_ids_structure_level_t ( - meeting_user_id integer NOT NULL REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - structure_level_id integer NOT NULL REFERENCES structure_level_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + meeting_user_id integer NOT NULL CONSTRAINT fk_nm_meeting_user_structure_level_ids_structure_level_t8c0bc42 REFERENCES meeting_user_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + structure_level_id integer NOT NULL CONSTRAINT fk_nm_meeting_user_structure_level_ids_structure_level_ta594d12 REFERENCES structure_level_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (meeting_user_id, structure_level_id) ); -CREATE INDEX ON nm_meeting_user_structure_level_ids_structure_level_t (meeting_user_id); -CREATE INDEX ON nm_meeting_user_structure_level_ids_structure_level_t (structure_level_id); +CREATE INDEX idx_nm_meeting_user_structure_level_ids_structure_level_a842d49 ON nm_meeting_user_structure_level_ids_structure_level_t (meeting_user_id); +CREATE INDEX idx_nm_meeting_user_structure_level_ids_structure_level_abd5dca ON nm_meeting_user_structure_level_ids_structure_level_t (structure_level_id); CREATE TABLE nm_motion_all_derived_motion_ids_motion_t ( - all_derived_motion_id integer NOT NULL REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - all_origin_id integer NOT NULL REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + all_derived_motion_id integer NOT NULL CONSTRAINT fk_nm_motion_all_derived_motion_ids_motion_t_all_derived87fec12 REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + all_origin_id integer NOT NULL CONSTRAINT fk_nm_motion_all_derived_motion_ids_motion_t_all_origin_c37696a REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (all_derived_motion_id, all_origin_id) ); -CREATE INDEX ON nm_motion_all_derived_motion_ids_motion_t (all_derived_motion_id); -CREATE INDEX ON nm_motion_all_derived_motion_ids_motion_t (all_origin_id); +CREATE INDEX idx_nm_motion_all_derived_motion_ids_motion_t_all_derivee757fda ON nm_motion_all_derived_motion_ids_motion_t (all_derived_motion_id); +CREATE INDEX idx_nm_motion_all_derived_motion_ids_motion_t_all_origin_id ON nm_motion_all_derived_motion_ids_motion_t (all_origin_id); CREATE TABLE nm_motion_identical_motion_ids_motion_t ( - identical_motion_id_1 integer NOT NULL REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - identical_motion_id_2 integer NOT NULL REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + identical_motion_id_1 integer NOT NULL CONSTRAINT fk_nm_motion_identical_motion_ids_motion_t_identical_motcb3785b REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + identical_motion_id_2 integer NOT NULL CONSTRAINT fk_nm_motion_identical_motion_ids_motion_t_identical_mot4e10b0c REFERENCES motion_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (identical_motion_id_1, identical_motion_id_2) ); -CREATE INDEX ON nm_motion_identical_motion_ids_motion_t (identical_motion_id_1); -CREATE INDEX ON nm_motion_identical_motion_ids_motion_t (identical_motion_id_2); +CREATE INDEX idx_nm_motion_identical_motion_ids_motion_t_identical_mo6988270 ON nm_motion_identical_motion_ids_motion_t (identical_motion_id_1); +CREATE INDEX idx_nm_motion_identical_motion_ids_motion_t_identical_moe0b67bf ON nm_motion_identical_motion_ids_motion_t (identical_motion_id_2); CREATE TABLE gm_motion_state_extension_reference_ids_t ( - motion_id integer NOT NULL REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + motion_id integer NOT NULL CONSTRAINT fk_gm_motion_state_extension_reference_ids_t_motion_id_m49e5f09 REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, state_extension_reference_id varchar(100) NOT NULL, - state_extension_reference_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(state_extension_reference_id, '/', 1) = 'motion' THEN cast(split_part(state_extension_reference_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + state_extension_reference_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(state_extension_reference_id, '/', 1) = 'motion' THEN cast(split_part(state_extension_reference_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_motion_state_extension_reference_ids_t_state_exten1eb8dcc REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, CONSTRAINT valid_state_extension_reference_id_part1 CHECK (split_part(state_extension_reference_id, '/', 1) IN ('motion')), CONSTRAINT unique_$motion_id_$state_extension_reference_id UNIQUE (motion_id, state_extension_reference_id) ); -CREATE INDEX ON gm_motion_state_extension_reference_ids_t (motion_id); -CREATE INDEX ON gm_motion_state_extension_reference_ids_t (state_extension_reference_id); +CREATE INDEX idx_gm_motion_state_extension_reference_ids_t_motion_id ON gm_motion_state_extension_reference_ids_t (motion_id); +CREATE INDEX idx_gm_motion_state_extension_reference_ids_t_state_exte869c61b ON gm_motion_state_extension_reference_ids_t (state_extension_reference_id); +CREATE INDEX idx_gm_motion_state_extension_reference_ids_t_state_extee77cee3 ON gm_motion_state_extension_reference_ids_t (state_extension_reference_id_motion_id); CREATE TABLE gm_motion_recommendation_extension_reference_ids_t ( - motion_id integer NOT NULL REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + motion_id integer NOT NULL CONSTRAINT fk_gm_motion_recommendation_extension_reference_ids_t_mo331611e REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, recommendation_extension_reference_id varchar(100) NOT NULL, - recommendation_extension_reference_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(recommendation_extension_reference_id, '/', 1) = 'motion' THEN cast(split_part(recommendation_extension_reference_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + recommendation_extension_reference_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(recommendation_extension_reference_id, '/', 1) = 'motion' THEN cast(split_part(recommendation_extension_reference_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_motion_recommendation_extension_reference_ids_t_re6acbf83 REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, CONSTRAINT valid_recommendation_extension_reference_id_part1 CHECK (split_part(recommendation_extension_reference_id, '/', 1) IN ('motion')), CONSTRAINT unique_$motion_id_$recommendation_extension_reference_id UNIQUE (motion_id, recommendation_extension_reference_id) ); -CREATE INDEX ON gm_motion_recommendation_extension_reference_ids_t (motion_id); -CREATE INDEX ON gm_motion_recommendation_extension_reference_ids_t (recommendation_extension_reference_id); +CREATE INDEX idx_gm_motion_recommendation_extension_reference_ids_t_m81631d0 ON gm_motion_recommendation_extension_reference_ids_t (motion_id); +CREATE INDEX idx_gm_motion_recommendation_extension_reference_ids_t_r6488b59 ON gm_motion_recommendation_extension_reference_ids_t (recommendation_extension_reference_id); +CREATE INDEX idx_gm_motion_recommendation_extension_reference_ids_t_r1489537 ON gm_motion_recommendation_extension_reference_ids_t (recommendation_extension_reference_id_motion_id); CREATE TABLE nm_motion_state_next_state_ids_motion_state_t ( - next_state_id integer NOT NULL REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, - previous_state_id integer NOT NULL REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + next_state_id integer NOT NULL CONSTRAINT fk_nm_motion_state_next_state_ids_motion_state_t_next_st820d55c REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, + previous_state_id integer NOT NULL CONSTRAINT fk_nm_motion_state_next_state_ids_motion_state_t_previou40712f2 REFERENCES motion_state_t (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (next_state_id, previous_state_id) ); -CREATE INDEX ON nm_motion_state_next_state_ids_motion_state_t (next_state_id); -CREATE INDEX ON nm_motion_state_next_state_ids_motion_state_t (previous_state_id); +CREATE INDEX idx_nm_motion_state_next_state_ids_motion_state_t_next_state_id ON nm_motion_state_next_state_ids_motion_state_t (next_state_id); +CREATE INDEX idx_nm_motion_state_next_state_ids_motion_state_t_previoa964ca1 ON nm_motion_state_next_state_ids_motion_state_t (previous_state_id); CREATE TABLE gm_organization_tag_tagged_ids_t ( - organization_tag_id integer NOT NULL REFERENCES organization_tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + organization_tag_id integer NOT NULL CONSTRAINT fk_gm_organization_tag_tagged_ids_t_organization_tag_id_4c0ab0b REFERENCES organization_tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, tagged_id varchar(100) NOT NULL, - tagged_id_committee_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'committee' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES committee_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'meeting' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES meeting_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_committee_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'committee' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_organization_tag_tagged_ids_t_tagged_id_committee_c4b8172 REFERENCES committee_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_meeting_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'meeting' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_organization_tag_tagged_ids_t_tagged_id_meeting_id97a619f REFERENCES meeting_t(id) ON DELETE CASCADE INITIALLY DEFERRED, CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('committee', 'meeting')), CONSTRAINT unique_$organization_tag_id_$tagged_id UNIQUE (organization_tag_id, tagged_id) ); -CREATE INDEX ON gm_organization_tag_tagged_ids_t (organization_tag_id); -CREATE INDEX ON gm_organization_tag_tagged_ids_t (tagged_id); +CREATE INDEX idx_gm_organization_tag_tagged_ids_t_organization_tag_id ON gm_organization_tag_tagged_ids_t (organization_tag_id); +CREATE INDEX idx_gm_organization_tag_tagged_ids_t_tagged_id ON gm_organization_tag_tagged_ids_t (tagged_id); +CREATE INDEX idx_gm_organization_tag_tagged_ids_t_tagged_id_committee_id ON gm_organization_tag_tagged_ids_t (tagged_id_committee_id); +CREATE INDEX idx_gm_organization_tag_tagged_ids_t_tagged_id_meeting_id ON gm_organization_tag_tagged_ids_t (tagged_id_meeting_id); CREATE TABLE gm_tag_tagged_ids_t ( - tag_id integer NOT NULL REFERENCES tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tag_id integer NOT NULL CONSTRAINT fk_gm_tag_tagged_ids_t_tag_id_tag_t_id REFERENCES tag_t(id) ON DELETE CASCADE INITIALLY DEFERRED, tagged_id varchar(100) NOT NULL, - tagged_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'agenda_item' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES agenda_item_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'assignment' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, - tagged_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'motion' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_agenda_item_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'agenda_item' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_tag_tagged_ids_t_tagged_id_agenda_item_id_agenda_item_id REFERENCES agenda_item_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_assignment_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'assignment' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_tag_tagged_ids_t_tagged_id_assignment_id_assignment_id REFERENCES assignment_t(id) ON DELETE CASCADE INITIALLY DEFERRED, + tagged_id_motion_id integer GENERATED ALWAYS AS (CASE WHEN split_part(tagged_id, '/', 1) = 'motion' THEN cast(split_part(tagged_id, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT fk_gm_tag_tagged_ids_t_tagged_id_motion_id_motion_id REFERENCES motion_t(id) ON DELETE CASCADE INITIALLY DEFERRED, CONSTRAINT valid_tagged_id_part1 CHECK (split_part(tagged_id, '/', 1) IN ('agenda_item', 'assignment', 'motion')), CONSTRAINT unique_$tag_id_$tagged_id UNIQUE (tag_id, tagged_id) ); -CREATE INDEX ON gm_tag_tagged_ids_t (tag_id); -CREATE INDEX ON gm_tag_tagged_ids_t (tagged_id); +CREATE INDEX idx_gm_tag_tagged_ids_t_tag_id ON gm_tag_tagged_ids_t (tag_id); +CREATE INDEX idx_gm_tag_tagged_ids_t_tagged_id ON gm_tag_tagged_ids_t (tagged_id); +CREATE INDEX idx_gm_tag_tagged_ids_t_tagged_id_agenda_item_id ON gm_tag_tagged_ids_t (tagged_id_agenda_item_id); +CREATE INDEX idx_gm_tag_tagged_ids_t_tagged_id_assignment_id ON gm_tag_tagged_ids_t (tagged_id_assignment_id); +CREATE INDEX idx_gm_tag_tagged_ids_t_tagged_id_motion_id ON gm_tag_tagged_ids_t (tagged_id_motion_id); -- View definitions @@ -2131,393 +2141,393 @@ comment on column "user".meeting_ids is 'Calculated. All ids from meetings calcu -- Alter table relations -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (content_object_id_motion_id); -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (content_object_id_motion_block_id); -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (content_object_id_assignment_id); -ALTER TABLE agenda_item_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (content_object_id_topic_id); -ALTER TABLE agenda_item_t ADD FOREIGN KEY(parent_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (parent_id); -ALTER TABLE agenda_item_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON agenda_item_t (meeting_id); - -ALTER TABLE assignment_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON assignment_t (meeting_id); - -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON assignment_candidate_t (assignment_id); -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON assignment_candidate_t (meeting_user_id); -ALTER TABLE assignment_candidate_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON assignment_candidate_t (meeting_id); - -ALTER TABLE ballot_t ADD FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON ballot_t (poll_id); -ALTER TABLE ballot_t ADD FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON ballot_t (acting_meeting_user_id); -ALTER TABLE ballot_t ADD FOREIGN KEY(represented_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON ballot_t (represented_meeting_user_id); - -ALTER TABLE chat_group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON chat_group_t (meeting_id); - -ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON chat_message_t (meeting_user_id); -ALTER TABLE chat_message_t ADD FOREIGN KEY(chat_group_id) REFERENCES chat_group_t(id) INITIALLY DEFERRED; -CREATE INDEX ON chat_message_t (chat_group_id); -ALTER TABLE chat_message_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON chat_message_t (meeting_id); - -ALTER TABLE committee_t ADD FOREIGN KEY(default_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON committee_t (default_meeting_id); -ALTER TABLE committee_t ADD FOREIGN KEY(parent_id) REFERENCES committee_t(id) INITIALLY DEFERRED; -CREATE INDEX ON committee_t (parent_id); - -ALTER TABLE group_t ADD FOREIGN KEY(used_as_motion_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON group_t (used_as_motion_poll_default_id); -ALTER TABLE group_t ADD FOREIGN KEY(used_as_assignment_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON group_t (used_as_assignment_poll_default_id); -ALTER TABLE group_t ADD FOREIGN KEY(used_as_topic_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON group_t (used_as_topic_poll_default_id); -ALTER TABLE group_t ADD FOREIGN KEY(used_as_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON group_t (used_as_poll_default_id); -ALTER TABLE group_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON group_t (meeting_id); - -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_entry_t (model_id_user_id); -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_entry_t (model_id_motion_id); -ALTER TABLE history_entry_t ADD FOREIGN KEY(model_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_entry_t (model_id_assignment_id); -ALTER TABLE history_entry_t ADD FOREIGN KEY(position_id) REFERENCES history_position_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_entry_t (position_id); -ALTER TABLE history_entry_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_entry_t (meeting_id); - -ALTER TABLE history_position_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON history_position_t (user_id); - -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (content_object_id_motion_id); -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (content_object_id_motion_block_id); -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (content_object_id_assignment_id); -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (content_object_id_topic_id); -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (content_object_id_meeting_mediafile_id); -ALTER TABLE list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON list_of_speakers_t (meeting_id); - -ALTER TABLE mediafile_t ADD FOREIGN KEY(published_to_meetings_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -CREATE INDEX ON mediafile_t (published_to_meetings_in_organization_id); -ALTER TABLE mediafile_t ADD FOREIGN KEY(parent_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON mediafile_t (parent_id); -ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON mediafile_t (owner_id_meeting_id); -ALTER TABLE mediafile_t ADD FOREIGN KEY(owner_id_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -CREATE INDEX ON mediafile_t (owner_id_organization_id); - -ALTER TABLE meeting_t ADD FOREIGN KEY(is_active_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (is_active_in_organization_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(is_archived_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (is_archived_in_organization_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(template_for_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (template_for_organization_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(motions_default_workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (motions_default_workflow_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(motions_default_amendment_workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (motions_default_amendment_workflow_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_projector_main_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_projector_main_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_projector_header_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_projector_header_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_web_header_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_web_header_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_pdf_header_l_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_pdf_header_l_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_pdf_header_r_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_pdf_header_r_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_pdf_footer_l_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_pdf_footer_l_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_pdf_footer_r_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_pdf_footer_r_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(logo_pdf_ballot_paper_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (logo_pdf_ballot_paper_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_regular_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_regular_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_italic_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_italic_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_bold_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_bold_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_bold_italic_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_bold_italic_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_monospace_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_monospace_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_chyron_speaker_name_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_chyron_speaker_name_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_projector_h1_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_projector_h1_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(font_projector_h2_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (font_projector_h2_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (committee_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(reference_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (reference_projector_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(list_of_speakers_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (list_of_speakers_countdown_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(poll_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (poll_countdown_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(default_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (default_group_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(admin_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (admin_group_id); -ALTER TABLE meeting_t ADD FOREIGN KEY(anonymous_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_t (anonymous_group_id); - -ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(mediafile_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_mediafile_t (mediafile_id); -ALTER TABLE meeting_mediafile_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_mediafile_t (meeting_id); - -ALTER TABLE meeting_user_t ADD FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_user_t (user_id); -ALTER TABLE meeting_user_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_user_t (meeting_id); -ALTER TABLE meeting_user_t ADD FOREIGN KEY(vote_delegated_to_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON meeting_user_t (vote_delegated_to_id); - -ALTER TABLE motion_t ADD FOREIGN KEY(lead_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (lead_motion_id); -ALTER TABLE motion_t ADD FOREIGN KEY(sort_parent_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (sort_parent_id); -ALTER TABLE motion_t ADD FOREIGN KEY(origin_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (origin_id); -ALTER TABLE motion_t ADD FOREIGN KEY(origin_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (origin_meeting_id); -ALTER TABLE motion_t ADD FOREIGN KEY(state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (state_id); -ALTER TABLE motion_t ADD FOREIGN KEY(recommendation_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (recommendation_id); -ALTER TABLE motion_t ADD FOREIGN KEY(category_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (category_id); -ALTER TABLE motion_t ADD FOREIGN KEY(block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (block_id); -ALTER TABLE motion_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_t (meeting_id); - -ALTER TABLE motion_block_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_block_t (meeting_id); - -ALTER TABLE motion_category_t ADD FOREIGN KEY(parent_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_category_t (parent_id); -ALTER TABLE motion_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_category_t (meeting_id); - -ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_change_recommendation_t (motion_id); -ALTER TABLE motion_change_recommendation_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_change_recommendation_t (meeting_id); - -ALTER TABLE motion_comment_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_comment_t (motion_id); -ALTER TABLE motion_comment_t ADD FOREIGN KEY(section_id) REFERENCES motion_comment_section_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_comment_t (section_id); -ALTER TABLE motion_comment_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_comment_t (meeting_id); - -ALTER TABLE motion_comment_section_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_comment_section_t (meeting_id); - -ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_editor_t (meeting_user_id); -ALTER TABLE motion_editor_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_editor_t (motion_id); -ALTER TABLE motion_editor_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_editor_t (meeting_id); - -ALTER TABLE motion_state_t ADD FOREIGN KEY(submitter_withdraw_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_state_t (submitter_withdraw_state_id); -ALTER TABLE motion_state_t ADD FOREIGN KEY(workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_state_t (workflow_id); -ALTER TABLE motion_state_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_state_t (meeting_id); - -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_submitter_t (meeting_user_id); -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_submitter_t (motion_id); -ALTER TABLE motion_submitter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_submitter_t (meeting_id); - -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_supporter_t (meeting_user_id); -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_supporter_t (motion_id); -ALTER TABLE motion_supporter_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_supporter_t (meeting_id); - -ALTER TABLE motion_workflow_t ADD FOREIGN KEY(first_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_workflow_t (first_state_id); -ALTER TABLE motion_workflow_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_workflow_t (meeting_id); - -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_working_group_speaker_t (meeting_user_id); -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_working_group_speaker_t (motion_id); -ALTER TABLE motion_working_group_speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON motion_working_group_speaker_t (meeting_id); - -ALTER TABLE organization_t ADD FOREIGN KEY(theme_id) REFERENCES theme_t(id) INITIALLY DEFERRED; -CREATE INDEX ON organization_t (theme_id); - -ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON personal_note_t (meeting_user_id); -ALTER TABLE personal_note_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON personal_note_t (content_object_id_motion_id); -ALTER TABLE personal_note_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON personal_note_t (meeting_id); - -ALTER TABLE point_of_order_category_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON point_of_order_category_t (meeting_id); - -ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (config_id_poll_config_approval_id); -ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (config_id_poll_config_selection_id); -ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (config_id_poll_config_rating_score_id); -ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (config_id_poll_config_rating_approval_id); -ALTER TABLE poll_t ADD FOREIGN KEY(config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (config_id_poll_config_stv_scottish_id); -ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (content_object_id_motion_id); -ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (content_object_id_assignment_id); -ALTER TABLE poll_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (content_object_id_topic_id); -ALTER TABLE poll_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_t (meeting_id); - -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_approval_id); -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_selection_id); -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_rating_score_id); -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_rating_approval_id); -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(poll_config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (poll_config_id_poll_config_stv_scottish_id); -ALTER TABLE poll_config_option_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON poll_config_option_t (meeting_user_id); - -ALTER TABLE projection_t ADD FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (current_projector_id); -ALTER TABLE projection_t ADD FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (preview_projector_id); -ALTER TABLE projection_t ADD FOREIGN KEY(history_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (history_projector_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_meeting_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_motion_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_meeting_mediafile_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_list_of_speakers_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_motion_block_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_assignment_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_agenda_item_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_agenda_item_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_topic_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_poll_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_message_id) REFERENCES projector_message_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_projector_message_id); -ALTER TABLE projection_t ADD FOREIGN KEY(content_object_id_projector_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (content_object_id_projector_countdown_id); -ALTER TABLE projection_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projection_t (meeting_id); - -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_agenda_item_list_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_agenda_item_list_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_topic_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_topic_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_list_of_speakers_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_list_of_speakers_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_current_los_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_current_los_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_motion_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_motion_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_amendment_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_amendment_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_motion_block_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_motion_block_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_assignment_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_assignment_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_mediafile_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_mediafile_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_message_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_message_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_countdown_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_countdown_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_assignment_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_assignment_poll_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_motion_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_motion_poll_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(used_as_default_projector_for_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (used_as_default_projector_for_poll_in_meeting_id); -ALTER TABLE projector_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_t (meeting_id); - -ALTER TABLE projector_countdown_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_countdown_t (meeting_id); - -ALTER TABLE projector_message_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON projector_message_t (meeting_id); - -ALTER TABLE speaker_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -CREATE INDEX ON speaker_t (list_of_speakers_id); -ALTER TABLE speaker_t ADD FOREIGN KEY(structure_level_list_of_speakers_id) REFERENCES structure_level_list_of_speakers_t(id) INITIALLY DEFERRED; -CREATE INDEX ON speaker_t (structure_level_list_of_speakers_id); -ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX ON speaker_t (meeting_user_id); -ALTER TABLE speaker_t ADD FOREIGN KEY(point_of_order_category_id) REFERENCES point_of_order_category_t(id) INITIALLY DEFERRED; -CREATE INDEX ON speaker_t (point_of_order_category_id); -ALTER TABLE speaker_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON speaker_t (meeting_id); - -ALTER TABLE structure_level_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON structure_level_t (meeting_id); - -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(structure_level_id) REFERENCES structure_level_t(id) INITIALLY DEFERRED; -CREATE INDEX ON structure_level_list_of_speakers_t (structure_level_id); -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; -CREATE INDEX ON structure_level_list_of_speakers_t (list_of_speakers_id); -ALTER TABLE structure_level_list_of_speakers_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON structure_level_list_of_speakers_t (meeting_id); - -ALTER TABLE tag_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON tag_t (meeting_id); - -ALTER TABLE topic_t ADD FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX ON topic_t (meeting_id); - -ALTER TABLE user_t ADD FOREIGN KEY(gender_id) REFERENCES gender_t(id) INITIALLY DEFERRED; -CREATE INDEX ON user_t (gender_id); -ALTER TABLE user_t ADD FOREIGN KEY(home_committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; -CREATE INDEX ON user_t (home_committee_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_content_object_id_motion_id_motion_t_id FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_content_object_id_motion_id ON agenda_item_t (content_object_id_motion_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_content_object_id_motion_block_id_motiofc82ae2 FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_content_object_id_motion_block_id ON agenda_item_t (content_object_id_motion_block_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_content_object_id_assignment_id_assignmd1e068c FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_content_object_id_assignment_id ON agenda_item_t (content_object_id_assignment_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_content_object_id_topic_id_topic_t_id FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_content_object_id_topic_id ON agenda_item_t (content_object_id_topic_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_parent_id_agenda_item_t_id FOREIGN KEY(parent_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_parent_id ON agenda_item_t (parent_id); +ALTER TABLE agenda_item_t ADD CONSTRAINT fk_agenda_item_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_agenda_item_t_meeting_id ON agenda_item_t (meeting_id); + +ALTER TABLE assignment_t ADD CONSTRAINT fk_assignment_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_assignment_t_meeting_id ON assignment_t (meeting_id); + +ALTER TABLE assignment_candidate_t ADD CONSTRAINT fk_assignment_candidate_t_assignment_id_assignment_t_id FOREIGN KEY(assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_assignment_candidate_t_assignment_id ON assignment_candidate_t (assignment_id); +ALTER TABLE assignment_candidate_t ADD CONSTRAINT fk_assignment_candidate_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_assignment_candidate_t_meeting_user_id ON assignment_candidate_t (meeting_user_id); +ALTER TABLE assignment_candidate_t ADD CONSTRAINT fk_assignment_candidate_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_assignment_candidate_t_meeting_id ON assignment_candidate_t (meeting_id); + +ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_ballot_t_poll_id ON ballot_t (poll_id); +ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_acting_meeting_user_id_meeting_user_t_id FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_ballot_t_acting_meeting_user_id ON ballot_t (acting_meeting_user_id); +ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_represented_meeting_user_id_meeting_user_t_id FOREIGN KEY(represented_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_ballot_t_represented_meeting_user_id ON ballot_t (represented_meeting_user_id); + +ALTER TABLE chat_group_t ADD CONSTRAINT fk_chat_group_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_chat_group_t_meeting_id ON chat_group_t (meeting_id); + +ALTER TABLE chat_message_t ADD CONSTRAINT fk_chat_message_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_chat_message_t_meeting_user_id ON chat_message_t (meeting_user_id); +ALTER TABLE chat_message_t ADD CONSTRAINT fk_chat_message_t_chat_group_id_chat_group_t_id FOREIGN KEY(chat_group_id) REFERENCES chat_group_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_chat_message_t_chat_group_id ON chat_message_t (chat_group_id); +ALTER TABLE chat_message_t ADD CONSTRAINT fk_chat_message_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_chat_message_t_meeting_id ON chat_message_t (meeting_id); + +ALTER TABLE committee_t ADD CONSTRAINT fk_committee_t_default_meeting_id_meeting_t_id FOREIGN KEY(default_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_committee_t_default_meeting_id ON committee_t (default_meeting_id); +ALTER TABLE committee_t ADD CONSTRAINT fk_committee_t_parent_id_committee_t_id FOREIGN KEY(parent_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_committee_t_parent_id ON committee_t (parent_id); + +ALTER TABLE group_t ADD CONSTRAINT fk_group_t_used_as_motion_poll_default_id_meeting_t_id FOREIGN KEY(used_as_motion_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_group_t_used_as_motion_poll_default_id ON group_t (used_as_motion_poll_default_id); +ALTER TABLE group_t ADD CONSTRAINT fk_group_t_used_as_assignment_poll_default_id_meeting_t_id FOREIGN KEY(used_as_assignment_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_group_t_used_as_assignment_poll_default_id ON group_t (used_as_assignment_poll_default_id); +ALTER TABLE group_t ADD CONSTRAINT fk_group_t_used_as_topic_poll_default_id_meeting_t_id FOREIGN KEY(used_as_topic_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_group_t_used_as_topic_poll_default_id ON group_t (used_as_topic_poll_default_id); +ALTER TABLE group_t ADD CONSTRAINT fk_group_t_used_as_poll_default_id_meeting_t_id FOREIGN KEY(used_as_poll_default_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_group_t_used_as_poll_default_id ON group_t (used_as_poll_default_id); +ALTER TABLE group_t ADD CONSTRAINT fk_group_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_group_t_meeting_id ON group_t (meeting_id); + +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_user_id_user_t_id FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_user_id ON history_entry_t (model_id_user_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_motion_id_motion_t_id FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_motion_id ON history_entry_t (model_id_motion_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_assignment_id_assignment_t_id FOREIGN KEY(model_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_assignment_id ON history_entry_t (model_id_assignment_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_position_id_history_position_t_id FOREIGN KEY(position_id) REFERENCES history_position_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_position_id ON history_entry_t (position_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_meeting_id ON history_entry_t (meeting_id); + +ALTER TABLE history_position_t ADD CONSTRAINT fk_history_position_t_user_id_user_t_id FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_position_t_user_id ON history_position_t (user_id); + +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_content_object_id_motion_id_motion_t_id FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_content_object_id_motion_id ON list_of_speakers_t (content_object_id_motion_id); +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_content_object_id_motion_block_id_62f90e7 FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_content_object_id_motion_block_id ON list_of_speakers_t (content_object_id_motion_block_id); +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_content_object_id_assignment_id_as9909666 FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_content_object_id_assignment_id ON list_of_speakers_t (content_object_id_assignment_id); +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_content_object_id_topic_id_topic_t_id FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_content_object_id_topic_id ON list_of_speakers_t (content_object_id_topic_id); +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_content_object_id_meeting_mediafilc591d1a FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_content_object_id_meeting_mediafile_id ON list_of_speakers_t (content_object_id_meeting_mediafile_id); +ALTER TABLE list_of_speakers_t ADD CONSTRAINT fk_list_of_speakers_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_list_of_speakers_t_meeting_id ON list_of_speakers_t (meeting_id); + +ALTER TABLE mediafile_t ADD CONSTRAINT fk_mediafile_t_published_to_meetings_in_organization_id_471fd9a FOREIGN KEY(published_to_meetings_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_mediafile_t_published_to_meetings_in_organization_id ON mediafile_t (published_to_meetings_in_organization_id); +ALTER TABLE mediafile_t ADD CONSTRAINT fk_mediafile_t_parent_id_mediafile_t_id FOREIGN KEY(parent_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_mediafile_t_parent_id ON mediafile_t (parent_id); +ALTER TABLE mediafile_t ADD CONSTRAINT fk_mediafile_t_owner_id_meeting_id_meeting_t_id FOREIGN KEY(owner_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_mediafile_t_owner_id_meeting_id ON mediafile_t (owner_id_meeting_id); +ALTER TABLE mediafile_t ADD CONSTRAINT fk_mediafile_t_owner_id_organization_id_organization_t_id FOREIGN KEY(owner_id_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_mediafile_t_owner_id_organization_id ON mediafile_t (owner_id_organization_id); + +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_is_active_in_organization_id_organization_t_id FOREIGN KEY(is_active_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_is_active_in_organization_id ON meeting_t (is_active_in_organization_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_is_archived_in_organization_id_organization_t_id FOREIGN KEY(is_archived_in_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_is_archived_in_organization_id ON meeting_t (is_archived_in_organization_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_template_for_organization_id_organization_t_id FOREIGN KEY(template_for_organization_id) REFERENCES organization_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_template_for_organization_id ON meeting_t (template_for_organization_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_motions_default_workflow_id_motion_workflow_t_id FOREIGN KEY(motions_default_workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_motions_default_workflow_id ON meeting_t (motions_default_workflow_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_motions_default_amendment_workflow_id_motio34ae2bf FOREIGN KEY(motions_default_amendment_workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_motions_default_amendment_workflow_id ON meeting_t (motions_default_amendment_workflow_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_projector_main_id_meeting_mediafile_t_id FOREIGN KEY(logo_projector_main_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_projector_main_id ON meeting_t (logo_projector_main_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_projector_header_id_meeting_mediafile_t_id FOREIGN KEY(logo_projector_header_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_projector_header_id ON meeting_t (logo_projector_header_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_web_header_id_meeting_mediafile_t_id FOREIGN KEY(logo_web_header_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_web_header_id ON meeting_t (logo_web_header_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_pdf_header_l_id_meeting_mediafile_t_id FOREIGN KEY(logo_pdf_header_l_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_pdf_header_l_id ON meeting_t (logo_pdf_header_l_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_pdf_header_r_id_meeting_mediafile_t_id FOREIGN KEY(logo_pdf_header_r_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_pdf_header_r_id ON meeting_t (logo_pdf_header_r_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_pdf_footer_l_id_meeting_mediafile_t_id FOREIGN KEY(logo_pdf_footer_l_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_pdf_footer_l_id ON meeting_t (logo_pdf_footer_l_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_pdf_footer_r_id_meeting_mediafile_t_id FOREIGN KEY(logo_pdf_footer_r_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_pdf_footer_r_id ON meeting_t (logo_pdf_footer_r_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_logo_pdf_ballot_paper_id_meeting_mediafile_t_id FOREIGN KEY(logo_pdf_ballot_paper_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_logo_pdf_ballot_paper_id ON meeting_t (logo_pdf_ballot_paper_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_regular_id_meeting_mediafile_t_id FOREIGN KEY(font_regular_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_regular_id ON meeting_t (font_regular_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_italic_id_meeting_mediafile_t_id FOREIGN KEY(font_italic_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_italic_id ON meeting_t (font_italic_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_bold_id_meeting_mediafile_t_id FOREIGN KEY(font_bold_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_bold_id ON meeting_t (font_bold_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_bold_italic_id_meeting_mediafile_t_id FOREIGN KEY(font_bold_italic_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_bold_italic_id ON meeting_t (font_bold_italic_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_monospace_id_meeting_mediafile_t_id FOREIGN KEY(font_monospace_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_monospace_id ON meeting_t (font_monospace_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_chyron_speaker_name_id_meeting_mediafile_t_id FOREIGN KEY(font_chyron_speaker_name_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_chyron_speaker_name_id ON meeting_t (font_chyron_speaker_name_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_projector_h1_id_meeting_mediafile_t_id FOREIGN KEY(font_projector_h1_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_projector_h1_id ON meeting_t (font_projector_h1_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_font_projector_h2_id_meeting_mediafile_t_id FOREIGN KEY(font_projector_h2_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_font_projector_h2_id ON meeting_t (font_projector_h2_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_committee_id_committee_t_id FOREIGN KEY(committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_committee_id ON meeting_t (committee_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_reference_projector_id_projector_t_id FOREIGN KEY(reference_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_reference_projector_id ON meeting_t (reference_projector_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_list_of_speakers_countdown_id_projector_cou566cfb1 FOREIGN KEY(list_of_speakers_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_list_of_speakers_countdown_id ON meeting_t (list_of_speakers_countdown_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_poll_countdown_id_projector_countdown_t_id FOREIGN KEY(poll_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_poll_countdown_id ON meeting_t (poll_countdown_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_default_group_id_group_t_id FOREIGN KEY(default_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_default_group_id ON meeting_t (default_group_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_admin_group_id_group_t_id FOREIGN KEY(admin_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_admin_group_id ON meeting_t (admin_group_id); +ALTER TABLE meeting_t ADD CONSTRAINT fk_meeting_t_anonymous_group_id_group_t_id FOREIGN KEY(anonymous_group_id) REFERENCES group_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_t_anonymous_group_id ON meeting_t (anonymous_group_id); + +ALTER TABLE meeting_mediafile_t ADD CONSTRAINT fk_meeting_mediafile_t_mediafile_id_mediafile_t_id FOREIGN KEY(mediafile_id) REFERENCES mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_mediafile_t_mediafile_id ON meeting_mediafile_t (mediafile_id); +ALTER TABLE meeting_mediafile_t ADD CONSTRAINT fk_meeting_mediafile_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_mediafile_t_meeting_id ON meeting_mediafile_t (meeting_id); + +ALTER TABLE meeting_user_t ADD CONSTRAINT fk_meeting_user_t_user_id_user_t_id FOREIGN KEY(user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_user_t_user_id ON meeting_user_t (user_id); +ALTER TABLE meeting_user_t ADD CONSTRAINT fk_meeting_user_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_user_t_meeting_id ON meeting_user_t (meeting_id); +ALTER TABLE meeting_user_t ADD CONSTRAINT fk_meeting_user_t_vote_delegated_to_id_meeting_user_t_id FOREIGN KEY(vote_delegated_to_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_meeting_user_t_vote_delegated_to_id ON meeting_user_t (vote_delegated_to_id); + +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_lead_motion_id_motion_t_id FOREIGN KEY(lead_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_lead_motion_id ON motion_t (lead_motion_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_sort_parent_id_motion_t_id FOREIGN KEY(sort_parent_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_sort_parent_id ON motion_t (sort_parent_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_origin_id_motion_t_id FOREIGN KEY(origin_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_origin_id ON motion_t (origin_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_origin_meeting_id_meeting_t_id FOREIGN KEY(origin_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_origin_meeting_id ON motion_t (origin_meeting_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_state_id_motion_state_t_id FOREIGN KEY(state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_state_id ON motion_t (state_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_recommendation_id_motion_state_t_id FOREIGN KEY(recommendation_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_recommendation_id ON motion_t (recommendation_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_category_id_motion_category_t_id FOREIGN KEY(category_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_category_id ON motion_t (category_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_block_id_motion_block_t_id FOREIGN KEY(block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_block_id ON motion_t (block_id); +ALTER TABLE motion_t ADD CONSTRAINT fk_motion_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_t_meeting_id ON motion_t (meeting_id); + +ALTER TABLE motion_block_t ADD CONSTRAINT fk_motion_block_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_block_t_meeting_id ON motion_block_t (meeting_id); + +ALTER TABLE motion_category_t ADD CONSTRAINT fk_motion_category_t_parent_id_motion_category_t_id FOREIGN KEY(parent_id) REFERENCES motion_category_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_category_t_parent_id ON motion_category_t (parent_id); +ALTER TABLE motion_category_t ADD CONSTRAINT fk_motion_category_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_category_t_meeting_id ON motion_category_t (meeting_id); + +ALTER TABLE motion_change_recommendation_t ADD CONSTRAINT fk_motion_change_recommendation_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_change_recommendation_t_motion_id ON motion_change_recommendation_t (motion_id); +ALTER TABLE motion_change_recommendation_t ADD CONSTRAINT fk_motion_change_recommendation_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_change_recommendation_t_meeting_id ON motion_change_recommendation_t (meeting_id); + +ALTER TABLE motion_comment_t ADD CONSTRAINT fk_motion_comment_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_comment_t_motion_id ON motion_comment_t (motion_id); +ALTER TABLE motion_comment_t ADD CONSTRAINT fk_motion_comment_t_section_id_motion_comment_section_t_id FOREIGN KEY(section_id) REFERENCES motion_comment_section_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_comment_t_section_id ON motion_comment_t (section_id); +ALTER TABLE motion_comment_t ADD CONSTRAINT fk_motion_comment_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_comment_t_meeting_id ON motion_comment_t (meeting_id); + +ALTER TABLE motion_comment_section_t ADD CONSTRAINT fk_motion_comment_section_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_comment_section_t_meeting_id ON motion_comment_section_t (meeting_id); + +ALTER TABLE motion_editor_t ADD CONSTRAINT fk_motion_editor_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_editor_t_meeting_user_id ON motion_editor_t (meeting_user_id); +ALTER TABLE motion_editor_t ADD CONSTRAINT fk_motion_editor_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_editor_t_motion_id ON motion_editor_t (motion_id); +ALTER TABLE motion_editor_t ADD CONSTRAINT fk_motion_editor_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_editor_t_meeting_id ON motion_editor_t (meeting_id); + +ALTER TABLE motion_state_t ADD CONSTRAINT fk_motion_state_t_submitter_withdraw_state_id_motion_state_t_id FOREIGN KEY(submitter_withdraw_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_state_t_submitter_withdraw_state_id ON motion_state_t (submitter_withdraw_state_id); +ALTER TABLE motion_state_t ADD CONSTRAINT fk_motion_state_t_workflow_id_motion_workflow_t_id FOREIGN KEY(workflow_id) REFERENCES motion_workflow_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_state_t_workflow_id ON motion_state_t (workflow_id); +ALTER TABLE motion_state_t ADD CONSTRAINT fk_motion_state_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_state_t_meeting_id ON motion_state_t (meeting_id); + +ALTER TABLE motion_submitter_t ADD CONSTRAINT fk_motion_submitter_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_submitter_t_meeting_user_id ON motion_submitter_t (meeting_user_id); +ALTER TABLE motion_submitter_t ADD CONSTRAINT fk_motion_submitter_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_submitter_t_motion_id ON motion_submitter_t (motion_id); +ALTER TABLE motion_submitter_t ADD CONSTRAINT fk_motion_submitter_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_submitter_t_meeting_id ON motion_submitter_t (meeting_id); + +ALTER TABLE motion_supporter_t ADD CONSTRAINT fk_motion_supporter_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_supporter_t_meeting_user_id ON motion_supporter_t (meeting_user_id); +ALTER TABLE motion_supporter_t ADD CONSTRAINT fk_motion_supporter_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_supporter_t_motion_id ON motion_supporter_t (motion_id); +ALTER TABLE motion_supporter_t ADD CONSTRAINT fk_motion_supporter_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_supporter_t_meeting_id ON motion_supporter_t (meeting_id); + +ALTER TABLE motion_workflow_t ADD CONSTRAINT fk_motion_workflow_t_first_state_id_motion_state_t_id FOREIGN KEY(first_state_id) REFERENCES motion_state_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_workflow_t_first_state_id ON motion_workflow_t (first_state_id); +ALTER TABLE motion_workflow_t ADD CONSTRAINT fk_motion_workflow_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_workflow_t_meeting_id ON motion_workflow_t (meeting_id); + +ALTER TABLE motion_working_group_speaker_t ADD CONSTRAINT fk_motion_working_group_speaker_t_meeting_user_id_meetinbc3a7bb FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_working_group_speaker_t_meeting_user_id ON motion_working_group_speaker_t (meeting_user_id); +ALTER TABLE motion_working_group_speaker_t ADD CONSTRAINT fk_motion_working_group_speaker_t_motion_id_motion_t_id FOREIGN KEY(motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_working_group_speaker_t_motion_id ON motion_working_group_speaker_t (motion_id); +ALTER TABLE motion_working_group_speaker_t ADD CONSTRAINT fk_motion_working_group_speaker_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_motion_working_group_speaker_t_meeting_id ON motion_working_group_speaker_t (meeting_id); + +ALTER TABLE organization_t ADD CONSTRAINT fk_organization_t_theme_id_theme_t_id FOREIGN KEY(theme_id) REFERENCES theme_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_organization_t_theme_id ON organization_t (theme_id); + +ALTER TABLE personal_note_t ADD CONSTRAINT fk_personal_note_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_personal_note_t_meeting_user_id ON personal_note_t (meeting_user_id); +ALTER TABLE personal_note_t ADD CONSTRAINT fk_personal_note_t_content_object_id_motion_id_motion_t_id FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_personal_note_t_content_object_id_motion_id ON personal_note_t (content_object_id_motion_id); +ALTER TABLE personal_note_t ADD CONSTRAINT fk_personal_note_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_personal_note_t_meeting_id ON personal_note_t (meeting_id); + +ALTER TABLE point_of_order_category_t ADD CONSTRAINT fk_point_of_order_category_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_point_of_order_category_t_meeting_id ON point_of_order_category_t (meeting_id); + +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_config_id_poll_config_approval_id_poll_config_f74c82e FOREIGN KEY(config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_config_id_poll_config_approval_id ON poll_t (config_id_poll_config_approval_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_config_id_poll_config_selection_id_poll_config65f401f FOREIGN KEY(config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_config_id_poll_config_selection_id ON poll_t (config_id_poll_config_selection_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_config_id_poll_config_rating_score_id_poll_conff3b6f0 FOREIGN KEY(config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_config_id_poll_config_rating_score_id ON poll_t (config_id_poll_config_rating_score_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_config_id_poll_config_rating_approval_id_poll_6ff58a7 FOREIGN KEY(config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_config_id_poll_config_rating_approval_id ON poll_t (config_id_poll_config_rating_approval_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_config_id_poll_config_stv_scottish_id_poll_con0ff7fb4 FOREIGN KEY(config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_config_id_poll_config_stv_scottish_id ON poll_t (config_id_poll_config_stv_scottish_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_content_object_id_motion_id_motion_t_id FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_content_object_id_motion_id ON poll_t (content_object_id_motion_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_content_object_id_assignment_id_assignment_t_id FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_content_object_id_assignment_id ON poll_t (content_object_id_assignment_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_content_object_id_topic_id_topic_t_id FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_content_object_id_topic_id ON poll_t (content_object_id_topic_id); +ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_t_meeting_id ON poll_t (meeting_id); + +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_appro6960976 FOREIGN KEY(poll_config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_approval_id ON poll_config_option_t (poll_config_id_poll_config_approval_id); +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_selecf8ee498 FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_selef031df2 ON poll_config_option_t (poll_config_id_poll_config_selection_id); +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_ratinad2ee64 FOREIGN KEY(poll_config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_ratia91759a ON poll_config_option_t (poll_config_id_poll_config_rating_score_id); +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_ratin79bc2a7 FOREIGN KEY(poll_config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_rati9075d6e ON poll_config_option_t (poll_config_id_poll_config_rating_approval_id); +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_stv_s66764cc FOREIGN KEY(poll_config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_stv_83d6519 ON poll_config_option_t (poll_config_id_poll_config_stv_scottish_id); +ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_config_option_t_meeting_user_id ON poll_config_option_t (meeting_user_id); + +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_current_projector_id_projector_t_id FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_current_projector_id ON projection_t (current_projector_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_preview_projector_id_projector_t_id FOREIGN KEY(preview_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_preview_projector_id ON projection_t (preview_projector_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_history_projector_id_projector_t_id FOREIGN KEY(history_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_history_projector_id ON projection_t (history_projector_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_meeting_id_meeting_t_id FOREIGN KEY(content_object_id_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_meeting_id ON projection_t (content_object_id_meeting_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_motion_id_motion_t_id FOREIGN KEY(content_object_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_motion_id ON projection_t (content_object_id_motion_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_meeting_mediafile_id_m09270d6 FOREIGN KEY(content_object_id_meeting_mediafile_id) REFERENCES meeting_mediafile_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_meeting_mediafile_id ON projection_t (content_object_id_meeting_mediafile_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_list_of_speakers_id_li392b5e1 FOREIGN KEY(content_object_id_list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_list_of_speakers_id ON projection_t (content_object_id_list_of_speakers_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_motion_block_id_motioncbb3c5b FOREIGN KEY(content_object_id_motion_block_id) REFERENCES motion_block_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_motion_block_id ON projection_t (content_object_id_motion_block_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_assignment_id_assignment_t_id FOREIGN KEY(content_object_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_assignment_id ON projection_t (content_object_id_assignment_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_agenda_item_id_agenda_bd5d814 FOREIGN KEY(content_object_id_agenda_item_id) REFERENCES agenda_item_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_agenda_item_id ON projection_t (content_object_id_agenda_item_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_topic_id_topic_t_id FOREIGN KEY(content_object_id_topic_id) REFERENCES topic_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_topic_id ON projection_t (content_object_id_topic_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_poll_id_poll_t_id FOREIGN KEY(content_object_id_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_poll_id ON projection_t (content_object_id_poll_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_projector_message_id_p5c0a05e FOREIGN KEY(content_object_id_projector_message_id) REFERENCES projector_message_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_projector_message_id ON projection_t (content_object_id_projector_message_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_content_object_id_projector_countdown_id1942f3a FOREIGN KEY(content_object_id_projector_countdown_id) REFERENCES projector_countdown_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_content_object_id_projector_countdown_id ON projection_t (content_object_id_projector_countdown_id); +ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projection_t_meeting_id ON projection_t (meeting_id); + +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_agenda_itemca4cc75 FOREIGN KEY(used_as_default_projector_for_agenda_item_list_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_agenda_ite41b5bd9 ON projector_t (used_as_default_projector_for_agenda_item_list_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_topic_in_me0971ea7 FOREIGN KEY(used_as_default_projector_for_topic_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_topic_in_mab361e8 ON projector_t (used_as_default_projector_for_topic_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_list_of_spe619d36f FOREIGN KEY(used_as_default_projector_for_list_of_speakers_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_list_of_spb099704 ON projector_t (used_as_default_projector_for_list_of_speakers_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_current_lose8cefef FOREIGN KEY(used_as_default_projector_for_current_los_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_current_locdd5b27 ON projector_t (used_as_default_projector_for_current_los_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_motion_in_m3a0e1e4 FOREIGN KEY(used_as_default_projector_for_motion_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_motion_in_f66691f ON projector_t (used_as_default_projector_for_motion_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_amendment_i4b417bf FOREIGN KEY(used_as_default_projector_for_amendment_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_amendment_2235e12 ON projector_t (used_as_default_projector_for_amendment_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_motion_blocd05a71e FOREIGN KEY(used_as_default_projector_for_motion_block_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_motion_blo7b0c3c8 ON projector_t (used_as_default_projector_for_motion_block_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_assignment_ddcffde FOREIGN KEY(used_as_default_projector_for_assignment_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_assignment78622ce ON projector_t (used_as_default_projector_for_assignment_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_mediafile_i9b33fdb FOREIGN KEY(used_as_default_projector_for_mediafile_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_mediafile_1c31a99 ON projector_t (used_as_default_projector_for_mediafile_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_message_in_21dcbf0 FOREIGN KEY(used_as_default_projector_for_message_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_message_in339958e ON projector_t (used_as_default_projector_for_message_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_countdown_if9b333e FOREIGN KEY(used_as_default_projector_for_countdown_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_countdown_07665b4 ON projector_t (used_as_default_projector_for_countdown_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_assignment_8b61ac6 FOREIGN KEY(used_as_default_projector_for_assignment_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_assignment5a08584 ON projector_t (used_as_default_projector_for_assignment_poll_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_motion_poll5bff78e FOREIGN KEY(used_as_default_projector_for_motion_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_motion_pol0605aa8 ON projector_t (used_as_default_projector_for_motion_poll_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_used_as_default_projector_for_poll_in_mee417a148 FOREIGN KEY(used_as_default_projector_for_poll_in_meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_used_as_default_projector_for_poll_in_me446bdba ON projector_t (used_as_default_projector_for_poll_in_meeting_id); +ALTER TABLE projector_t ADD CONSTRAINT fk_projector_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_t_meeting_id ON projector_t (meeting_id); + +ALTER TABLE projector_countdown_t ADD CONSTRAINT fk_projector_countdown_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_countdown_t_meeting_id ON projector_countdown_t (meeting_id); + +ALTER TABLE projector_message_t ADD CONSTRAINT fk_projector_message_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_projector_message_t_meeting_id ON projector_message_t (meeting_id); + +ALTER TABLE speaker_t ADD CONSTRAINT fk_speaker_t_list_of_speakers_id_list_of_speakers_t_id FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_speaker_t_list_of_speakers_id ON speaker_t (list_of_speakers_id); +ALTER TABLE speaker_t ADD CONSTRAINT fk_speaker_t_structure_level_list_of_speakers_id_structu559f22d FOREIGN KEY(structure_level_list_of_speakers_id) REFERENCES structure_level_list_of_speakers_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_speaker_t_structure_level_list_of_speakers_id ON speaker_t (structure_level_list_of_speakers_id); +ALTER TABLE speaker_t ADD CONSTRAINT fk_speaker_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_speaker_t_meeting_user_id ON speaker_t (meeting_user_id); +ALTER TABLE speaker_t ADD CONSTRAINT fk_speaker_t_point_of_order_category_id_point_of_order_ce6dbc9a FOREIGN KEY(point_of_order_category_id) REFERENCES point_of_order_category_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_speaker_t_point_of_order_category_id ON speaker_t (point_of_order_category_id); +ALTER TABLE speaker_t ADD CONSTRAINT fk_speaker_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_speaker_t_meeting_id ON speaker_t (meeting_id); + +ALTER TABLE structure_level_t ADD CONSTRAINT fk_structure_level_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_structure_level_t_meeting_id ON structure_level_t (meeting_id); + +ALTER TABLE structure_level_list_of_speakers_t ADD CONSTRAINT fk_structure_level_list_of_speakers_t_structure_level_idee3e20c FOREIGN KEY(structure_level_id) REFERENCES structure_level_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_structure_level_list_of_speakers_t_structure_level_id ON structure_level_list_of_speakers_t (structure_level_id); +ALTER TABLE structure_level_list_of_speakers_t ADD CONSTRAINT fk_structure_level_list_of_speakers_t_list_of_speakers_idbd2794 FOREIGN KEY(list_of_speakers_id) REFERENCES list_of_speakers_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_structure_level_list_of_speakers_t_list_of_speakers_id ON structure_level_list_of_speakers_t (list_of_speakers_id); +ALTER TABLE structure_level_list_of_speakers_t ADD CONSTRAINT fk_structure_level_list_of_speakers_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_structure_level_list_of_speakers_t_meeting_id ON structure_level_list_of_speakers_t (meeting_id); + +ALTER TABLE tag_t ADD CONSTRAINT fk_tag_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_tag_t_meeting_id ON tag_t (meeting_id); + +ALTER TABLE topic_t ADD CONSTRAINT fk_topic_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_topic_t_meeting_id ON topic_t (meeting_id); + +ALTER TABLE user_t ADD CONSTRAINT fk_user_t_gender_id_gender_t_id FOREIGN KEY(gender_id) REFERENCES gender_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_user_t_gender_id ON user_t (gender_id); +ALTER TABLE user_t ADD CONSTRAINT fk_user_t_home_committee_id_committee_t_id FOREIGN KEY(home_committee_id) REFERENCES committee_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_user_t_home_committee_id ON user_t (home_committee_id); @@ -3482,33 +3492,33 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('projector'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projector_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_agenda_item_li AFTER INSERT OR UPDATE OF used_as_default_projector_for_agenda_item_list_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_agenda_a3418fd AFTER INSERT OR UPDATE OF used_as_default_projector_for_agenda_item_list_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_agenda_item_list_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_topic_in_meeti AFTER INSERT OR UPDATE OF used_as_default_projector_for_topic_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_topic_iccc9ca7 AFTER INSERT OR UPDATE OF used_as_default_projector_for_topic_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_topic_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_list_of_speake AFTER INSERT OR UPDATE OF used_as_default_projector_for_list_of_speakers_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_list_offcea2e3 AFTER INSERT OR UPDATE OF used_as_default_projector_for_list_of_speakers_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_list_of_speakers_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_current_los_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_current_los_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_current897012e AFTER INSERT OR UPDATE OF used_as_default_projector_for_current_los_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_current_los_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_in_meet AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_9cf3618 AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_amendment_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_amendment_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_amendme4ebfd41 AFTER INSERT OR UPDATE OF used_as_default_projector_for_amendment_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_amendment_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_block_i AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_block_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_1b9d3a7 AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_block_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_block_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_in_ AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignm9e3b0b3 AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_mediafile_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_mediafile_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_mediafib4f0da8 AFTER INSERT OR UPDATE OF used_as_default_projector_for_mediafile_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_mediafile_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_message_in_mee AFTER INSERT OR UPDATE OF used_as_default_projector_for_message_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_message28c0ca6 AFTER INSERT OR UPDATE OF used_as_default_projector_for_message_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_message_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_countdown_in_m AFTER INSERT OR UPDATE OF used_as_default_projector_for_countdown_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_countdoe67f735 AFTER INSERT OR UPDATE OF used_as_default_projector_for_countdown_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_countdown_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignment_pol AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_poll_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_assignmf3a7b0f AFTER INSERT OR UPDATE OF used_as_default_projector_for_assignment_poll_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_assignment_poll_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_poll_in AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_poll_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_motion_c48d3bb AFTER INSERT OR UPDATE OF used_as_default_projector_for_motion_poll_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_motion_poll_in_meeting_id'); -CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_poll_in_meetin AFTER INSERT OR UPDATE OF used_as_default_projector_for_poll_in_meeting_id OR DELETE ON projector_t +CREATE TRIGGER tr_log_projector_t_used_as_default_projector_for_poll_inf6f7d63 AFTER INSERT OR UPDATE OF used_as_default_projector_for_poll_in_meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'used_as_default_projector_for_poll_in_meeting_id'); CREATE TRIGGER tr_log_projector_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON projector_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id'); diff --git a/dev/src/generate_sql_schema.py b/dev/src/generate_sql_schema.py index 096c7ec3..7df02a22 100644 --- a/dev/src/generate_sql_schema.py +++ b/dev/src/generate_sql_schema.py @@ -1,5 +1,4 @@ import string -import sys from collections import defaultdict from collections.abc import Callable from decimal import Decimal @@ -19,7 +18,6 @@ TableFieldType, ) -SOURCE = (Path(__file__).parent / ".." / ".." / "models.yml").resolve() DESTINATION = (Path(__file__).parent / ".." / "sql" / "schema_relational.sql").resolve() MODELS: dict[str, dict[str, Any]] = {} @@ -70,7 +68,7 @@ class GenerateCodeBlocks: """Main work is done here by recursing the models and their fields and determine the method to use""" if not InternalHelper.MODELS: - InternalHelper.read_models_yml(SOURCE.as_posix()) + InternalHelper.read_models_yml() intermediate_tables: dict[str, str] = ( {} ) # Key=Name, data: collected content of table @@ -228,8 +226,7 @@ def generate_the_code( @staticmethod def get_not_null_trigger_params(type_: str) -> dict[str, str]: if type_ == "1_1": - docstring = dedent( - """\ + docstring = dedent("""\ -- Parameters required for all operation types -- 0. own_collection – name of the view on which the trigger is defined -- 1. own_column – column in `own_table` referencing @@ -240,11 +237,9 @@ def get_not_null_trigger_params(type_: str) -> dict[str, str]: -- 2. foreign_collection – name of collection of the triggered table that -- will be used to SELECT -- 3. foreign_column – column in the foreign table referencing - -- `own_table`""" - ) + -- `own_table`""") parameters_declaration = indent( - dedent( - """\ + dedent("""\ -- Parameters from TRIGGER DEFINITION -- Always required own_collection TEXT := TG_ARGV[0]; @@ -258,26 +253,22 @@ def get_not_null_trigger_params(type_: str) -> dict[str, str]: own_id INTEGER; foreign_id INTEGER; counted INTEGER; - error_message TEXT;""" - ), + error_message TEXT;"""), " ", ) select_expression = "EXECUTE format('SELECT %I FROM %I WHERE id = %L', own_column, own_collection, own_id) INTO counted;" elif type_ == "1_n": - docstring = dedent( - """\ + docstring = dedent("""\ -- Parameters required for all operation types -- 0. own_table – name of the table on which the trigger is defined -- 1. own_column – column in `own_table` referencing -- `foreign_table` -- 2. foreign_table – name of the triggered table, that will be used to SELECT -- 3. foreign_column – column in the foreign table referencing - -- `own_table`""" - ) + -- `own_table`""") parameters_declaration = indent( - dedent( - """\ + dedent("""\ -- Parameters from TRIGGER DEFINITION -- Always required own_table TEXT := TG_ARGV[0]; @@ -291,15 +282,13 @@ def get_not_null_trigger_params(type_: str) -> dict[str, str]: own_id INTEGER; foreign_id INTEGER; counted INTEGER; - error_message TEXT;""" - ), + error_message TEXT;"""), " ", ) select_expression = "EXECUTE format('SELECT 1 FROM %I WHERE %I = %L', foreign_table, foreign_column, own_id) INTO counted;" else: - docstring = dedent( - """\ + docstring = dedent("""\ -- Parameters required for both INSERT and DELETE operations -- 0. intermediate_table_name – name of the n:m table -- 1. own_table – name of the table on which the trigger is defined @@ -314,11 +303,9 @@ def get_not_null_trigger_params(type_: str) -> dict[str, str]: -- the foreign table -- 5. foreign_collection – name of the collection of the foreign table -- 6. foreign_column – column in the foreign table referencing - -- `own_collection`""" - ) + -- `own_collection`""") parameters_declaration = indent( - dedent( - """\ + dedent("""\ -- Parameters from TRIGGER DEFINITION -- Always required intermediate_table_name TEXT := TG_ARGV[0]; @@ -336,8 +323,7 @@ def get_not_null_trigger_params(type_: str) -> dict[str, str]: own_id INTEGER; foreign_id INTEGER; counted INTEGER; - error_message TEXT;""" - ), + error_message TEXT;"""), " ", ) select_expression = "EXECUTE format('SELECT 1 FROM %I WHERE %I = %L', intermediate_table_name, intermediate_table_own_key, own_id) INTO counted;" @@ -752,13 +738,11 @@ def get_trigger_generate_partitioned_sequence( cls, view_name: str, actual_field: str, depend_field: str ) -> str: table_name = HelperGetNames.get_table_name(view_name) - return dedent( - f""" + return dedent(f""" -- definition trigger generate partitioned sequence number for {table_name}.{actual_field} partitioned by {depend_field} CREATE TRIGGER tr_generate_sequence_{view_name}_{actual_field} BEFORE INSERT ON {table_name} FOR EACH ROW EXECUTE FUNCTION generate_sequence('{table_name}', '{actual_field}', '{depend_field}'); - """ - ) + """) @classmethod def get_trigger_check_not_null_for_1_1_relation( @@ -770,16 +754,14 @@ def get_trigger_check_not_null_for_1_1_relation( ) -> str: own_table_t = HelperGetNames.get_table_name(own_collection) foreign_table_t = HelperGetNames.get_table_name(foreign_collection) - return dedent( - f""" + return dedent(f""" -- definition trigger not null for {own_collection}.{own_column} against {foreign_collection}.{foreign_column} CREATE CONSTRAINT TRIGGER {HelperGetNames.get_not_null_1_1_rel_insert_trigger_name(own_collection, own_column)} AFTER INSERT ON {own_table_t} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('{own_collection}', '{own_column}'); CREATE CONSTRAINT TRIGGER {HelperGetNames.get_not_null_1_1_rel_upd_del_trigger_name(own_collection, own_column)} AFTER UPDATE OF {foreign_column} OR DELETE ON {foreign_table_t} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_1('{own_collection}', '{own_column}', '{foreign_collection}', '{foreign_column}'); - """ - ) + """) @classmethod def get_trigger_check_not_null_for_1_n( @@ -791,8 +773,7 @@ def get_trigger_check_not_null_for_1_n( ) -> str: own_table_t = HelperGetNames.get_table_name(own_collection) foreign_table_t = HelperGetNames.get_table_name(foreign_collection) - return dedent( - f""" + return dedent(f""" -- definition trigger not null for {own_collection}.{own_column} against {foreign_collection}.{foreign_column} CREATE CONSTRAINT TRIGGER {HelperGetNames.get_not_null_rel_list_insert_trigger_name(own_collection, own_column)} AFTER INSERT ON {own_table_t} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_n('{own_table_t}', '{own_column}', '{foreign_table_t}', '{foreign_column}'); @@ -800,8 +781,7 @@ def get_trigger_check_not_null_for_1_n( CREATE CONSTRAINT TRIGGER {HelperGetNames.get_not_null_rel_list_upd_del_trigger_name(own_collection, own_column)} AFTER UPDATE OF {foreign_column} OR DELETE ON {foreign_table_t} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_1_n('{own_table_t}', '{own_column}', '{foreign_table_t}', '{foreign_column}'); - """ - ) + """) @classmethod def get_trigger_check_not_null_for_n_m( @@ -821,8 +801,7 @@ def get_trigger_check_not_null_for_n_m( intermediate_table_foreign_key = HelperGetNames.get_field_in_n_m_relation_list( foreign_table_field, own_table_field.table ) - return dedent( - f""" + return dedent(f""" -- definition trigger not null for {own_collection}.{own_column} against {foreign_collection}.{foreign_column} through {intermediate_table_name} CREATE CONSTRAINT TRIGGER tr_i_{own_collection}_{own_column} AFTER INSERT ON {own_table} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_n_m('{intermediate_table_name}', '{own_table}', '{own_column}', '{intermediate_table_own_key}'); @@ -830,8 +809,7 @@ def get_trigger_check_not_null_for_n_m( CREATE CONSTRAINT TRIGGER tr_d_{own_collection}_{own_column} AFTER DELETE ON {intermediate_table_name} INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_not_null_for_n_m('{intermediate_table_name}', '{own_table}', '{own_column}', '{intermediate_table_own_key}', '{intermediate_table_foreign_key}', '{foreign_collection}', '{foreign_column}'); - """ - ) + """) @classmethod def get_trigger_check_unique_ids_pair( @@ -841,14 +819,12 @@ def get_trigger_check_unique_ids_pair( table_name: str, ) -> str: base_column_name = column[:-1] - return dedent( - f""" + return dedent(f""" -- definition trigger unique ids pair for {view}.{column} CREATE TRIGGER restrict_{view}_{column} BEFORE INSERT OR UPDATE ON {table_name} FOR EACH ROW EXECUTE FUNCTION check_unique_ids_pair('{base_column_name}'); - """ - ) + """) @classmethod def get_generic_relation_type( @@ -960,14 +936,11 @@ def get_generic_relation_list_type( class Helper: - FILE_TEMPLATE_HEADER = dedent( - """ + FILE_TEMPLATE_HEADER = dedent(""" -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. - """ - ) - FILE_TEMPLATE_CONSTANT_DEFINITIONS = dedent( - """ + """) + FILE_TEMPLATE_CONSTANT_DEFINITIONS = dedent(""" CREATE EXTENSION hstore; -- included in standard postgres-installations, check for alpine CREATE FUNCTION generate_sequence() @@ -1131,11 +1104,8 @@ class Helper: RAISE EXCEPTION 'Table % is currently read-only.', TG_TABLE_NAME; END; $read_only_trigger$ LANGUAGE plpgsql; - """ - ) - NOT_NULL_TRIGGER_FUNCTION_TEMPLATE = string.Template( - dedent( - """ + """) + NOT_NULL_TRIGGER_FUNCTION_TEMPLATE = string.Template(dedent(""" CREATE FUNCTION check_not_null_for_${trigger_type}() RETURNS trigger AS $$not_null_trigger$$ ${docstring} DECLARE @@ -1165,49 +1135,42 @@ class Helper: RETURN NULL; -- AFTER TRIGGER needs no return END; $$not_null_trigger$$ language plpgsql; - """ - ) - ) + """)) COLLECTION_FROM_TABLE_TEMPLATE = string.Template( "${parameter} := SUBSTRING(${table_t} FOR LENGTH(${table_t}) - 2);" ) FIELD_TEMPLATE = string.Template( " ${field_name} ${type}${primary_key}${required}${unique}${check_enum}${minimum}${minLength}${default},\n" ) - INTERMEDIATE_TABLE_N_M_RELATION_TEMPLATE = string.Template( - dedent( - """ + INTERMEDIATE_TABLE_N_M_RELATION_TEMPLATE = string.Template(dedent(""" CREATE TABLE ${table_name} ( - ${field1} integer NOT NULL REFERENCES ${table1} (id) ON DELETE CASCADE INITIALLY DEFERRED, - ${field2} integer NOT NULL REFERENCES ${table2} (id) ON DELETE CASCADE INITIALLY DEFERRED, + ${field1} integer NOT NULL CONSTRAINT ${fk_name_1} REFERENCES ${table1} (id) ON DELETE CASCADE INITIALLY DEFERRED, + ${field2} integer NOT NULL CONSTRAINT ${fk_name_2} REFERENCES ${table2} (id) ON DELETE CASCADE INITIALLY DEFERRED, PRIMARY KEY (${list_of_keys}) ); - CREATE INDEX ON ${table_name} (${field1}); - CREATE INDEX ON ${table_name} (${field2}); - """ - ) - ) - INTERMEDIATE_TABLE_G_M_RELATION_TEMPLATE = string.Template( - dedent( - """ + CREATE INDEX ${index_1} ON ${table_name} (${field1}); + CREATE INDEX ${index_2} ON ${table_name} (${field2}); + """)) + INTERMEDIATE_TABLE_G_M_RELATION_TEMPLATE = string.Template(dedent(""" CREATE TABLE ${table_name} ( - ${own_table_name_with_ref_column} integer NOT NULL REFERENCES ${own_table_name}(${own_table_ref_column}) ON DELETE CASCADE INITIALLY DEFERRED, + ${own_table_name_with_ref_column} integer NOT NULL CONSTRAINT ${fk_name} REFERENCES ${own_table_name}(${own_table_ref_column}) ON DELETE CASCADE INITIALLY DEFERRED, ${own_table_column} varchar(100) NOT NULL, ${foreign_table_ref_lines} CONSTRAINT ${valid_constraint_name} CHECK (split_part(${own_table_column}, '/', 1) IN ${tuple_of_foreign_table_names}), CONSTRAINT ${unique_constraint_name} UNIQUE (${own_table_name_with_ref_column}, ${own_table_column}) ); - CREATE INDEX ON ${table_name} (${own_table_name_with_ref_column}); - CREATE INDEX ON ${table_name} (${own_table_column}); - """ - ) - ) + CREATE INDEX ${index_1} ON ${table_name} (${own_table_name_with_ref_column}); + CREATE INDEX ${index_2} ON ${table_name} (${own_table_column}); + ${content_field_indices} + """)) GM_FOREIGN_TABLE_LINE_TEMPLATE = string.Template( - " ${gm_content_field} integer GENERATED ALWAYS AS (CASE WHEN split_part(${own_table_column}, '/', 1) = '${foreign_view_name}' THEN cast(split_part(${own_table_column}, '/', 2) AS INTEGER) ELSE null END) STORED REFERENCES ${foreign_table_name}(id) ON DELETE CASCADE INITIALLY DEFERRED," + " ${gm_content_field} integer GENERATED ALWAYS AS (CASE WHEN split_part(${own_table_column}, '/', 1) = '${foreign_view_name}' THEN cast(split_part(${own_table_column}, '/', 2) AS INTEGER) ELSE null END) STORED CONSTRAINT ${fk_name} REFERENCES ${foreign_table_name}(id) ON DELETE CASCADE INITIALLY DEFERRED," + ) + GM_INDEX_LINE_TEMPLATE = string.Template( + "CREATE INDEX ${index} ON ${table_name} (${gm_content_field});" ) - RELATION_LIST_AGENDA = dedent( - """ + RELATION_LIST_AGENDA = dedent(""" /* Relation-list infos Generated: What will be generated for left field FIELD: a usual Database field @@ -1226,8 +1189,7 @@ class Helper: model.field names */ - """ - ) + """) @staticmethod def get_table_letter(table_name: str, letters: list[str] = []) -> str: @@ -1324,8 +1286,8 @@ def get_foreign_key_table_constraint_as_alter_table( update_action: str = "", ) -> str: FOREIGN_KEY_TABLE_CONSTRAINT_TEMPLATE = string.Template( - "ALTER TABLE ${own_table} ADD FOREIGN KEY(${own_column}) REFERENCES ${foreign_table}(${fk_column})${initially_deferred}${delete_action}${update_action};\n" - "CREATE INDEX ON ${own_table} (${own_column});\n" + "ALTER TABLE ${own_table} ADD CONSTRAINT ${fk_name} FOREIGN KEY(${own_column}) REFERENCES ${foreign_table}(${fk_column})${initially_deferred}${delete_action}${update_action};\n" + "CREATE INDEX ${index} ON ${own_table} (${own_column});\n" ) if initially_deferred: @@ -1334,9 +1296,14 @@ def get_foreign_key_table_constraint_as_alter_table( text_initially_deferred = "" own_table = HelperGetNames.get_table_name(table_name) foreign_table = HelperGetNames.get_table_name(foreign_table) + fk_idx = HelperGetNames.get_fk_and_index_name( + own_table, own_column, foreign_table, fk_column + ) result = FOREIGN_KEY_TABLE_CONSTRAINT_TEMPLATE.substitute( { "own_table": own_table, + "fk_name": fk_idx[0], + "index": fk_idx[1], "foreign_table": foreign_table, "own_column": own_column, "fk_column": fk_column, @@ -1390,13 +1357,21 @@ def get_nm_table_for_n_m_relation_lists( field1 += "_1" field2 += "_2" table_name = HelperGetNames.get_table_name(nm_table_name) + table1 = HelperGetNames.get_table_name(own_table_field.table) + table2 = HelperGetNames.get_table_name(foreign_table_field.table) + fk_idx1 = HelperGetNames.get_fk_and_index_name(table_name, field1, table1, "id") + fk_idx2 = HelperGetNames.get_fk_and_index_name(table_name, field2, table2, "id") text = Helper.INTERMEDIATE_TABLE_N_M_RELATION_TEMPLATE.substitute( { "table_name": table_name, "field1": field1, - "table1": HelperGetNames.get_table_name(own_table_field.table), + "fk_name_1": fk_idx1[0], + "index_1": fk_idx1[1], + "table1": table1, "field2": field2, - "table2": HelperGetNames.get_table_name(foreign_table_field.table), + "fk_name_2": fk_idx2[0], + "index_2": fk_idx2[1], + "table2": table2, "list_of_keys": ", ".join([field1, field2]), } ) @@ -1418,27 +1393,55 @@ def get_gm_table_for_gm_nm_relation_lists( + "')" ) foreign_table_ref_lines = [] + indices_lines = [] own_table_column = own_table_field.intermediate_column for foreign_table_field in foreign_table_fields: foreign_table_name = foreign_table_field.table + gm_content_field = HelperGetNames.get_gm_content_field( + own_table_column, foreign_table_name + ) + fk_idx = HelperGetNames.get_fk_and_index_name( + gm_table_name, gm_content_field, foreign_table_name, "id" + ) subst_dict = { "own_table_column": own_table_column, + "fk_name": fk_idx[0], "foreign_table_name": HelperGetNames.get_table_name(foreign_table_name), "foreign_view_name": foreign_table_name, - "gm_content_field": HelperGetNames.get_gm_content_field( - own_table_column, foreign_table_name - ), + "gm_content_field": gm_content_field, } foreign_table_ref_lines.append( Helper.GM_FOREIGN_TABLE_LINE_TEMPLATE.substitute(subst_dict) ) + indices_lines.append( + Helper.GM_INDEX_LINE_TEMPLATE.substitute( + { + "index": fk_idx[1], + "table_name": gm_table_name, + "gm_content_field": gm_content_field, + } + ) + ) + own_table_name = HelperGetNames.get_table_name(own_table_field.table) + own_table_name_with_ref_column = ( + f"{own_table_field.table}_{own_table_field.ref_column}" + ) + fk_idx = HelperGetNames.get_fk_and_index_name( + gm_table_name, + own_table_name_with_ref_column, + own_table_name, + own_table_field.ref_column, + ) text = Helper.INTERMEDIATE_TABLE_G_M_RELATION_TEMPLATE.substitute( { "table_name": gm_table_name, - "own_table_name": HelperGetNames.get_table_name(own_table_field.table), - "own_table_name_with_ref_column": ( - own_table_name_with_ref_column := f"{own_table_field.table}_{own_table_field.ref_column}" + "own_table_name": own_table_name, + "own_table_name_with_ref_column": own_table_name_with_ref_column, + "fk_name": fk_idx[0], + "index_1": fk_idx[1], + "index_2": HelperGetNames.get_index_name( + gm_table_name, own_table_column ), "own_table_ref_column": own_table_field.ref_column, "own_table_column": own_table_column, @@ -1450,6 +1453,7 @@ def get_gm_table_for_gm_nm_relation_lists( "unique_constraint_name": HelperGetNames.get_generic_unique_constraint_name( own_table_name_with_ref_column, own_table_column ), + "content_field_indices": "\n".join(indices_lines), } ) return gm_table_name, text @@ -1718,16 +1722,10 @@ def get_foreign_table_from_to_or_reference( def main() -> None: """ - Main entry point for this script to generate the schema_relational.sql from models.yml. + Main entry point for this script to generate the schema_relational.sql from the collections files. """ - # Retrieve models.yml from call-parameter for testing purposes, local file or GitHub - if len(sys.argv) > 1: - file = sys.argv[1] - else: - file = str(SOURCE) - - _, checksum = InternalHelper.read_models_yml(file) + _, checksum = InternalHelper.read_models_yml() ( pre_code, diff --git a/dev/src/helper_get_names.py b/dev/src/helper_get_names.py index bbc1e9b0..d8baf065 100644 --- a/dev/src/helper_get_names.py +++ b/dev/src/helper_get_names.py @@ -3,13 +3,49 @@ import re from collections.abc import Callable from enum import Enum +from pathlib import Path from typing import Any, TypedDict, cast -import requests import yaml KEYSEPARATOR = "/" +ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..") +DEFAULT_COLLECTION_META = os.path.join(ROOT, "collection-meta.yml") +DEFAULT_COLLECTIONS_DIR = os.path.join(ROOT, "collections") + + +def build_models_yaml_content(meta_file: str, collections_dir: str) -> bytes: + result = {} + + with open(meta_file, encoding="utf-8") as f: + meta_data = yaml.safe_load(f) + result["_meta"] = meta_data + + collections_path = Path(collections_dir) + yaml_files = sorted(collections_path.glob("*.yml")) + + for yaml_file in yaml_files: + with open(yaml_file, encoding="utf-8") as f: + data = yaml.safe_load(f) + + result[yaml_file.stem] = data + + header = ( + "# GENERATED FILE - DO NOT EDIT MANUALLY\n" + "# This file is automatically generated. Manual changes will be overwritten.\n" + "---\n" + ) + + yaml_body = yaml.dump( + result, + default_flow_style=False, + allow_unicode=True, + sort_keys=False, + ) + + return (header + yaml_body).encode("utf-8") + class TableFieldType: def __init__( @@ -65,11 +101,10 @@ class FieldSqlErrorType(Enum): class HelperGetNames: MAX_LEN = 63 - trigger_unique_list: list[str] = [] @staticmethod def max_length(func: Callable) -> Callable: - def wrapper(*args, **kwargs) -> str: # type:ignore + def wrapper(*args, **kwargs) -> str: # type: ignore name = func(*args, **kwargs) assert ( len(name) <= HelperGetNames.MAX_LEN @@ -88,6 +123,16 @@ def get_initial_letters(words: str) -> str: else: return words + @staticmethod + @max_length + def get_shortened_name(name: str) -> str: + """ + Gets the name shortened to 56 characters plus 7 characters of its md5 hash. + """ + if len(name) > HelperGetNames.MAX_LEN: + name = f"{name[:56]}{hashlib.md5(name.encode()).hexdigest()[:7]}" + return name + @staticmethod @max_length def get_table_name(table_name: str, migration: bool = False) -> str: @@ -194,6 +239,43 @@ def get_minlength_constraint_name( """gets the name of minLength constraint""" return f"minlength_{fname}" + @staticmethod + @max_length + def get_fk_constraint_name( + own_table: str, + own_column: str, + foreign_table: str, + fk_column: str, + ) -> str: + """gets the name of a foreign key constraint.""" + return HelperGetNames.get_shortened_name( + f"fk_{own_table}_{own_column}_{foreign_table}_{fk_column}" + ) + + @staticmethod + @max_length + def get_index_name( + own_table: str, + own_column: str, + ) -> str: + """gets the name of a foreign key constraint.""" + return HelperGetNames.get_shortened_name(f"idx_{own_table}_{own_column}") + + @staticmethod + def get_fk_and_index_name( + own_table: str, + own_column: str, + foreign_table: str, + fk_column: str, + ) -> tuple[str, str]: + """gets the tuple of a foreign key constraint and index (FK, IDX).""" + return ( + HelperGetNames.get_fk_constraint_name( + own_table, own_column, foreign_table, fk_column + ), + HelperGetNames.get_index_name(own_table, own_column), + ) + @staticmethod @max_length def get_not_null_insert_trigger_name_base( @@ -201,11 +283,7 @@ def get_not_null_insert_trigger_name_base( column_name: str, ) -> str: """gets the name of the insert trigger for not null""" - name = f"tr_i_{table_name}_{column_name}"[: HelperGetNames.MAX_LEN] - if name in HelperGetNames.trigger_unique_list: - raise Exception(f"trigger {name} is not unique!") - HelperGetNames.trigger_unique_list.append(name) - return name + return HelperGetNames.get_shortened_name(f"tr_i_{table_name}_{column_name}") @staticmethod @max_length @@ -214,11 +292,7 @@ def get_not_null_upd_del_trigger_name_base( column_name: str, ) -> str: """gets the name of the update/delete trigger for not null""" - name = f"tr_ud_{table_name}_{column_name}"[: HelperGetNames.MAX_LEN] - if name in HelperGetNames.trigger_unique_list: - raise Exception(f"trigger {name} is not unique!") - HelperGetNames.trigger_unique_list.append(name) - return name + return HelperGetNames.get_shortened_name(f"tr_ud_{table_name}_{column_name}") @staticmethod @max_length @@ -270,11 +344,7 @@ def get_notify_trigger_name( table_name: str, ) -> str: """gets the name of the trigger for logging changes on models""" - name = f"tr_log_{table_name}"[: HelperGetNames.MAX_LEN] - if name in HelperGetNames.trigger_unique_list: - raise Exception(f"trigger {name} is not unique!") - HelperGetNames.trigger_unique_list.append(name) - return name + return HelperGetNames.get_shortened_name(f"tr_log_{table_name}") @staticmethod @max_length @@ -283,11 +353,7 @@ def get_notify_related_trigger_name( column_name: str, ) -> str: """gets the name of the trigger for logging changes on related models""" - name = f"tr_log_{table_name}_{column_name}"[: HelperGetNames.MAX_LEN] - if name in HelperGetNames.trigger_unique_list: - raise Exception(f"trigger {name} is not unique!") - HelperGetNames.trigger_unique_list.append(name) - return name + return HelperGetNames.get_shortened_name(f"tr_log_{table_name}_{column_name}") class InternalHelper: @@ -296,21 +362,17 @@ class InternalHelper: ref_compiled = compiled = re.compile(r"(^\w+\b).*?\((.*?)\)") @classmethod - def read_models_yml(cls, file: str) -> tuple[dict[str, Any], str]: - """method reads models.yml from file or web and returns MODELS and it's checksum""" - if os.path.isfile(file): - with open(file, "rb") as x: - models_yml = x.read() - else: - models_yml = requests.get(file).content + def read_models_yml( + cls, + meta_file: str = DEFAULT_COLLECTION_META, + collections_dir: str = DEFAULT_COLLECTIONS_DIR, + ) -> tuple[dict[str, Any], str]: + """method reads from the collections files and returns MODELS and it's checksum""" + models_yml = build_models_yaml_content(meta_file, collections_dir) # calc checksum to assert the schema.sql is up-to-date checksum = hashlib.md5(models_yml).hexdigest() - # Fix broken keys - models_yml = models_yml.replace(b" yes:", b' "yes":') - models_yml = models_yml.replace(b" no:", b' "no":') - # Load and parse models.yml cls.MODELS = yaml.safe_load(models_yml) cls.check_field_length() diff --git a/dev/src/join_models_yml.py b/dev/src/join_models_yml.py index 85ecbcc6..85990dc5 100644 --- a/dev/src/join_models_yml.py +++ b/dev/src/join_models_yml.py @@ -1,37 +1,17 @@ # join_models_yml.py is a temporary script to create the old models.yml until # all services are able to work with the new separat collections. + from pathlib import Path -import yaml +from .helper_get_names import build_models_yaml_content def join_yaml_file(meta_file: str, collections_dir: str, output_file: str) -> None: - result = {} - - with open(meta_file, encoding="utf-8") as f: - meta_data = yaml.safe_load(f) - result["_meta"] = meta_data - - collections_path = Path(collections_dir) - yaml_files = sorted(collections_path.glob("*.yml")) - - for yaml_file in yaml_files: - with open(yaml_file, encoding="utf-8") as f: - data = yaml.safe_load(f) - - result[yaml_file.stem] = data - - with open(output_file, "w", encoding="utf-8") as f: - f.write("# GENERATED FILE - DO NOT EDIT MANUALLY\n") - f.write( - "# This file is automatically generated. Manual changes will be overwritten.\n" - ) - f.write("---\n") + content = build_models_yaml_content(meta_file, collections_dir) - yaml.dump( - result, f, default_flow_style=False, allow_unicode=True, sort_keys=False - ) + with open(output_file, "wb") as f: + f.write(content) if __name__ == "__main__": diff --git a/dev/src/validate.py b/dev/src/validate.py index 6200fb1d..fad3484f 100644 --- a/dev/src/validate.py +++ b/dev/src/validate.py @@ -6,7 +6,8 @@ import simplejson as json import yaml -KEYSEPARATOR = "/" +from .helper_get_names import DEFAULT_COLLECTIONS_DIR, KEYSEPARATOR + MAX_FIELD_NAME_LENGTH = 63 _collection_regex = r"[a-z](?:[a-z_]+[a-z]+)?" @@ -19,9 +20,6 @@ DECIMAL_REGEX = re.compile(r"^-?(\d|[1-9]\d+)\.\d{6}$") COLOR_REGEX = re.compile(r"^#[0-9a-f]{6}$") -DEFAULT_COLLECTIONS_DIR = str( - (Path(__file__).parent / ".." / ".." / "collections").resolve() -) RELATION_TYPES = ( "relation", diff --git a/dev/tests/base.py b/dev/tests/base.py index c108ab80..da5d9a83 100644 --- a/dev/tests/base.py +++ b/dev/tests/base.py @@ -409,7 +409,7 @@ def create_meeting( ] columns, values = DbUtils.get_columns_and_values_for_insert(projector_t, data) curs.execute(*projector_t.insert(columns, values, returning=[projector_t.id])) - (result["default_projector_id"], result["secondary_projector_id"]) = ( + result["default_projector_id"], result["secondary_projector_id"] = ( x["id"] for x in curs ) From 3c347a4fd5af9b1adf43fbbf9224c1fa4c210219 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Fri, 20 Mar 2026 13:00:02 +0100 Subject: [PATCH 08/23] Add `onehundred_percent_base` fields to configs (#408) --- collection-meta.yml | 47 ++++++++--- collections/meeting.yml | 30 +++---- collections/poll_config_approval.yml | 5 ++ collections/poll_config_rating_approval.yml | 5 ++ collections/poll_config_rating_score.yml | 5 ++ collections/poll_config_selection.yml | 9 ++ dev/sql/schema_relational.sql | 31 +++---- models.yml | 93 ++++++++++++++------- 8 files changed, 151 insertions(+), 74 deletions(-) diff --git a/collection-meta.yml b/collection-meta.yml index c221b7f3..36448653 100644 --- a/collection-meta.yml +++ b/collection-meta.yml @@ -10,19 +10,42 @@ ballot_paper_selection: &ballot_paper_selection - NUMBER_OF_DELEGATES - NUMBER_OF_ALL_PARTICIPANTS - CUSTOM_NUMBER -poll_backends: &poll_backends - - long - - fast onehundred_percent_bases: &onehundred_percent_bases - - "Y" - - "YN" - - "YNA" - - "N" - - "valid" - - "cast" - - "entitled" - - "entitled_present" - - "disabled" + - no_general + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled +approval_onehundred_percent_bases: &approval_onehundred_percent_bases + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled +rating_approval_onehundred_percent_bases: &rating_approval_onehundred_percent_bases + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled +rating_score_onehundred_percent_bases: &rating_score_onehundred_percent_bases + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled +selection_onehundred_percent_bases: &selection_onehundred_percent_bases + - no_general + - valid + - cast + - entitled + - entitled_present + - disabled id_field: &id_field type: number restriction_mode: A diff --git a/collections/meeting.yml b/collections/meeting.yml index 65e220f8..af88ba06 100644 --- a/collections/meeting.yml +++ b/collections/meeting.yml @@ -541,26 +541,21 @@ motion_poll_ballot_paper_number: restriction_mode: B motion_poll_default_type: type: string - default: pseudoanonymous + default: secret restriction_mode: B -motion_poll_default_method: - type: string - default: YNA +motion_poll_default_allow_abstain: + type: boolean + default: true restriction_mode: B motion_poll_default_onehundred_percent_base: type: string - enum: *onehundred_percent_bases - default: YNA + enum: *approval_onehundred_percent_bases + default: valid restriction_mode: B motion_poll_default_group_ids: type: relation-list to: group/used_as_motion_poll_default_id restriction_mode: B -motion_poll_default_backend: - type: string - enum: *poll_backends - default: fast - restriction_mode: B motion_poll_projection_name_order_first: type: string enum: @@ -695,11 +690,11 @@ assignment_poll_sort_poll_result_by_votes: restriction_mode: B assignment_poll_default_type: type: string - default: pseudoanonymous + default: secret restriction_mode: B assignment_poll_default_method: type: string - default: Y + default: selection restriction_mode: B assignment_poll_default_onehundred_percent_base: type: string @@ -710,11 +705,6 @@ assignment_poll_default_group_ids: type: relation-list to: group/used_as_assignment_poll_default_id restriction_mode: B -assignment_poll_default_backend: - type: string - enum: *poll_backends - default: fast - restriction_mode: B # Polls poll_ballot_paper_selection: @@ -736,8 +726,8 @@ poll_default_method: restriction_mode: B poll_default_onehundred_percent_base: type: string - enum: *onehundred_percent_bases - default: YNA + enum: *selection_onehundred_percent_bases + default: valid restriction_mode: B poll_default_group_ids: type: relation-list diff --git a/collections/poll_config_approval.yml b/collections/poll_config_approval.yml index 02b1bf90..05c9ab4a 100644 --- a/collections/poll_config_approval.yml +++ b/collections/poll_config_approval.yml @@ -17,3 +17,8 @@ allow_abstain: type: boolean default: true restriction_mode: A +onehundred_percent_base: + type: string + required: true + enum: *approval_onehundred_percent_bases + restriction_mode: A diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml index 6fec262a..60c952f0 100644 --- a/collections/poll_config_rating_approval.yml +++ b/collections/poll_config_rating_approval.yml @@ -25,3 +25,8 @@ allow_abstain: type: boolean default: true restriction_mode: A +onehundred_percent_base: + type: string + required: true + enum: *rating_approval_onehundred_percent_bases + restriction_mode: A diff --git a/collections/poll_config_rating_score.yml b/collections/poll_config_rating_score.yml index c851ec23..648ab288 100644 --- a/collections/poll_config_rating_score.yml +++ b/collections/poll_config_rating_score.yml @@ -33,3 +33,8 @@ min_vote_sum: type: number default: 0 restriction_mode: A +onehundred_percent_base: + type: string + required: true + enum: *rating_score_onehundred_percent_bases + restriction_mode: A diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml index 81de41ee..6520ad63 100644 --- a/collections/poll_config_selection.yml +++ b/collections/poll_config_selection.yml @@ -25,3 +25,12 @@ allow_nota: type: boolean default: false restriction_mode: A +strike_out: + type: boolean + default: false + restriction_mode: A +onehundred_percent_base: + type: string + required: true + enum: *selection_onehundred_percent_bases + restriction_mode: A diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 47a945de..9127b0a1 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '38e3ba8ca214cb99d4d28caf140370d7' +-- MODELS_YML_CHECKSUM = '8f6b33883a3c3b774ada5af312dcbb14' -- Function and meta table definitions @@ -722,10 +722,9 @@ CREATE TABLE meeting_t ( motions_enable_restricted_editor_for_non_manager boolean, motion_poll_ballot_paper_selection varchar(256) CONSTRAINT enum_meeting_motion_poll_ballot_paper_selection CHECK (motion_poll_ballot_paper_selection IN ('NUMBER_OF_DELEGATES', 'NUMBER_OF_ALL_PARTICIPANTS', 'CUSTOM_NUMBER')) DEFAULT 'CUSTOM_NUMBER', motion_poll_ballot_paper_number integer DEFAULT 8, - motion_poll_default_type varchar(256) DEFAULT 'pseudoanonymous', - motion_poll_default_method varchar(256) DEFAULT 'YNA', - motion_poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_motion_poll_default_onehundred_percent_base CHECK (motion_poll_default_onehundred_percent_base IN ('Y', 'YN', 'YNA', 'N', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'YNA', - motion_poll_default_backend varchar(256) CONSTRAINT enum_meeting_motion_poll_default_backend CHECK (motion_poll_default_backend IN ('long', 'fast')) DEFAULT 'fast', + motion_poll_default_type varchar(256) DEFAULT 'secret', + motion_poll_default_allow_abstain boolean DEFAULT True, + motion_poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_motion_poll_default_onehundred_percent_base CHECK (motion_poll_default_onehundred_percent_base IN ('yes_no', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'valid', motion_poll_projection_name_order_first varchar(256) NOT NULL CONSTRAINT enum_meeting_motion_poll_projection_name_order_first CHECK (motion_poll_projection_name_order_first IN ('first_name', 'last_name')) DEFAULT 'last_name', motion_poll_projection_max_columns integer NOT NULL DEFAULT 6, users_enable_presence_view boolean DEFAULT False, @@ -761,16 +760,15 @@ This email was generated automatically.', assignment_poll_add_candidates_to_list_of_speakers boolean DEFAULT False, assignment_poll_enable_max_votes_per_option boolean DEFAULT False, assignment_poll_sort_poll_result_by_votes boolean DEFAULT True, - assignment_poll_default_type varchar(256) DEFAULT 'pseudoanonymous', - assignment_poll_default_method varchar(256) DEFAULT 'Y', - assignment_poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_assignment_poll_default_onehundred_percent_base CHECK (assignment_poll_default_onehundred_percent_base IN ('Y', 'YN', 'YNA', 'N', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'valid', - assignment_poll_default_backend varchar(256) CONSTRAINT enum_meeting_assignment_poll_default_backend CHECK (assignment_poll_default_backend IN ('long', 'fast')) DEFAULT 'fast', + assignment_poll_default_type varchar(256) DEFAULT 'secret', + assignment_poll_default_method varchar(256) DEFAULT 'selection', + assignment_poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_assignment_poll_default_onehundred_percent_base CHECK (assignment_poll_default_onehundred_percent_base IN ('no_general', 'yes_no', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'valid', poll_ballot_paper_selection varchar(256) CONSTRAINT enum_meeting_poll_ballot_paper_selection CHECK (poll_ballot_paper_selection IN ('NUMBER_OF_DELEGATES', 'NUMBER_OF_ALL_PARTICIPANTS', 'CUSTOM_NUMBER')), poll_ballot_paper_number integer, poll_sort_poll_result_by_votes boolean, poll_default_type varchar(256) DEFAULT 'analog', poll_default_method varchar(256), - poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_poll_default_onehundred_percent_base CHECK (poll_default_onehundred_percent_base IN ('Y', 'YN', 'YNA', 'N', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'YNA', + poll_default_onehundred_percent_base varchar(256) CONSTRAINT enum_meeting_poll_default_onehundred_percent_base CHECK (poll_default_onehundred_percent_base IN ('no_general', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) DEFAULT 'valid', poll_default_live_voting_enabled boolean DEFAULT False, poll_default_allow_invalid boolean DEFAULT False, poll_default_allow_vote_split boolean DEFAULT False, @@ -1157,7 +1155,8 @@ comment on column poll_t.sequential_number is 'The (positive) serial number of t CREATE TABLE poll_config_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - allow_abstain boolean DEFAULT True + allow_abstain boolean DEFAULT True, + onehundred_percent_base varchar(256) NOT NULL CONSTRAINT enum_poll_config_approval_onehundred_percent_base CHECK (onehundred_percent_base IN ('yes_no', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) ); @@ -1184,7 +1183,8 @@ CREATE TABLE poll_config_rating_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, max_options_amount integer DEFAULT 0, min_options_amount integer DEFAULT 0, - allow_abstain boolean DEFAULT True + allow_abstain boolean DEFAULT True, + onehundred_percent_base varchar(256) NOT NULL CONSTRAINT enum_poll_config_rating_approval_onehundred_percent_base CHECK (onehundred_percent_base IN ('yes_no', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) ); @@ -1196,7 +1196,8 @@ CREATE TABLE poll_config_rating_score_t ( min_options_amount integer DEFAULT 0, max_votes_per_option integer DEFAULT 0, max_vote_sum integer DEFAULT 0, - min_vote_sum integer DEFAULT 0 + min_vote_sum integer DEFAULT 0, + onehundred_percent_base varchar(256) NOT NULL CONSTRAINT enum_poll_config_rating_score_onehundred_percent_base CHECK (onehundred_percent_base IN ('yes_no', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) ); @@ -1206,7 +1207,9 @@ CREATE TABLE poll_config_selection_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, max_options_amount integer DEFAULT 0, min_options_amount integer DEFAULT 0, - allow_nota boolean DEFAULT False + allow_nota boolean DEFAULT False, + strike_out boolean DEFAULT False, + onehundred_percent_base varchar(256) NOT NULL CONSTRAINT enum_poll_config_selection_onehundred_percent_base CHECK (onehundred_percent_base IN ('no_general', 'valid', 'cast', 'entitled', 'entitled_present', 'disabled')) ); diff --git a/models.yml b/models.yml index b6c80708..e082de96 100644 --- a/models.yml +++ b/models.yml @@ -14,14 +14,37 @@ _meta: - NUMBER_OF_DELEGATES - NUMBER_OF_ALL_PARTICIPANTS - CUSTOM_NUMBER - poll_backends: &id004 - - long - - fast - onehundred_percent_bases: &id003 - - Y - - YN - - YNA - - N + onehundred_percent_bases: &id004 + - no_general + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled + approval_onehundred_percent_bases: &id003 + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled + rating_approval_onehundred_percent_bases: &id006 + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled + rating_score_onehundred_percent_bases: &id007 + - yes_no + - valid + - cast + - entitled + - entitled_present + - disabled + selection_onehundred_percent_bases: &id005 + - no_general - valid - cast - entitled @@ -1401,26 +1424,21 @@ meeting: restriction_mode: B motion_poll_default_type: type: string - default: pseudoanonymous + default: secret restriction_mode: B - motion_poll_default_method: - type: string - default: YNA + motion_poll_default_allow_abstain: + type: boolean + default: true restriction_mode: B motion_poll_default_onehundred_percent_base: type: string enum: *id003 - default: YNA + default: valid restriction_mode: B motion_poll_default_group_ids: type: relation-list to: group/used_as_motion_poll_default_id restriction_mode: B - motion_poll_default_backend: - type: string - enum: *id004 - default: fast - restriction_mode: B motion_poll_projection_name_order_first: type: string enum: @@ -1548,26 +1566,21 @@ meeting: restriction_mode: B assignment_poll_default_type: type: string - default: pseudoanonymous + default: secret restriction_mode: B assignment_poll_default_method: type: string - default: Y + default: selection restriction_mode: B assignment_poll_default_onehundred_percent_base: type: string - enum: *id003 + enum: *id004 default: valid restriction_mode: B assignment_poll_default_group_ids: type: relation-list to: group/used_as_assignment_poll_default_id restriction_mode: B - assignment_poll_default_backend: - type: string - enum: *id004 - default: fast - restriction_mode: B poll_ballot_paper_selection: type: string enum: *id002 @@ -1587,8 +1600,8 @@ meeting: restriction_mode: B poll_default_onehundred_percent_base: type: string - enum: *id003 - default: YNA + enum: *id005 + default: valid restriction_mode: B poll_default_group_ids: type: relation-list @@ -3474,6 +3487,11 @@ poll_config_approval: type: boolean default: true restriction_mode: A + onehundred_percent_base: + type: string + required: true + enum: *id003 + restriction_mode: A poll_config_option: id: type: number @@ -3536,6 +3554,11 @@ poll_config_rating_approval: type: boolean default: true restriction_mode: A + onehundred_percent_base: + type: string + required: true + enum: *id006 + restriction_mode: A poll_config_rating_score: id: type: number @@ -3572,6 +3595,11 @@ poll_config_rating_score: type: number default: 0 restriction_mode: A + onehundred_percent_base: + type: string + required: true + enum: *id007 + restriction_mode: A poll_config_selection: id: type: number @@ -3600,6 +3628,15 @@ poll_config_selection: type: boolean default: false restriction_mode: A + strike_out: + type: boolean + default: false + restriction_mode: A + onehundred_percent_base: + type: string + required: true + enum: *id005 + restriction_mode: A poll_config_stv_scottish: id: type: number From 98929842c8aaaaed2f381e177717d07fe23625ac Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Fri, 20 Mar 2026 13:10:35 +0100 Subject: [PATCH 09/23] Move poll options from config to poll (#419) Also rename poll_config_option to poll_option. This has the advantage, that the namespace poll_config_* is only for poll_configs. --- collections/meeting_user.yml | 4 +- collections/poll.yml | 5 + collections/poll_config_approval.yml | 5 - collections/poll_config_option.yml | 33 ------ collections/poll_config_rating_approval.yml | 5 - collections/poll_config_rating_score.yml | 5 - collections/poll_config_selection.yml | 5 - collections/poll_config_stv_scottish.yml | 5 - collections/poll_option.yml | 23 ++++ dev/sql/schema_relational.sql | 117 +++++++------------- models.yml | 92 ++++++--------- 11 files changed, 102 insertions(+), 197 deletions(-) delete mode 100644 collections/poll_config_option.yml create mode 100644 collections/poll_option.yml diff --git a/collections/meeting_user.yml b/collections/meeting_user.yml index e439c8b2..84f353bb 100644 --- a/collections/meeting_user.yml +++ b/collections/meeting_user.yml @@ -89,8 +89,8 @@ poll_voted_ids: restriction_mode: A poll_option_ids: type: relation-list - to: poll_config_option/meeting_user_id - reference: poll_config_option + to: poll_option/meeting_user_id + reference: poll_option required: false restriction_mode: A acting_ballot_ids: diff --git a/collections/poll.yml b/collections/poll.yml index 7def96ff..9b5ff861 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -23,6 +23,11 @@ config_id: - poll_config_stv_scottish required: true restriction_mode: A +option_ids: + type: relation-list + to: poll_option/poll_id + on_delete: CASCADE + restriction_mode: A visibility: type: string required: true diff --git a/collections/poll_config_approval.yml b/collections/poll_config_approval.yml index 05c9ab4a..d410b6b0 100644 --- a/collections/poll_config_approval.yml +++ b/collections/poll_config_approval.yml @@ -8,11 +8,6 @@ poll_id: to: poll/config_id required: true restriction_mode: A -option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A allow_abstain: type: boolean default: true diff --git a/collections/poll_config_option.yml b/collections/poll_config_option.yml deleted file mode 100644 index 929b0556..00000000 --- a/collections/poll_config_option.yml +++ /dev/null @@ -1,33 +0,0 @@ -id: - type: number - restriction_mode: A - constant: true - required: true -poll_config_id: - type: generic-relation - to: - - poll_config_approval/option_ids - - poll_config_selection/option_ids - - poll_config_rating_score/option_ids - - poll_config_rating_approval/option_ids - - poll_config_stv_scottish/option_ids - reference: - - poll_config_approval - - poll_config_selection - - poll_config_rating_score - - poll_config_rating_approval - - poll_config_stv_scottish - required: true - restriction_mode: A -weight: - type: number - restriction_mode: A -text: - type: string - restriction_mode: A -meeting_user_id: - type: relation - to: meeting_user/poll_option_ids - reference: meeting_user - required: false - restriction_mode: A diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml index 60c952f0..f4497ebf 100644 --- a/collections/poll_config_rating_approval.yml +++ b/collections/poll_config_rating_approval.yml @@ -8,11 +8,6 @@ poll_id: to: poll/config_id required: true restriction_mode: A -option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 diff --git a/collections/poll_config_rating_score.yml b/collections/poll_config_rating_score.yml index 648ab288..f87dbdf9 100644 --- a/collections/poll_config_rating_score.yml +++ b/collections/poll_config_rating_score.yml @@ -8,11 +8,6 @@ poll_id: to: poll/config_id required: true restriction_mode: A -option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml index 6520ad63..43b8b5a4 100644 --- a/collections/poll_config_selection.yml +++ b/collections/poll_config_selection.yml @@ -8,11 +8,6 @@ poll_id: to: poll/config_id required: true restriction_mode: A -option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 diff --git a/collections/poll_config_stv_scottish.yml b/collections/poll_config_stv_scottish.yml index 82b6b44e..293a938e 100644 --- a/collections/poll_config_stv_scottish.yml +++ b/collections/poll_config_stv_scottish.yml @@ -8,11 +8,6 @@ poll_id: to: poll/config_id required: true restriction_mode: A -option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A posts: type: number minimum: 1 diff --git a/collections/poll_option.yml b/collections/poll_option.yml new file mode 100644 index 00000000..637c65aa --- /dev/null +++ b/collections/poll_option.yml @@ -0,0 +1,23 @@ +id: + type: number + restriction_mode: A + constant: true + required: true +poll_id: + type: relation + to: poll/option_ids + reference: poll + required: true + restriction_mode: A +weight: + type: number + restriction_mode: A +text: + type: string + restriction_mode: A +meeting_user_id: + type: relation + to: meeting_user/poll_option_ids + reference: meeting_user + required: false + restriction_mode: A diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 9127b0a1..259fb042 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '8f6b33883a3c3b774ada5af312dcbb14' +-- MODELS_YML_CHECKSUM = '002918b6cf290122a97a46560d495ba1' -- Function and meta table definitions @@ -1162,23 +1162,6 @@ CREATE TABLE poll_config_approval_t ( -CREATE TABLE poll_config_option_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - poll_config_id varchar(100) NOT NULL, - poll_config_id_poll_config_approval_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_approval' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - poll_config_id_poll_config_selection_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_selection' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - poll_config_id_poll_config_rating_score_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_score' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - poll_config_id_poll_config_rating_approval_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_rating_approval' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - poll_config_id_poll_config_stv_scottish_id integer GENERATED ALWAYS AS (CASE WHEN split_part(poll_config_id, '/', 1) = 'poll_config_stv_scottish' THEN cast(split_part(poll_config_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_poll_config_id_part1 CHECK (split_part(poll_config_id, '/', 1) IN ('poll_config_approval','poll_config_selection','poll_config_rating_score','poll_config_rating_approval','poll_config_stv_scottish')), - weight integer, - text varchar(256), - meeting_user_id integer -); - - - - CREATE TABLE poll_config_rating_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, max_options_amount integer DEFAULT 0, @@ -1223,6 +1206,17 @@ CREATE TABLE poll_config_stv_scottish_t ( +CREATE TABLE poll_option_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + poll_id integer NOT NULL, + weight integer, + text varchar(256), + meeting_user_id integer +); + + + + CREATE TABLE projection_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, options jsonb, @@ -1915,7 +1909,7 @@ CREATE VIEW "meeting_user" AS SELECT *, (select array_agg(a.id ORDER BY a.id) from assignment_candidate_t a where a.meeting_user_id = m.id) as assignment_candidate_ids, (select array_agg(mu.id ORDER BY mu.id) from meeting_user_t mu where mu.vote_delegated_to_id = m.id) as vote_delegations_from_ids, (select array_agg(n.poll_id ORDER BY n.poll_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.meeting_user_id = m.id) as poll_voted_ids, -(select array_agg(p.id ORDER BY p.id) from poll_config_option_t p where p.meeting_user_id = m.id) as poll_option_ids, +(select array_agg(p.id ORDER BY p.id) from poll_option_t p where p.meeting_user_id = m.id) as poll_option_ids, (select array_agg(b.id ORDER BY b.id) from ballot_t b where b.acting_meeting_user_id = m.id) as acting_ballot_ids, (select array_agg(b.id ORDER BY b.id) from ballot_t b where b.represented_meeting_user_id = m.id) as represented_ballot_ids, (select array_agg(c.id ORDER BY c.id) from chat_message_t c where c.meeting_user_id = m.id) as chat_message_ids, @@ -2036,6 +2030,7 @@ FROM point_of_order_category_t p; CREATE VIEW "poll" AS SELECT *, +(select array_agg(po.id ORDER BY po.id) from poll_option_t po where po.poll_id = p.id) as option_ids, (select array_agg(b.id ORDER BY b.id) from ballot_t b where b.poll_id = p.id) as ballot_ids, (select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.poll_id = p.id) as voted_ids, (select array_agg(n.group_id ORDER BY n.group_id) from nm_group_poll_ids_poll_t n where n.poll_id = p.id) as entitled_group_ids, @@ -2044,38 +2039,33 @@ FROM poll_t p; CREATE VIEW "poll_config_approval" AS SELECT *, -(select p1.id from poll_t p1 where p1.config_id_poll_config_approval_id = p.id) as poll_id, -(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_approval_id = p.id) as option_ids +(select p1.id from poll_t p1 where p1.config_id_poll_config_approval_id = p.id) as poll_id FROM poll_config_approval_t p; -CREATE VIEW "poll_config_option" AS SELECT * FROM poll_config_option_t p; - - CREATE VIEW "poll_config_rating_approval" AS SELECT *, -(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_approval_id = p.id) as poll_id, -(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_approval_id = p.id) as option_ids +(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_approval_id = p.id) as poll_id FROM poll_config_rating_approval_t p; CREATE VIEW "poll_config_rating_score" AS SELECT *, -(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_score_id = p.id) as poll_id, -(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_rating_score_id = p.id) as option_ids +(select p1.id from poll_t p1 where p1.config_id_poll_config_rating_score_id = p.id) as poll_id FROM poll_config_rating_score_t p; CREATE VIEW "poll_config_selection" AS SELECT *, -(select p1.id from poll_t p1 where p1.config_id_poll_config_selection_id = p.id) as poll_id, -(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_selection_id = p.id) as option_ids +(select p1.id from poll_t p1 where p1.config_id_poll_config_selection_id = p.id) as poll_id FROM poll_config_selection_t p; CREATE VIEW "poll_config_stv_scottish" AS SELECT *, -(select p1.id from poll_t p1 where p1.config_id_poll_config_stv_scottish_id = p.id) as poll_id, -(select array_agg(pc.id ORDER BY pc.id) from poll_config_option_t pc where pc.poll_config_id_poll_config_stv_scottish_id = p.id) as option_ids +(select p1.id from poll_t p1 where p1.config_id_poll_config_stv_scottish_id = p.id) as poll_id FROM poll_config_stv_scottish_t p; +CREATE VIEW "poll_option" AS SELECT * FROM poll_option_t p; + + CREATE VIEW "projection" AS SELECT * FROM projection_t p; @@ -2451,18 +2441,10 @@ CREATE INDEX idx_poll_t_content_object_id_topic_id ON poll_t (content_object_id_ ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_poll_t_meeting_id ON poll_t (meeting_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_appro6960976 FOREIGN KEY(poll_config_id_poll_config_approval_id) REFERENCES poll_config_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_approval_id ON poll_config_option_t (poll_config_id_poll_config_approval_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_selecf8ee498 FOREIGN KEY(poll_config_id_poll_config_selection_id) REFERENCES poll_config_selection_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_selef031df2 ON poll_config_option_t (poll_config_id_poll_config_selection_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_ratinad2ee64 FOREIGN KEY(poll_config_id_poll_config_rating_score_id) REFERENCES poll_config_rating_score_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_ratia91759a ON poll_config_option_t (poll_config_id_poll_config_rating_score_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_ratin79bc2a7 FOREIGN KEY(poll_config_id_poll_config_rating_approval_id) REFERENCES poll_config_rating_approval_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_rati9075d6e ON poll_config_option_t (poll_config_id_poll_config_rating_approval_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_poll_config_id_poll_config_stv_s66764cc FOREIGN KEY(poll_config_id_poll_config_stv_scottish_id) REFERENCES poll_config_stv_scottish_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_poll_config_id_poll_config_stv_83d6519 ON poll_config_option_t (poll_config_id_poll_config_stv_scottish_id); -ALTER TABLE poll_config_option_t ADD CONSTRAINT fk_poll_config_option_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_poll_config_option_t_meeting_user_id ON poll_config_option_t (meeting_user_id); +ALTER TABLE poll_option_t ADD CONSTRAINT fk_poll_option_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_option_t_poll_id ON poll_option_t (poll_id); +ALTER TABLE poll_option_t ADD CONSTRAINT fk_poll_option_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_option_t_meeting_user_id ON poll_option_t (meeting_user_id); ALTER TABLE projection_t ADD CONSTRAINT fk_projection_t_current_projector_id_projector_t_id FOREIGN KEY(current_projector_id) REFERENCES projector_t(id) INITIALLY DEFERRED; CREATE INDEX idx_projection_t_current_projector_id ON projection_t (current_projector_id); @@ -3432,29 +3414,6 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_approval'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_poll_config_option AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_option'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_option_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - - -CREATE TRIGGER tr_log_poll_config_approval_poll_config_id_poll_config_approval_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_approval_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_approval','poll_config_id_poll_config_approval_id','option_ids'); - -CREATE TRIGGER tr_log_poll_config_selection_poll_config_id_poll_config_selection_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_selection_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_selection','poll_config_id_poll_config_selection_id','option_ids'); - -CREATE TRIGGER tr_log_poll_config_rating_score_poll_config_id_poll_config_rating_score_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_rating_score_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_score','poll_config_id_poll_config_rating_score_id','option_ids'); - -CREATE TRIGGER tr_log_poll_config_rating_approval_poll_config_id_poll_config_rating_approval_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_rating_approval_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_rating_approval','poll_config_id_poll_config_rating_approval_id','option_ids'); - -CREATE TRIGGER tr_log_poll_config_stv_scottish_poll_config_id_poll_config_stv_scottish_id AFTER INSERT OR UPDATE OF poll_config_id_poll_config_stv_scottish_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll_config_stv_scottish','poll_config_id_poll_config_stv_scottish_id','option_ids'); -CREATE TRIGGER tr_log_poll_config_option_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON poll_config_option_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id', 'poll_option_ids'); - CREATE TRIGGER tr_log_poll_config_rating_approval AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_approval_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_rating_approval'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_rating_approval_t @@ -3475,6 +3434,16 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_stv_scottish'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_stv_scottish_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); +CREATE TRIGGER tr_log_poll_option AFTER INSERT OR UPDATE OR DELETE ON poll_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_option'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_option_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_poll_option_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id', 'option_ids'); +CREATE TRIGGER tr_log_poll_option_t_meeting_user_id AFTER INSERT OR UPDATE OF meeting_user_id OR DELETE ON poll_option_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeting_user_id', 'poll_option_ids'); + CREATE TRIGGER tr_log_projection AFTER INSERT OR UPDATE OR DELETE ON projection_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('projection'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON projection_t @@ -3881,7 +3850,7 @@ SQL nt:1r => meeting_user/assignment_candidate_ids:-> assignment_candidate/meeti FIELD 1r:nt => meeting_user/vote_delegated_to_id:-> meeting_user/vote_delegations_from_ids SQL nt:1r => meeting_user/vote_delegations_from_ids:-> meeting_user/vote_delegated_to_id SQL nt:nt => meeting_user/poll_voted_ids:-> poll/voted_ids -SQL nr:1r => meeting_user/poll_option_ids:-> poll_config_option/meeting_user_id +SQL nr:1r => meeting_user/poll_option_ids:-> poll_option/meeting_user_id SQL nt:1r => meeting_user/acting_ballot_ids:-> ballot/acting_meeting_user_id SQL nt:1r => meeting_user/represented_ballot_ids:-> ballot/represented_meeting_user_id SQL nt:1r => meeting_user/chat_message_ids:-> chat_message/meeting_user_id @@ -3999,6 +3968,7 @@ FIELD 1rR:nt => point_of_order_category/meeting_id:-> meeting/point_of_order_cat SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_category_id FIELD 1GrR:1tR,1tR,1tR,1tR,1tR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id +SQL nt:1rR => poll/option_ids:-> poll_option/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids @@ -4007,22 +3977,17 @@ SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids SQL 1tR:1GrR => poll_config_approval/poll_id:-> poll/config_id -SQL nt:1GrR => poll_config_approval/option_ids:-> poll_config_option/poll_config_id - -FIELD 1GrR:nt,nt,nt,nt,nt => poll_config_option/poll_config_id:-> poll_config_approval/option_ids,poll_config_selection/option_ids,poll_config_rating_score/option_ids,poll_config_rating_approval/option_ids,poll_config_stv_scottish/option_ids -FIELD 1r:nr => poll_config_option/meeting_user_id:-> meeting_user/poll_option_ids SQL 1tR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id -SQL nt:1GrR => poll_config_rating_approval/option_ids:-> poll_config_option/poll_config_id SQL 1tR:1GrR => poll_config_rating_score/poll_id:-> poll/config_id -SQL nt:1GrR => poll_config_rating_score/option_ids:-> poll_config_option/poll_config_id SQL 1tR:1GrR => poll_config_selection/poll_id:-> poll/config_id -SQL nt:1GrR => poll_config_selection/option_ids:-> poll_config_option/poll_config_id SQL 1tR:1GrR => poll_config_stv_scottish/poll_id:-> poll/config_id -SQL nt:1GrR => poll_config_stv_scottish/option_ids:-> poll_config_option/poll_config_id + +FIELD 1rR:nt => poll_option/poll_id:-> poll/option_ids +FIELD 1r:nr => poll_option/meeting_user_id:-> meeting_user/poll_option_ids FIELD 1r:nt => projection/current_projector_id:-> projector/current_projection_ids FIELD 1r:nt => projection/preview_projector_id:-> projector/preview_projection_ids diff --git a/models.yml b/models.yml index e082de96..aca11e67 100644 --- a/models.yml +++ b/models.yml @@ -2236,8 +2236,8 @@ meeting_user: restriction_mode: A poll_option_ids: type: relation-list - to: poll_config_option/meeting_user_id - reference: poll_config_option + to: poll_option/meeting_user_id + reference: poll_option required: false restriction_mode: A acting_ballot_ids: @@ -3375,6 +3375,11 @@ poll: - poll_config_stv_scottish required: true restriction_mode: A + option_ids: + type: relation-list + to: poll_option/poll_id + on_delete: CASCADE + restriction_mode: A visibility: type: string required: true @@ -3478,11 +3483,6 @@ poll_config_approval: to: poll/config_id required: true restriction_mode: A - option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A allow_abstain: type: boolean default: true @@ -3492,40 +3492,6 @@ poll_config_approval: required: true enum: *id003 restriction_mode: A -poll_config_option: - id: - type: number - restriction_mode: A - constant: true - required: true - poll_config_id: - type: generic-relation - to: - - poll_config_approval/option_ids - - poll_config_selection/option_ids - - poll_config_rating_score/option_ids - - poll_config_rating_approval/option_ids - - poll_config_stv_scottish/option_ids - reference: - - poll_config_approval - - poll_config_selection - - poll_config_rating_score - - poll_config_rating_approval - - poll_config_stv_scottish - required: true - restriction_mode: A - weight: - type: number - restriction_mode: A - text: - type: string - restriction_mode: A - meeting_user_id: - type: relation - to: meeting_user/poll_option_ids - reference: meeting_user - required: false - restriction_mode: A poll_config_rating_approval: id: type: number @@ -3537,11 +3503,6 @@ poll_config_rating_approval: to: poll/config_id required: true restriction_mode: A - option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 @@ -3570,11 +3531,6 @@ poll_config_rating_score: to: poll/config_id required: true restriction_mode: A - option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 @@ -3611,11 +3567,6 @@ poll_config_selection: to: poll/config_id required: true restriction_mode: A - option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A max_options_amount: type: number default: 0 @@ -3648,16 +3599,35 @@ poll_config_stv_scottish: to: poll/config_id required: true restriction_mode: A - option_ids: - type: relation-list - to: poll_config_option/poll_config_id - on_delete: CASCADE - restriction_mode: A posts: type: number minimum: 1 default: 1 restriction_mode: A +poll_option: + id: + type: number + restriction_mode: A + constant: true + required: true + poll_id: + type: relation + to: poll/option_ids + reference: poll + required: true + restriction_mode: A + weight: + type: number + restriction_mode: A + text: + type: string + restriction_mode: A + meeting_user_id: + type: relation + to: meeting_user/poll_option_ids + reference: meeting_user + required: false + restriction_mode: A projection: id: type: number From 9661cf9ae324c0a7239a86ba89601368276d714c Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Thu, 23 Apr 2026 09:12:16 +0200 Subject: [PATCH 10/23] Revert formatting changes (#485) --- collections/meeting.yml | 85 ++++++++++++++++++------------------ collections/meeting_user.yml | 1 + collections/motion.yml | 15 ++++--- collections/projection.yml | 50 +++++++++++---------- collections/user.yml | 7 +-- models.yml | 4 ++ 6 files changed, 88 insertions(+), 74 deletions(-) diff --git a/collections/meeting.yml b/collections/meeting.yml index af88ba06..0320ff6d 100644 --- a/collections/meeting.yml +++ b/collections/meeting.yml @@ -129,8 +129,8 @@ applause_enable: applause_type: type: string enum: - - applause-type-bar - - applause-type-particles + - applause-type-bar + - applause-type-particles default: applause-type-bar restriction_mode: C applause_show_level: @@ -173,8 +173,8 @@ projector_countdown_warning_time: export_csv_encoding: type: string enum: - - utf-8 - - iso-8859-15 + - utf-8 + - iso-8859-15 default: utf-8 restriction_mode: B export_csv_separator: @@ -184,17 +184,17 @@ export_csv_separator: export_pdf_pagenumber_alignment: type: string enum: - - left - - right - - center + - left + - right + - center default: center restriction_mode: B export_pdf_fontsize: type: number enum: - - 10 - - 11 - - 12 + - 10 + - 11 + - 12 default: 10 restriction_mode: B export_pdf_line_height: @@ -225,8 +225,8 @@ export_pdf_page_margin_bottom: export_pdf_pagesize: type: string enum: - - A4 - - A5 + - A4 + - A5 default: A4 restriction_mode: B @@ -246,25 +246,25 @@ agenda_number_prefix: agenda_numeral_system: type: string enum: - - arabic - - roman + - arabic + - roman default: arabic restriction_mode: B agenda_item_creation: type: string enum: - - always - - never - - default_yes - - default_no + - always + - never + - default_yes + - default_no default: default_no restriction_mode: B agenda_new_items_default_visibility: type: string enum: - - common - - internal - - hidden + - common + - internal + - hidden default: internal restriction_mode: B agenda_show_internal_items_on_projector: @@ -376,9 +376,9 @@ motions_preamble: motions_default_line_numbering: type: string enum: - - outside - - inline - - none + - outside + - inline + - none default: outside restriction_mode: A motions_line_length: @@ -439,25 +439,25 @@ motions_block_slide_columns: motions_recommendation_text_mode: type: string enum: - - original - - changed - - diff - - agreed + - original + - changed + - diff + - agreed default: diff restriction_mode: B motions_default_sorting: type: string enum: - - number - - weight + - number + - weight default: number restriction_mode: B motions_number_type: type: string enum: - - per_category - - serially_numbered - - manually + - per_category + - serially_numbered + - manually default: per_category restriction_mode: B motions_number_min_digits: @@ -487,9 +487,9 @@ motions_amendments_prefix: motions_amendments_text_mode: type: string enum: - - freestyle - - fulltext - - paragraph + - freestyle + - fulltext + - paragraph default: paragraph restriction_mode: B motions_amendments_multiple_paragraphs: @@ -559,8 +559,8 @@ motion_poll_default_group_ids: motion_poll_projection_name_order_first: type: string enum: - - first_name - - last_name + - first_name + - last_name default: last_name required: true restriction_mode: B @@ -606,10 +606,10 @@ users_pdf_wlan_encryption: type: string default: WPA enum: - - "" - - WEP - - WPA - - nopass + - "" + - WEP + - WPA + - nopass restriction_mode: B users_email_sender: type: string @@ -1156,3 +1156,4 @@ relevant_history_entry_ids: type: relation-list to: history_entry/meeting_id restriction_mode: A + diff --git a/collections/meeting_user.yml b/collections/meeting_user.yml index 84f353bb..925dabc4 100644 --- a/collections/meeting_user.yml +++ b/collections/meeting_user.yml @@ -4,6 +4,7 @@ id: constant: true required: true + comment: type: HTMLStrict restriction_mode: D diff --git a/collections/motion.yml b/collections/motion.yml index c19e566e..3f734c91 100644 --- a/collections/motion.yml +++ b/collections/motion.yml @@ -106,22 +106,22 @@ sort_child_ids: origin_id: type: relation reference: motion - to: motion/derived_motion_ids # Note: The related motions may not be in the same meeting + to: motion/derived_motion_ids # Note: The related motions may not be in the same meeting restriction_mode: A -origin_meeting_id: # The meeting of the motion in origin_id, if any +origin_meeting_id: # The meeting of the motion in origin_id, if any type: relation reference: meeting to: meeting/forwarded_motion_ids restriction_mode: A derived_motion_ids: type: relation-list - to: motion/origin_id # Note: The related motions may not be in the same meeting + to: motion/origin_id # Note: The related motions may not be in the same meeting restriction_mode: A -all_origin_ids: # Calculated: All parents (origin_id), grandparents, etc. of this motion. +all_origin_ids: # Calculated: All parents (origin_id), grandparents, etc. of this motion. type: relation-list to: motion/all_derived_motion_ids restriction_mode: A -all_derived_motion_ids: # Calculated: All children (derived_motion_ids), grandchildren, etc. of this motion. +all_derived_motion_ids: # Calculated: All children (derived_motion_ids), grandchildren, etc. of this motion. type: relation-list to: motion/all_origin_ids restriction_mode: A @@ -146,7 +146,7 @@ state_extension_reference_ids: type: generic-relation-list to: collections: - - motion + - motion field: referenced_in_motion_state_extension_ids equal_fields: meeting_id restriction_mode: C @@ -159,7 +159,7 @@ recommendation_extension_reference_ids: type: generic-relation-list to: collections: - - motion + - motion field: referenced_in_motion_recommendation_extension_ids equal_fields: meeting_id restriction_mode: C @@ -270,3 +270,4 @@ history_entry_ids: type: relation-list to: history_entry/model_id restriction_mode: A + diff --git a/collections/projection.yml b/collections/projection.yml index 2dfaae59..5c54a267 100644 --- a/collections/projection.yml +++ b/collections/projection.yml @@ -18,6 +18,11 @@ type: type: string restriction_mode: A +content: + type: JSON + calculated: true + restriction_mode: A + current_projector_id: type: relation reference: projector @@ -39,29 +44,29 @@ history_projector_id: content_object_id: type: generic-relation reference: - - meeting - - motion - - meeting_mediafile - - list_of_speakers - - motion_block - - assignment - - agenda_item - - topic - - poll - - projector_message - - projector_countdown + - meeting + - motion + - meeting_mediafile + - list_of_speakers + - motion_block + - assignment + - agenda_item + - topic + - poll + - projector_message + - projector_countdown to: - - meeting/projection_ids - - motion/projection_ids - - meeting_mediafile/projection_ids - - list_of_speakers/projection_ids - - motion_block/projection_ids - - assignment/projection_ids - - agenda_item/projection_ids - - topic/projection_ids - - poll/projection_ids - - projector_message/projection_ids - - projector_countdown/projection_ids + - meeting/projection_ids + - motion/projection_ids + - meeting_mediafile/projection_ids + - list_of_speakers/projection_ids + - motion_block/projection_ids + - assignment/projection_ids + - agenda_item/projection_ids + - topic/projection_ids + - poll/projection_ids + - projector_message/projection_ids + - projector_countdown/projection_ids equal_fields: meeting_id restriction_mode: A required: true @@ -73,3 +78,4 @@ meeting_id: required: true restriction_mode: A constant: true + diff --git a/collections/user.yml b/collections/user.yml index cef6f608..dc1e2159 100644 --- a/collections/user.yml +++ b/collections/user.yml @@ -79,9 +79,9 @@ organization_management_level: type: string description: Hierarchical permission level for the whole organization. enum: - - superadmin - - can_manage_organization - - can_manage_users + - superadmin + - can_manage_organization + - can_manage_users restriction_mode: B is_present_in_meeting_ids: type: relation-list @@ -168,3 +168,4 @@ organization_id: required: true restriction_mode: F constant: true + diff --git a/models.yml b/models.yml index aca11e67..92e9716a 100644 --- a/models.yml +++ b/models.yml @@ -3647,6 +3647,10 @@ projection: type: type: string restriction_mode: A + content: + type: JSON + calculated: true + restriction_mode: A current_projector_id: type: relation reference: projector From 30ec47f1b98ee78866a7b90f50202b77b757aa43 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Tue, 5 May 2026 15:34:16 +0200 Subject: [PATCH 11/23] Remove meeting id from ballot (#500) --- collections/ballot.yml | 8 -------- collections/meeting.yml | 6 ------ collections/poll.yml | 1 - dev/sql/schema_relational.sql | 18 +----------------- 4 files changed, 1 insertion(+), 32 deletions(-) diff --git a/collections/ballot.yml b/collections/ballot.yml index 345677e4..91d7e88f 100644 --- a/collections/ballot.yml +++ b/collections/ballot.yml @@ -17,18 +17,10 @@ fields: type: text restriction_mode: B constant: true - meeting_id: - type: relation - reference: meeting - to: meeting/ballot_ids - restriction_mode: A - required: true - constant: true poll_id: type: relation reference: poll to: poll/ballot_ids - equal_fields: meeting_id required: true restriction_mode: A constant: true diff --git a/collections/meeting.yml b/collections/meeting.yml index 8a3ab68e..f0e378e9 100644 --- a/collections/meeting.yml +++ b/collections/meeting.yml @@ -903,12 +903,6 @@ fields: reference: poll on_delete: CASCADE restriction_mode: B - ballot_ids: - type: relation-list - to: ballot/meeting_id - reference: ballot - on_delete: CASCADE - restriction_mode: B assignment_ids: type: relation-list to: assignment/meeting_id diff --git a/collections/poll.yml b/collections/poll.yml index 333c54f9..29285cd7 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -94,7 +94,6 @@ fields: to: ballot/poll_id reference: ballot on_delete: CASCADE - equal_fields: meeting_id restriction_mode: A voted_ids: type: relation-list diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 534425c9..1160be3d 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '2f9f14555504e4f501fadc87b3661578' +-- MODELS_YML_CHECKSUM = '16fab06ccd342abd9a78e00b0048aa41' -- ENUM definitions @@ -953,8 +953,6 @@ CREATE TABLE ballot_t ( split boolean CONSTRAINT default_ballot_split DEFAULT False, value text, - meeting_id integer - CONSTRAINT required_ballot_meeting_id NOT NULL, poll_id integer CONSTRAINT required_ballot_poll_id NOT NULL, acting_meeting_user_id integer, @@ -3047,7 +3045,6 @@ CREATE VIEW "meeting" AS SELECT *, (select array_agg(mc.id ORDER BY mc.id) from motion_change_recommendation_t mc where mc.meeting_id = m.id) as motion_change_recommendation_ids, (select array_agg(ms.id ORDER BY ms.id) from motion_state_t ms where ms.meeting_id = m.id) as motion_state_ids, (select array_agg(p.id ORDER BY p.id) from poll_t p where p.meeting_id = m.id) as poll_ids, -(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.meeting_id = m.id) as ballot_ids, (select array_agg(a.id ORDER BY a.id) from assignment_t a where a.meeting_id = m.id) as assignment_ids, (select array_agg(a.id ORDER BY a.id) from assignment_candidate_t a where a.meeting_id = m.id) as assignment_candidate_ids, (select array_agg(p.id ORDER BY p.id) from personal_note_t p where p.meeting_id = m.id) as personal_note_ids, @@ -3399,8 +3396,6 @@ CREATE INDEX idx_assignment_candidate_t_meeting_user_id ON assignment_candidate_ ALTER TABLE assignment_candidate_t ADD CONSTRAINT fk_assignment_candidate_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_assignment_candidate_t_meeting_id ON assignment_candidate_t (meeting_id); -ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_ballot_t_meeting_id ON ballot_t (meeting_id); ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; CREATE INDEX idx_ballot_t_poll_id ON ballot_t (poll_id); ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_acting_meeting_user_id_meeting_user_t_id FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; @@ -4098,8 +4093,6 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_models('ballot'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON ballot_t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_ballot_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON ballot_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id', 'ballot_ids'); CREATE TRIGGER tr_log_ballot_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON ballot_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id', 'ballot_ids'); CREATE TRIGGER tr_log_ballot_t_acting_meeting_user_id AFTER INSERT OR UPDATE OF acting_meeting_user_id OR DELETE ON ballot_t @@ -4908,13 +4901,6 @@ FOR EACH ROW EXECUTE FUNCTION check_equals('assignment_candidate', 'meeting_user -CREATE CONSTRAINT TRIGGER equal_meeting_id_on_ballot_t_poll_id AFTER INSERT ON ballot_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_equals('ballot', 'poll', 'poll_id', 'meeting_id', FALSE); -CREATE CONSTRAINT TRIGGER equal_meeting_id_on_poll_t_ballot_ids AFTER INSERT ON poll_t INITIALLY DEFERRED -FOR EACH ROW EXECUTE FUNCTION check_equals('ballot', 'poll', 'poll_id', 'meeting_id', TRUE); - - - CREATE CONSTRAINT TRIGGER equal_meeting_id_on_chat_group_t_read_group_ids AFTER INSERT ON chat_group_t INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION check_equals_multi('nm_chat_group_read_group_ids_group_t', 'chat_group_id', 'chat_group', 'group_id', 'group', 'meeting_id', 'read_group_ids'); CREATE CONSTRAINT TRIGGER equal_meeting_id_on_group_t_read_chat_group_ids AFTER INSERT ON group_t INITIALLY DEFERRED @@ -5456,7 +5442,6 @@ FIELD 1rR:nt => assignment_candidate/assignment_id:-> assignment/candidate_ids FIELD 1r:nt => assignment_candidate/meeting_user_id:-> meeting_user/assignment_candidate_ids FIELD 1rR:nt => assignment_candidate/meeting_id:-> meeting/assignment_candidate_ids -FIELD 1rR:nr => ballot/meeting_id:-> meeting/ballot_ids FIELD 1rR:nr => ballot/poll_id:-> poll/ballot_ids FIELD 1r:nt => ballot/acting_meeting_user_id:-> meeting_user/acting_ballot_ids FIELD 1r:nt => ballot/represented_meeting_user_id:-> meeting_user/represented_ballot_ids @@ -5561,7 +5546,6 @@ SQL nt:1rR => meeting/motion_working_group_speaker_ids:-> motion_working_group_s SQL nt:1rR => meeting/motion_change_recommendation_ids:-> motion_change_recommendation/meeting_id SQL nt:1rR => meeting/motion_state_ids:-> motion_state/meeting_id SQL nr:1rR => meeting/poll_ids:-> poll/meeting_id -SQL nr:1rR => meeting/ballot_ids:-> ballot/meeting_id SQL nt:1rR => meeting/assignment_ids:-> assignment/meeting_id SQL nt:1rR => meeting/assignment_candidate_ids:-> assignment_candidate/meeting_id SQL nt:1rR => meeting/personal_note_ids:-> personal_note/meeting_id From 76cd8f61a4299db272bfc64a5c4ca020a668e636 Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Thu, 7 May 2026 17:34:19 +0200 Subject: [PATCH 12/23] Remove projection content (#504) --- collections/projection.yml | 5 ----- dev/sql/schema_relational.sql | 12 +----------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/collections/projection.yml b/collections/projection.yml index ee1cd191..ca22fa2b 100644 --- a/collections/projection.yml +++ b/collections/projection.yml @@ -19,11 +19,6 @@ fields: type: string restriction_mode: A - content: - type: JSON - calculated: true - restriction_mode: A - current_projector_id: type: relation reference: projector diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 89325c7e..f6cce8ba 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'fa396bcefa865c941128374216b63743' +-- MODELS_YML_CHECKSUM = '659252f26ee5ed0d8baa911985de383c' -- ENUM definitions @@ -2150,12 +2150,6 @@ CREATE TABLE projection_t ( -/* - Fields without SQL definition for table projection - - projection/content: type:JSON is marked as a calculated field and not generated in schema - -*/ CREATE TABLE projector_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -6269,9 +6263,5 @@ SQL nts:nts => user/meeting_ids:-> meeting/user_ids FIELD 1rR:nr => user/organization_id:-> organization/user_ids */ -/* -There are 1 errors/warnings - projection/content: type:JSON is marked as a calculated field and not generated in schema -*/ /* Missing attribute handling for on_delete, constant_legacy, deferred */ \ No newline at end of file From a1d28df29a220be713108f2b0b87ff876ce9704a Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Sat, 9 May 2026 08:27:54 +0200 Subject: [PATCH 13/23] [Vote] Models changes for new Vote-Service (#506) * Refactor poll permissions - Move poll.can_manage_pools to agenda_item * rename ballot to poll_ballot * add selection display_chart * Make sure in the schema, a user can only vote once * Add field anonymized * add field live_voting_enabled --- collections/meeting_user.yml | 7 +- collections/poll.yml | 14 +- collections/{ballot.yml => poll_ballot.yml} | 3 + collections/poll_config_selection.yml | 3 + dev/sql/schema_relational.sql | 134 +++++++++++--------- permission.yml | 17 ++- 6 files changed, 103 insertions(+), 75 deletions(-) rename collections/{ballot.yml => poll_ballot.yml} (92%) diff --git a/collections/meeting_user.yml b/collections/meeting_user.yml index e66eb629..0d456f6f 100644 --- a/collections/meeting_user.yml +++ b/collections/meeting_user.yml @@ -1,5 +1,5 @@ unique_together: -- meeting_id, user_id + - meeting_id, user_id fields: id: @@ -99,11 +99,11 @@ fields: restriction_mode: A acting_ballot_ids: type: relation-list - to: ballot/acting_meeting_user_id + to: poll_ballot/acting_meeting_user_id restriction_mode: A represented_ballot_ids: type: relation-list - to: ballot/represented_meeting_user_id + to: poll_ballot/represented_meeting_user_id restriction_mode: A chat_message_ids: type: relation-list @@ -121,4 +121,3 @@ fields: equal_fields: meeting_id restriction_mode: A to: structure_level/meeting_user_ids - diff --git a/collections/poll.yml b/collections/poll.yml index 29285cd7..7a83cb7b 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -55,6 +55,11 @@ fields: default: false description: If true, users can see the result. restriction_mode: A + anonymized: + type: boolean + default: false + description: Set to true, after finished was called with anonymize. + restriction_mode: A allow_invalid: type: boolean default: false @@ -65,6 +70,11 @@ fields: default: false description: If true, users can split there vote. restriction_mode: A + live_voting_enabled: + type: boolean + default: false + description: If true, on start, publish will be set to true. + restriction_mode: A sequential_number: type: number sequence_scope: meeting_id @@ -91,8 +101,8 @@ fields: constant: true ballot_ids: type: relation-list - to: ballot/poll_id - reference: ballot + to: poll_ballot/poll_id + reference: poll_ballot on_delete: CASCADE restriction_mode: A voted_ids: diff --git a/collections/ballot.yml b/collections/poll_ballot.yml similarity index 92% rename from collections/ballot.yml rename to collections/poll_ballot.yml index 91d7e88f..95126682 100644 --- a/collections/ballot.yml +++ b/collections/poll_ballot.yml @@ -1,3 +1,6 @@ +unique_together: + - poll_id, represented_meeting_user_id + fields: id: type: number diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml index 74de3fde..01c1da42 100644 --- a/collections/poll_config_selection.yml +++ b/collections/poll_config_selection.yml @@ -30,3 +30,6 @@ fields: required: true enum: selection_onehundred_percent_bases restriction_mode: A + display_chart: + type: string + restriction_mode: A diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index f6cce8ba..3840bf3d 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '659252f26ee5ed0d8baa911985de383c' +-- MODELS_YML_CHECKSUM = 'd99c7cda0eee3355b9c5e848de67a826' -- ENUM definitions @@ -980,22 +980,6 @@ CREATE TABLE assignment_candidate_t ( -CREATE TABLE ballot_t ( - id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, - weight decimal(16,6) - CONSTRAINT default_ballot_weight DEFAULT '1.000000', - split boolean - CONSTRAINT default_ballot_split DEFAULT False, - value text, - poll_id integer - CONSTRAINT required_ballot_poll_id NOT NULL, - acting_meeting_user_id integer, - represented_meeting_user_id integer -); - - - - CREATE TABLE chat_group_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, name varchar(256) @@ -1996,10 +1980,14 @@ CREATE TABLE poll_t ( result text, published boolean CONSTRAINT default_poll_published DEFAULT False, + anonymized boolean + CONSTRAINT default_poll_anonymized DEFAULT False, allow_invalid boolean CONSTRAINT default_poll_allow_invalid DEFAULT False, allow_vote_split boolean CONSTRAINT default_poll_allow_vote_split DEFAULT False, + live_voting_enabled boolean + CONSTRAINT default_poll_live_voting_enabled DEFAULT False, sequential_number integer CONSTRAINT required_poll_sequential_number NOT NULL, CONSTRAINT unique_poll_sequential_number_meeting_id UNIQUE (sequential_number, meeting_id), @@ -2020,11 +2008,30 @@ CREATE TABLE poll_t ( comment on column poll_t.result is 'Calculated result. The format depends on the value in poll/method. Can be manually set when visibility is set to manually.'; comment on column poll_t.published is 'If true, users can see the result.'; +comment on column poll_t.anonymized is 'Set to true, after finished was called with anonymize.'; comment on column poll_t.allow_invalid is 'If true, the vote service does not validate. This is always the case for secret polls.'; comment on column poll_t.allow_vote_split is 'If true, users can split there vote.'; +comment on column poll_t.live_voting_enabled is 'If true, on start, publish will be set to true.'; comment on column poll_t.sequential_number is 'The (positive) serial number of this model in its meeting. This number is auto-generated and read-only.'; +CREATE TABLE poll_ballot_t ( + id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, + weight decimal(16,6) + CONSTRAINT default_poll_ballot_weight DEFAULT '1.000000', + split boolean + CONSTRAINT default_poll_ballot_split DEFAULT False, + value text, + poll_id integer + CONSTRAINT required_poll_ballot_poll_id NOT NULL, + acting_meeting_user_id integer, + represented_meeting_user_id integer, + CONSTRAINT unique_poll_ballot_poll_id_represented_meeting_user_id UNIQUE (poll_id, represented_meeting_user_id) +); + + + + CREATE TABLE poll_config_approval_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, allow_abstain boolean @@ -2081,7 +2088,8 @@ CREATE TABLE poll_config_selection_t ( strike_out boolean CONSTRAINT default_poll_config_selection_strike_out DEFAULT False, onehundred_percent_base enum_selection_onehundred_percent_bases - CONSTRAINT required_poll_config_selection_onehundred_percent_base NOT NULL + CONSTRAINT required_poll_config_selection_onehundred_percent_base NOT NULL, + display_chart varchar(256) ); @@ -2944,9 +2952,6 @@ FROM assignment_t a; CREATE VIEW "assignment_candidate" AS SELECT * FROM assignment_candidate_t a; -CREATE VIEW "ballot" AS SELECT * FROM ballot_t b; - - CREATE VIEW "chat_group" AS SELECT *, (select array_agg(cm.id ORDER BY cm.id) from chat_message_t cm where cm.chat_group_id = c.id) as chat_message_ids, (select array_agg(n.group_id ORDER BY n.group_id) from nm_chat_group_read_group_ids_group_t n where n.chat_group_id = c.id) as read_group_ids, @@ -3147,8 +3152,8 @@ CREATE VIEW "meeting_user" AS SELECT *, (select array_agg(mu.id ORDER BY mu.id) from meeting_user_t mu where mu.vote_delegated_to_id = m.id) as vote_delegations_from_ids, (select array_agg(n.poll_id ORDER BY n.poll_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.meeting_user_id = m.id) as poll_voted_ids, (select array_agg(p.id ORDER BY p.id) from poll_option_t p where p.meeting_user_id = m.id) as poll_option_ids, -(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.acting_meeting_user_id = m.id) as acting_ballot_ids, -(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.represented_meeting_user_id = m.id) as represented_ballot_ids, +(select array_agg(p.id ORDER BY p.id) from poll_ballot_t p where p.acting_meeting_user_id = m.id) as acting_ballot_ids, +(select array_agg(p.id ORDER BY p.id) from poll_ballot_t p where p.represented_meeting_user_id = m.id) as represented_ballot_ids, (select array_agg(c.id ORDER BY c.id) from chat_message_t c where c.meeting_user_id = m.id) as chat_message_ids, (select array_agg(n.group_id ORDER BY n.group_id) from nm_group_meeting_user_ids_meeting_user_t n where n.meeting_user_id = m.id) as group_ids, (select array_agg(n.structure_level_id ORDER BY n.structure_level_id) from nm_meeting_user_structure_level_ids_structure_level_t n where n.meeting_user_id = m.id) as structure_level_ids @@ -3268,13 +3273,16 @@ FROM point_of_order_category_t p; CREATE VIEW "poll" AS SELECT *, (select array_agg(po.id ORDER BY po.id) from poll_option_t po where po.poll_id = p.id) as option_ids, -(select array_agg(b.id ORDER BY b.id) from ballot_t b where b.poll_id = p.id) as ballot_ids, +(select array_agg(pb.id ORDER BY pb.id) from poll_ballot_t pb where pb.poll_id = p.id) as ballot_ids, (select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.poll_id = p.id) as voted_ids, (select array_agg(n.group_id ORDER BY n.group_id) from nm_group_poll_ids_poll_t n where n.poll_id = p.id) as entitled_group_ids, (select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_poll_id = p.id) as projection_ids FROM poll_t p; +CREATE VIEW "poll_ballot" AS SELECT * FROM poll_ballot_t p; + + CREATE VIEW "poll_config_approval" AS SELECT *, (select p1.id from poll_t p1 where p1.config_id_poll_config_approval_id = p.id) as poll_id FROM poll_config_approval_t p; @@ -3426,13 +3434,6 @@ CREATE INDEX idx_assignment_candidate_t_meeting_user_id ON assignment_candidate_ ALTER TABLE assignment_candidate_t ADD CONSTRAINT fk_assignment_candidate_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_assignment_candidate_t_meeting_id ON assignment_candidate_t (meeting_id); -ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_ballot_t_poll_id ON ballot_t (poll_id); -ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_acting_meeting_user_id_meeting_user_t_id FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_ballot_t_acting_meeting_user_id ON ballot_t (acting_meeting_user_id); -ALTER TABLE ballot_t ADD CONSTRAINT fk_ballot_t_represented_meeting_user_id_meeting_user_t_id FOREIGN KEY(represented_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_ballot_t_represented_meeting_user_id ON ballot_t (represented_meeting_user_id); - ALTER TABLE chat_group_t ADD CONSTRAINT fk_chat_group_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_chat_group_t_meeting_id ON chat_group_t (meeting_id); @@ -3686,6 +3687,13 @@ CREATE INDEX idx_poll_t_content_object_id_topic_id ON poll_t (content_object_id_ ALTER TABLE poll_t ADD CONSTRAINT fk_poll_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_poll_t_meeting_id ON poll_t (meeting_id); +ALTER TABLE poll_ballot_t ADD CONSTRAINT fk_poll_ballot_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_ballot_t_poll_id ON poll_ballot_t (poll_id); +ALTER TABLE poll_ballot_t ADD CONSTRAINT fk_poll_ballot_t_acting_meeting_user_id_meeting_user_t_id FOREIGN KEY(acting_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_ballot_t_acting_meeting_user_id ON poll_ballot_t (acting_meeting_user_id); +ALTER TABLE poll_ballot_t ADD CONSTRAINT fk_poll_ballot_t_represented_meeting_user_id_meeting_user_t_id FOREIGN KEY(represented_meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_poll_ballot_t_represented_meeting_user_id ON poll_ballot_t (represented_meeting_user_id); + ALTER TABLE poll_option_t ADD CONSTRAINT fk_poll_option_t_poll_id_poll_t_id FOREIGN KEY(poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; CREATE INDEX idx_poll_option_t_poll_id ON poll_option_t (poll_id); ALTER TABLE poll_option_t ADD CONSTRAINT fk_poll_option_t_meeting_user_id_meeting_user_t_id FOREIGN KEY(meeting_user_id) REFERENCES meeting_user_t(id) INITIALLY DEFERRED; @@ -4095,19 +4103,6 @@ CREATE TRIGGER tr_constant_assignment_candidate_meeting_id BEFORE UPDATE OF meet FOR EACH ROW EXECUTE FUNCTION prevent_updates('assignment_candidate', 'meeting_id'); --- definition trigger prevent_updates for ballot.weight -CREATE TRIGGER tr_constant_ballot_weight BEFORE UPDATE OF weight ON ballot_t -FOR EACH ROW EXECUTE FUNCTION prevent_updates('ballot', 'weight'); - --- definition trigger prevent_updates for ballot.value -CREATE TRIGGER tr_constant_ballot_value BEFORE UPDATE OF value ON ballot_t -FOR EACH ROW EXECUTE FUNCTION prevent_updates('ballot', 'value'); - --- definition trigger prevent_updates for ballot.poll_id -CREATE TRIGGER tr_constant_ballot_poll_id BEFORE UPDATE OF poll_id ON ballot_t -FOR EACH ROW EXECUTE FUNCTION prevent_updates('ballot', 'poll_id'); - - -- definition trigger prevent_updates for chat_group.meeting_id CREATE TRIGGER tr_constant_chat_group_meeting_id BEFORE UPDATE OF meeting_id ON chat_group_t FOR EACH ROW EXECUTE FUNCTION prevent_updates('chat_group', 'meeting_id'); @@ -4336,6 +4331,19 @@ CREATE TRIGGER tr_constant_poll_meeting_id BEFORE UPDATE OF meeting_id ON poll_t FOR EACH ROW EXECUTE FUNCTION prevent_updates('poll', 'meeting_id'); +-- definition trigger prevent_updates for poll_ballot.weight +CREATE TRIGGER tr_constant_poll_ballot_weight BEFORE UPDATE OF weight ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION prevent_updates('poll_ballot', 'weight'); + +-- definition trigger prevent_updates for poll_ballot.value +CREATE TRIGGER tr_constant_poll_ballot_value BEFORE UPDATE OF value ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION prevent_updates('poll_ballot', 'value'); + +-- definition trigger prevent_updates for poll_ballot.poll_id +CREATE TRIGGER tr_constant_poll_ballot_poll_id BEFORE UPDATE OF poll_id ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION prevent_updates('poll_ballot', 'poll_id'); + + -- definition trigger prevent_updates for projection.content_object_id CREATE TRIGGER tr_constant_projection_content_object_id BEFORE UPDATE OF content_object_id ON projection_t FOR EACH ROW EXECUTE FUNCTION prevent_updates('projection', 'content_object_id'); @@ -4465,18 +4473,6 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'meeti CREATE TRIGGER tr_log_assignment_candidate_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON assignment_candidate_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id', 'assignment_candidate_ids'); -CREATE TRIGGER tr_log_ballot AFTER INSERT OR UPDATE OR DELETE ON ballot_t -FOR EACH ROW EXECUTE FUNCTION log_modified_models('ballot'); -CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON ballot_t -DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); - -CREATE TRIGGER tr_log_ballot_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON ballot_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id', 'ballot_ids'); -CREATE TRIGGER tr_log_ballot_t_acting_meeting_user_id AFTER INSERT OR UPDATE OF acting_meeting_user_id OR DELETE ON ballot_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'acting_meeting_user_id', 'acting_ballot_ids'); -CREATE TRIGGER tr_log_ballot_t_represented_meeting_user_id AFTER INSERT OR UPDATE OF represented_meeting_user_id OR DELETE ON ballot_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'represented_meeting_user_id', 'represented_ballot_ids'); - CREATE TRIGGER tr_log_chat_group AFTER INSERT OR UPDATE OR DELETE ON chat_group_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('chat_group'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON chat_group_t @@ -5033,6 +5029,18 @@ FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('topic','content_objec CREATE TRIGGER tr_log_poll_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON poll_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting', 'meeting_id', 'poll_ids'); +CREATE TRIGGER tr_log_poll_ballot AFTER INSERT OR UPDATE OR DELETE ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_ballot'); +CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_ballot_t +DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); + +CREATE TRIGGER tr_log_poll_ballot_t_poll_id AFTER INSERT OR UPDATE OF poll_id OR DELETE ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll', 'poll_id', 'ballot_ids'); +CREATE TRIGGER tr_log_poll_ballot_t_acting_meeting_user_id AFTER INSERT OR UPDATE OF acting_meeting_user_id OR DELETE ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'acting_meeting_user_id', 'acting_ballot_ids'); +CREATE TRIGGER tr_log_poll_ballot_t_represented_meeting_user_id AFTER INSERT OR UPDATE OF represented_meeting_user_id OR DELETE ON poll_ballot_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('meeting_user', 'represented_meeting_user_id', 'represented_ballot_ids'); + CREATE TRIGGER tr_log_poll_config_approval AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t FOR EACH ROW EXECUTE FUNCTION log_modified_models('poll_config_approval'); CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELETE ON poll_config_approval_t @@ -5859,10 +5867,6 @@ FIELD 1rR:nt => assignment_candidate/assignment_id:-> assignment/candidate_ids FIELD 1r:nt => assignment_candidate/meeting_user_id:-> meeting_user/assignment_candidate_ids FIELD 1rR:nt => assignment_candidate/meeting_id:-> meeting/assignment_candidate_ids -FIELD 1rR:nr => ballot/poll_id:-> poll/ballot_ids -FIELD 1r:nt => ballot/acting_meeting_user_id:-> meeting_user/acting_ballot_ids -FIELD 1r:nt => ballot/represented_meeting_user_id:-> meeting_user/represented_ballot_ids - SQL nt:1rR => chat_group/chat_message_ids:-> chat_message/chat_group_id SQL nt:nt => chat_group/read_group_ids:-> group/read_chat_group_ids SQL nt:nt => chat_group/write_group_ids:-> group/write_chat_group_ids @@ -6050,8 +6054,8 @@ FIELD 1r:nt => meeting_user/vote_delegated_to_id:-> meeting_user/vote_delegation SQL nt:1r => meeting_user/vote_delegations_from_ids:-> meeting_user/vote_delegated_to_id SQL nt:nt => meeting_user/poll_voted_ids:-> poll/voted_ids SQL nr:1r => meeting_user/poll_option_ids:-> poll_option/meeting_user_id -SQL nt:1r => meeting_user/acting_ballot_ids:-> ballot/acting_meeting_user_id -SQL nt:1r => meeting_user/represented_ballot_ids:-> ballot/represented_meeting_user_id +SQL nt:1r => meeting_user/acting_ballot_ids:-> poll_ballot/acting_meeting_user_id +SQL nt:1r => meeting_user/represented_ballot_ids:-> poll_ballot/represented_meeting_user_id SQL nt:1r => meeting_user/chat_message_ids:-> chat_message/meeting_user_id SQL ntR:nt => meeting_user/group_ids:-> group/meeting_user_ids SQL nt:nt => meeting_user/structure_level_ids:-> structure_level/meeting_user_ids @@ -6170,12 +6174,16 @@ SQL nt:1r => point_of_order_category/speaker_ids:-> speaker/point_of_order_categ FIELD 1GrR:1tR,1tR,1tR,1tR,1tR => poll/config_id:-> poll_config_approval/poll_id,poll_config_selection/poll_id,poll_config_rating_score/poll_id,poll_config_rating_approval/poll_id,poll_config_stv_scottish/poll_id SQL nt:1rR => poll/option_ids:-> poll_option/poll_id FIELD 1GrR:nt,nt,nt => poll/content_object_id:-> motion/poll_ids,assignment/poll_ids,topic/poll_ids -SQL nr:1rR => poll/ballot_ids:-> ballot/poll_id +SQL nr:1rR => poll/ballot_ids:-> poll_ballot/poll_id SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids SQL nt:nt => poll/entitled_group_ids:-> group/poll_ids SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids +FIELD 1rR:nr => poll_ballot/poll_id:-> poll/ballot_ids +FIELD 1r:nt => poll_ballot/acting_meeting_user_id:-> meeting_user/acting_ballot_ids +FIELD 1r:nt => poll_ballot/represented_meeting_user_id:-> meeting_user/represented_ballot_ids + SQL 1tR:1GrR => poll_config_approval/poll_id:-> poll/config_id SQL 1tR:1GrR => poll_config_rating_approval/poll_id:-> poll/config_id diff --git a/permission.yml b/permission.yml index e6f05f38..9cc7e4c7 100644 --- a/permission.yml +++ b/permission.yml @@ -10,12 +10,17 @@ agenda_item: can_manage: can_see_internal: can_see: + can_manage_polls: # Can create, start and stop topic polls + can_see_polls: # Can see unpublished poll results for topics + can_see_internal: + can_see: assignment: can_manage: can_nominate_other: can_see: - can_manage_polls: - can_see: + can_manage_polls: # Can create, start and stop assignment polls + can_see_polls: # Can see unpublished poll results for assignments + can_see: can_nominate_self: can_see: chat: @@ -48,15 +53,15 @@ motion: can_see: can_forward: can_see: - can_manage_polls: - can_see: + can_manage_polls: # Can create, start and stop motion polls + can_see_polls: # Can see unpublished poll results for motions + can_see: can_support: can_see: can_see_origin: can_see: poll: - can_manage: - can_see_progress: + can_see_progress: # Can see all progressbars (Topic, Assignemnt, Motion) projector: can_manage: can_see: From 9273b587864b584132008894e841838a1d59bc1d Mon Sep 17 00:00:00 2001 From: Bastian Rihm Date: Mon, 11 May 2026 11:27:19 +0200 Subject: [PATCH 14/23] Mark collections not managed by the backend (#509) --- README.md | 3 +++ collections/poll.yml | 1 + collections/poll_ballot.yml | 1 + collections/poll_config_approval.yml | 1 + collections/poll_config_rating_approval.yml | 1 + collections/poll_config_rating_score.yml | 1 + collections/poll_config_selection.yml | 1 + collections/poll_config_stv_scottish.yml | 1 + collections/poll_option.yml | 1 + 9 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 770a0d80..346865b9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ collection, there is a file in the `collections` directory. The file Each collection-file has the following format: +- Model level settings: + - `managed_by` can be set to the service the collection is managed by. Default to + `backend`. Available options are `backend` or `vote`. - Length of names: - field name: Their length is limited to 25 characters. There are still some fields with longer names, that has to be shortened diff --git a/collections/poll.yml b/collections/poll.yml index 7a83cb7b..989eeb46 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_ballot.yml b/collections/poll_ballot.yml index 95126682..6ab94d15 100644 --- a/collections/poll_ballot.yml +++ b/collections/poll_ballot.yml @@ -1,3 +1,4 @@ +managed_by: vote unique_together: - poll_id, represented_meeting_user_id diff --git a/collections/poll_config_approval.yml b/collections/poll_config_approval.yml index e1807141..d75af6b9 100644 --- a/collections/poll_config_approval.yml +++ b/collections/poll_config_approval.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml index c842c60e..52499b91 100644 --- a/collections/poll_config_rating_approval.yml +++ b/collections/poll_config_rating_approval.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_config_rating_score.yml b/collections/poll_config_rating_score.yml index ac7e59b4..15bdf37e 100644 --- a/collections/poll_config_rating_score.yml +++ b/collections/poll_config_rating_score.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_config_selection.yml b/collections/poll_config_selection.yml index 01c1da42..0e4c3d25 100644 --- a/collections/poll_config_selection.yml +++ b/collections/poll_config_selection.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_config_stv_scottish.yml b/collections/poll_config_stv_scottish.yml index 84a848fe..b7e26c99 100644 --- a/collections/poll_config_stv_scottish.yml +++ b/collections/poll_config_stv_scottish.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number diff --git a/collections/poll_option.yml b/collections/poll_option.yml index 57d8bd05..70227715 100644 --- a/collections/poll_option.yml +++ b/collections/poll_option.yml @@ -1,3 +1,4 @@ +managed_by: vote fields: id: type: number From 0ffd96331f81d6e0a671fa591bcf3de6bfa71a91 Mon Sep 17 00:00:00 2001 From: Viktoriia Krasnovyd <114735598+vkrasnovyd@users.noreply.github.com> Date: Mon, 11 May 2026 13:33:37 +0200 Subject: [PATCH 15/23] Update permissions (#510) --- collections/group.yml | 5 ++++- dev/sql/schema_relational.sql | 7 ++++--- dev/tests/base.py | 5 ++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/collections/group.yml b/collections/group.yml index 34e30f08..73fbd680 100644 --- a/collections/group.yml +++ b/collections/group.yml @@ -20,12 +20,15 @@ fields: items: enum: - agenda_item.can_manage + - agenda_item.can_manage_polls + - agenda_item.can_see_polls - agenda_item.can_see - agenda_item.can_see_internal - assignment.can_manage - assignment.can_manage_polls - assignment.can_nominate_other - assignment.can_nominate_self + - assignment.can_see_polls - assignment.can_see - chat.can_manage - list_of_speakers.can_be_speaker @@ -47,11 +50,11 @@ fields: - motion.can_manage - motion.can_manage_metadata - motion.can_manage_polls + - motion.can_see_polls - motion.can_see - motion.can_see_internal - motion.can_see_origin - motion.can_support - - poll.can_manage - poll.can_see_progress - projector.can_manage - projector.can_see diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 3840bf3d..c0617db5 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'd99c7cda0eee3355b9c5e848de67a826' +-- MODELS_YML_CHECKSUM = 'd9907ba84a14faf895da6454411809ac' -- ENUM definitions @@ -26,7 +26,7 @@ CREATE TYPE enum_agenda_item_type AS ENUM ('common', 'internal', 'hidden'); CREATE TYPE enum_assignment_phase AS ENUM ('search', 'voting', 'finished'); -CREATE TYPE enum_group_permissions AS ENUM ('agenda_item.can_manage', 'agenda_item.can_see', 'agenda_item.can_see_internal', 'assignment.can_manage', 'assignment.can_manage_polls', 'assignment.can_nominate_other', 'assignment.can_nominate_self', 'assignment.can_see', 'chat.can_manage', 'list_of_speakers.can_be_speaker', 'list_of_speakers.can_manage', 'list_of_speakers.can_see', 'list_of_speakers.can_manage_moderator_notes', 'list_of_speakers.can_see_moderator_notes', 'mediafile.can_manage', 'mediafile.can_see', 'meeting.can_manage_logos_and_fonts', 'meeting.can_manage_settings', 'meeting.can_see_autopilot', 'meeting.can_see_frontpage', 'meeting.can_see_history', 'meeting.can_see_livestream', 'motion.can_create', 'motion.can_create_amendments', 'motion.can_forward', 'motion.can_manage', 'motion.can_manage_metadata', 'motion.can_manage_polls', 'motion.can_see', 'motion.can_see_internal', 'motion.can_see_origin', 'motion.can_support', 'poll.can_manage', 'poll.can_see_progress', 'projector.can_manage', 'projector.can_see', 'tag.can_manage', 'user.can_manage', 'user.can_manage_presence', 'user.can_see_sensitive_data', 'user.can_see', 'user.can_update', 'user.can_edit_own_delegation'); +CREATE TYPE enum_group_permissions AS ENUM ('agenda_item.can_manage', 'agenda_item.can_manage_polls', 'agenda_item.can_see_polls', 'agenda_item.can_see', 'agenda_item.can_see_internal', 'assignment.can_manage', 'assignment.can_manage_polls', 'assignment.can_nominate_other', 'assignment.can_nominate_self', 'assignment.can_see_polls', 'assignment.can_see', 'chat.can_manage', 'list_of_speakers.can_be_speaker', 'list_of_speakers.can_manage', 'list_of_speakers.can_see', 'list_of_speakers.can_manage_moderator_notes', 'list_of_speakers.can_see_moderator_notes', 'mediafile.can_manage', 'mediafile.can_see', 'meeting.can_manage_logos_and_fonts', 'meeting.can_manage_settings', 'meeting.can_see_autopilot', 'meeting.can_see_frontpage', 'meeting.can_see_history', 'meeting.can_see_livestream', 'motion.can_create', 'motion.can_create_amendments', 'motion.can_forward', 'motion.can_manage', 'motion.can_manage_metadata', 'motion.can_manage_polls', 'motion.can_see_polls', 'motion.can_see', 'motion.can_see_internal', 'motion.can_see_origin', 'motion.can_support', 'poll.can_see_progress', 'projector.can_manage', 'projector.can_see', 'tag.can_manage', 'user.can_manage', 'user.can_manage_presence', 'user.can_see_sensitive_data', 'user.can_see', 'user.can_update', 'user.can_edit_own_delegation'); CREATE TYPE enum_import_preview_name AS ENUM ('account', 'participant', 'topic', 'committee', 'motion'); @@ -6272,4 +6272,5 @@ FIELD 1rR:nr => user/organization_id:-> organization/user_ids */ -/* Missing attribute handling for on_delete, constant_legacy, deferred */ \ No newline at end of file +/* Missing attribute handling for on_delete, constant_legacy, deferred */ +/* Missing handling for collections _meta attributes: managed_by */ \ No newline at end of file diff --git a/dev/tests/base.py b/dev/tests/base.py index da5d9a83..1458eb57 100644 --- a/dev/tests/base.py +++ b/dev/tests/base.py @@ -304,7 +304,10 @@ def create_meeting( "meeting.can_see_frontpage", "meeting.can_see_history", "motion.can_manage", - "poll.can_manage", + "agenda_item.can_manage_polls", + "assignment.can_manage_polls", + "motion.can_manage_polls", + "poll.can_see_progress", "projector.can_manage", "tag.can_manage", "user.can_manage", From 0f01e570ef16757b867c58e3142ca01f875f5aeb Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Thu, 11 Jun 2026 12:52:35 +0200 Subject: [PATCH 16/23] Add poll to history entry --- collections/history_entry.yml | 14 +++++++----- collections/poll.yml | 4 ++++ dev/sql/schema_relational.sql | 41 +++++++++++++++++++++-------------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/collections/history_entry.yml b/collections/history_entry.yml index 2bed1640..e523ddb0 100644 --- a/collections/history_entry.yml +++ b/collections/history_entry.yml @@ -16,15 +16,17 @@ fields: type: generic-relation to: collections: - - user - - motion - - assignment + - assignment + - motion + - poll + - user field: history_entry_ids restriction_mode: A reference: - - user - - motion - - assignment + - assignment + - motion + - poll + - user position_id: type: relation to: history_position/entry_ids diff --git a/collections/poll.yml b/collections/poll.yml index 7a83cb7b..a2c0b860 100644 --- a/collections/poll.yml +++ b/collections/poll.yml @@ -127,3 +127,7 @@ fields: restriction_mode: A required: true constant: true + history_entry_ids: + type: relation-list + to: history_entry/model_id + restriction_mode: A diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 3840bf3d..1606cc16 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = 'd99c7cda0eee3355b9c5e848de67a826' +-- MODELS_YML_CHECKSUM = 'fe1f6aa4189b471933d9758701964c1f' -- ENUM definitions @@ -1065,13 +1065,15 @@ CREATE TABLE history_entry_t ( entries text[], original_model_id varchar(256), model_id varchar(100), - model_id_user_id integer - CONSTRAINT generated_always_as_history_entry_model_id_user_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'user' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, - model_id_motion_id integer - CONSTRAINT generated_always_as_history_entry_model_id_motion_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'motion' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, model_id_assignment_id integer CONSTRAINT generated_always_as_history_entry_model_id_assignment_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'assignment' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, - CONSTRAINT valid_history_entry_model_id_part1 CHECK (split_part(model_id, '/', 1) IN ('user','motion','assignment')), + model_id_motion_id integer + CONSTRAINT generated_always_as_history_entry_model_id_motion_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'motion' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + model_id_poll_id integer + CONSTRAINT generated_always_as_history_entry_model_id_poll_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'poll' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + model_id_user_id integer + CONSTRAINT generated_always_as_history_entry_model_id_user_id GENERATED ALWAYS AS (CASE WHEN split_part(model_id, '/', 1) = 'user' THEN cast(split_part(model_id, '/', 2) AS INTEGER) ELSE null END) STORED, + CONSTRAINT valid_history_entry_model_id_part1 CHECK (split_part(model_id, '/', 1) IN ('assignment','motion','poll','user')), position_id integer CONSTRAINT required_history_entry_position_id NOT NULL, meeting_id integer @@ -3276,7 +3278,8 @@ CREATE VIEW "poll" AS SELECT *, (select array_agg(pb.id ORDER BY pb.id) from poll_ballot_t pb where pb.poll_id = p.id) as ballot_ids, (select array_agg(n.meeting_user_id ORDER BY n.meeting_user_id) from nm_meeting_user_poll_voted_ids_poll_t n where n.poll_id = p.id) as voted_ids, (select array_agg(n.group_id ORDER BY n.group_id) from nm_group_poll_ids_poll_t n where n.poll_id = p.id) as entitled_group_ids, -(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_poll_id = p.id) as projection_ids +(select array_agg(pt.id ORDER BY pt.id) from projection_t pt where pt.content_object_id_poll_id = p.id) as projection_ids, +(select array_agg(h.id ORDER BY h.id) from history_entry_t h where h.model_id_poll_id = p.id) as history_entry_ids FROM poll_t p; @@ -3465,12 +3468,14 @@ CREATE INDEX idx_group_t_used_as_poll_default_id ON group_t (used_as_poll_defaul ALTER TABLE group_t ADD CONSTRAINT fk_group_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; CREATE INDEX idx_group_t_meeting_id ON group_t (meeting_id); -ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_user_id_user_t_id FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_history_entry_t_model_id_user_id ON history_entry_t (model_id_user_id); -ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_motion_id_motion_t_id FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; -CREATE INDEX idx_history_entry_t_model_id_motion_id ON history_entry_t (model_id_motion_id); ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_assignment_id_assignment_t_id FOREIGN KEY(model_id_assignment_id) REFERENCES assignment_t(id) INITIALLY DEFERRED; CREATE INDEX idx_history_entry_t_model_id_assignment_id ON history_entry_t (model_id_assignment_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_motion_id_motion_t_id FOREIGN KEY(model_id_motion_id) REFERENCES motion_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_motion_id ON history_entry_t (model_id_motion_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_poll_id_poll_t_id FOREIGN KEY(model_id_poll_id) REFERENCES poll_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_poll_id ON history_entry_t (model_id_poll_id); +ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_model_id_user_id_user_t_id FOREIGN KEY(model_id_user_id) REFERENCES user_t(id) INITIALLY DEFERRED; +CREATE INDEX idx_history_entry_t_model_id_user_id ON history_entry_t (model_id_user_id); ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_position_id_history_position_t_id FOREIGN KEY(position_id) REFERENCES history_position_t(id) INITIALLY DEFERRED; CREATE INDEX idx_history_entry_t_position_id ON history_entry_t (position_id); ALTER TABLE history_entry_t ADD CONSTRAINT fk_history_entry_t_meeting_id_meeting_t_id FOREIGN KEY(meeting_id) REFERENCES meeting_t(id) INITIALLY DEFERRED; @@ -4604,14 +4609,17 @@ CREATE CONSTRAINT TRIGGER notify_transaction_end AFTER INSERT OR UPDATE OR DELET DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION notify_transaction_end(); -CREATE TRIGGER tr_log_user_model_id_user_id AFTER INSERT OR UPDATE OF model_id_user_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user','model_id_user_id','history_entry_ids'); +CREATE TRIGGER tr_log_assignment_model_id_assignment_id AFTER INSERT OR UPDATE OF model_id_assignment_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','model_id_assignment_id','history_entry_ids'); CREATE TRIGGER tr_log_motion_model_id_motion_id AFTER INSERT OR UPDATE OF model_id_motion_id OR DELETE ON history_entry_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('motion','model_id_motion_id','history_entry_ids'); -CREATE TRIGGER tr_log_assignment_model_id_assignment_id AFTER INSERT OR UPDATE OF model_id_assignment_id OR DELETE ON history_entry_t -FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('assignment','model_id_assignment_id','history_entry_ids'); +CREATE TRIGGER tr_log_poll_model_id_poll_id AFTER INSERT OR UPDATE OF model_id_poll_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('poll','model_id_poll_id','history_entry_ids'); + +CREATE TRIGGER tr_log_user_model_id_user_id AFTER INSERT OR UPDATE OF model_id_user_id OR DELETE ON history_entry_t +FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('user','model_id_user_id','history_entry_ids'); CREATE TRIGGER tr_log_history_entry_t_position_id AFTER INSERT OR UPDATE OF position_id OR DELETE ON history_entry_t FOR EACH ROW EXECUTE FUNCTION log_modified_related_models('history_position', 'position_id', 'entry_ids'); CREATE TRIGGER tr_log_history_entry_t_meeting_id AFTER INSERT OR UPDATE OF meeting_id OR DELETE ON history_entry_t @@ -5910,7 +5918,7 @@ FIELD 1r:nt => group/used_as_topic_poll_default_id:-> meeting/topic_poll_default FIELD 1r:nt => group/used_as_poll_default_id:-> meeting/poll_default_group_ids FIELD 1rR:nt => group/meeting_id:-> meeting/group_ids -FIELD 1Gr:nt,nt,nt => history_entry/model_id:-> user/history_entry_ids,motion/history_entry_ids,assignment/history_entry_ids +FIELD 1Gr:nt,nt,nt,nt => history_entry/model_id:-> assignment/history_entry_ids,motion/history_entry_ids,poll/history_entry_ids,user/history_entry_ids FIELD 1rR:nt => history_entry/position_id:-> history_position/entry_ids FIELD 1r:nt => history_entry/meeting_id:-> meeting/relevant_history_entry_ids @@ -6179,6 +6187,7 @@ SQL nt:nt => poll/voted_ids:-> meeting_user/poll_voted_ids SQL nt:nt => poll/entitled_group_ids:-> group/poll_ids SQL nt:1GrR => poll/projection_ids:-> projection/content_object_id FIELD 1rR:nr => poll/meeting_id:-> meeting/poll_ids +SQL nt:1Gr => poll/history_entry_ids:-> history_entry/model_id FIELD 1rR:nr => poll_ballot/poll_id:-> poll/ballot_ids FIELD 1r:nt => poll_ballot/acting_meeting_user_id:-> meeting_user/acting_ballot_ids From 403d1617bcbd985036ccb11a07300569cbe10cac Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Thu, 25 Jun 2026 11:42:06 +0200 Subject: [PATCH 17/23] Add field for max_yes_amount (#538) --- collections/poll_config_rating_approval.yml | 4 ++++ dev/sql/schema_relational.sql | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/collections/poll_config_rating_approval.yml b/collections/poll_config_rating_approval.yml index 52499b91..566c65e9 100644 --- a/collections/poll_config_rating_approval.yml +++ b/collections/poll_config_rating_approval.yml @@ -18,6 +18,10 @@ fields: type: number default: 0 restriction_mode: A + max_yes_amount: + type: number + required: false + restriction_mode: A allow_abstain: type: boolean default: true diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index f485b122..551733b7 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '51e6dde20f32a81e6624f27da3c903a6' +-- MODELS_YML_CHECKSUM = '65103beb4910ed9e78b253bf2639b69c' -- ENUM definitions @@ -2052,6 +2052,7 @@ CREATE TABLE poll_config_rating_approval_t ( CONSTRAINT default_poll_config_rating_approval_max_options_amount DEFAULT 0, min_options_amount integer CONSTRAINT default_poll_config_rating_approval_min_options_amount DEFAULT 0, + max_yes_amount integer, allow_abstain boolean CONSTRAINT default_poll_config_rating_approval_allow_abstain DEFAULT True, onehundred_percent_base enum_rating_approval_onehundred_percent_bases From 341cb6da4bd7b9c01d843854785ee964d00faa5f Mon Sep 17 00:00:00 2001 From: peb-adr Date: Tue, 2 Jun 2026 14:36:47 +0200 Subject: [PATCH 18/23] Improve models diff (#527) --- dev/scripts/models_diff.py | 109 +++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 36 deletions(-) diff --git a/dev/scripts/models_diff.py b/dev/scripts/models_diff.py index f6abd087..a22fb9a3 100755 --- a/dev/scripts/models_diff.py +++ b/dev/scripts/models_diff.py @@ -14,6 +14,7 @@ COLLECTIONS = {} D1 = {} D2 = {} +DIFF_OK = [] DIFF = [] @@ -58,6 +59,8 @@ def timestamp_is_equal(s1, s2): def compare_value(type_, value_d1, value_d2): + global DIFF + # assume not equal until proven otherwise is_equal = False @@ -107,32 +110,32 @@ def compare_value(type_, value_d1, value_d2): def check_field_empty_list(collection, model_id, field_name): global D2 - log(4, f"check_field_empty_list: {collection}/{model_id}/{field_name} ...") + log(5, f"check_field_empty_list: {collection}/{model_id}/{field_name} ...") field_type = COLLECTIONS[collection][field_name]['type'] if field_type not in ['text[]', 'string[]', 'number[]']: - log(4, f"- {field_name} is not a list type - not visiting") + log(5, f"- {field_name} is not a list type - not visiting") return field_value_d2 = D2[collection][model_id][field_name] if type(field_value_d2) is not list: - log(4, f"- value is no list - not visiting") + log(5, f"- value is no list - not visiting") return if len(field_value_d2) != 0: - log(4, f"- value is no empty list - not visiting") + log(5, f"- value is no empty list - not visiting") return - log(4, f"+ visited field in D2: {collection}/{model_id}/{field_name} (empty list)") + log(5, f"+ visited field in D2: {collection}/{model_id}/{field_name} (empty list)") del D2[collection][model_id][field_name] def check_field_default(collection, model_id, field_name): - global D2, DIFF + global D2, DIFF, DIFF_OK - log(4, f"check_field_default: {collection}/{model_id}/{field_name} ...") + log(5, f"check_field_default: {collection}/{model_id}/{field_name} ...") if 'default' not in COLLECTIONS[collection][field_name].keys(): - log(4, f"- no default defined - not visiting") + log(5, f"- no default defined - not visiting") return field_type = COLLECTIONS[collection][field_name]['type'] @@ -140,19 +143,23 @@ def check_field_default(collection, model_id, field_name): field_value_d2 = D2[collection][model_id][field_name] is_equal = compare_value(field_type, field_value_default, field_value_d2) - if not is_equal: + if is_equal: + DIFF_OK += [f"{collection}/{model_id}/{field_name} of type {field_type} was set to a new default."] + DIFF_OK += [f" D1: NOT SET"] + DIFF_OK += [f" D2: {field_value_d2}"] + else: DIFF += [f"{collection}/{model_id}/{field_name} of type {field_type} differs from default."] DIFF += [f" D1: NOT SET"] DIFF += [f" D2: {field_value_d2}"] - log(4, f"+ visited field in D2: {collection}/{model_id}/{field_name} (default value)") + log(5, f"+ visited field in D2: {collection}/{model_id}/{field_name} (default value)") del D2[collection][model_id][field_name] def check_field(collection, model_id, field_name): - global D1, D2, DIFF + global D1, D2, DIFF, DIFF_OK - log(3, f"check_field: {collection}/{model_id}/{field_name} ...") + log(4, f"check_field: {collection}/{model_id}/{field_name} ...") field_type = COLLECTIONS[collection][field_name]['type'] field_value_d1 = D1[collection][model_id][field_name] @@ -166,32 +173,41 @@ def check_field(collection, model_id, field_name): is_equal = compare_value(field_type, field_value_d1, field_value_d2) if not is_equal: - DIFF += [f"{collection}/{model_id}/{field_name} of type {field_type} differs."] - DIFF += [f" D1: {field_value_d1}{field_value_d1_human_readable}"] - DIFF += [f" D2: {field_value_d2}{field_value_d2_human_readable}"] + if collection == 'action_worker' and field_name == 'name': + DIFF_OK += [f"{collection}/{model_id}/{field_name} of type {field_type} differs (action_worker.name shortened)."] + DIFF_OK += [f" D1: {field_value_d1}"] + DIFF_OK += [f" D2: {field_value_d2}"] + elif field_type == 'decimal(6)' and field_value_d1 == '0.000000' and field_value_d2 == '0.000001': + DIFF_OK += [f"{collection}/{model_id}/{field_name} of type {field_type} differs (decimal raised to minimum)."] + DIFF_OK += [f" D1: {field_value_d1}"] + DIFF_OK += [f" D2: {field_value_d2}"] + else: + DIFF += [f"{collection}/{model_id}/{field_name} of type {field_type} differs."] + DIFF += [f" D1: {field_value_d1}{field_value_d1_human_readable}"] + DIFF += [f" D2: {field_value_d2}{field_value_d2_human_readable}"] # Fields of type generic-relation will additionally appear in an expanded form if field_type == 'generic-relation': if not is_equal: - log(4, f"- field values not equal - not visiting expanded {field_name} fields") + log(5, f"- field values not equal - not visiting expanded {field_name} fields") else: related_collection, _ = field_value_d1.split('/') expanded_field_name = f"{field_name}_{related_collection}_id" # Remove visited field - log(4, f"+ visited expanded field in D2: {collection}/{model_id}/{expanded_field_name}") + log(5, f"+ visited expanded field in D2: {collection}/{model_id}/{expanded_field_name}") del D2[collection][model_id][expanded_field_name] # Remove visited field - log(3, f"+ visited field in D1: {collection}/{model_id}/{field_name}") + log(4, f"+ visited field in D1: {collection}/{model_id}/{field_name}") del D1[collection][model_id][field_name] - log(3, f"+ visited field in D2: {collection}/{model_id}/{field_name}") + log(4, f"+ visited field in D2: {collection}/{model_id}/{field_name}") del D2[collection][model_id][field_name] def check_model(collection, model_id): - global D1, D2, DIFF + global D1, D2, DIFF, DIFF_OK - log(2, f"check_model: {collection}/{model_id} ...") + log(3, f"check_model: {collection}/{model_id} ...") field_names_d1 = list(D1[collection][model_id].keys()) field_names_d2 = list(D2[collection][model_id].keys()) @@ -200,30 +216,44 @@ def check_model(collection, model_id): # EXPECTED DIFF: meta_deleted and meta_position fields were removed if field_name == 'meta_deleted' or field_name == 'meta_position': # Remove visited field - log(4, f"+ visited field in D1: {collection}/{model_id}/{field_name} (old field)") + log(5, f"+ visited field in D1: {collection}/{model_id}/{field_name} (old field)") del D1[collection][model_id][field_name] continue if field_name not in field_names_d2: - DIFF += [f"field {collection}/{model_id}/{field_name} exists in D1 but not in D2"] + field_value_d1 = D1[collection][model_id][field_name] + if '$' in field_name: + DIFF_OK += [f"field {collection}/{model_id}/{field_name} exists in D1 but not in D2 (template field)"] + DIFF_OK += [f" D1: {field_value_d1}"] + DIFF_OK += [f" D2: NOT SET"] + else: + DIFF += [f"field {collection}/{model_id}/{field_name} exists in D1 but not in D2"] + DIFF += [f" D1: {field_value_d1}"] + DIFF += [f" D2: NOT SET"] + log(5, f"+ visited field in D1: {collection}/{model_id}/{field_name} (does not exist in D2)") + del D1[collection][model_id][field_name] continue check_field(collection, model_id, field_name) - log(4, f"visiting known new fields in D2 ...") + log(5, f"visiting known new fields in D2 ...") remaining_field_names_d2 = list(D2[collection][model_id].keys()) if collection in ['organization', 'meeting']: if 'time_zone' in remaining_field_names_d2: - log(4, f"+ visited field in D2: {collection}/{model_id}/time_zone (new field)") + log(5, f"+ visited field in D2: {collection}/{model_id}/time_zone (new field)") del D2[collection][model_id]['time_zone'] + if collection in ['meeting']: + if 'motions_enable_restricted_editor_for_non_manager' in remaining_field_names_d2: + log(5, f"+ visited field in D2: {collection}/{model_id}/motions_enable_restricted_editor_for_non_manager (new field)") + del D2[collection][model_id]['motions_enable_restricted_editor_for_non_manager'] - log(4, f"checking remaining fields in D2 ...") + log(5, f"checking remaining fields in D2 ...") # Fields not present in D1 may appear in D2 # - as None (null value) remaining_field_names_d2 = list(D2[collection][model_id].keys()) for field_name in remaining_field_names_d2: if D2[collection][model_id][field_name] is None: - log(4, f"+ visited field in D2: {collection}/{model_id}/{field_name} (null value)") + log(5, f"+ visited field in D2: {collection}/{model_id}/{field_name} (null value)") del D2[collection][model_id][field_name] # - with default value remaining_field_names_d2 = list(D2[collection][model_id].keys()) @@ -236,10 +266,10 @@ def check_model(collection, model_id): # Remove visited model if len(D1[collection][model_id]) == 0: - log(2, f"+ fully visited model in D1: {collection}/{model_id}") + log(3, f"+ fully visited model in D1: {collection}/{model_id}") del D1[collection][model_id] if len(D2[collection][model_id]) == 0: - log(2, f"+ fully visited model in D2: {collection}/{model_id}") + log(3, f"+ fully visited model in D2: {collection}/{model_id}") del D2[collection][model_id] @@ -249,14 +279,14 @@ def check_collection(collection): # This can happen if certain features were not used and therefore no models # in corresponding collections were created. if collection not in D1.keys() and collection not in D2.keys(): - log(1, f"check_collection: skipping {collection}, does not exist in both D1 and D2 ...") + log(2, f"check_collection: skipping {collection}, does not exist in both D1 and D2 ...") return # This would be a fatal flaw in migration100 and should never occur. if collection not in D1.keys() or collection not in D2.keys(): DIFF += [f"collection {collection} exists in only one of D1 and D2"] return - log(1, f"check_collection: {collection} ...") + log(2, f"check_collection: {collection} ...") model_ids_d1 = list(D1[collection].keys()) model_ids_d2 = list(D2[collection].keys()) @@ -270,10 +300,10 @@ def check_collection(collection): # Remove visited collection if len(D1[collection]) == 0: - log(1, f"+ fully visited collection in D1: {collection}") + log(2, f"+ fully visited collection in D1: {collection}") del D1[collection] if len(D2[collection]) == 0: - log(1, f"+ fully visited collection in D2: {collection}") + log(2, f"+ fully visited collection in D2: {collection}") del D2[collection] @@ -333,10 +363,17 @@ def print_results(): print() + if len(DIFF_OK) != 0 and ARGS.level >= 1: + print("Log Level is set to [1: okdiff] or higher (-v flag).") + print("Printing expected differences.") + print() + print('\n'.join(DIFF_OK)) + print() + if len(DIFF) == 0: - print("No differences found.") + print("No unexpected differences found.") else: - print("Found differences.") + print("Found unexpected differences.") print() print('\n'.join(DIFF)) @@ -356,7 +393,7 @@ def build_parser(): "--verbose", action="count", default=0, - help="Use multiple times to set log level (1: collection, 2: model, 3: field, 4: detail)", + help="Use multiple times to set log level (1: okdiff, 2: collection, 3: model, 4: field, 5: detail)", dest="level", ) From a327bde8d813efb437b729a83d898081c18b4cc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 12:43:35 +0200 Subject: [PATCH 19/23] Bump pytest from 9.0.3 to 9.1.1 in /dev (#537) --- dev/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/requirements.txt b/dev/requirements.txt index f8313397..58543fb5 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -4,7 +4,7 @@ flake8==7.3.0 isort==8.0.1 sqlfluff==4.2.1 mypy==2.1.0 -pytest==9.0.3 +pytest==9.1.1 pyupgrade==3.21.2 pyyaml==6.0.3 simplejson==4.1.1 From cab8db690b5c4a47dc54587c926f779c5fa5e033 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:14:35 +0200 Subject: [PATCH 20/23] Bump debugpy (#530) --- dev/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/requirements.txt b/dev/requirements.txt index 58543fb5..d10b94e1 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -8,7 +8,7 @@ pytest==9.1.1 pyupgrade==3.21.2 pyyaml==6.0.3 simplejson==4.1.1 -debugpy==1.8.20 +debugpy==1.8.21 requests==2.34.2 psycopg[binary]==3.3.4 python-sql==1.8.1 From 9e3f7f6e18f12073723ca9fa60e112eaac0957da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:21:15 +0200 Subject: [PATCH 21/23] Bump sqlfluff (#531) --- dev/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/requirements.txt b/dev/requirements.txt index d10b94e1..7e2d9b4e 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -2,7 +2,7 @@ autoflake==2.3.3 black==26.5.1 flake8==7.3.0 isort==8.0.1 -sqlfluff==4.2.1 +sqlfluff==4.2.2 mypy==2.1.0 pytest==9.1.1 pyupgrade==3.21.2 From e84e062ddd67865dd2d47c72282298adba321925 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:34:27 +0200 Subject: [PATCH 22/23] Bump actions/checkout from 6 to 7 (#536) --- .github/workflows/continuous_integration.yml | 2 +- .github/workflows/create-pr.yml | 4 ++-- .github/workflows/pick-to-staging.yml | 2 +- .github/workflows/test-sql.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/continuous_integration.yml b/.github/workflows/continuous_integration.yml index a08cbf88..83ef06e8 100644 --- a/.github/workflows/continuous_integration.yml +++ b/.github/workflows/continuous_integration.yml @@ -19,7 +19,7 @@ jobs: working-directory: dev/ steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v6 diff --git a/.github/workflows/create-pr.yml b/.github/workflows/create-pr.yml index e21c7321..b0d9cfa3 100644 --- a/.github/workflows/create-pr.yml +++ b/.github/workflows/create-pr.yml @@ -24,12 +24,12 @@ jobs: name: Create or update PR runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: path: current-meta-repository ref: ${{ github.ref_name }} - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: repository: ${{ github.repository_owner }}/${{ inputs.repository }} path: service-repository diff --git a/.github/workflows/pick-to-staging.yml b/.github/workflows/pick-to-staging.yml index b8226dab..9580c2de 100644 --- a/.github/workflows/pick-to-staging.yml +++ b/.github/workflows/pick-to-staging.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout main - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: ref: main fetch-depth: 2 diff --git a/.github/workflows/test-sql.yml b/.github/workflows/test-sql.yml index 384abe90..c0692cac 100644 --- a/.github/workflows/test-sql.yml +++ b/.github/workflows/test-sql.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Check out code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Install psql run: | From d16e66eb6a061264f5c799df79556e9efe7643d6 Mon Sep 17 00:00:00 2001 From: Viktoriia Krasnovyd <114735598+vkrasnovyd@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:43:27 +0200 Subject: [PATCH 23/23] Add changed_fields field (#546) --- collections/history_entry.yml | 3 +++ dev/sql/schema_relational.sql | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/collections/history_entry.yml b/collections/history_entry.yml index e523ddb0..cdb52b15 100644 --- a/collections/history_entry.yml +++ b/collections/history_entry.yml @@ -8,6 +8,9 @@ fields: entries: type: text[] restriction_mode: A + changed_fields: + type: JSON + restriction_mode: A original_model_id: type: string restriction_mode: A diff --git a/dev/sql/schema_relational.sql b/dev/sql/schema_relational.sql index 551733b7..15de4ced 100644 --- a/dev/sql/schema_relational.sql +++ b/dev/sql/schema_relational.sql @@ -1,7 +1,7 @@ -- schema_relational.sql for initial database setup OpenSlides -- Code generated. DO NOT EDIT. --- MODELS_YML_CHECKSUM = '65103beb4910ed9e78b253bf2639b69c' +-- MODELS_YML_CHECKSUM = '965ccdcc638ae8b108f5f7d4544866b5' -- ENUM definitions @@ -1063,6 +1063,7 @@ CREATE TABLE group_t ( CREATE TABLE history_entry_t ( id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY NOT NULL, entries text[], + changed_fields jsonb, original_model_id varchar(256), model_id varchar(100), model_id_assignment_id integer