--- # Types: # - Nativ datatypes: string, number, boolean, JSON # - HTMLStrict: A string with HTML content. # - HTMLPermissive: A string with HTML content (with video tags). # - 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. # At the moment we support only X == 6. # - timestamp: Datetime as a unix timestamp. Why a number? This enables queries # in the DB. And we do not need more precision than 1 second. # - []: This indicates and arbitrary array of the given type. At the moment # we support only some types. You can add JSON Schema properties for items # using the extra property `items` # Relations: # - We have the following types: `relation`, `relation-list`, `generic-relation` # and `generic-relation-list`. # - Non-generic relations: The simple syntax for such a field # `to: /`. This is a reference to a collection. The reverse # relation field in this collection is . E. g. in a motion the field # `category_id` links to one category where the field `motion_ids` contains the # motion id. The simple notation for the field is `motion_category/motion_ids`. # The reverse field has type `relation-list` and is related back to # `motion/category_id`. The type indicates that there are many # motion ids. # - Generic relations: The difference to non-generic relations is that you have a # list of possible fields, so `to` can either hold multiple collections (if the # field name is the same): # to: # collections: # - agenda_item # - assignment # - ... # field: tag_ids # Or `to` can be a list of collection fields: # to: # - motion/option_ids # - user/option_$_ids # - on_delete: This fields determines what should happen with the foreign model if # this model gets deleted. Possible values are: # - SET_NULL (default): delete the id from the foreign key # - PROTECT: if the foreign key is not empty, throw an error instead of # deleting the object # - CASCADE: also delete all models in this foreign key # Structured fields: # - There are template fields (see autoupdate service interface) with a `$` as # the placeholder. # - The type `template` describes a structured field for the given model. If the # property `replacement` is given, it describes which field of the same model # is used as the replacement (=> structured relation). If it not given, the field # is a structured tag. The property `fields` contains the definition for all the # fields that come from the template field. # JSON Schema Properties: # - You can add JSON Schema properties to the fields like `enum`, `description`, # `maxLength` and `minimum` # Additional properties: # - The property `read_only` describes a field that can not be changed by an action. # - The property `default` describes the default value that is used for new objects. # - The property `required` describes that this field can not be null or an empty # string. If this field is given it must have some content. # - The property `equal_fields` describes fields that must have the same value in # the instance and the related instance. organisation: id: number name: string description: HTMLStrict # Settings (configurable by the client) legal_notice: string privacy_policy: string login_text: string theme: string custom_translations: JSON reset_password_verbose_errors: boolean # Configuration (only for the server owner) enable_electronic_voting: type: boolean read_only: true 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_physical_person: type: boolean default: true password: string default_password: string about_me: HTMLStrict gender: string comment: HTMLStrict number: string structure_level: string email: string last_email_send: string vote_weight: decimal(6) is_demo_user: type: boolean read_only: true 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 # 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 on_delete: CASCADE 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 poll_voted_$_ids: type: template replacement: meeting_id fields: type: relation-list to: poll/voted_ids option_$_ids: type: template replacement: meeting_id fields: type: relation-list to: option/content_object_id vote_$_ids: type: template replacement: meeting_id fields: type: relation-list to: vote/user_id vote_delegated_vote_$_ids: type: template replacement: meeting_id fields: type: relation-list to: vote/delegated_user_id assignment_candidate_$_ids: type: template replacement: meeting_id fields: type: relation-list to: assignment_candidate/user_id projection_$_ids: type: template replacement: meeting_id fields: type: relation-list to: projection/element_id current_projector_$_ids: type: template replacement: meeting_id fields: type: relation-list to: projector/current_element_ids vote_delegated_$_to_id: type: template replacement: meeting_id fields: type: relation to: user/vote_delegations_$_from_ids vote_delegations_$_from_ids: type: template replacement: meeting_id fields: type: relation-list to: user/vote_delegated_$_to_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: type: string required: true description: HTMLStrict meeting_ids: type: relation-list to: meeting/committee_id on_delete: PROTECT 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_member_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 required: true meeting: id: number welcome_title: string welcome_text: HTMLPermissive # General name: type: string maxLength: 100 description: type: string maxLength: 100 location: string start_time: timestamp end_time: timestamp # Configuration (only for the server owner) jitsi_domain: type: string read_only: true jitsi_room_name: type: string read_only: true jitsi_room_password: type: string read_only: true # System url_name: type: string description: 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 conference_stream_poster_url: string conference_open_microphone: boolean conference_open_video: boolean conference_auto_connect_next_speakers: boolean # Projector projector_default_countdown_time: number projector_countdown_warning_time: type: number minimum: 0 # Exports export_csv_encoding: type: string enum: - utf-8 - iso-8859-15 export_csv_separator: string export_pdf_pagenumber_alignment: type: string enum: - left - right - center export_pdf_fontsize: type: number enum: - 10 - 11 - 12 export_pdf_pagesize: type: string enum: - A4 - A5 # Agenda agenda_show_subtitles: boolean agenda_enable_numbering: boolean agenda_number_prefix: type: string maxLength: 20 agenda_numeral_system: type: string enum: - arabic - roman agenda_item_creation: type: string enum: - always - never - default_yes - default_no agenda_new_items_default_visibility: type: string enum: - common - internal - hidden agenda_show_internal_items_on_projector: boolean # List of speakers list_of_speakers_amount_last_on_projector: type: number minimum: 0 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 list_of_speakers_enable_point_of_order_speakers: boolean # Motions motions_default_workflow_id: type: relation to: motion_workflow/default_workflow_meeting_id required: true motions_default_amendment_workflow_id: type: relation to: motion_workflow/default_amendment_workflow_meeting_id required: true motions_default_statute_amendment_workflow_id: type: relation to: motion_workflow/default_statute_amendment_workflow_meeting_id required: true motions_preamble: string motions_default_line_numbering: type: string enum: - outside - inline - none motions_line_length: type: number minimium: 40 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: type: string enum: - original - changed - diff - agreed motions_default_sorting: string motions_number_type: type: string enum: - per_category - serially_numbered - manually motions_number_min_digits: number motions_number_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: type: string enum: - freestyle - fulltext - paragraph motions_amendments_multiple_paragraphs: boolean motions_supporters_min_amount: type: number minimum: 0 motions_export_title: string motions_export_preamble: string motions_export_submitter_recommendation: boolean motions_export_follow_recommendation: boolean # Motion poll motion_poll_ballot_paper_selection: type: string enum: - NUMBER_OF_DELEGATES - NUMBER_OF_ALL_PARTICIPANTS - CUSTOM_NUMBER 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: type: string enum: - first_name - last_name - number 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: type: string enum: - "" - WEP - WPA - nopass 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 polls assignment_poll_ballot_paper_selection: type: string enum: - NUMBER_OF_DELEGATES - NUMBER_OF_ALL_PARTICIPANTS - CUSTOM_NUMBER 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 # Polls poll_ballot_paper_selection: type: string enum: - NUMBER_OF_DELEGATES - NUMBER_OF_ALL_PARTICIPANTS - CUSTOM_NUMBER poll_ballot_paper_number: number poll_sort_poll_result_by_votes: boolean poll_default_type: string poll_default_method: string poll_default_100_percent_base: string poll_default_majority_method: string poll_default_group_ids: type: relation-list to: group/used_as_poll_default_id # Relations projector_ids: type: relation-list to: projector/meeting_id on_delete: CASCADE projection_ids: type: relation-list to: projection/meeting_id on_delete: CASCADE projectiondefault_ids: type: relation-list to: projectiondefault/meeting_id on_delete: CASCADE projector_message_ids: type: relation-list to: projector_message/meeting_id on_delete: CASCADE projector_countdown_ids: type: relation-list to: projector_countdown/meeting_id on_delete: CASCADE tag_ids: type: relation-list to: tag/meeting_id on_delete: CASCADE agenda_item_ids: type: relation-list to: agenda_item/meeting_id on_delete: CASCADE list_of_speakers_ids: type: relation-list to: list_of_speakers/meeting_id on_delete: CASCADE speaker_ids: type: relation-list to: speaker/meeting_id on_delete: CASCADE topic_ids: type: relation-list to: topic/meeting_id on_delete: CASCADE group_ids: type: relation-list to: group/meeting_id on_delete: CASCADE mediafile_ids: type: relation-list to: mediafile/meeting_id on_delete: CASCADE motion_ids: type: relation-list to: motion/meeting_id on_delete: CASCADE motion_comment_section_ids: type: relation-list to: motion_comment_section/meeting_id on_delete: CASCADE motion_category_ids: type: relation-list to: motion_category/meeting_id on_delete: CASCADE motion_block_ids: type: relation-list to: motion_block/meeting_id on_delete: CASCADE motion_workflow_ids: type: relation-list to: motion_workflow/meeting_id on_delete: CASCADE motion_statute_paragraph_ids: type: relation-list to: motion_statute_paragraph/meeting_id on_delete: CASCADE motion_comment_ids: type: relation-list to: motion_comment/meeting_id on_delete: CASCADE motion_submitter_ids: type: relation-list to: motion_submitter/meeting_id on_delete: CASCADE motion_change_recommendation_ids: type: relation-list to: motion_change_recommendation/meeting_id on_delete: CASCADE motion_state_ids: type: relation-list to: motion_state/meeting_id on_delete: CASCADE poll_ids: type: relation-list to: poll/meeting_id on_delete: CASCADE option_ids: type: relation-list to: option/meeting_id on_delete: CASCADE vote_ids: type: relation-list to: vote/meeting_id on_delete: CASCADE assignment_ids: type: relation-list to: assignment/meeting_id on_delete: CASCADE assignment_candidate_ids: type: relation-list to: assignment_candidate/meeting_id on_delete: CASCADE personal_note_ids: type: relation-list to: personal_note/meeting_id on_delete: CASCADE # Logos and Fonts logo_$_id: type: template fields: type: relation to: mediafile/used_as_logo_$_in_meeting_id font_$_id: type: template fields: type: relation to: mediafile/used_as_font_$_in_meeting_id # 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 required: true 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: type: number[] decription: Calculated. All ids from temporary_user_ids, guest_ids and all users assigned to groups. read_only: true 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 required: true admin_group_id: type: relation to: group/admin_group_for_meeting_id group: id: number name: type: string required: true permissions: string[] user_ids: type: relation-list to: user/group_$_ids default_group_for_meeting_id: type: relation to: meeting/default_group_id on_delete: PROTECT admin_group_for_meeting_id: type: relation to: meeting/admin_group_id on_delete: PROTECT mediafile_access_group_ids: type: relation-list to: mediafile/access_group_ids equal_fields: meeting_id mediafile_inherited_access_group_ids: type: relation-list to: mediafile/inherited_access_group_ids description: Calculated field. read_only: true read_comment_section_ids: type: relation-list to: motion_comment_section/read_group_ids equal_fields: meeting_id write_comment_section_ids: type: relation-list to: motion_comment_section/write_group_ids equal_fields: meeting_id poll_ids: type: relation-list to: poll/entitled_group_ids equal_fields: meeting_id 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 used_as_poll_default_id: type: relation to: meeting/poll_default_group_ids meeting_id: type: relation to: meeting/group_ids required: true personal_note: id: number note: HTMLStrict star: boolean user_id: type: relation to: user/personal_note_$_ids content_object_id: type: generic-relation to: collections: - motion field: personal_note_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/personal_note_ids required: true tag: id: number name: type: string required: true tagged_ids: type: generic-relation-list to: collections: - agenda_item - assignment - motion - topic field: tag_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/tag_ids required: true agenda_item: id: number item_number: string comment: string closed: boolean type: type: string enum: - common - internal - hidden default: common duration: type: number description: Given in seconds minimum: 0 is_internal: type: boolean description: Calculated by the server read_only: true is_hidden: type: boolean description: Calculated by the server read_only: true level: type: number description: Calculated by the server read_only: true weight: type: number default: 10000 content_object_id: type: generic-relation to: collections: - motion - motion_block - assignment - topic field: agenda_item_id required: true equal_fields: meeting_id parent_id: type: relation to: agenda_item/child_ids equal_fields: meeting_id child_ids: type: relation-list to: agenda_item/parent_id equal_fields: meeting_id tag_ids: type: relation-list to: tag/tagged_ids equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/agenda_item_ids required: true list_of_speakers: id: number closed: boolean content_object_id: type: generic-relation to: collections: - motion - motion_block - assignment - topic - mediafile field: list_of_speakers_id required: true equal_fields: meeting_id speaker_ids: type: relation-list to: speaker/list_of_speakers_id on_delete: CASCADE equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/list_of_speakers_ids required: true speaker: id: number begin_time: type: timestamp read_only: true end_time: type: timestamp read_only: true weight: type: number default: 10000 marked: boolean point_of_order: boolean list_of_speakers_id: type: relation to: list_of_speakers/speaker_ids required: true equal_fields: meeting_id user_id: type: relation to: user/speaker_$_ids required: true meeting_id: type: relation to: meeting/speaker_ids required: true topic: id: number title: type: string required: true text: HTMLPermissive attachment_ids: type: relation-list to: mediafile/attachment_ids equal_fields: meeting_id agenda_item_id: type: relation to: agenda_item/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id list_of_speakers_id: type: relation to: list_of_speakers/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id option_ids: type: relation-list to: option/content_object_id on_delete: CASCADE equal_fields: meeting_id tag_ids: type: relation-list to: tag/tagged_ids equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/topic_ids required: true motion: id: number number: string number_value: type: number description: The number value of this motion. This number is auto-generated and read-only. read_only: true sequential_number: type: number description: The (positive) serial number of this motion. This number is auto-generated and read-only. read_only: true title: type: string required: true text: HTMLStrict amendment_paragraph_$: type: template fields: HTMLStrict modified_final_version: HTMLStrict reason: HTMLStrict category_weight: type: number default: 10000 state_extension: string recommendation_extension: string sort_weight: type: number default: 10000 created: type: timestamp read_only: true last_modified: type: timestamp read_only: true lead_motion_id: type: relation to: motion/amendment_ids equal_fields: meeting_id amendment_ids: type: relation-list to: motion/lead_motion_id equal_fields: meeting_id sort_parent_id: type: relation to: motion/sort_child_ids equal_fields: meeting_id sort_child_ids: type: relation-list to: motion/sort_parent_id equal_fields: meeting_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: number[] # Calculated: All children (derived_motion_ids), grand children, ... and all parents (origin_id). state_id: type: relation to: motion_state/motion_ids required: true equal_fields: meeting_id recommendation_id: type: relation to: motion_state/motion_recommendation_ids equal_fields: meeting_id recommendation_extension_reference_ids: type: generic-relation-list to: collections: - motion field: referenced_in_motion_recommendation_extension_ids equal_fields: meeting_id referenced_in_motion_recommendation_extension_ids: type: relation-list to: motion/recommendation_extension_reference_ids equal_fields: meeting_id category_id: type: relation to: motion_category/motion_ids equal_fields: meeting_id block_id: type: relation to: motion_block/motion_ids equal_fields: meeting_id submitter_ids: type: relation-list to: motion_submitter/motion_id on_delete: CASCADE equal_fields: meeting_id supporter_ids: type: relation-list to: user/supported_motion_$_ids poll_ids: type: relation-list to: poll/content_object_id on_delete: CASCADE equal_fields: meeting_id option_ids: type: relation-list to: option/content_object_id on_delete: CASCADE equal_fields: meeting_id change_recommendation_ids: type: relation-list to: motion_change_recommendation/motion_id on_delete: CASCADE equal_fields: meeting_id statute_paragraph_id: type: relation to: motion_statute_paragraph/motion_ids equal_fields: meeting_id comment_ids: type: relation-list to: motion_comment/motion_id on_delete: CASCADE equal_fields: meeting_id agenda_item_id: type: relation to: agenda_item/content_object_id on_delete: CASCADE equal_fields: meeting_id list_of_speakers_id: type: relation to: list_of_speakers/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id tag_ids: type: relation-list to: tag/tagged_ids equal_fields: meeting_id attachment_ids: type: relation-list to: mediafile/attachment_ids equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id personal_note_ids: type: relation-list to: personal_note/content_object_id equal_fields: meeting_id on_delete: CASCADE meeting_id: type: relation to: meeting/motion_ids required: true motion_submitter: id: number weight: type: number default: 10000 user_id: type: relation to: user/submitted_motion_$_ids motion_id: type: relation to: motion/submitter_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_submitter_ids required: true motion_comment: id: number comment: HTMLStrict motion_id: type: relation to: motion/comment_ids required: true equal_fields: meeting_id section_id: type: relation to: motion_comment_section/comment_ids required: true equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_comment_ids required: true motion_comment_section: id: number name: type: string required: true weight: type: number default: 10000 comment_ids: type: relation-list to: motion_comment/section_id on_delete: PROTECT equal_fields: meeting_id read_group_ids: type: relation-list to: group/read_comment_section_ids equal_fields: meeting_id write_group_ids: type: relation-list to: group/write_comment_section_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_comment_section_ids required: true motion_category: id: number name: type: string required: true prefix: type: string weight: type: number default: 10000 level: type: number description: Calculated field. read_only: true parent_id: type: relation to: motion_category/child_ids equal_fields: meeting_id child_ids: type: relation-list to: motion_category/parent_id equal_fields: meeting_id motion_ids: type: relation-list to: motion/category_id equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_category_ids required: true motion_block: id: number title: type: string required: true internal: boolean motion_ids: type: relation-list to: motion/block_id equal_fields: meeting_id agenda_item_id: type: relation to: agenda_item/content_object_id on_delete: CASCADE equal_fields: meeting_id list_of_speakers_id: type: relation to: list_of_speakers/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_block_ids required: true motion_change_recommendation: id: number rejected: boolean internal: boolean type: type: string enum: - replacement - insertion - deletion - other default: replacement other_description: string line_from: type: number minimum: 0 line_to: type: number minimum: 0 text: HTMLStrict creation_time: type: timestamp read_only: true motion_id: type: relation to: motion/change_recommendation_ids required: true equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_change_recommendation_ids required: true motion_state: id: number name: type: string required: true recommendation_label: string css_class: type: string enum: - grey - red - green - lightblue - yellow default: lightblue restrictions: type: string[] items: enum: - motion.can_see_internal - motion.can_manage_metadata - motion.can_manage - is_submitter allow_support: boolean allow_create_poll: boolean allow_submitter_edit: boolean set_number: boolean show_state_extension_field: boolean merge_amendment_into_final: type: string enum: - do_not_merge - undefined - do_merge default: undefined show_recommendation_extension_field: boolean next_state_ids: type: relation-list to: motion_state/previous_state_ids equal_fields: - meeting_id - workflow_id previous_state_ids: type: relation-list to: motion_state/next_state_ids equal_fields: - meeting_id - workflow_id motion_ids: type: relation-list to: motion/state_id on_delete: PROTECT equal_fields: meeting_id motion_recommendation_ids: type: relation-list to: motion/recommendation_id equal_fields: meeting_id workflow_id: type: relation to: motion_workflow/state_ids required: true equal_fields: meeting_id first_state_of_workflow_id: type: relation to: motion_workflow/first_state_id on_delete: PROTECT equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_state_ids required: true motion_workflow: id: number name: type: string required: true state_ids: type: relation-list to: motion_state/workflow_id on_delete: CASCADE equal_fields: meeting_id first_state_id: type: relation to: motion_state/first_state_of_workflow_id required: true equal_fields: meeting_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 required: true motion_statute_paragraph: id: number title: type: string required: true text: HTMLStrict weight: type: number default: 10000 motion_ids: type: relation-list to: motion/statute_paragraph_id equal_fields: meeting_id meeting_id: type: relation to: meeting/motion_statute_paragraph_ids required: true poll: id: number description: string title: type: string required: true type: type: string required: true enum: - analog - named - pseudoanonymous pollmethod: type: string required: true enum: - Y - YN - YNA - N state: type: string enum: - created - started - finished - published default: created min_votes_amount: type: number default: 1 max_votes_amount: type: number default: 1 global_yes: type: boolean default: false global_no: type: boolean default: false global_abstain: type: boolean default: false onehundred_percent_base: type: string required: true enum: - Y - YN - YNA - valid - cast - disabled majority_method: type: string required: true enum: - simple - two_thirds - three_quarters - disabled votesvalid: decimal(6) votesinvalid: decimal(6) votescast: decimal(6) content_object_id: # Note: must not be set - it is allowed to have standalone polls type: generic-relation to: collections: - motion - assignment field: poll_ids equal_fields: meeting_id option_ids: type: relation-list to: option/poll_id on_delete: CASCADE equal_fields: meeting_id global_option_id: type: relation to: option/used_as_global_option_in_poll_id on_delete: CASCADE equal_fields: meeting_id voted_ids: type: relation-list to: user/poll_voted_$_ids entitled_group_ids: type: relation-list to: group/poll_ids equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/poll_ids option: id: number weight: type: number default: 10000 text: HTMLStrict yes: decimal(6) no: decimal(6) abstain: decimal(6) poll_id: type: relation to: poll/option_ids equal_fields: meeting_id used_as_global_option_in_poll_id: type: relation to: poll/global_option_id equal_fields: meeting_id vote_ids: type: relation-list to: vote/option_id on_delete: CASCADE equal_fields: meeting_id content_object_id: type: generic-relation to: - motion/option_ids - topic/option_ids - user/option_$_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/option_ids required: true vote: id: number weight: decimal(6) value: string option_id: type: relation to: option/vote_ids equal_fields: meeting_id required: true user_id: type: relation to: user/vote_$_ids delegated_user_id: type: relation to: user/vote_delegated_vote_$_ids meeting_id: type: relation to: meeting/vote_ids required: true assignment: id: number title: type: string required: true description: HTMLStrict open_posts: type: number minimum: 0 default: 0 phase: type: string enum: - search - voting - finished default: search default_poll_description: string number_poll_candidates: boolean candidate_ids: type: relation-list to: assignment_candidate/assignment_id on_delete: CASCADE equal_fields: meeting_id poll_ids: type: relation-list to: poll/content_object_id on_delete: CASCADE equal_fields: meeting_id agenda_item_id: type: relation to: agenda_item/content_object_id on_delete: CASCADE equal_fields: meeting_id list_of_speakers_id: type: relation to: list_of_speakers/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id tag_ids: type: relation-list to: tag/tagged_ids equal_fields: meeting_id attachment_ids: type: relation-list to: mediafile/attachment_ids equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/assignment_ids required: true assignment_candidate: id: number weight: type: number default: 10000 assignment_id: type: relation to: assignment/candidate_ids equal_fields: meeting_id user_id: type: relation to: user/assignment_candidate_$_ids meeting_id: type: relation to: meeting/assignment_candidate_ids required: true # Mediafiles are delivered by the mediafile server with the URL # `/media//path` mediafile: id: number title: type: string description: Title and parent_id must be unique. is_directory: boolean filesize: type: number description: In bytes, not the human readable format anymore. read_only: true filename: type: string descriptin: The uploaded filename. Will be used for downloading. Only writeable on create. required: true mimetype: string pdf_information: JSON create_timestamp: timestamp is_public: type: boolean description: "Calculated field. inherited_access_group_ids == [] can have two causes: cancelling access groups (=> is_public := false) or no access groups at all (=> is_public := true)" read_only: true inherited_access_group_ids: type: relation-list to: group/mediafile_inherited_access_group_ids description: Calculated field. read_only: true access_group_ids: type: relation-list to: group/mediafile_access_group_ids equal_fields: meeting_id parent_id: type: relation to: mediafile/child_ids equal_fields: meeting_id child_ids: type: relation-list to: mediafile/parent_id equal_fields: meeting_id list_of_speakers_id: type: relation to: list_of_speakers/content_object_id required: true on_delete: CASCADE equal_fields: meeting_id projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id attachment_ids: type: generic-relation-list to: collections: - motion - topic - assignment field: attachment_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/mediafile_ids required: true # Reverse relations for meetings, if a mediafile is used as a special resource used_as_logo_$_in_meeting_id: type: template fields: type: relation to: meeting/logo_$_id used_as_font_$_in_meeting_id: type: template fields: type: relation to: meeting/font_$_id 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 on_delete: CASCADE equal_fields: meeting_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: - motion/current_projector_ids - mediafile/current_projector_ids - list_of_speakers/current_projector_ids - motion_block/current_projector_ids - assignment/current_projector_ids - agenda_item/current_projector_ids - topic/current_projector_ids - poll/current_projector_ids - projector_message/current_projector_ids - projector_countdown/current_projector_ids - user/current_projector_$_ids equal_fields: meeting_id preview_projection_ids: type: relation-list to: projection/preview_projector_id equal_fields: meeting_id history_projection_ids: type: relation-list to: projection/history_projector_id equal_fields: meeting_id used_as_reference_projector_meeting_id: type: relation to: meeting/reference_projector_id projectiondefault_ids: type: relation-list to: projectiondefault/projector_id on_delete: PROTECT equal_fields: meeting_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 equal_fields: meeting_id preview_projector_id: type: relation to: projector/preview_projection_ids equal_fields: meeting_id history_projector_id: type: relation to: projector/history_projection_ids equal_fields: meeting_id element_id: type: generic-relation to: - motion/projection_ids - 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 - user/projection_$_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/projection_ids required: true projectiondefault: id: number name: string display_name: string projector_id: type: relation to: projector/projectiondefault_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/projectiondefault_ids projector_message: id: number message: HTMLStrict projection_ids: type: relation-list to: projection/element_id equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id 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 equal_fields: meeting_id current_projector_ids: type: relation-list to: projector/current_element_ids equal_fields: meeting_id meeting_id: type: relation to: meeting/projector_countdown_ids