From c1b9de6e813a86d3fbbfb61f6c55b2a196b98d98 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Fri, 18 Sep 2020 18:00:08 +0200 Subject: [PATCH] Added models.yml --- docs/models.yml | 1388 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1388 insertions(+) create mode 100644 docs/models.yml diff --git a/docs/models.yml b/docs/models.yml new file mode 100644 index 000000000..daad7ca43 --- /dev/null +++ b/docs/models.yml @@ -0,0 +1,1388 @@ +# Types: +# - nativ datatypes: string, number, boolean, JSON +# - HTML: string with HTML content +# - float: numbers that are expected to be non-integer. Formatted as in rfc7159. +# - decimal(X): Decimal values represented as a string with X decimal places +# - datetime: Datetime as a unix timestamp. Why a number? This enables queries +# in the DB. And we do not need more precision than 1 second. +# Relations: +# - /: This is a reference to a collection. The reverse relation +# field is . E.g. `category_id: motion_category/motion_ids` in a motion links +# to one category. The reverse field is `motion_ids` which may be `motion_ids: +# (motion/category_id)[]` indicating, that there are many motion ids. +# - []: This indicated multiple ids. For an example see above. +# - {x,y,z}/: This is a generic relation (analog: `({x,y,z}/)[]` a +# generic list relation) with fqids as values to the given ollections x, y and z. +# - If no field is specified, there is no reverse relation. +# Structured Fields: +# - There are template fields (see autoupdate service interface) with a `$` as +# the placeholder. In this document, angle brackets are followed by the +# dollar sign including the meaning of the template. E.g. +# group_$_ids: (group/user_ids)[]; +# says, that the template are meeting ids and each structured field is a +# multi-relation to groups and the reverse relation field for groups is +# user_ids. +# +organisation: + id: number + name: string + description: HTML + + # Configs + legal_notice: string + privacy_policy: string + login_text: string + theme: string + custom_translations: JSON + + committee_ids: + type: relation-list + to: committee/organisation_id + role_ids: + type: relation-list + to: role/organisation_id + superadmin_role_id: + type: relation + to: role/superadmin_role_for_organisation_id + resource_ids: + type: relation-list + to: resource/organisation_id + +user: + id: number + username: string + title: string + first_name: string + last_name: string + is_active: boolean + is_committee: boolean + password: string + default_password: string + about_me: HTML + gender: string + comment: HTML + number: string + structure_level: string + email: string + last_email_send: string + vote_weight: decimal + + role_id: + type: relation + to: role/user_ids # Attention: prevent impelenting a "default-role" or let a + # user create such a role! This would cause the user_ids-array for this + # role to explode in size. If a user has no role, it should be handles as + # the user has no permission in the organisation and is a "normal" delegate + # there. Just a few users (expected <100) should even get a role and all + # other don't. + + # Meeting and committee + is_present_in_meeting_ids: + type: relation-list + to: meeting/present_user_ids + meeting_id: + type: relation + to: meeting/temporary_user_ids # Temporary users + guest_meeting_ids: + type: relation-list + to: meeting/guest_ids # Guests in meetings + committee_as_member_ids: + type: relation-list + to: committee/member_ids + committee_as_manager_ids: + type: relation-list + to: committee/manager_ids + + # Projection + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + + # All foreign keys are meeting-specific: + # - Keys are smaller (Space is in O(n^2) for n keys + # in the relation), so this saves storagespace + # - This makes quering things like this possible: + # "Give me all groups for User X in Meeting Y" without + # the need to get all groups and filter them for the meeting + group_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: group/user_ids + speaker_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: speaker/user_id + personal_note_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: personal_note/user_id + supported_motion_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: motion/supporter_ids + submitted_motion_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: motion_submitter/user_id + motion_poll_voted_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: motion_poll/voted_ids + motion_vote_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: motion_vote/user_id + assignment_candidate_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: assignment_candidate/user_id + assignment_poll_voted_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: assignment_poll/voted_ids + assignment_option_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: assignment_option/user_id + assignment_vote_$_ids: + type: template + replacement: meeting_id + fields: + type: relation-list + to: assignment_vote/user_id + +role: + id: number + name: string + permissions: string[] + + organisation_id: + type: relation + to: organisation/role_ids + superadmin_role_for_organisation_id: + type: relation + to: organisation/superadmin_role_id + user_ids: + type: relation-list + to: user/role_id + +# New: Resource +# Resources are organsation wide "mediafiles", like logos for the organisatio or +# organisation-wide fonts. Therefore, no permission checks are done and the user +# must not be logged in to retrieve files. A resource has a token, e.g. `web_header` +# or `pdf_font_italic`, so the client knowns, where to put the resource. +resource: + id: number + token: string + filesize: number + mimetype: string + + organisation_id: + type: relation + to: organisation/resource_ids + +committee: + id: number + name: string + description: HTML + + meeting_ids: + type: relation-list + to: meeting/committee_id + template_meeting_id: + type: relation + to: meeting/template_for_committee_id + default_meeting_id: + type: relation + to: meeting/default_meeting_for_committee_id + member_ids: + type: relation-list + to: user/committee_as_memeber_ids + manager_ids: + type: relation-list + to: user/committee_as_manager_ids + forward_to_committee_ids: + type: relation-list + to: committee/receive_forwardings_from_committee_ids + receive_forwardings_from_committee_ids: + type: relation-list + to: committee/forward_to_committee_ids + organisation_id: + type: relation + to: organisation/committee_ids + +meeting: + id: number + welcome_title: string + welcome_text: HTML + + # General + name: string + description: string + location: string + start_time: datetime + end_time: datetime + custom_translations: JSON + + # System + url_name: string # For unique urls. + template_for_committee_id: + type: relation + to: committee/template_meeting_id + enable_anonymous: boolean + + # Jitsi/Livestream settings + conference_show: boolean + conference_auto_connect: boolean + conference_los_restriction: boolean + conference_stream_url: string + + # Projector + projector_default_countdown_time: number + projector_countdown_warning_time: number + + # Exports + export_csv_encoding: string + export_csv_separator: string + export_pdf_pagenumber_alignment: string + export_pdf_fontsize: number + export_pdf_pagesize: string + + # Agenda + agenda_show_subtitles: boolean + agenda_enable_numbering: boolean + agenda_number_prefix: string + agenda_numeral_system: string + agenda_item_creation: string + agenda_new_items_default_visibility: number + agenda_show_internal_items_on_projector: boolean + + # List of speakers + list_of_speakers_amount_last_on_projector: number + list_of_speakers_amount_next_on_projector: boolean + list_of_speakers_couple_countdown: boolean + list_of_speakers_show_amount_of_speakers_on_slide: boolean + list_of_speakers_present_users_only: boolean + list_of_speakers_show_first_contribution: boolean + + # Motions + motions_default_workflow_id: + type: relation + to: motion_workflow/default_workflow_meeting_id + motions_default_amendment_workflow_id: + type: relation + to: motion_workflow/default_amendment_workflow_meeting_id + motions_default_statute_amendment_workflow_id: + type: relation + to: motion_workflow/default_statute_amendment_workflow_meeting_id + motions_preamble: string + motions_default_line_numbering: string + motions_line_length: number + motions_reason_required: boolean + motions_enable_text_on_projector: boolean + motions_enable_reason_on_projector: boolean + motions_enable_sidebox_on_projector: boolean + motions_enable_recommendation_on_projector: boolean + motions_show_referring_motions: boolean + motions_show_sequential_number: boolean + motions_recommendations_by: string + motions_statute_recommendations_by: string + motions_recommendation_text_mode: string + motions_default_sorting: string + motions_identifier_type: string + motions_identifier_min_digits: number + motions_identifier_with_blank: boolean + motions_statutes_enabled: boolean + motions_amendments_enabled: boolean + motions_amendments_in_main_list: boolean + motions_amendments_of_amendments: boolean + motions_amendments_prefix: string + motions_amendments_text_mode: string + motions_amendments_multiple_paragraphs: boolean + motions_supporters_min_amount: number + motions_supporters_enable_autoremove: boolean + motions_export_title: string + motions_export_preamble: string + motions_export_submitter_recommendation: boolean + motions_export_follow_recommendation: boolean + + motion_poll_ballot_paper_selection: string + motion_poll_ballot_paper_number: number + motion_poll_default_type: string + motion_poll_default_100_percent_base: string + motion_poll_default_majority_method: string + motion_poll_default_group_ids: + type: relation-list + to: group/used_as_motion_poll_default_id + + # Users + users_sort_by: string + users_enable_presence_view: boolean + users_enable_vote_weight: boolean + users_allow_self_set_present: boolean + users_pdf_welcometitle: string + users_pdf_welcometext: string + users_pdf_url: string + users_pdf_wlan_ssid: string + users_pdf_wlan_password: string + users_pdf_wlan_encryption: string + users_email_sender: string + users_email_replyto: string + users_email_subject: string + users_email_body: string + + # Assignments + assignemnts_export_title: string + assignments_export_preamble: string + + assignment_poll_ballot_paper_selection: string + assignment_poll_ballot_paper_number: number + assignment_poll_add_candidates_to_list_of_speakers: boolean + assignment_poll_sort_poll_result_by_votes: boolean + assignment_poll_default_type: string + assignment_poll_default_method: string + assignment_poll_default_100_percent_base: string + assignment_poll_default_majority_method: string + assignment_poll_default_group_ids: + type: relation-list + to: group/used_as_assignment_poll_default_id + + projector_ids: + type: relation-list + to: projector/meeting_id + projectiondefault_ids: + type: relation-list + to: projectiondefault/meeting_id + projector_message_ids: + type: relation-list + to: projector_message/meeting_id + projector_countdown_ids: + type: relation-list + to: projector_countdown/meeting_id + tag_ids: + type: relation-list + to: tag/meeting_id + agenda_item_ids: + type: relation-list + to: agenda_item/meeting_id + list_of_speakers_ids: + type: relation-list + to: list_of_speakers/meeting_id + topic_ids: + type: relation-list + to: topic/meeting_id + group_ids: + type: relation-list + to: group/meeting_id + mediafile_ids: + type: relation-list + to: mediafile/meeting_id + motion_ids: + type: relation-list + to: motion/meeting_id + motion_comment_section_ids: + type: relation-list + to: motion_comment_section/meeting_id + motion_category_ids: + type: relation-list + to: motion_category/meeting_id + motion_block_ids: + type: relation-list + to: motion_block/meeting_id + motion_workflow_ids: + type: relation-list + to: motion_workflow/meeting_id + motion_statute_paragraph_ids: + type: relation-list + to: motion_statute_paragraph/meeting_id + motion_poll_ids: + type: relation-list + to: motion_poll/meeting_id + assignment_ids: + type: relation-list + to: assignment/meeting_id + assignment_poll_ids: + type: relation-list + to: assignment_poll/meeting_id + + # No relations to a meeting: + # user; OK, because not meeting-specific + # personal_note + # projection + # speaker + # motion_option + # motion_vote + # motion_comment + # motion_submitter + # motion_change_recommendation + # motion_state + # assignment_candidate + # assignment_option + # assignment_vote + + # Logos and Fonts + logo_$_id: + type: template + replacement: location + fields: + type: relation + to: + collection: mediafile + field: + name: used_as_logo_$_in_meeting_id + type: structured-tag + replacement: location + font_$_id: + type: template + replacement: location + fields: + type: relation + to: + collection: mediafile + field: + name: used_as_font_$_in_mmeting_id + type: structured-tag + replacement: location + # Examples: + # logo_web_header: Mediafile; + # font_italic_pdf: Mediafile; + # The client can define these resources. There is no need + # to have whitelist/blacklist on the server. The places must + # be checked: They must match `[a-z]([a-z_]*[a-z])?` and must + # not be longer than 32 characters. + + # Other relations + committee_id: + type: relation + to: committee/meeting_ids + default_meeting_for_committee_id: + type: relation + to: committee/default_meeting_id + present_user_ids: + type: relation-list + to: user/is_present_in_meeting_ids + temporary_user_ids: + type: relation-list + to: user/meeting_id + guest_ids: + type: relation-list + to: user/guest_meeting_ids + user_ids: (Id)[] # Calculated: All ids from temporary_user_ids, guest_ids and all users assigned to groups. + reference_projector_id: + type: relation + to: projector/used_as_reference_projector_meeting_id + + default_group_id: + type: relation + to: group/default_group_for_meeting_id + superadmin_group_id: + type: relation + to: group/superadmin_group_for_meeting_id + +group: + id: number + name: string + permissions: string[] + + user_ids: + type: relation-list + to: + collection: user + field: + name: group_$_ids + type: structured-relation + replacement: meeting_id + default_group_for_meeting_id: + type: relation + to: meeting/default_group_id + superadmin_group_for_meeting_id: + type: relation + to: meeting/superadmin_group_id + mediafile_access_group_ids: + type: relation-list + to: mediafile/access_group_ids + mediafile_inherited_access_group_ids: + type: relation-list + to: mediafile/inherited_access_group_ids + read_comment_section_ids: + type: relation-list + to: motion_comment_section/read_group_ids + write_comment_section_ids: + type: relation-list + to: motion_comment_section/write_group_ids + motion_poll_ids: + type: relation-list + to: motion_poll/entitled_group_ids + assignment_poll_ids: + type: relation-list + to: assignment_poll/entitled_group_ids + used_as_motion_poll_default_id: + type: relation + to: meeting/motion_poll_default_group_ids + used_as_assignment_poll_default_id: + type: relation + to: meeting/assignment_poll_default_group_ids + meeting_id: + type: relation + to: meeting/group_ids + +personal_note: + id: number + note: HTML + star: boolean + + user_id: + type: relation + to: + collection: user + field: + name: personal_note_$_ids + type: structured-relation + replacement: meeting_id + content_object_id: + type: generic-relation + to: + collection: + - motion + field: personal_note_ids + +tag: + id: number + name: string + + tagged_ids: + type: generic-relation-list + to: + collection: + - agenda_item + - assignment + - motion + - topic + field: tag_ids + meeting_id: + type: relation + to: meeting/tag_ids + +agenda_item: + id: number + item_number: string + comment: string + closed: boolean + type: number + is_internal: boolean + is_hidden: boolean + duration: number # in seconds + weight: number + level: number # calculated. + + content_object_id: + type: generic-relation + to: + collection: + - motion + - motion_block + - assignment + - topic + field: agenda_item_id + parent_id: + type: relation + to: agenda_item/child_ids + child_ids: + type: relation-list + to: agenda_item/parent_id + tag_ids: + type: relation-list + to: tag/tagged_ids + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/agenda_item_ids + +list_of_speakers: + id: number + closed: boolean + + content_object_id: + type: generic-relation + to: + collection: + - motion + - motion_block + - assignment + - topic + - mediafile + field: list_of_speakers_id + speaker_ids: + type: relation-list + to: speaker/list_of_speakers_id + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/list_of_speakers_ids + +speaker: + id: number + begin_time: datetime + end_time: datetime + weight: number + marked: boolean + + list_of_speakers_id: + type: relation + to: list_of_speakers/speaker_ids + user_id: + type: relation + to: + collection: user + field: + name: speaker_$_ids + type: structured-relation + replacement: meeting_id + +topic: + id: number + title: string + text: HTML + + attachment_ids: + type: relation-list + to: mediafile/attachement_ids + agenda_item_id: + type: relation + to: agenda_item/content_object_id + list_of_speakers_id: + type: relation + to: list_of_speakers/content_object_id + tag_ids: + type: relation-list + to: tag/tagged_ids + meeting_id: + type: relation + to: meeting/topic_ids + +motion: + id: number + number: string + sequential_number: number # Calculated + title: string + text: HTML + amendment_paragraph_$: + type: template + replacement: paragraph_number + fields: HTML + modified_final_version: HTML + reason: HTML + category_weight: number + state_extension: string + recommendation_extension: string + sort_weight: number + created: datetime + last_modified: datetime + + lead_motion_id: + type: relation + to: motion/amendment_ids + amendment_ids: + type: relation-list + to: motion/lead_motion_id + sort_parent_id: + type: relation + to: motion/sort_child_ids + sort_child_ids: + type: relation-list + to: motion/parent_id + origin_id: + type: relation + to: motion/derived_motion_ids # Note: The related motions may not be in the same meeting + derived_motion_ids: + type: relation-list + to: motion/origin_id # Note: The related motions may not be in the same meeting + forwarding_tree_motion_ids: (Id)[] # Calculated: All children (derived_motion_ids), grand children, ... and all parents (origin_id). + state_id: + type: relation + to: motion_state/motion_ids + recommendation_id: + type: relation + to: motion_state/motion_recommendation_ids + recommendation_extension_reference_ids: + type: generic-relation-list + to: + collection: + - motion + field: referenced_in_motion_recommendation_extension_ids + referenced_in_motion_recommendation_extension_ids: + type: relation-list + to: motion/recommendation_extension_reference_ids + category_id: + type: relation + to: motion_category/motion_ids + block_id: + type: relation + to: motion_block/motion_ids + submitter_ids: + type: relation-list + to: motion_submitter/motion_id + supporter_ids: + type: relation-list + to: + collection: user + field: + name: supported_motion_$_ids + type: structured-relation + replacement: meeting_id + poll_ids: + type: relation-list + to: motion_poll/motion_id + change_recommendation_ids: + type: relation-list + to: motion_change_recommendation/motion_id + statute_paragraph_id: + type: relation + to: motion_statute_paragraph/motion_ids + comment_ids: + type: relation-list + to: motion_comment/motion_id + agenda_item_id: + type: relation + to: agenda_item/content_object_id + list_of_speakers_id: + type: relation + to: list_of_speakers/content_object_id + tag_ids: + type: relation-list + to: tag/tagged_ids + attachment_ids: + type: relation-list + to: mediafile/attachment_ids + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + personal_note_ids: + type: relation-list + to: personal_note/content_object_id + meeting_id: + type: relation + to: meeting/motion_ids + +motion_submitter: + id: number + weight: number + + user_id: + type: relation + to: + collection: user + field: + name: submitted_motion_$_ids + type: structured-relation + replacement: meeting_id + motion_id: + type: relation + to: motion/submitter_ids + +motion_comment: + id: number + comment: HTML + + motion_id: + type: relation + to: motion/comment_ids + section_id: + type: relation + to: motion_comment_section/comment_ids + +motion_comment_section: + id: number + name: string + weight: number + + comment_ids: + type: relation-list + to: motion_comment/section_id + read_group_ids: + type: relation-list + to: group/read_comment_section_ids + write_group_ids: + type: relation-list + to: group/write_comment_section_ids + meeting_id: + type: relation + to: meeting/motion_comment_section_ids + +motion_category: + id: number + name: string + prefix: string + weight: number + level: number + + parent_id: + type: relation + to: motion_category/child_ids + child_ids: + type: relation-list + to: motion_category/parent_id + motion_ids: + type: relation-list + to: motion/category_id + meeting_id: + type: relation + to: meeting/category_ids + +motion_block: + id: number + title: string + internal: boolean + + motion_ids: + type: relation-list + to: motion/block_id + agenda_item_id: + type: relation + to: agenda_item/content_object_id + list_of_speakers_id: + type: relation + to: list_of_speakers/content_object_id + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/motion_block_ids + +motion_change_recommendation: + id: number + rejected: boolean + internal: boolean + type: number + other_description: string + line_from: number + line_to: number + text: HTML + creation_time: datetime + + motion_id: + type: relation + to: motion/change_recommendation_ids + +motion_state: + id: number + name: string + recommendation_label: string + css_class: string + restrictions: string[] + allow_support: boolean + allow_create_poll: boolean + allow_submitter_edit: boolean + set_number: boolean + show_state_extension_field: boolean + merge_amendment_into_final: number + show_recommendation_extension_field: boolean + + next_state_ids: + type: relation-list + to: motion_state/previous_state_ids + previous_state_ids: + type: relation-list + to: motion_state/next_state_ids + motion_ids: + type: relation-list + to: motion/state_id + motion_recommendation_ids: + type: relation-list + to: motion/recommendation_id + workflow_id: + type: relation + to: motion_workflow/state_ids + first_state_of_workflow_id: + type: relation + to: motion_workflow/first_state_id + +motion_workflow: + id: number + name: string + + state_ids: + type: relation-list + to: motion_state/workflow_id + first_state_id: + type: relation + to: motion_state/first_state_of_workflow_id + default_workflow_meeting_id: + type: relation + to: meeting/motions_default_workflow_id + default_amendment_workflow_meeting_id: + type: relation + to: meeting/motions_default_amendment_workflow_id + default_statute_amendment_workflow_meeting_id: + type: relation + to: meeting/motions_default_statute_amendment_workflow_id + meeting_id: + type: relation + to: meeting/motion_workflow_ids + +motion_statute_paragraph: + id: number + title: string + text: HTML + weight: number + + motion_ids: + type: relation-list + to: motion/statute_paragraph_id + meeting_id: + type: relation + to: meeting/motion_statute_paragraph_ids + +motion_poll: + id: number + pollmethod: string + state: number + type: string + title: string + onehundred_percent_base: string + majority_method: string + votesvalid: decimal(6) + votesinvalid: decimal(6) + votescast: decimal(6) + user_has_voted: boolean # This is user specific and set during restriction + + motion_id: + type: relation + to: motion/poll_ids + option_ids: + type: relation-list + to: motion_option/poll_id + voted_ids: + type: relation-list + to: + collection: user + field: + name: motion_poll_voted_$_ids + type: structured-relation + replacement: meeting_id + entitled_group_ids: + type: relation-list + to: group/motion_poll_ids + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/motion_poll_ids + +motion_option: + id: number + yes: decimal(6) + no: decimal(6) + abstain: decimal(6) + + poll_id: + type: relation + to: motion_poll/option_ids + vote_ids: + type: relation-list + to: motion_vote/option_id + +motion_vote: + id: number + weight: decimal(6) + value: string + + option_id: + type: relation + to: motion_option/vote_ids + user_id: + type: relation + to: + collection: user + field: + name: motion_vote_$_ids + type: structured-relation + replacement: meeting_id + +assignment: + id: number + title: string + description: HTML + open_posts: number + phase: number + default_poll_description: string + number_poll_candidates: boolean + + candidate_ids: + type: relation-list + to: assignment_candidate/assignment_id + poll_ids: + type: relation-list + to: assignment_poll/assignment_id + agenda_item_id: + type: relation + to: agenda_item/content_object_id + list_of_speakers_id: + type: relation + to: list_of_speakers/content_object_id + tag_ids: + type: relation-list + to: tag/tagged_ids + attachment_ids: + type: relation-list + to: mediafile/attachment_ids + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/assignment_ids + +assignment_candidate: + id: number + weight: number + + assignment_id: + type: relation + to: assignment/candidate_ids + user_id: + type: relation + to: + collection: user + field: + name: assignment_candidate_$_ids + type: structured-relation + replacement: meeting_id + +assignment_poll: + id: number + description: string + pollmethod: string + votes_amount: number + allow_multiple_votes_per_candidate: boolean + global_abstain: boolean + global_no: boolean + amount_global_abstain: decimal(6) + amount_global_no: decimal(6) + state: number + title: string + type: string + onehundred_percent_base: string + majority_method: string + votescast: decimal(6) + votesinvalid: decimal(6) + votesvalid: decimal(6) + user_has_voted: boolean # This is user specific and set during restriction + + assignment_id: + type: relation + to: assignment/poll_ids + voted_ids: + type: relation-list + to: + collection: user + field: + name: assignment_poll_voted_$_ids + type: structured-relation + replacement: meeting_id + entitled_group_ids: + type: relation-list + to: group/assignment_poll_ids + option_ids: + type: relation-list + to: assignment_option/poll_id + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/assignment_poll_ids + +assignment_option: + id: number + yes: decimal(6) + no: decimal(6) + abstain: decimal(6) + weight: number + + poll_id: + type: relation + to: assignment_poll/option_ids + user_id: + type: relation + to: + collection: user + field: + name: assignment_option_$_ids + type: structured-relation + replacement: meeting_id + vote_ids: + type: relation-list + to: assignment_vote/option_id + +assignment_vote: + id: number + value: string + weight: decimal(6) + + option_id: + type: relation + to: assignment_option/vote_ids + user_id: + type: relation + to: + collection: user + field: + name: assignment_vote_$_ids + type: structured-relation + replacement: meeting_id + +# Mediafiles are delivered by the mediafile server with the URL +# `/media//path` +mediafile: + id: number + title: string # title and parent_id must be unique. + is_directory: boolean + filesize: number # Note: in bytes, not the human readable format anymore + filename: string # Note: The uploaded filename. will be used for downloading. Only writeable on create. + mimetype: string + pdf_information: JSON + create_timestamp: datetime + has_inherited_access_groups: boolean # Note: calculated + + inherited_access_group_ids: + type: relation-list + to: group/mediafile_inherited_access_group_ids # Note: calculated + access_group_ids: + type: relation-list + to: group/mediafile_access_group_ids + parent_id: + type: relation + to: mediafile/child_ids + child_ids: + type: relation-list + to: mediafile/parent_id + list_of_speakers_id: + type: relation + to: list_of_speakers/content_object_id + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + attachment_ids: + type: generic-relation-list + to: + collection: + - motion + - topic + - assignment + field: attachment_ids + meeting_id: + type: relation + to: meeting/mediafile_ids + + # Reverse relations for meetings, if a mediafile is used as a special resource + used_as_logo_$_in_meeting_id: + type: template + replacement: location + fields: + type: relation + to: + collection: meeting + field: + name: logo_$_id + type: structured-tag + replacement: location + used_as_font_$_in_meeting_id: + type: template + replacement: location + fields: + type: relation + to: + collection: meeting + field: + name: font_$_id + type: structured-tag + replacement: location + +projector: + id: number + name: string + scale: number + scroll: number + width: number + aspect_ratio_numerator: number + aspect_ratio_denominator: number + color: string + background_color: string + header_background_color: string + header_font_color: string + header_h1_color: string + chyron_background_color: string + chyron_font_color: string + show_header_footer: boolean + show_title: boolean + show_logo: boolean + + current_projection_ids: + type: relation-list + to: projection/current_projector_id + # A relation to the currently projected elements to get a direct link, if + # the element is projected. + current_element_ids: + type: generic-relation-list + to: + collection: + - motion + - mediafile + - list_of_speakers + - motion_block + - assignment + - agenda_item + - user + - assignment_poll + - motion_poll + - projector_message + - projector_countdown + field: current_projector_ids + preview_projection_ids: + type: relation-list + to: projection/projector_preview_id + history_projection_ids: + type: relation-list + to: projection/projector_history_id + used_as_reference_projector_meeting_id: + type: relation + to: meeting/reference_projector_id + projectiondefault_ids: + type: relation-list + to: projectiondefault/projector_id + meeting_id: + type: relation + to: meeting/projector_ids + +# A projection is a M2M model between an element that is assigned to a +# projector. This element can either be the current one projected, in the +# preview, or in the history, but not more than one once. A projection is +# projector-specific, meaning that once a projection is created for a projector +# and element, these references will not change. +projection: + id: number + options: JSON + + current_projector_id: + type: relation + to: projector/current_projection_ids + preview_projector_id: + type: relation + to: projector/preview_projection_ids + history_projector_id: + type: relation + to: projector/history_projection_ids + element_id: + type: generic-relation + to: + collection: + - motion + - mediafile + - list_of_speakers + - motion_block + - assignment + - agenda_item + - user + - assignment_poll + - motion_poll + - projector_message + - projector_countdown + field: projection_ids + +projectiondefault: + id: number + name: string + display_name: string + + projector_id: + type: relation + to: projector/projectiondefault_ids + meeting_id: + type: relation + to: meeting/projectiondefault_ids + +projector_message: + id: number + message: HTML + + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/projector_message_ids + +projector_countdown: + id: number + title: string + description: string + default_time: number + countdown_time: number # float? + running: boolean + + projection_ids: + type: relation-list + to: projection/element_id + current_projector_ids: + type: relation-list + to: projector/current_element_ids + meeting_id: + type: relation + to: meeting/projector_countdown_ids