Files
qt5-legatus-legacy/Lts/Services/OperatorManagement/opm_service.xml
T
2026-08-13 18:33:10 +02:00

406 lines
24 KiB
XML
Executable File

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<service namespace="OperatorManagement" abbreviation="OPM" procNames="OperatorManagement" exerciseDependency="Global" groups="Core" prio="2">
<rcs>
<Id Id="$Id$"/>
<HeadURL HeadURL="$HeadURL$"/>
<Author Author="$Author$"/>
</rcs>
<operatorRights offset="25">
<guiPlugin name="Login" offset="2">
<operatorRightGroup name="Administrator Mode" description="Obtain administrative rights">
<operatorRight right="Administrator" value="1" description="Administrator rights"/>
<operatorRight right="ShutdownWorkstations" value="2" description="Shut down workstations"/>
</operatorRightGroup>
</guiPlugin>
<guiPlugin name="OperatorEdit" offset="1">
<operatorRightGroup name="Edit Operators" description="Create, Modify, Change Password, Delete on any Operator, Create, Modify, Delete Groups, Edit Group Memberships">
<operatorRight right="OperatorsEdit" value="1" description="Create, Change Name, Change Image, Change Password, Delete on any Operator"/>
<operatorRight right="OperatorsShow" value="2" description="Get Overview over any Operator"/>
<operatorRight right="GroupEdit" value="4" description="Create, Remove Groups, Change their Name"/>
<operatorRight right="GroupMembershipsEdit" value="5" description="Change Memberships of Groups."/>
<operatorRight right="GroupShow" value="6" description="See all Groups and their Relationships."/>
</operatorRightGroup>
<operatorRightGroup name="Operator Self Service" description="Change own Password and Image">
<operatorRight right="OperatorSelfEdit" value="3" description="Change own Password and Image"/>
</operatorRightGroup>
</guiPlugin>
<guiPlugin name="OperatorSettings" offset="3">
<operatorRightGroup name="Operator Settings" description="Save and Restore own Operator Settings">
<operatorRight right="OperatorSettingsRead" value="1" description="Obtain own Operator Settings"/>
<operatorRight right="OperatorSettingsWrite" value="2" description="Save own Operator Settings"/>
<operatorRight right="OperatorSettingsRestore" value="3" description="Restore default Operator Settings"/>
</operatorRightGroup>
</guiPlugin>
<guiPlugin name="TerminalWindow" offset="4">
<operatorRightGroup name="Terminal Window" description="Right to open a terminal session">
<operatorRight right="TerminalWindowOpen" value="1" description="Right to open a terminal session"/>
</operatorRightGroup>
</guiPlugin>
</operatorRights>
<tables>
<table name="opm_access_control_level">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="name" datatype="text"/>
<column name="description" datatype="text"/>
<constraint name="UQ_opm_access_control_level_name" type="unique">
<column name="name"/>
</constraint>
</table>
<table name="opm_acl_allow">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="group_id" datatype="integer" isForeignKey="1"/>
<column name="acl_id" datatype="integer" isForeignKey="1"/>
<constraint name="IDX_opm_acl_allow_group_id" type="index">
<column name="group_id"/>
</constraint>
<foreignKey name="FK_opm_acl_allow_opm_group">
<source table="opm_acl_allow" column="group_id"/>
<destination table="opm_group" column="id"/>
</foreignKey>
<foreignKey name="FK_opm_acl_allow_opm_access_control_level">
<source table="opm_acl_allow" column="acl_id"/>
<destination table="opm_access_control_level" column="id"/>
</foreignKey>
</table>
<table name="opm_acl_deny">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="group_id" datatype="integer" isForeignKey="1"/>
<column name="acl_id" datatype="integer" isForeignKey="1"/>
<constraint name="IDX_opm_acl_deny_group_id" type="index">
<column name="group_id"/>
</constraint>
<foreignKey name="FK_opm_acl_deny_opm_group">
<source table="opm_acl_deny" column="group_id"/>
<destination table="opm_group" column="id"/>
</foreignKey>
<foreignKey name="FK_opm_acl_deny_opm_access_control_level">
<source table="opm_acl_deny" column="acl_id"/>
<destination table="opm_access_control_level" column="id"/>
</foreignKey>
</table>
<table name="opm_group">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="description" datatype="text"/>
<column name="name" datatype="text"/>
<column name="type_id" datatype="integer" isForeignKey="1"/>
<column name="is_hidden" datatype="boolean" comment="Can be used for &quot;xxxDataPluginRead&quot; that is hidden to user unlike &quot;XxxGuiPluginRead&quot; (ie. &quot;ExerciseManagementRead&quot;) (dtc containing Plugins vs. Gui Plugins)."/>
<constraint name="UQ_opm_group_name" type="unique">
<column name="name"/>
</constraint>
<foreignKey name="FK_opm_group_opm_group_type">
<source table="opm_group" column="type_id"/>
<destination table="opm_group_type" column="id"/>
</foreignKey>
</table>
<table name="opm_group_group">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="group_id" datatype="integer" isForeignKey="1"/>
<column name="is_member_of_group_id" datatype="integer" isForeignKey="1"/>
<constraint name="IDX_opm_group_group_group_id" type="index">
<column name="group_id"/>
</constraint>
<constraint name="IDX_opm_group_group_is_member_of_group_id" type="index">
<column name="is_member_of_group_id"/>
</constraint>
<constraint name="UQ_opm_group_group_group_id_is_member_of_group_id" type="unique">
<column name="group_id"/>
<column name="is_member_of_group_id"/>
</constraint>
<foreignKey name="FK_opm_group_group_opm_group">
<source table="opm_group_group" column="group_id"/>
<destination table="opm_group" column="id"/>
</foreignKey>
<foreignKey name="FK_is_member_of_opm_group">
<source table="opm_group_group" column="is_member_of_group_id"/>
<destination table="opm_group" column="id"/>
</foreignKey>
</table>
<table name="opm_group_type">
<column name="id" datatype="integer" isPrimaryKey="1"/>
<column name="name" datatype="text"/>
</table>
<table name="opm_locked_topics">
<column name="id" datatype="bigint" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="operator_id" datatype="integer"/>
<column name="workstation_id" datatype="integer"/>
<column name="exercise_id" datatype="integer" isOptional="1" isForeignKey="1"/>
<column name="entity_id" datatype="bigint"/>
<column name="entity_type_name" datatype="text"/>
<column name="locked" datatype="boolean"/>
<column name="time_stamp_lock" datatype="bigint"/>
<column name="time_stamp_unlock" datatype="bigint"/>
<constraint name="IDX_opm_locked_topics_locked" type="index">
<column name="locked"/>
</constraint>
<foreignKey name="FK_opm_locked_topics_exercise" referential_integrity="DeleteCascade">
<source table="opm_locked_topics" column="exercise_id"/>
<destination service="ExerciseManagement" serviceAbbr="exm" schema="exm" table="exercise" column="id"/>
</foreignKey>
</table>
<table name="opm_operator">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="name" datatype="text"/>
<column name="password" datatype="text"/>
<column name="primary_group_id" datatype="integer" isForeignKey="1"/>
<column name="projection_priority" datatype="integer"/>
<column name="audio_channel_priority" datatype="integer"/>
<column name="description" datatype="text"/>
<column name="image" datatype="bytea"/>
<column name="workstation_id" datatype="integer" isOptional="1" isForeignKey="1"/>
<column name="workstation_ip" datatype="integer" comment="full ipv4 address of workstation"/>
<column name="visible_parties" datatype="integer[]" comment="the global visible parties for this operator"/>
<column name="role_preset_id" datatype="integer" comment="Role Preset like Organisator, Techniker, Leitung, Uebungsleitung, Auswewertung Table opm.opm_group"/>
<column name="properties" datatype="jsonb" comment="special properties stored as JSON"/>
<constraint name="UQ_opm_operator_name" type="unique">
<column name="name"/>
</constraint>
<constraint name="UQ_opm_operator_primary_group_id" type="unique">
<column name="primary_group_id"/>
</constraint>
<foreignKey name="FK_opm_operator_asm_asset">
<source table="opm_operator" column="workstation_id"/>
<destination service="AssetManagement" serviceAbbr="asm" schema="asm" table="asm_asset" column="id"/>
</foreignKey>
<foreignKey name="FK_opm_operator_opm_group" referential_integrity="DeleteCascade">
<source table="opm_operator" column="primary_group_id"/>
<destination table="opm_group" column="id"/>
</foreignKey>
</table>
<table name="opm_operator_exercise">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="operator_id" datatype="integer" isForeignKey="1"/>
<column name="exercise_id" datatype="integer" isForeignKey="1"/>
<column name="visible_parties" datatype="integer[]" comment="the visible parties for this operator"/>
<column name="hidden_parties" datatype="integer[]" comment="the hidden parties for this operator"/>
<column name="properties" datatype="jsonb" comment="special properties stored as JSON"/>
<constraint name="IDX_opm_operator_operator_id" type="index">
<column name="operator_id"/>
</constraint>
<foreignKey name="FK_opm_operator_exercise_opm_operator">
<source table="opm_operator_exercise" column="operator_id"/>
<destination table="opm_operator" column="id"/>
</foreignKey>
<foreignKey name="FK_opm_operator_exercise_exercise">
<source table="opm_operator_exercise" column="exercise_id"/>
<destination service="ExerciseManagement" serviceAbbr="exm" schema="exm" table="exercise" column="id"/>
</foreignKey>
</table>
<table name="opm_settings">
<column name="id" datatype="integer" isPrimaryKey="1">
<sequence start="1" increment="1"/>
</column>
<column name="operator_id" datatype="integer" isForeignKey="1"/>
<column name="settings" datatype="bytea"/>
<constraint name="IDX_operator_id" type="index">
<column name="operator_id"/>
</constraint>
<foreignKey name="FK_opm_settings_opm_operator">
<source table="opm_settings" column="operator_id"/>
<destination table="opm_operator" column="id"/>
</foreignKey>
</table>
</tables>
<views/>
<dbServiceStructs>
<serviceStruct name="OpmAccessControlLevel" table="opm_access_control_level"/>
<serviceStruct name="OpmAclAllow" table="opm_acl_allow"/>
<serviceStruct name="OpmAclDeny" table="opm_acl_deny"/>
<serviceStruct name="OpmGroup" table="opm_group"/>
<serviceStruct name="OpmGroupGroup" table="opm_group_group"/>
<serviceStruct name="OpmLockedTopics" table="opm_locked_topics"/>
<serviceStruct name="OpmOperator" table="opm_operator"/>
<serviceStruct name="OpmOperatorExercise" table="opm_operator_exercise"/>
<serviceStruct name="OpmSettings" table="opm_settings"/>
<table name="opm_access_control_level"/>
<table name="opm_acl_allow"/>
<table name="opm_acl_deny"/>
<table name="opm_group"/>
<table name="opm_group_group"/>
<table name="opm_locked_topics"/>
<table name="opm_operator"/>
<table name="opm_operator_exercise"/>
<table name="opm_settings"/>
</dbServiceStructs>
<topicTypes>
<topicType name="ActiveApp" isDataObject="1" routeToClient="1" routeToServer="0" routeInReplay="1">
<column name="id" idlType="long" isKey="1"/>
<column name="operatorId" idlType="long"/>
<column name="screenTypeId" idlType="long"/>
<column name="screenId" idlType="long"/>
<column name="screenContainerId" idlType="long"/>
<column name="exerciseId" idlType="long"/>
<column name="appId" idlType="long"/>
</topicType>
<topicType name="AccessControlLevel" isDataObject="1" routeToClient="1" routeToServer="0" routeInReplay="0">
<column name="id" idlType="long" isKey="1"/>
<column name="name" idlType="string"/>
<column name="description" idlType="string"/>
</topicType>
<topicType name="Group" isDataObject="1" routeToClient="1" routeToServer="0" routeInReplay="0" baseValueType="Core::BaseEntityTranslatable">
<column name="description" idlType="string" isTranslatable="1"/>
<column name="aclAllow" idlType="sequence&lt;long&gt;"/>
<column name="aclDeny" idlType="sequence&lt;long&gt;"/>
<column name="isHidden" idlType="boolean"/>
<column name="isMemberOf" idlType="sequence&lt;long&gt;"/>
<column name="type" idlType="GroupType"/>
</topicType>
<topicType name="GroupChangeMembersRequest">
<column name="id" idlType="long"/>
<column name="memberships" idlType="sequence&lt;long&gt;"/>
<column name="rolePresetId" idlType="long" isOptional="1"/>
<column name="operatorId" idlType="long" isOptional="1"/>
</topicType>
<topicType name="GroupChangeNameRequest">
<column name="id" idlType="long"/>
<column name="name" idlType="string"/>
<column name="description" idlType="string"/>
</topicType>
<topicType name="GroupCreateRequest">
<column name="name" idlType="string"/>
<column name="description" idlType="string"/>
<column name="type" idlType="GroupType"/>
<column name="isHidden" idlType="boolean" isOptional="1"/>
<column name="memberships" idlType="sequence&lt;long&gt;" isOptional="1"/>
</topicType>
<topicType name="OperatorApplyForeignAclsRequest">
<column name="id" idlType="long" comment="The Operator that receives the OperatorRights"/>
<column name="remoteOperatorId" idlType="long" comment="The Operator Id from whom the ACLs shall be obtained."/>
</topicType>
<topicType name="OperatorChangePasswordRequest">
<column name="id" idlType="long"/>
<column name="password" idlType="string" comment="password in Function Topic unencrypted! (?)"/>
<column name="oldPassword" idlType="string"/>
<column name="forceSet" idlType="boolean"/>
</topicType>
<topicType name="OperatorCreateModifyRequest">
<column name="id" idlType="long" isOptional="1"/>
<column name="name" idlType="string" isOptional="1"/>
<column name="description" idlType="string" isOptional="1"/>
<column name="password" idlType="string" isOptional="1"/>
<column name="image" idlType="sequence&lt;octet&gt;" isOptional="1"/>
<column name="visiblePartiesByExercise" idlType="sequence&lt;PartiesByExercise&gt;"/>
<column name="visibleExercises" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="operatorRights" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="projectionPriority" idlType="short" isOptional="1"/>
<column name="audioChannelPriority" idlType="short" isOptional="1"/>
<column name="rolePresetId" idlType="long" isOptional="1"/>
<column name="properties" idlType="string"/>
</topicType>
<topicType name="OperatorUpdateVisiblePartiesByExerciseRequest">
<column name="id" idlType="long" comment="operator id"/>
<column name="exerciseId" idlType="long"/>
<column name="hiddenParties" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="visibleParties" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="properties" idlType="string"/>
</topicType>
<topicType name="OperatorGetSetSettingsReply" baseValueType="Core::FunctionReply">
<column name="settings" idlType="sequence&lt;octet&gt;" isOptional="1"/>
</topicType>
<topicType name="OperatorGetSetSettingsRequest">
<column name="id" idlType="long" comment="operator id"/>
<column name="settings" idlType="sequence&lt;octet&gt;" isOptional="1"/>
</topicType>
<topicType name="OperatorLoginRequest">
<column name="id" idlType="long" comment="instead of operator name. Since operators are with all attributes (but passwords) on DDS, ID can be obtained in advance"/>
<column name="password" idlType="string" comment="unencrypted"/>
<column name="workstationId" idlType="long"/>
<column name="workstationIp" idlType="long" comment="Logon should claim a workstation, logon claiming another workstation will be denied"/>
<column name="force" idlType="boolean" comment="true will force login in case other operator is logged in"/>
</topicType>
<topicType name="OperatorLogoutRequest">
<column name="id" idlType="long" comment="Operator Id"/>
</topicType>
<topicType name="OperatorWorkstationAlive" isDataObject="1" routeToClient="0" routeToServer="1" routeInReplay="0">
<column name="workstationId" idlType="long" isKey="1"/>
<column name="operatorId" idlType="long"/>
<column name="lastAlive" idlType="long long"/>
</topicType>
<topicType name="PartiesByExercise" isDataObject="0">
<column name="exerciseId" idlType="long" isKey="1"/>
<column name="visibleParties" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="hiddenParties" idlType="sequence&lt;long&gt;" isOptional="1"/>
<column name="properties" idlType="string"/>
</topicType>
<topicType name="User" isDataObject="1" routeToClient="1" routeToServer="0" routeInReplay="1" baseValueType="Core::BaseEntity">
<column name="description" idlType="string"/>
<column name="effectiveAcls" idlType="sequence&lt;long&gt;"/>
<column name="visiblePartiesByExercise" idlType="sequence&lt;PartiesByExercise&gt;"/>
<column name="primaryGroupId" idlType="long"/>
<column name="projectionPriority" idlType="short" comment="1..5"/>
<column name="audioChannelPriority" idlType="short" comment="1..5"/>
<column name="image" idlType="sequence&lt;octet&gt;" comment="-&amp;gt; QByteArray, JPG encodiert"/>
<column name="workstationIp" idlType="long"/>
<column name="workstationId" idlType="long"/>
<column name="exerciseIds" idlType="sequence&lt;long&gt;" comment="exercises, the Operator may log into."/>
<column name="rolePresetId" idlType="long" isOptional="1"/>
<column name="properties" idlType="string"/>
</topicType>
</topicTypes>
<functionTopics>
<functionTopic name="ActiveAppRemove" requestTopicType="Core::RemoveElementRequest" replyTopicType="Core::FunctionReply" requestTopicName="ActiveAppRemoveRequest" replyTopicName="ActiveAppRemoveReply" routeInReplay="0"/>
<functionTopic name="ActiveAppUpdate" requestTopicType="ActiveApp" replyTopicType="Core::FunctionReply" requestTopicName="ActiveAppUpdateRequest" replyTopicName="ActiveAppUpdateReply" routeInReplay="0"/>
<functionTopic name="GroupChangeMemberships" requestTopicType="GroupChangeMembersRequest" replyTopicType="Core::FunctionReply" requestTopicName="GroupChangeMembershipsRequest" replyTopicName="GroupChangeMembershipsReply" routeInReplay="0"/>
<functionTopic name="GroupChangeName" requestTopicType="GroupChangeNameRequest" replyTopicType="Core::FunctionReply" requestTopicName="GroupChangeNameRequest" replyTopicName="GroupChangeNameReply" routeInReplay="0"/>
<functionTopic name="GroupCreate" requestTopicType="GroupCreateRequest" replyTopicType="Core::FunctionReply" requestTopicName="GroupCreateRequest" replyTopicName="GroupCreateReply" routeInReplay="0"/>
<functionTopic name="GroupRemove" requestTopicType="Core::RemoveElementRequest" replyTopicType="Core::FunctionReply" requestTopicName="GroupRemoveRequest" replyTopicName="GroupRemoveReply" routeInReplay="0"/>
<functionTopic name="OperatorApplyForeignAcls" requestTopicType="OperatorApplyForeignAclsRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorApplyForeignAclsRequest" replyTopicName="OperatorApplyForeignAclsReply" routeInReplay="0"/>
<functionTopic name="OperatorChangePassword" requestTopicType="OperatorChangePasswordRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorChangePasswordRequest" replyTopicName="OperatorChangePasswordReply" routeInReplay="0"/>
<functionTopic name="OperatorCreateModify" requestTopicType="OperatorCreateModifyRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorCreateModifyRequest" replyTopicName="OperatorCreateModifyReply" routeInReplay="0"/>
<functionTopic name="OperatorUpdateVisiblePartiesByExercise" requestTopicType="OperatorUpdateVisiblePartiesByExerciseRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorUpdateVisiblePartiesByExerciseRequest" replyTopicName="OperatorUpdateVisiblePartiesByExerciseReply" routeInReplay="0"/>
<functionTopic name="OperatorGetSetSettings" requestTopicType="OperatorGetSetSettingsRequest" replyTopicType="OperatorGetSetSettingsReply" requestTopicName="OperatorGetSetSettingsRequest" replyTopicName="OperatorGetSetSettingsReply" routeInReplay="0"/>
<functionTopic name="OperatorLogin" requestTopicType="OperatorLoginRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorLoginRequest" replyTopicName="OperatorLoginReply" routeInReplay="0"/>
<functionTopic name="OperatorLogout" requestTopicType="OperatorLogoutRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorLogoutRequest" replyTopicName="OperatorLogoutReply" routeInReplay="0"/>
<functionTopic name="OperatorRemove" requestTopicType="Core::RemoveElementRequest" replyTopicType="Core::FunctionReply" requestTopicName="OperatorRemoveRequest" replyTopicName="OperatorRemoveReply" routeInReplay="0"/>
</functionTopics>
<customDtcFunctions>
<customDtcFunction>
<function name="getOperatorsByOperatorRight" returns="QVector&lt;int&gt;">
<parameter pos="1" name="operatorRight" type="int"/>
</function>
<function name="getNotificationRecipents" returns="QVector&lt;int&gt;">
<parameter pos="1" name="exerciseId" type="const int"/>
<parameter pos="2" name="partyId" type="const int"/>
<parameter pos="3" name="operatorRight" type="const int"/>
<parameter pos="4" name="notificationType" type="const int"/>
</function>
</customDtcFunction>
<customDtcFunction>
<function name="operatorForExerciseParty" returns="QVector&lt;int&gt;">
<parameter pos="1" name="exerciseId" type="int"/>
<parameter pos="2" name="partyId" type="int"/>
</function>
</customDtcFunction>
<customDtcFunction>
<function name="isAdlerAllowedParty" returns="bool">
<parameter pos="1" name="exerciseId" type="int"/>
<parameter pos="2" name="partyId" type="int"/>
<parameter pos="3" name="operatorId" type="int"/>
</function>
</customDtcFunction>
</customDtcFunctions>
<enumerations>
<enumeration name="GroupType" table="opm_group_type">
<attribute key="AclGroup" value="1"/>
<attribute key="OperatorGroup" value="2"/>
<attribute key="PresetGroup" value="3"/>
<attribute key="StandardGroup" value="4"/>
</enumeration>
</enumerations>
</service>