supercommitting all changes since the beginning of time...kinda

This commit is contained in:
Michael Becker 2024-03-17 02:06:52 -04:00
parent bed7bfaa45
commit ef244c0747
78 changed files with 2924 additions and 24 deletions

View File

@ -5,6 +5,12 @@
"driver": "SQLite", "driver": "SQLite",
"name": "mocha-suv-manager", "name": "mocha-suv-manager",
"database": "/home/beckermj/.config/mocha-suv-manager.sqlite3" "database": "/home/beckermj/.config/mocha-suv-manager.sqlite3"
},
{
"previewLimit": 50,
"driver": "SQLite",
"name": "test_mql",
"database": "${workspaceFolder:mocha}/python/test.mql"
} }
] ]
} }

551
apache2/conf/suv.conf Normal file
View File

@ -0,0 +1,551 @@
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
# will be interpreted as '/logs/access_log'.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
ServerRoot "/usr/local/apache2"
#
# Mutex: Allows you to set the mutex mechanism and mutex file directory
# for individual mutexes, or change the global defaults
#
# Uncomment and change the directory if mutexes are file-based and the default
# mutex file directory is not on a local disk or is not appropriate for some
# other reason.
#
# Mutex default:logs
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule isapi_module modules/mod_isapi.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
#LoadModule socache_redis_module modules/mod_socache_redis.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule bucketeer_module modules/mod_bucketeer.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule example_hooks_module modules/mod_example_hooks.so
#LoadModule case_filter_module modules/mod_case_filter.so
#LoadModule case_filter_in_module modules/mod_case_filter_in.so
#LoadModule example_ipc_module modules/mod_example_ipc.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule data_module modules/mod_data.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule deflate_module modules/mod_deflate.so
#LoadModule xml2enc_module modules/mod_xml2enc.so
#LoadModule proxy_html_module modules/mod_proxy_html.so
#LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
#LoadModule ldap_module modules/mod_ldap.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule lua_module modules/mod_lua.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule ident_module modules/mod_ident.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_crypto_module modules/mod_session_crypto.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so
#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so
#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so
#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule http2_module modules/mod_http2.so
#LoadModule proxy_http2_module modules/mod_proxy_http2.so
#LoadModule md_module modules/mod_md.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule suexec_module modules/mod_suexec.so
<IfModule !mpm_prefork_module>
#LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
#LoadModule cgi_module modules/mod_cgi.so
</IfModule>
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www-data
Group www-data
</IfModule>
# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin you@example.com
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ".ht*">
Require all denied
</Files>
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /proc/self/fd/2
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog /proc/self/fd/1 common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a <Directory> section to allow access to
# the filesystem path.
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
#
# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
#
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
# For type maps (negotiated resources):
#AddHandler type-map var
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
#MIMEMagicFile conf/magic
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or one of the special
# values 'default', 'none' or 'unlimited'.
# Default setting is to accept 200 Ranges.
#MaxRanges unlimited
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
#EnableSendfile on
# Supplemental configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
#Include conf/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

View File

@ -0,0 +1,8 @@
- entityDefinitions:
- IDC_Nurse: '{1d77f316-22f0-437d-827b-a975066f6b2f}'
- library: '&IDL_StarlightCare;'
instances:
- class: '&IDC_Nurse;'
name: 'Nurse'
index: 31001

View File

@ -0,0 +1,8 @@
- entityDefinitions:
- IDC_Patient: '{1bd2ce7c-3e22-47da-9b64-921ffc0ed244}'
- library: '&IDL_StarlightCare;'
instances:
- class: '&IDC_Patient;'
name: 'Patient'
index: 31002

View File

@ -0,0 +1,8 @@
- entityDefinitions:
- IDC_Hospital: '{54389173-4ef9-45fb-a10b-15d06b0ac696}'
- library: '&IDL_StarlightCare;'
instances:
- class: '&IDC_Hospital;'
name: 'Hospital'
index: 31003

View File

@ -0,0 +1,42 @@
- entityDefinitions:
- IDI_Task_AssignPatients: '{5366c083-c7b6-436c-be60-e405ee4ac917}'
- IDM_AssignPatients_Start: '{19bf0b17-0e99-4226-80db-c40e76c7a60c}'
- IDM_AssignPatients: '{4c568764-5590-4af5-b635-e55b2f8d1887}'
- IDMB_AssignPatients: '{959ebea2-504e-4e29-8a43-bc7a46b16101}'
- IDE_AssignPatients_Start: '{235f36df-d5cb-4d73-88e2-c3849696881e}'
- IDE_AssignPatients: '{3fe3fb60-20d1-452e-b345-1b6d04e19c3a}'
- library: '&IDL_StarlightCare;'
instances:
- controlTransactionMethod: '&IDM_AssignPatients_Start;'
forClassId: '&IDC_Nurse;'
verb: ''
name: 'assign patients'
buildsResponseWithBRMB:
- globalIdentifier: '&IDMB_AssignPatients;'
executesMethod:
- type: 'buildUIResponseMethod'
globalIdentifier: '&IDM_AssignPatients;'
usesExecutableReturningElement: '&IDE_AssignPatients;'
- element: '&IDE_AssignPatients_Start;'
name: 'assign patients start'
processedByCTMethod: '&IDM_AssignPatients_Start;'
elementContents:
- globalIdentifier: '{c4b50ab2-5025-49ce-9308-1e66416300a8}'
defaultDataType: '&IDE_Patient_Select;'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- element: '&IDE_AssignPatients;'
name: 'assign patients'
- sequenceTask: '&IDI_Task_AssignPatients;'
name: 'Assign Patients'
initiatingElement: '&IDE_AssignPatients_Start;'
taskCategory: '&IDI_TaskCategory_Nurse;'

View File

@ -0,0 +1,10 @@
- entityDefinitions:
- IDE_Patient_Select: '{6eee89c4-18d0-4422-833c-7bbfddeab40d}'
- library: '&IDL_StarlightCare;'
instances:
- element: '&IDE_Patient_Select;'
name: 'patient select subedit'
elementContents:
- globalIdentifier: '{28e16937-6c7c-4808-928b-b0216be23e78}'
defaultDataType: '&IDC_Patient;'

View File

@ -19,6 +19,3 @@
familyName: 'Trevino' familyName: 'Trevino'
images: images:
- instance: '{1079b0d3-0a1d-47d3-a98c-3f062dc88f90}' - instance: '{1079b0d3-0a1d-47d3-a98c-3f062dc88f90}'
# {b8136d2a-8238-443b-8d9e-4f47c8a47c4b}

View File

@ -3,6 +3,10 @@
- IDE_ClassSelect: '{bc393547-3a92-48b2-b0dc-7e93306ab5fb}' - IDE_ClassSelect: '{bc393547-3a92-48b2-b0dc-7e93306ab5fb}'
- IDE_ViewClassButtons: '{a3fd6203-8e9c-4b7f-b731-e73f9f77967e}' - IDE_ViewClassButtons: '{a3fd6203-8e9c-4b7f-b731-e73f9f77967e}'
- IDE_Class_Tabs: '{4926d78c-4397-4a33-8462-740635c937f3}'
- IDE_Class_Tabs_Structure: '{6550e278-eeeb-4efc-94c4-999a7dc41ca0}'
# {1b261a51-f185-49f9-9733-96184c8539a1}
- library: '&IDL_MochaBaseSystem;' - library: '&IDL_MochaBaseSystem;'
instances: instances:
- workSet: '&IDI_WorkSet_ClassForEditClassTask;' - workSet: '&IDI_WorkSet_ClassForEditClassTask;'
@ -133,6 +137,28 @@
- element: '&IDE_ViewClass;' - element: '&IDE_ViewClass;'
name: 'view class' name: 'view class'
elementContents: elementContents:
- globalIdentifier: '{36dcc0a3-9254-453f-b87d-1a9c57468826}'
defaultDataType: '&IDE_Class_Tabs;'
layout:
- type: '&IDC_GroupLayout;'
globalIdentifier: '{7cebd1b5-3fed-47b9-adb6-653d169a4177}'
options:
- instance: '&IDI_GroupLayoutOption_Tabbed;'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;'
- element: '&IDE_Class_Tabs;'
name: 'class tabs'
elementContents:
- globalIdentifier: '{00b1ac1e-f10e-4498-8a9f-b4cb0eabd7c0}'
defaultDataType: '&IDE_Class_Tabs_Structure;'
label: 'Structure'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;' # !FIXME: nonsingular does not work for some reason
- element: '&IDE_Class_Tabs_Structure;'
name: 'class structure'
elementContents:
- globalIdentifier: '{156e622f-da03-42f9-8d45-a85b9336501a}' - globalIdentifier: '{156e622f-da03-42f9-8d45-a85b9336501a}'
defaultDataType: '&IDE_ViewClassButtons;' defaultDataType: '&IDE_ViewClassButtons;'
displayOptions: displayOptions:
@ -148,16 +174,25 @@
- element: '&IDE_EditClass;' - element: '&IDE_EditClass;'
name: 'edit class' name: 'edit class'
elementContents: elementContents:
- globalIdentifier: '{c24c0ac5-4d79-4cad-9cb7-9917722d12d0}' - globalIdentifier: '{f09f6918-3ad0-4160-af63-afffd6876706}'
defaultDataType: '&IDC_Class;' defaultDataType: '&IDE_Class_Tabs;'
layout:
- type: '&IDC_GroupLayout;'
globalIdentifier: '{ed47ac5b-4101-45bd-91f4-28294c51b63d}'
options:
- instance: '&IDI_GroupLayoutOption_Tabbed;'
displayOptions: displayOptions:
- instance: '&IDI_DisplayOption_DisplayAsPageTitle;'
- instance: '&IDI_DisplayOption_Required;'
- globalIdentifier: '{e9a6b12d-49a9-4224-bc1c-18cca8617fc2}'
defaultDataType: '&IDE_Class_Structure;'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;' - instance: '&IDI_DisplayOption_Singular;'
# - globalIdentifier: '{c24c0ac5-4d79-4cad-9cb7-9917722d12d0}'
# defaultDataType: '&IDC_Class;'
# displayOptions:
# - instance: '&IDI_DisplayOption_DisplayAsPageTitle;'
# - instance: '&IDI_DisplayOption_Required;'
# - globalIdentifier: '{e9a6b12d-49a9-4224-bc1c-18cca8617fc2}'
# defaultDataType: '&IDE_Class_Structure;'
# displayOptions:
# - instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
# - instance: '&IDI_DisplayOption_Singular;'
- element: '&IDE_Class_Structure;' - element: '&IDE_Class_Structure;'
name: 'class structure subedits' name: 'class structure subedits'

View File

@ -0,0 +1,13 @@
---
- entityDefinitions:
- IDC_BinarySwitchLayout: '{248d781d-3d2f-4377-acc4-38112cf2f9d1}'
- library: '&IDL_MochaBaseSystem;'
instances:
- class: '&IDC_BinarySwitchLayout;'
name: 'Binary Switch Layout'
customTagName: 'binarySwitchLayout'
superclasses:
- instance: '&IDC_Layout;'

View File

@ -0,0 +1,47 @@
---
- entityDefinitions:
- IDA_ThemeName: '{8cfc012c-52fd-4a66-8b2f-1b9b5e4af474}'
- IDC_RotarySwitchLayout: '{ea52446a-6332-49f7-baa9-4c78bea4faab}'
- IDC_RotarySwitchLayoutOption: '{cdd9a157-3896-471a-91e2-c69c9e1ea9a9}'
- IDR_Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option: '{ae716c95-1e26-48f4-9013-001d1a1854aa}'
- IDR_Rotary_Switch_Layout_Option__for__Rotary_Switch_Layout: '{fed5fe08-db78-4c29-860a-a5be1a15caa0}'
- library: '&IDL_MochaBaseSystem;'
instances:
- textAttribute: '&IDA_ThemeName;'
name: 'Theme Name'
- class: '&IDC_RotarySwitchLayout;'
name: 'Rotary Switch Layout'
customTagName: 'rotarySwitchLayout'
superclasses:
- instance: '&IDC_Layout;'
attributes:
- instance: '&IDA_ThemeName;'
customTagName: 'theme'
relationships:
- instance: '&IDR_Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option;'
customTagName: 'options'
customTagNameCreatesInstanceOf: '&IDC_RotarySwitchLayoutOption;'
- class: '&IDC_RotarySwitchLayoutOption;'
name: 'Rotary Switch Layout Option'
registerForTemplate: yes
attributes:
- instance: '&IDA_Value;'
customTagName: 'value'
- relationship: '&IDR_Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option;'
sourceClassId: '&IDC_RotarySwitchLayout;'
type: 'has'
destinationClassId: '&IDC_RotarySwitchLayoutOption;'
siblingRelationshipId: '&IDR_Rotary_Switch_Layout_Option__for__Rotary_Switch_Layout;'
singular: no
- relationship: '&IDR_Rotary_Switch_Layout_Option__for__Rotary_Switch_Layout;'
sourceClassId: '&IDC_RotarySwitchLayoutOption;'
type: 'for'
destinationClassId: '&IDC_RotarySwitchLayout;'
siblingRelationshipId: '&IDR_Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option;'
singular: no

View File

@ -0,0 +1,90 @@
---
- entityDefinitions:
- IDC_Device: '{51a0a1f6-cc81-4dbb-8b47-86745b9968f6}'
- IDR_Device__has__Device_Type: '{84cf3bee-6e82-4a44-b823-df241e3b8edb}'
- IDR_Device_Type__for__Device: '{aa947d3e-3952-4cc4-aa87-88e2641b0dc9}'
- IDR_Device__has__Protocol: '{6d7e8bc3-0214-4c4e-8cfa-91c33cade601}'
- IDR_Protocol__for__Device: '{ee7e3446-88c8-46c3-8e8a-735bcc2d6ab9}'
- IDR_Device__has__Room: '{45495325-22f8-407e-ada0-68be24eb924f}'
- IDR_Room__for__Device: '{e51006b2-8592-4380-b9a3-7721e0d367d6}'
- library: '&IDL_MochaBaseSystem;'
instances:
- class: '&IDC_Device;'
name: 'Device'
index: 21101
customTagName: 'device'
attributes:
- instance: '&IDA_Name;'
customTagName: 'name'
relationships:
- instance: '&IDR_Device__has__Device_Type;'
customTagName: 'deviceTypeId'
- instance: '&IDR_Device__has__Protocol;'
customTagName: 'protocolId'
- instance: '&IDR_Device__has__Room;'
customTagName: 'roomId'
defaultTask: '&IDI_Task_Device_View;'
relatedTasks:
- instance: '&IDI_Task_Device_View;'
- instance: '&IDI_Task_Device_Edit;'
- relationship: '&IDR_Device__has__Device_Type;'
sourceClassId: '&IDC_Device;'
type: 'has'
destinationClassId: '&IDC_DeviceType;'
siblingRelationshipId: '&IDR_Device_Type__for__Device;'
singular: yes
- relationship: '&IDR_Device_Type__for__Device;'
sourceClassId: '&IDC_DeviceType;'
type: 'for'
destinationClassId: '&IDC_Device;'
siblingRelationshipId: '&IDR_Device__has__Device_Type;'
singular: no
- relationship: '&IDR_Device__has__Protocol;'
sourceClassId: '&IDC_Device;'
type: 'has'
destinationClassId: '&IDC_Protocol;'
siblingRelationshipId: '&IDR_Protocol__for__Device;'
singular: yes
- relationship: '&IDR_Protocol__for__Device;'
sourceClassId: '&IDC_Protocol;'
type: 'for'
destinationClassId: '&IDC_Device;'
siblingRelationshipId: '&IDR_Device__has__Protocol;'
singular: no
- relationship: '&IDR_Device__has__Room;'
sourceClassId: '&IDC_Device;'
type: 'has'
destinationClassId: '&IDC_Room;'
siblingRelationshipId: '&IDR_Room__for__Device;'
singular: yes
- relationship: '&IDR_Room__for__Device;'
sourceClassId: '&IDC_Room;'
type: 'for'
destinationClassId: '&IDC_Device;'
siblingRelationshipId: '&IDR_Device__has__Room;'
singular: no
- device: '{235b454f-de7d-40b8-96bf-9b5fdc0fd4cf}'
name: 'lenovo-14IIL'
deviceTypeId: '{168850c5-150f-47ea-8671-7c73a7a8cabc}'
protocolId: '{c664b941-f6e8-4861-938a-9aa854bd89f3}'
- device: '{89f75de0-c782-494d-9026-28d85f3e048a}'
name: 'Living Room Lights Behind TV'
deviceTypeId: '{45a2407a-9422-42cf-b588-2dfdeeb65733}'
protocolId: '{4b18ce2d-a5a3-4ccb-99f4-32a2e781fc34}'
roomId: '{b8136d2a-8238-443b-8d9e-4f47c8a47c4b}'
- device: '{47a85ac8-ba23-46ac-b000-c6e7d43a29bf}'
name: 'Thermostat'
deviceTypeId: '{d6c4d815-5663-488d-b559-4fa12d65614d}'
protocolId: '{c664b941-f6e8-4861-938a-9aa854bd89f3}'
roomId: '{b8136d2a-8238-443b-8d9e-4f47c8a47c4b}'

View File

@ -0,0 +1,25 @@
---
- entityDefinitions:
- IDC_DeviceType: '{62a8d816-2d17-4f8f-a231-511295b9f123}'
- library: '&IDL_MochaBaseSystem;'
instances:
- class: '&IDC_DeviceType;'
name: 'Device Type'
index: 21102
customTagName: 'deviceType'
attributes:
- instance: '&IDA_Name;'
customTagName: 'name'
- deviceType: '{168850c5-150f-47ea-8671-7c73a7a8cabc}'
name: 'Computer'
- deviceType: '{45a2407a-9422-42cf-b588-2dfdeeb65733}'
name: 'Light'
- deviceType: '{ccaeb192-7604-4e80-a031-99261ca312ef}'
name: 'Switch'
- deviceType: '{d6c4d815-5663-488d-b559-4fa12d65614d}'
name: 'Thermostat'

View File

@ -0,0 +1,37 @@
---
- entityDefinitions:
- IDC_Protocol: '{e691d813-c043-4e72-9f7c-12c550034e27}'
- library: '&IDL_MochaBaseSystem;'
instances:
- class: '&IDC_Protocol;'
name: 'Protocol'
index: 21103
customTagName: 'protocol'
attributes:
- instance: '&IDA_Name;'
customTagName: 'name'
- protocol: '{c664b941-f6e8-4861-938a-9aa854bd89f3}'
name: 'Quovii-Ethernet'
- protocol: '{4c5e0b0b-c0ca-410b-bf49-4613642db932}'
name: 'X10'
- protocol: '{4b18ce2d-a5a3-4ccb-99f4-32a2e781fc34}'
name: 'Z-Wave'
- protocol: '{388428fb-e8b2-4c62-8a5c-ee4fba3e5a91}'
name: 'DMX'
- protocol: '{b36bea16-9c26-4579-8292-8942de428a66}'
name: 'Art-Net'
- protocol: '{540e91e3-207a-4848-8618-5ca924f5e86f}'
name: 'Zigbee'
- protocol: '{5d287561-1c95-4c75-a717-5b63c265ca4c}'
name: 'Lutron'
- protocol: '{062f1f6d-e354-4293-8855-f2669ee0bc01}'
name: 'Kidde'

View File

@ -0,0 +1,25 @@
---
- entityDefinitions:
- IDC_Room: '{16572a37-87b0-4ee4-8503-4aadf229c16e}'
- library: '&IDL_MochaBaseSystem;'
instances:
- class: '&IDC_Room;'
name: 'Room'
index: 21104
customTagName: 'room'
attributes:
- instance: '&IDA_Name;'
customTagName: 'name'
# relationships:
# - instance: '&IDR_Device__has__Device_Type;'
# customTagName: 'deviceTypeId'
# - instance: '&IDR_Device__has__Protocol;'
# customTagName: 'protocolId'
# defaultTask: '&IDI_Task_Device_View;'
# relatedTasks:
# - instance: '&IDI_Task_Device_View;'
# - instance: '&IDI_Task_Device_Edit;'
- room: '{b8136d2a-8238-443b-8d9e-4f47c8a47c4b}'
name: 'Living Room'

View File

@ -0,0 +1,119 @@
- entityDefinitions:
- IDI_TaskCategory_Device: '{b5866acf-1b2b-4b91-9dd7-42c7a83d3e42}'
- IDE_Device_Definition: '{fef7fa56-b830-4612-8cda-4ba246446a6f}'
- IDE_Device_Panels: '{2460d307-71d4-49c5-aeb6-929e0a8d11b5}'
- IDE_Device_Select: '{d2d65d00-b720-43b3-8148-5bc4b1ace442}'
- IDA_TestNumericAttribute: '{2b1786b8-2b53-445f-a9a9-7657d566dd27}'
- IDA_X10HouseCode: '{f3a1172c-530d-4173-8f50-28f1f2b932c7}'
- IDA_X10UnitCode: '{7173b0d2-116e-4749-88ae-f530feb6b1a5}'
- library: '&IDL_MochaBaseSystem;'
instances:
- taskCategory: '&IDI_TaskCategory_Device;'
name: 'Device'
- element: '&IDE_Device_Select;'
name: 'device select subedits'
elementContents:
- globalIdentifier: '{5e215417-06be-4347-9709-1122ec80bb77}'
defaultDataType: '&IDC_Device;'
- numericAttribute: '&IDA_TestNumericAttribute;'
name: 'Test Numeric Attribute'
minimumValue: 0
maximumValue: 65535
- binarySwitchLayout: '{5df8edda-59a2-484e-ad3f-0cc4017e8e90}'
- rotarySwitchLayout: '{22660131-df8f-4b59-990e-9e63bee88541}'
theme: 'danger'
options:
- value: 'A'
- value: 'B'
- value: 'C'
- value: 'D'
- value: 'E'
- value: 'F'
- value: 'G'
- value: 'H'
- value: 'I'
- value: 'J'
- value: 'K'
- value: 'L'
- value: 'M'
- value: 'N'
- value: 'O'
- value: 'P'
- rotarySwitchLayout: '{a95a9c14-9ba3-47f2-a24a-880546b505a4}'
theme: 'primary'
options:
- value: '1'
- value: '2'
- value: '3'
- value: '4'
- value: '5'
- value: '6'
- value: '7'
- value: '8'
- value: '9'
- value: '10'
- value: '11'
- value: '12'
- value: '13'
- value: '14'
- value: '15'
- value: '16'
- textAttribute: '&IDA_X10HouseCode;'
name: 'House Code'
- numericAttribute: '&IDA_X10UnitCode;'
name: 'Unit Code'
- element: '&IDE_Device_Definition;'
name: 'device subedits'
elementContents:
- globalIdentifier: '{a0ce4337-f5dd-457f-bcf2-10e87ef7e5d5}'
defaultDataType: '&IDA_Name;'
- globalIdentifier: '{e2ce9eaf-3c2b-48c5-b108-388c44e14176}'
defaultDataType: '&IDR_Device__has__Device_Type;'
label: 'Device Type'
- globalIdentifier: '{cd0e7e01-30f8-4302-90fc-b409c706993e}'
defaultDataType: '&IDR_Device__has__Protocol;'
label: 'Protocol'
dynamicDisplayOptions:
- globalIdentifier: '{2cc3eb4b-cb66-477c-b18f-867829563290}'
modifiesElementContents:
- instance: '{14c833ca-0e2d-4e6f-8da0-7d78d48b7b1c}' # computer subedits
# condition:
# - trueConditions:
# - globalIdentifier: '&IDMB_Generate_Random_Password__is__True;'
removesDisplayOptions:
- instance: '&IDI_DisplayOption_DoNotShow;'
- globalIdentifier: '{fb336c55-1abe-453e-83ba-87fa8b3bfbee}'
defaultDataType: '&IDA_TestNumericAttribute;'
label: 'Test Binary Switch'
layout: '{5df8edda-59a2-484e-ad3f-0cc4017e8e90}'
- globalIdentifier: '{fbd4448d-0eeb-44a7-b8f9-9877779af13a}'
defaultDataType: '&IDA_X10HouseCode;'
layout: '{22660131-df8f-4b59-990e-9e63bee88541}'
- globalIdentifier: '{aa8c3b58-73a4-482c-b63c-8bb4e5289a41}'
defaultDataType: '&IDA_X10UnitCode;'
layout: '{a95a9c14-9ba3-47f2-a24a-880546b505a4}'
- globalIdentifier: '{14c833ca-0e2d-4e6f-8da0-7d78d48b7b1c}'
defaultDataType: '&IDE_Device_Computer_Subedits;'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_DoNotShow;'
- globalIdentifier: '{ef961d4e-b423-44b9-87d2-35b5f3984d47}'
defaultDataType: '&IDE_Protocol_ZWave_Subedits;'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_DoNotShow;'

View File

@ -0,0 +1,45 @@
---
- entityDefinitions:
- IDE_Device_Computer_Subedits: '{5182e243-dc69-4c31-aca8-5726fc73145d}'
- IDE_Device_Computer_Subedit_Tabs: '{5f7e1efb-33c5-4cd1-a6a9-2a439b878b67}'
- IDE_Device_Computer_Subedit_Network: '{c791db99-b487-4335-befc-0afde45e4ed4}'
- IDA_UseDHCP: '{307a5103-99e0-41b5-aae9-be8e5d9c9995}'
- library: '&IDL_MochaBaseSystem;'
instances:
- element: '&IDE_Device_Computer_Subedits;'
name: 'computer subedits'
elementContents:
- globalIdentifier: '{1f6ddc69-ad4f-428d-bd0b-062328eb7081}'
defaultDataType: '&IDE_Device_Computer_Subedit_Tabs;'
layout: '{a8a233f1-42d1-4bba-a20d-047a9cebd175}'
- booleanAttribute: '&IDA_UseDHCP;'
name: 'Use DHCP'
- groupLayout: '{a8a233f1-42d1-4bba-a20d-047a9cebd175}'
options:
- instance: '&IDI_GroupLayoutOption_Tabbed;'
- element: '&IDE_Device_Computer_Subedit_Tabs;'
elementContents:
- globalIdentifier: '{60e38734-a2be-44ae-888c-d683695e86b1}'
defaultDataType: '&IDE_Device_Computer_Subedit_Network;'
label: 'Network'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;'
- element: '&IDE_Device_Computer_Subedit_Network;'
name: 'Network'
elementContents:
- globalIdentifier: '{b889d09b-2620-4e80-a7aa-52cb25fb959f}'
defaultDataType: '&IDA_UseDHCP;'
label: 'Use DHCP'
- globalIdentifier: '{a6971557-623d-4a63-bb88-b3f8682c409e}'
defaultDataType: '&IDA_IPAddress;'
label: 'IP Address'
- globalIdentifier: '{b895bdea-32f2-4b85-9093-0c1e506e4a6c}'
defaultDataType: '&IDA_Name;'
label: 'Name'

View File

@ -0,0 +1,53 @@
- entityDefinitions:
- IDI_Task_Device_Edit: '{92c338b8-828b-41d5-929f-56e454643c58}'
- IDE_Device_Edit: '{9223ea8e-aa43-4a90-bdde-cb978088489f}'
- IDE_Device_Edit_Start: '{a310dacd-b4c1-4f31-a140-05131bbe64e9}'
- IDM_Device_Edit_Start: '{63c76968-e26a-4058-927e-771c9190b15b}'
- IDMB_Device_Edit: '{003ed29c-8826-491e-9a0c-a9f4b5c69928}'
- IDM_Device_Edit: '{dd7ab568-15b4-4834-9ed6-4a16449e5867}'
- library: '&IDL_MochaBaseSystem;'
instances:
- sequenceTask: '&IDI_Task_Device_Edit;'
name: 'Edit Device'
initiatingElement: '&IDE_Device_Edit_Start;'
taskCategory: '&IDI_TaskCategory_Device;'
- controlTransactionMethod: '&IDM_Device_Edit_Start;'
forClassId: '&IDC_Device;'
verb: ''
name: 'Device Edit Start'
buildsResponseWithBRMB: '&IDMB_Device_Edit;'
- element: '&IDE_Device_Edit_Start;'
name: 'Edit Device Start'
processedByCTMethod: '&IDM_Device_Edit_Start;'
elementContents:
- globalIdentifier: '{f4e0a7a8-4ec1-4a12-b2cc-abaa84345772}'
defaultDataType: '&IDE_Device_Select;'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- element: '&IDE_Device_Edit;'
name: 'Edit Device'
elementContents:
- globalIdentifier: '{b789e221-3c0b-49ea-a2f4-58e0e58b1213}'
defaultDataType: '&IDC_Device;'
label: 'Device'
displayOptions:
- instance: '&IDI_DisplayOption_NotEnterable;'
- instance: '&IDI_DisplayOption_DoNotShow;'
- globalIdentifier: '{a601df82-ee3e-43f5-a9c8-2afbdefec1c3}'
defaultDataType: '&IDE_Device_Definition;'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- buildUIResponseMethod: '&IDM_Device_Edit;'
usesExecutableReturningElement: '&IDE_Device_Edit;'
- buildResponseMethodBinding: '&IDMB_Device_Edit;'
executesMethod: '&IDM_Device_Edit;'

View File

@ -0,0 +1,41 @@
---
- entityDefinitions:
- IDE_Protocol_Kidde_Subedits: '{4973e9b2-49eb-4efe-8006-3895ebe068f1}'
- IDE_Protocol_Kidde_Subedit_Tabs: '{e9e7a000-4b72-40b6-955d-aeeaf82d6c71}'
- IDE_Protocol_Kidde_Subedit_Network: '{9730e79d-b07b-4ca6-9498-19de08ed4438}'
- IDA_KiddeAddress: '{10e8fcd9-12a0-4614-b30b-b62b32a1547d}'
- library: '&IDL_MochaBaseSystem;'
instances:
- element: '&IDE_Protocol_Kidde_Subedits;'
name: 'kidde subedits'
elementContents:
- globalIdentifier: '{7e721db2-abb6-4f8b-beb6-20a0d2bb51d8}'
defaultDataType: '&IDE_Protocol_Kidde_Subedit_Tabs;'
layout: '{f57a229d-832c-4bbf-9be6-39cef96eaa51}'
- groupLayout: '{f57a229d-832c-4bbf-9be6-39cef96eaa51}'
options:
- instance: '&IDI_GroupLayoutOption_Tabbed;'
- numericAttribute: '&IDA_KiddeAddress;'
name: 'Kidde Address'
- binarySwitchLayout: '{44392a21-68da-4b86-a858-3c39ce054abf}'
- element: '&IDE_Protocol_Kidde_Subedit_Tabs;'
elementContents:
- globalIdentifier: '{7e1fc142-ee08-4409-97d0-e42994f22daa}'
defaultDataType: '&IDE_Protocol_Kidde_Subedit_Network;'
label: 'Kidde'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;'
- element: '&IDE_Protocol_Kidde_Subedit_Network;'
name: 'Network'
elementContents:
- globalIdentifier: '{7b401357-1eb5-4427-9198-57a1f14d1270}'
defaultDataType: '&IDA_KiddeAddress;'
layout: '{44392a21-68da-4b86-a858-3c39ce054abf}'
label: 'Address'

View File

@ -0,0 +1,54 @@
- entityDefinitions:
- IDI_Task_Device_View: '{b9d1daf8-ac77-473f-b5df-a8ee1256c98b}'
- IDE_Device_View: '{7340c83a-c5ca-41fc-a1f5-963c8e7e9067}'
- IDE_Device_View_Start: '{1caa3a72-79c1-4276-89f3-179f0bf4859d}'
- IDM_Device_View_Start: '{f04b2523-45ff-48e6-a3b4-c9c3818c0636}'
- IDMB_Device_View: '{63531fd3-1963-4510-987f-5349cde64d81}'
- IDM_Device_View: '{9bc93c3d-7348-4075-b179-c3d6f144d568}'
- library: '&IDL_MochaBaseSystem;'
instances:
- sequenceTask: '&IDI_Task_Device_View;'
name: 'View Device'
initiatingElement: '&IDE_Device_View_Start;'
taskCategory: '&IDI_TaskCategory_Device;'
- controlTransactionMethod: '&IDM_Device_View_Start;'
forClassId: '&IDC_Device;'
verb: ''
name: 'Device View Start'
buildsResponseWithBRMB: '&IDMB_Device_View;'
- element: '&IDE_Device_View_Start;'
name: 'View Device Start'
processedByCTMethod: '&IDM_Device_View_Start;'
elementContents:
- globalIdentifier: '{5a5c572f-8d13-4f4a-9651-53585d82859f}'
defaultDataType: '&IDE_Device_Select;'
displayOptions:
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- element: '&IDE_Device_View;'
name: 'View Device'
elementContents:
- globalIdentifier: '{dd6b5443-4480-467f-a9ce-395366b479e9}'
defaultDataType: '&IDC_Device;'
label: 'Device'
displayOptions:
- instance: '&IDI_DisplayOption_NotEnterable;'
- instance: '&IDI_DisplayOption_DoNotShow;'
- globalIdentifier: '{2734715a-b232-491a-aafb-9499c423890f}'
defaultDataType: '&IDE_Device_Definition;'
displayOptions:
- instance: '&IDI_DisplayOption_NotEnterable;'
- instance: '&IDI_DisplayOption_Singular;'
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- buildUIResponseMethod: '&IDM_Device_View;'
usesExecutableReturningElement: '&IDE_Device_View;'
- buildResponseMethodBinding: '&IDMB_Device_View;'
executesMethod: '&IDM_Device_View;'

View File

@ -0,0 +1,40 @@
---
- entityDefinitions:
- IDE_Protocol_ZWave_Subedits: '{702150af-6c63-4d8b-b240-e6e72015d5ed}'
- IDE_Protocol_ZWave_Subedit_Tabs: '{d547bec8-efb1-4240-a02e-435b755dabe8}'
- IDE_Protocol_ZWave_Subedit_Network: '{00e83e02-cbd9-4eb3-857b-5d9df41cec71}'
- library: '&IDL_MochaBaseSystem;'
instances:
- element: '&IDE_Protocol_ZWave_Subedits;'
name: 'z-wave subedits'
elementContents:
- globalIdentifier: '{c04f20b0-96b3-4779-9c6c-ad160d105755}'
defaultDataType: '&IDE_Protocol_ZWave_Subedit_Tabs;'
layout: '{07091788-296c-448f-ace4-e493465f114b}'
- booleanAttribute: '&IDA_UseDHCP;'
name: 'Use DHCP'
- groupLayout: '{07091788-296c-448f-ace4-e493465f114b}'
options:
- instance: '&IDI_GroupLayoutOption_Tabbed;'
- element: '&IDE_Protocol_ZWave_Subedit_Tabs;'
elementContents:
- globalIdentifier: '{7b16a228-b633-4863-bccf-5c49ef58658d}'
defaultDataType: '&IDE_Protocol_ZWave_Subedit_Network;'
label: 'Z-Wave'
displayOptions:
- instance: '&IDI_DisplayOption_ShowSubelementsVertically;'
- instance: '&IDI_DisplayOption_Singular;'
- element: '&IDE_Protocol_ZWave_Subedit_Network;'
name: 'Network'
elementContents:
- globalIdentifier: '{8606ffd6-0ea8-4542-bb2a-a701981a014b}'
layout:
- type: '&IDC_ButtonLayout;'
executesTask: '&IDI_Task_Element_Edit;'
relatedInstance: '&IDI_WorkSet_TaskRelatedInstance;'
label: 'Enroll Device'

View File

@ -21,5 +21,3 @@
- returnInstanceSetMethodBinding: '&IDMB_Product__get__Product_Type;' - returnInstanceSetMethodBinding: '&IDMB_Product__get__Product_Type;'
executesMethod: '&IDM_Product__get__Product_Type;' executesMethod: '&IDM_Product__get__Product_Type;'
# {ee7e3446-88c8-46c3-8e8a-735bcc2d6ab9}

View File

@ -16,6 +16,7 @@ class KnownAttributeGuids
const MethodType = "{47ae57a9-7723-48a8-80f2-dd410d929e14}"; const MethodType = "{47ae57a9-7723-48a8-80f2-dd410d929e14}";
const ClassName = "c7e8d78ecfac4dacae242ac67a0ba9d3"; const ClassName = "c7e8d78ecfac4dacae242ac67a0ba9d3";
const ThemeName = "{8cfc012c-52fd-4a66-8b2f-1b9b5e4af474}";
/** /**
* A Numeric Attribute specifying the maximum length of an input field. * A Numeric Attribute specifying the maximum length of an input field.

View File

@ -150,5 +150,8 @@ class KnownClassGuids
const ProcessRelatedUpdatesMethod = "2953e69803c54752a1ebcbbfa8f13905"; const ProcessRelatedUpdatesMethod = "2953e69803c54752a1ebcbbfa8f13905";
const SelectFromInstanceSetMethod = "{130637B4-17A7-4394-8F4D-E83A79114E6C}"; const SelectFromInstanceSetMethod = "{130637B4-17A7-4394-8F4D-E83A79114E6C}";
const ConditionalSelectFromInstanceSetMethod = "{ffea8e52-06e5-4e95-8c40-da3ba54ce95f}"; const ConditionalSelectFromInstanceSetMethod = "{ffea8e52-06e5-4e95-8c40-da3ba54ce95f}";
const BinarySwitchLayout = "{248d781d-3d2f-4377-acc4-38112cf2f9d1}";
const RotarySwitchLayout = "{ea52446a-6332-49f7-baa9-4c78bea4faab}";
} }
?> ?>

View File

@ -266,6 +266,8 @@ class KnownRelationshipGuids
const Layout__has__Style = "{e684bb26-7e78-4a21-b8b4-5a550f3053d5}"; const Layout__has__Style = "{e684bb26-7e78-4a21-b8b4-5a550f3053d5}";
const Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option = "{ae716c95-1e26-48f4-9013-001d1a1854aa}";
const Element_Content__has__Element_Content_Display_Option = "f070dfa762604488a779fae291903f2d"; const Element_Content__has__Element_Content_Display_Option = "f070dfa762604488a779fae291903f2d";
const Element_Content__has__Parameter_Assignment = "51214ef0458a44fa8b9df3d9d2309388"; const Element_Content__has__Parameter_Assignment = "51214ef0458a44fa8b9df3d9d2309388";

View File

@ -25,6 +25,13 @@
use Phast\Utilities\Stopwatch; use Phast\Utilities\Stopwatch;
use Phast\UUID; use Phast\UUID;
use Phast\WebControlAttribute; use Phast\WebControlAttribute;
use Phast\WebControls\BinarySwitch;
use Phast\WebControls\BinarySwitchEndianness;
use Phast\WebControls\RotarySwitch;
use Phast\WebControls\RotarySwitchOption;
use Phast\WebControls\Button; use Phast\WebControls\Button;
use Phast\WebControls\TabContainer; use Phast\WebControls\TabContainer;
use Phast\WebControls\TabPage; use Phast\WebControls\TabPage;
@ -378,7 +385,7 @@
echo ("</div>"); echo ("</div>");
$this->renderEndForm($allElementsAreReadonly); $this->renderEndForm($allElementsAreReadonly);
if (!$allElementsAreReadonly) if (false) // (!$allElementsAreReadonly)
{ {
echo("<script type=\"text/javascript\">"); echo("<script type=\"text/javascript\">");
echo(<<<EOF echo(<<<EOF
@ -1315,6 +1322,54 @@ EOF
array_pop($parentElementContents); array_pop($parentElementContents);
} }
else if ($ecLayoutParentClass->GlobalIdentifier->__is_equal(UUID::parse(KnownClassGuids::BinarySwitchLayout)))
{
$bs = new BinarySwitch();
$bs->Name = "ec_" . $fullyQualifiedECID;
$bs->Endianness = BinarySwitchEndianness::LittleEndian;
// Executable returning Attribute
$value = 0;
if ($oms->is_a($ecInst, KnownClassGuids::ExecutableReturningAttribute))
{
$value = $oms->getAttributeValue($relatedInstance, $ecInst);
}
$bs->Value = $value;
if ($renderNotEnterable)
{
$bs->Enabled = false;
}
else
{
$bs->Enabled = true;
}
// $bs->Value = $value;
$bs->Render();
}
else if ($ecLayoutParentClass->GlobalIdentifier->__is_equal(UUID::parse(KnownClassGuids::RotarySwitchLayout)))
{
$bs = new RotarySwitch();
$bs->Name = "ec_" . $fullyQualifiedECID;
$themeName = $oms->getAttributeValue($ecLayout, KnownAttributeGuids::ThemeName);
if ($themeName !== null)
{
$bs->ClassList[] = "uwt-color-" . $themeName;
}
$rotarySwitchOptions = $oms->getRelatedInstances($ecLayout, KnownRelationshipGuids::Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option);
foreach ($rotarySwitchOptions as $rotarySwitchOption)
{
$value = $oms->getAttributeValue($rotarySwitchOption, KnownAttributeGuids::Value);
$bs->Options[] = new RotarySwitchOption($value);
}
// $bs->Value = $value;
$bs->Render();
}
} }
} }
else else

View File

@ -0,0 +1,47 @@
div.uwt-binaryswitch
{
border: solid 1px var(--uwt-color-gray-400);
&:not([disabled])
{
&:hover
{
border-color: var(--uwt-color-accent);
}
&> div.uwt-binaryswitch-switches
{
&> div.uwt-switch
{
&:hover
{
border-color: var(--uwt-color-gray-600);
&> div.uwt-switch-indicator
{
background-color: var(--uwt-color-gray-600);
}
}
}
}
}
&> div.uwt-binaryswitch-switches
{
&> div.uwt-switch
{
transition: all 0.3s;
border: solid 1px var(--uwt-color-gray-400);
&> div.uwt-switch-indicator
{
background-color: var(--uwt-color-gray-200);
}
&.uwt-selected
{
border-color: var(--uwt-color-accent);
&> div.uwt-switch-indicator
{
background-color: var(--uwt-color-accent);
}
}
}
}
}

View File

@ -0,0 +1,7 @@
div.uwt-rotaryswitch
{
&> div.uwt-rotaryswitch-indicator
{
background-color: var(--uwt-color-accent);
}
}

View File

@ -9,6 +9,7 @@
@import "uwt-alert.less"; @import "uwt-alert.less";
@import "uwt-applicationmenu.less"; @import "uwt-applicationmenu.less";
@import "uwt-badge.less"; @import "uwt-badge.less";
@import "uwt-binaryswitch.less";
@import "uwt-blockquote.less"; @import "uwt-blockquote.less";
@import "uwt-button.less"; @import "uwt-button.less";
@import "uwt-checkbox.less"; @import "uwt-checkbox.less";
@ -26,6 +27,7 @@
@import "uwt-panel.less"; @import "uwt-panel.less";
@import "uwt-popup.less"; @import "uwt-popup.less";
@import "uwt-richtextbox.less"; @import "uwt-richtextbox.less";
@import "uwt-rotaryswitch.less";
@import "uwt-sidebar.less"; @import "uwt-sidebar.less";
@import "uwt-slider.less"; @import "uwt-slider.less";
@import "uwt-spinner.less"; @import "uwt-spinner.less";

View File

@ -0,0 +1,91 @@
div.uwt-binaryswitch
{
&> div.uwt-binaryswitch-switches
{
background: #ffffff;
display: flex;
flex-direction: row;
justify-content: center;
&> div.uwt-switch
{
border: solid 1px #aaaaaa;
cursor: pointer;
user-select: none;
margin: 16px 8px 8px 8px;
&> label.uwt-switch-label
{
font-size: 8pt;
position: absolute;
top: -16px;
text-align: center;
display: block;
width: 100%;
box-sizing: border-box;
}
height: 48px;
position: relative;
width: 16px;
&> div.uwt-switch-indicator
{
padding: 8px;
background: #cccccc;
height: 4px;
position: absolute;
top: 28px;
width: 0px;
transition: all 0.3s;
}
&.uwt-selected
{
background-color: #fff7cc;
&> div.uwt-switch-indicator
{
top: 0px;
}
}
}
}
&> input.uwt-binaryswitch-input, &> label.uwt-binaryswitch-label
{
width: 100%;
box-sizing: border-box;
border: none;
text-align: center;
}
&> label.uwt-binaryswitch-label
{
display: none;
cursor: text;
padding: 8px;
user-select: revert;
}
&[disabled]
{
&> div.uwt-binaryswitch-switches
{
background-color: var(--uwt-color-gray-300);
&> div.uwt-switch
{
background-color: var(--uwt-color-gray-500);
cursor: default;
pointer-events: none;
&> div.uwt-switch-indicator
{
background: #ffffff;
}
}
}
&> input.uwt-binaryswitch-input
{
display: none;
}
&> label.uwt-binaryswitch-label
{
display: block;
}
}
}

View File

@ -0,0 +1,76 @@
@RotarySwitchSize: 128px;
@RotarySwitchButtonSize: 16px;
div.uwt-rotaryswitch
{
position: relative;
width: @RotarySwitchSize;
&> div.uwt-rotaryswitch-indicator
{
left: 75%;
top: 50%;
height: 3px;
width: 50%;
position: absolute;
transform-origin: 0px 0px;
transition: all 0.3s;
margin: -4px 0px;
}
&> ul
{
background-color: #fff;
list-style-type: none;
padding: 0px;
margin: 0px;
padding: 32px;
position: relative;
width: @RotarySwitchSize;
height: @RotarySwitchSize;
&> li
{
position: absolute;
width: @RotarySwitchSize;
height: @RotarySwitchSize;
pointer-events: none;
&> a
{
pointer-events: all;
position: absolute;
width: @RotarySwitchButtonSize;
height: @RotarySwitchButtonSize;
}
}
}
}
body:not(.uwt-javascript-disabled)
{
div.uwt-rotaryswitch
{
&> select
{
display: none;
}
}
}
body.uwt-javascript-disabled
{
div.uwt-rotaryswitch
{
&> ul
{
display: none;
}
&> div.uwt-rotaryswitch-indicator
{
display: none;
}
}
}

View File

@ -2,6 +2,7 @@
@import "uwt-alert.less"; @import "uwt-alert.less";
@import "uwt-applicationmenu.less"; @import "uwt-applicationmenu.less";
@import "uwt-badge.less"; @import "uwt-badge.less";
@import "uwt-binaryswitch.less";
@import "uwt-button.less"; @import "uwt-button.less";
@import "uwt-button-group.less"; @import "uwt-button-group.less";
@import "uwt-calendar.less"; @import "uwt-calendar.less";
@ -30,6 +31,7 @@
@import "uwt-progressbar.less"; @import "uwt-progressbar.less";
@import "uwt-ribbon.less"; @import "uwt-ribbon.less";
@import "uwt-ribbon-listview.less"; @import "uwt-ribbon-listview.less";
@import "uwt-rotaryswitch.less";
@import "uwt-searchbar.less"; @import "uwt-searchbar.less";
@import "uwt-sidebar.less"; @import "uwt-sidebar.less";
@import "uwt-sidebar-profile.less"; @import "uwt-sidebar-profile.less";

View File

@ -1 +1,18 @@
@import "mcx-instancebrowser.less"; @import "mcx-instancebrowser.less";
@media (max-width: 1000px)
{
body.mcx-loginpage
{
form
{
position: fixed;
right: 0px;
left: 0px;
top: 0px;
bottom: 0px;
margin: 0px;
width: auto;
}
}
}

View File

@ -2,8 +2,6 @@
@import "mcx-elementcontent.less"; @import "mcx-elementcontent.less";
@import "mcx-instancebrowser.less"; @import "mcx-instancebrowser.less";
@import "mobile/uwt.less";
html html
{ {
margin: 0px; margin: 0px;
@ -204,6 +202,12 @@ div.mcx-instancebrowser
} }
*/ */
// hide the mcx-empty-text for binary switch
div.uwt-binaryswitch + span.mcx-empty-text
{
display: none !important;
}
.mcx-validation-message.uwt-color-danger .mcx-validation-message.uwt-color-danger
{ {
color: var(--uwt-color-danger); color: var(--uwt-color-danger);
@ -212,3 +216,5 @@ div.mcx-instancebrowser
{ {
color: var(--uwt-color-warning); color: var(--uwt-color-warning);
} }
@import "mobile/uwt.less";

362
python/mocha-shell.py Normal file
View File

@ -0,0 +1,362 @@
#
# mocha-shell - the 'latte' python REPL shell for mocha
# Copyright (C) 2024 Michael Becker
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from mocha.core import InstanceKey, InstanceReference
from mocha.oms import Oms
from mocha.definitions import KnownClassGuids, KnownInstanceGuids, KnownAttributeGuids, KnownRelationshipGuids
from framework import REPLApplication, Guid, format_cwd, parse_cwd
import atexit
import colorama
import os
import readline
import sys
from colorama import Fore, Style
from getpass import getpass
histfile = os.path.join(os.path.expanduser("~"), ".config/latte/history")
try:
readline.read_history_file(histfile)
# default history len is -1 (infinite), which may grow unruly
readline.set_history_length(1000)
except FileNotFoundError:
pass
atexit.register(readline.write_history_file, histfile)
colorama.init()
def clear():
print("\033c", end='')
class MochaShell (REPLApplication):
def print_instance_list(self, instances : list):
print("")
print("instance key global identifier ")
print("--------------- --------------------------------------")
for inst in instances:
print(str(inst.get_instance_key()).ljust(16) + str(inst.get_global_identifier()))
print("")
def print_instance_list_with_attribute_values(self, instances : list, oms : Oms, refobj : InstanceReference):
print("")
print("instance key global identifier value")
print("--------------- -------------------------------------- ---------")
for inst in instances:
print(str(inst.get_instance_key()).ljust(16) + str(inst.get_global_identifier()) + " " + str(oms.get_attribute_value(refobj, inst)))
print("")
def print_instance_list_with_relationship_values(self, instances : list, oms : Oms, refobj : InstanceReference):
print("")
print("instance key global identifier value")
print("--------------- -------------------------------------- ---------")
for inst in instances:
print(str(inst.get_instance_key()).ljust(16) + str(inst.get_global_identifier()) + " ", end = "")
rels = oms.get_related_instances(refobj, inst)
for rel in rels:
if rels.index(rel) > 0:
print (" ", end = "")
print(str(rel.get_instance_key()))
print("")
def print_error(self, text : str):
print (f"{Fore.RED}error: {Style.RESET_ALL}" + text)
def print_error_not_open(self):
self.print_error ("no database specified, use `create` or `open` first")
def __init__(self):
self.current_user = None
self.current_file = None
from mocha.oms.db.sqlite import SQLiteDatabaseOms
self.oms = SQLiteDatabaseOms()
def open_file(self, oms : Oms, filename : str):
if not os.path.exists(filename):
print ("file not found")
return False
oms.open(filename)
print("opening '" + filename + "'")
un = input("user name: ")
pw = getpass("password: ")
user = oms.get_user_by_username(un)
if user is not None:
hash = oms.get_attribute_value(user, oms.get_instance_by_global_identifier(KnownAttributeGuids.PasswordHash))
salt = oms.get_attribute_value(user, oms.get_instance_by_global_identifier(KnownAttributeGuids.PasswordSalt))
passsalt = str(pw + salt).encode("utf-8")
import hashlib
passhash = hashlib.sha512(passsalt).hexdigest()
if (hash == passhash):
self.current_user = un
self.current_file = filename
login = oms.create_instance_of(oms.get_instance_by_global_identifier(KnownClassGuids.UserLogin))
oms.assign_relationship(login, oms.get_instance_by_global_identifier(KnownRelationshipGuids.User_Login__has__User), user)
# oms.assign_relationship(user, oms.get_instance_by_global_identifier(KnownRelationshipGuids.User__for__User_Login), login)
token = Guid.create()
oms.set_attribute_value(login, oms.get_instance_by_global_identifier(KnownAttributeGuids.Token), str(token))
return True
print ("invalid user name or password")
self.current_file = None
oms.close()
return False
def strip(self, iid_or_gid : str) -> str:
if iid_or_gid[0] == "[" and iid_or_gid[-1] == "]":
return iid_or_gid[1:-1]
return iid_or_gid
def parse(self, iid_or_gid : str) -> InstanceReference:
if len(iid_or_gid) < 3:
return None
if iid_or_gid[0] == "[" and iid_or_gid[-1] == "]":
ik = InstanceKey.parse(self.strip(iid_or_gid))
return self.oms.get_instance_by_key(ik)
elif iid_or_gid[0] == "{" and iid_or_gid[-1] == "}":
ik = Guid.parse(iid_or_gid)
return self.oms.get_instance_by_global_identifier(ik)
def create_file(self, oms : Oms, filename : str):
self.oms.open(filename)
self.oms.init()
self.oms.close()
def before_start_internal(self):
print (f"latte v0.3 - {Fore.GREEN}Local Application Testing and Troubleshooting Environment{Style.RESET_ALL}")
if len(sys.argv) > 1:
if os.path.exists(sys.argv[1]):
self.current_file = sys.argv[1]
else:
print(f"{Fore.RED}error:{Style.RESET_ALL} file not found '" + sys.argv[1] + "'")
if input("would you like to create it? (Y/N) [N] > ").lower() == "y":
self.create_file(self.oms, sys.argv[1])
self.current_file = sys.argv[1]
if self.current_file is None:
self.print_error_not_open()
else:
self.open_file(self.oms, self.current_file)
print ("")
def get_prompt(self):
prompt = f"{Fore.GREEN}{Style.BRIGHT}" + os.getlogin() + f"@localhost{Style.RESET_ALL}:{Fore.BLUE}{Style.BRIGHT}" + format_cwd(os.getcwd()) + f"{Style.RESET_ALL}\n↳ latte "
if self.current_file is not None:
if self.current_user is not None:
prompt += f"{Fore.GREEN}" + self.current_user + f"{Style.RESET_ALL}" + "@"
prompt += f"{Fore.CYAN}" + self.current_file + f"{Style.RESET_ALL}" + " "
prompt += "> "
return prompt
def process_input(self, value):
parms = value.split(' ')
if len(parms) > 0:
if parms[0] == "cd":
os.chdir(parse_cwd(parms[1]))
elif parms[0] == "ls":
os.system("ls --color=always")
elif parms[0] == "open":
if len(parms) == 2:
if parms[1] == "database":
if len(parms) > 2:
self.open_file(self.oms, parms[2])
return
else:
print("usage: open database|tenant 'filename'")
elif parms[1] == "tenant":
print("error: not implemented")
return
else:
# default to "open database ..."
self.open_file(self.oms, parms[1])
return
else:
print("usage: open database|tenant 'filename'")
elif parms[0] == "create":
self.create_file(self.oms, parms[1])
self.open_file(self.oms, parms[1])
# print ("error: no database open, use `open filename.mql` first")
elif parms[0] == "instance":
if parms[1] == "create":
if len(parms) == 3:
iid = self.parse(parms[2])
inst = self.oms.create_instance_of(iid)
print(inst)
else:
print("usage: instance create class_iid [index]")
elif parms[1] == "get":
if len(parms) == 3:
iid = self.parse(parms[2])
print(iid)
elif parms[1] == "list":
if not self.oms.is_open():
self.print_error_not_open()
return
instances = self.oms.get_instances()
self.print_instance_list(instances)
elif parms[0] == "attribute":
if parms[1] == "list":
if len(parms) == 3:
inst_id = self.parse(parms[2])
if inst_id is None:
print("invalid inst id " + parms[2] + " (inst not found)")
return
attrs = self.oms.get_attributes(inst_id)
self.print_instance_list_with_attribute_values(attrs, self.oms, inst_id)
else:
print ("usage: attribute list instance_id")
elif parms[1] == "get":
if len(parms) == 4:
if not self.oms.is_open():
self.print_error_not_open()
return
inst_id = self.parse(parms[2])
att_id = self.parse(parms[3])
if inst_id is None:
print("invalid inst id " + self.strip(parms[2]) + " (inst not found)")
return
if att_id is None:
print("invalid inst id " + self.strip(parms[3]) + " (inst not found)")
return
value = self.oms.get_attribute_value(inst_id, att_id)
print(value)
else:
print("usage: attribute get inst_iid|inst_gid att_iid|att_gid")
elif parms[1] == "set":
if len(parms) == 5:
if not self.oms.is_open():
self.print_error_not_open()
return
inst_id = self.parse(parms[2])
att_id = self.parse(parms[3])
value = parms[4]
if inst_id is None:
print("invalid inst id " + self.strip(parms[2]) + " (inst not found)")
return
if att_id is None:
print("invalid inst id " + self.strip(parms[3]) + " (inst not found)")
return
self.oms.set_attribute_value(inst_id, att_id, value)
print("ok")
else:
print("usage: attribute set inst_iid|inst_gid att_iid|att_gid value")
elif parms[0] == "relationship":
if parms[1] == "list":
if len(parms) == 3:
inst_id = self.parse(parms[2])
if inst_id is None:
print("invalid inst id " + parms[2] + " (inst not found)")
return
rels = self.oms.get_relationships(inst_id)
self.print_instance_list_with_relationship_values(rels, self.oms, inst_id)
else:
print ("usage: relationship list instance_id")
elif parms[0] == "close":
self.oms.close()
else:
print("invalid cmd '" + parms[0] + "'")
if __name__ == '__main__':
prog = MochaShell()
prog.start()

View File

@ -3,9 +3,18 @@ from mocha.web.WebServer import WebServer
from mocha.oms import Oms from mocha.oms import Oms
from mocha.oms.memory import MemoryOms from mocha.oms.memory import MemoryOms
import sys
from getopt import getopt
if __name__ == "__main__": if __name__ == "__main__":
port = 8081 port = 8081
(opts, remaining) = getopt(sys.argv[1:], "p", [ "port=" ])
for opt in opts:
if opt[0] == "--port":
port = int(opt[1])
print("Mocha User Interface Service - running on port", port) print("Mocha User Interface Service - running on port", port)
oms = MemoryOms() oms = MemoryOms()

View File

@ -9,8 +9,6 @@ class InstanceKey():
return InstanceKey(tup[0], tup[1]) return InstanceKey(tup[0], tup[1])
def __init__(self, class_id : int, inst_id : int): def __init__(self, class_id : int, inst_id : int):
self.__class_id = class_id self.__class_id = class_id
self.__inst_id = inst_id self.__inst_id = inst_id

View File

@ -1,8 +1,10 @@
from .InstanceKey import InstanceKey from .InstanceKey import InstanceKey
from framework import Guid
class InstanceReference: class InstanceReference:
def __init__(self, dbid, inst_key : InstanceKey, global_id): def __init__(self, dbid, inst_key : InstanceKey, global_id : Guid):
self.dbid = dbid self.dbid = dbid
self.inst_key = inst_key self.inst_key = inst_key
self.global_id = global_id self.global_id = global_id
@ -14,7 +16,10 @@ class InstanceReference:
return self.inst_key return self.inst_key
def get_global_identifier(self): def get_global_identifier(self):
return self.global_id.lower() return self.global_id
def __str__(self): def __str__(self):
return str(self.inst_key) + ' ' + self.global_id return str(self.inst_key) + ' ' + str(self.global_id)
def __repr__(self):
return str(self.inst_key) + ' ' + str(self.global_id)

View File

@ -0,0 +1,52 @@
from framework import Guid
"""
Represents the Text Attribute `Name`
"""
Name = Guid.parse("{9153A637-992E-4712-ADF2-B03F0D9EDEA6}")
"""
Represents the Text Attribute `Value`
"""
Value = Guid.parse("{041DD7FD-2D9C-412B-8B9D-D7125C166FE0}")
"""
Represents the Text Attribute `Debug Definition File Name`
"""
DebugDefinitionFileName = Guid.parse("{03bf47c7-dc97-43c8-a8c9-c6147bee4e1f}")
DebugDefinitionLineNumber = Guid.parse("{822be9b7-531d-4aa1-818a-6e4de1609057}")
DebugDefinitionColumnNumber = Guid.parse("{0f75c750-e738-4410-9b4e-deb422efc7aa}")
Singular = Guid.parse("F1A06573C4474D85B4E754A438C4A960")
Value = Guid.parse("041DD7FD2D9C412B8B9DD7125C166FE0")
CSSValue = Guid.parse("C0DD4A42F5034EB380347C428B1B8803")
RelationshipType = Guid.parse("71106B1219344834B0F6D894637BAEED")
LabelOverride = Guid.parse("{89b361e0-9f13-4fea-9b1e-6eca573bd6ba}")
Label = Guid.parse("69cdf8affcf24477b75d71593e7dbb22")
Order = Guid.parse("{49423f66-8837-430d-8cac-7892ebdcb1fe}")
MethodType = Guid.parse("{47ae57a9-7723-48a8-80f2-dd410d929e14}")
ClassName = Guid.parse("c7e8d78ecfac4dacae242ac67a0ba9d3")
ThemeName = Guid.parse("{8cfc012c-52fd-4a66-8b2f-1b9b5e4af474}")
"""
A Numeric Attribute specifying the maximum length of an input field.
"""
MaximumLength = Guid.parse("6d69fee2f2204aadab8901bfa491dae1")
TargetURL = Guid.parse("970F79A09EFE4E7D92869908C6F06A67")
UserName = Guid.parse("960FAF025C5940F791A720012A99D9ED")
PasswordHash = Guid.parse("F377FC294DF14AFB96434191F37A00A9")
PasswordSalt = Guid.parse("8C5A99BC40ED4FA2B23FF373C1F3F4BE")
Encoding = Guid.parse("a82f3c46055e4e129c5de40447134389")
ContentType = Guid.parse("34142FCB172C490AAF03FF8451D00CAF")
BackgroundColor = Guid.parse("B817BE3BD0AC4A60A98A97F99E96CC89")
ForegroundColor = Guid.parse("BB4B6E0DD9BA403D9E8193E8F7FB31C8")
IPAddress = Guid.parse("ADE5A3C3A84E4798BC5BE08F21380208")
Token = Guid.parse("da7686b638034f1597f67f8f3ae16668")
DebugDefinitionFileName = Guid.parse("03bf47c7dc9743c8a8c9c6147bee4e1f")

View File

@ -0,0 +1,124 @@
from framework import Guid
Class = Guid.parse("{B9C9B9B7-AD8A-4CBD-AA6B-E05784630B6B}")
Attribute = Guid.parse("{F9CD7751-EF62-4F7C-8A28-EBE90B8F46AA}")
Relationship = Guid.parse("{9B0A80F9-C325-4D36-997C-FB4106204648}")
InstanceDefinition = Guid.parse("{ee26f146-0b89-4cfe-a1af-ae6ac3533eae}")
Enumeration = Guid.parse("{70c3ee17-4d54-4342-9e7b-527cf73c93dd}")
# Attribute subclasses
TextAttribute = Guid.parse("{C2F36542-60C3-4B9E-9A96-CA9B309C43AF}")
BooleanAttribute = Guid.parse("{EA830448-A403-4ED9-A3D3-048D5D5C3A03}")
NumericAttribute = Guid.parse("{9DE86AF1-EFD6-4B71-9DCC-202F247C94CB}")
DateAttribute = Guid.parse("{0B7B1812-DFB4-4F25-BF6D-CEB0E1DF8744}")
Element = Guid.parse("{91929595-3dbd-4eae-8add-6120a49797c7}")
ElementContent = Guid.parse("{f85d4f5e-c69f-4498-9913-7a8554e233a4}")
Translation = Guid.parse("{04A53CC8-3206-4A97-99C5-464DB8CAA6E6}")
TranslationValue = Guid.parse("{6D38E757-EC18-43AD-9C35-D15BB446C0E1}")
String = Guid.parse("{5AECB489-DBC2-432E-86AF-6BE349317238}")
StringComponent = Guid.parse("{F9E2B671-13F5-4172-A568-725ACD8BBFAB}")
ExtractSingleInstanceStringComponent = Guid.parse("{FCECCE4E-8D05-485A-AE34-B1B45E766661}")
InstanceAttributeStringComponent = Guid.parse("{623565D5-5AEE-49ED-A5A9-0CFE670507BC}")
Prompt = Guid.parse("{EC889225-416A-4F73-B8D1-2A42B37AF43E}")
TextPrompt = Guid.parse("{195DDDD7-0B74-4498-BF61-B0549FE05CF3}")
ChoicePrompt = Guid.parse("{5597AEEB-922D-48AF-AE67-DF7D951C71DB}")
InstancePrompt = Guid.parse("{F3ECBF1E-E732-4370-BE05-8FA7CC520F50}")
BooleanPrompt = Guid.parse("{a7b49c03-c9ce-4a79-a4b2-e94fc8cd8b29}")
Method = Guid.parse("{D2813913-80B6-4DD6-9AD6-56D989169734}")
# MethodCall = Guid.parse("{084A6D58-32C9-4A5F-9D2B-86C46F74E522}")
ConditionalEvaluationCase = Guid.parse("{ba18abdc-11ae-46af-850a-eb30280b0ffa}")
ConditionalSelectAttributeCase = Guid.parse("{a1115690-c400-4e3e-9c8f-24e2a9477e8f}")
AccessModifier = Guid.parse("{ca4fcc11-16c8-4872-a712-82e589d382ce}")
MethodBinding = Guid.parse("{CB36098E-B9BF-4D22-87FA-4186EC632C89}")
ReturnAttributeMethodBinding = Guid.parse("{30FB6BA6-2BBB-41D2-B91A-709C00A07790}")
ReturnInstanceSetMethodBinding = Guid.parse("{AADC20F9-7559-429B-AEF0-97E059295C76}")
Executable = Guid.parse("{6A1F66F7-8EA6-43D1-B2AF-198F63B84710}")
ExecutableReturningAttribute = Guid.parse("{50b2db7a-3623-4be4-b40d-98fab89d3ff5}")
ExecutableReturningInstanceSet = Guid.parse("{d5fbc5cb-13fb-4e68-b3ad-46b4ab8909f7}")
ExecutableReturningElement = Guid.parse("{a15a4f52-1f1a-4ef3-80a7-033d45cc0548}")
ExecutableReturningWorkData = Guid.parse("{a0365b76-ad1f-462e-84da-d6a1d5b9c88c}")
Event = Guid.parse("{ca727ecd-8536-4aeb-9e75-352dbb958767}")
WorkData = Guid.parse("{05e8f023-88cb-416b-913e-75299e665eb2}")
WorkSet = Guid.parse("{c4c171d8-994b-485b-b0ac-053d11b963ab}")
Parameter = Guid.parse("{1ab99be0-43f1-495a-b85e-ec38ea606713}")
ParameterAssignment = Guid.parse("{c7aa0c7c-50d8-44fd-9b05-a558a38a6954}") # 28
ElementContentDisplayOption = Guid.parse("{bd68052a-daa4-43b9-8965-d38095473170}")
ReportObject = Guid.parse("{ff7d5757-d9d9-48ab-ab04-5932e7341a90}")
Validation = Guid.parse("{3E45AA17-6E8E-41DB-9C94-E84B4B4176E8}")
ValidationClassification = Guid.parse("{8f43d578-a671-436b-afdc-c8689a5bd9b6}")
PrimaryObjectReportField = Guid.parse("{59EA0C72-4800-48BA-84A4-DDFE10E5F4D0}")
RelationshipReportField = Guid.parse("{FC4E3BB5-1EA7-44FF-B828-2EA54CDD4ABB}")
ReportField = Guid.parse("{655A04D9-FE35-4F89-9AAB-B8FA34989D03}")
AttributeReportField = Guid.parse("{C06E0461-A956-4599-9708-012C8FE04D94}")
Module = Guid.parse("{e009631d-6b9d-445c-95df-79f4ef8c8fff}")
Report = Guid.parse("{19D947B6-CE82-4EEE-92EC-A4E01E27F2DB}")
ReportColumn = Guid.parse("{BEFE99A1-B2EB-4365-A2C9-061C6609037B}")
StandardReport = Guid.parse("{FDF4A498-DE83-417D-BA01-707372125C8D}")
TaskCategory = Guid.parse("{e8d8060f-a20c-442f-8384-03488b63247f}")
Task = Guid.parse("{D4F2564B-2D11-4A5C-8AA9-AF52D4EACC13}")
UITask = Guid.parse("{BFD07772-178C-4885-A6CE-C85076C8461C}")
Tenant = Guid.parse("{703F9D65-C584-4D9F-A656-D0E3C247FF1F}")
User = Guid.parse("{9C6871C1-9A7F-4A3A-900E-69D1D9E24486}")
UserLogin = Guid.parse("{64F4BCDB-38D0-4373-BA30-8AE99AF1A5F7}")
MenuItemCommand = Guid.parse("{9D3EDE23-6DB9-4664-9145-ABCBD3A0A2C2}")
MenuItemSeparator = Guid.parse("{798DECAB-5119-49D7-B0AD-D4BF45807188}")
MenuItemHeader = Guid.parse("{1F148873-8A97-4409-A79B-C19D5D380CA4}")
MenuItemInstance = Guid.parse("{6E3AA9AF-96B9-4208-BEA9-291A72C68418}")
Style = Guid.parse("{A48C843A-B24B-4BC3-BE6F-E2D069229B0A}")
StyleRule = Guid.parse("{C269A1F3-E014-4230-B78D-38EAF6EA8A81}")
StyleClass = Guid.parse("{a725f089-7763-4887-af37-da52358c378c}")
Page = Guid.parse("{D9626359-48E3-4840-A089-CD8DA6731690}")
ContainerPageComponent = Guid.parse("{6AD6BD1C-7D1C-4AC9-9642-FEBC61E9D6FF}")
ButtonPageComponent = Guid.parse("{F480787D-F51E-498A-8972-72128D808AEB}")
HeadingPageComponent = Guid.parse("{FD86551E-E4CE-4B8B-95CB-BEC1E6A0EE2B}")
ImagePageComponent = Guid.parse("{798B67FA-D4BE-42B9-B4BD-6F8E02C953C0}")
PanelPageComponent = Guid.parse("{D349C489-9684-4A5A-9843-B906A7F803BC}")
ParagraphPageComponent = Guid.parse("{ADFF93CE-9E85-4168-A7D4-5239B99BE36D}")
SequentialContainerPageComponent = Guid.parse("{A66D9AE2-3BEC-4083-A5CB-7DE3B03A9CC7}")
SummaryPageComponent = Guid.parse("{5EBA7BD6-BA0A-45B2-835C-C92489FD7E74}")
TabContainerPageComponent = Guid.parse("{E52B02D7-895C-4642-9B03-EB0232868190}")
DetailPageComponent = Guid.parse("{41F9508E-6CF0-4F3D-8762-FF17CD52C466}")
ElementPageComponent = Guid.parse("{122d5565-9df9-4656-b6af-ba5df6630d32}")
IntegrationID = Guid.parse("{49a5ebda-baaa-4ede-bba5-decc250ce1a3}")
IntegrationIDUsage = Guid.parse("{86084b9f-3860-4857-a41f-2f8b6877aff1}")
Dashboard = Guid.parse("{896B529C-452D-42AC-98C5-170ED4F826C6}")
DashboardContent = Guid.parse("{2720ea77-cb09-4099-9f74-ccdacdd146e8}")
Instance = Guid.parse("{263C4882-945F-4DE9-AED8-E0D6516D4903}")
InstanceSet = Guid.parse("{53aac86e-ce60-4509-a869-417c38c305e0}")
AuditLine = Guid.parse("{a4124a76-02f6-406a-9583-a197675b493b}")
Theme = Guid.parse("{7c2cc4b5-8323-4478-863b-1759d7adf62e}")
CommonBoolean = Guid.parse("{5b025da3-b7bd-45a9-b084-48c4a922bf72}")
CommonInstanceSet = Guid.parse("{3382da21-4fc5-45dc-bbd1-f7ba3ece1a1b}")

View File

@ -0,0 +1,7 @@
from framework import Guid
class User:
superuser = Guid.parse("{69e291d8-381b-4ad8-9013-f3b0a0c693fe}")

View File

@ -0,0 +1,354 @@
from framework import Guid
Instance__has__Source_Definition = Guid.parse("{57cbc351-0428-47e6-a6db-445e4503abab}")
Class__has_super__Class = Guid.parse("{100F0308-855D-4EC5-99FA-D8976CA20053}")
Class__has_sub__Class = Guid.parse("C14BC80D879C4E6F9123E8DFB13F4666")
Class__has__Method = Guid.parse("2DA282715E464472A6F5910B5DD6F608")
Method__for__Class = Guid.parse("76D2CE0DAA4D460BB8442BD76EF9902B")
Class__has__Instance = Guid.parse("7EB41D3C2AE9488483A4E59441BCAEFB")
Instance__for__Class = Guid.parse("494D5A6D04BE477B8763E3F57D0DD8C8")
Class__has__Relationship = Guid.parse("3997CAAD3BFA4EA69CFA2AA63E20F08D")
Relationship__for__Class = Guid.parse("C00BD63F10DA4751B8EA0905436EA098")
Class__has_title__Translation = Guid.parse("B8BDB90569DD49CDB5570781F7EF2C50")
Class__has__Attribute = Guid.parse("DECBB61A2C6C4BC890420B5B701E08DE")
Attribute__for__Class = Guid.parse("FFC8E435B9F844958C854DDA67F7E2A8")
Class__has_default__Task = Guid.parse("CF396DAA75EA41488468C66A71F2262D")
Class__has_owner__User = Guid.parse("D1A25625C90F4A73A6F2AFB530687705")
User__owner_for__Class = Guid.parse("04DD2E6BEA5748408DD5F0AA943C37BB")
Instance__for__Module = Guid.parse("c60fda3c2c0a422980e8f644e4471d28")
Module__has__Instance = Guid.parse("c3e5d7e35e114f8da212b175327b2648")
Class__has__Object_Source = Guid.parse("B62F9B81799B4ABEA4AF29B45347DE54")
Object_Source__for__Class = Guid.parse("FBB9391DC4A243269F857801F377253C")
Relationship__has_source__Class = Guid.parse("7FB5D234042E45CBB11DAD72F8D45BD3")
Relationship__has_destination__Class = Guid.parse("F220F1C204994E87A32EBDBF80C1F8A4")
Relationship__has_sibling__Relationship = Guid.parse("656110FF450248B8A7F3D07F017AEA3F")
Translation__has__Translation_Value = Guid.parse("F9B60C00FF1D438FAC746EDFA8DD7324")
Translation_Value__has__Language = Guid.parse("3655AEC2E2C94DDE8D980C4D3CE1E569")
String__has__String_Component = Guid.parse("3B6C4C25B7BC42428ED1BA6D01B834BA")
Extract_Single_Instance_String_Component__has__Relationship = Guid.parse("5E499753F50F4A9EBF53DC013820499C")
Instance_Attribute_String_Component__has__Attribute = Guid.parse("E15D427769FB4F1992DB8D087F361484")
String_Component__has_source__Method = Guid.parse("1ef1c965e12048beb682aa040573b5fb")
# Class__instance_labeled_by__String = Guid.parse("F52FC851D65548A9B526C5FE0D7A29D2")
Class__instances_labeled_by__Executable_returning_Attribute = Guid.parse("{c22fc17f-0c92-47dc-9a8b-28db0db68985}")
Class__has_summary__Report_Field = Guid.parse("D11050AD73764AB784DEE8D0336B74D2")
Class__uses_preview__Executable_returning_Element = Guid.parse("{059dc948-5f1b-4331-94f4-6d79dc324ebf}")
Executable_returning_Element__preview_used_by__Class = Guid.parse("{07d5e08f-fe38-49fd-8fcb-c862a532ec57}")
Class__has_related__Task = Guid.parse("4D8670E12AF14E7C9C87C910BD7B319B")
Report_Object__has__Report_Field = Guid.parse("0af6265642bc40a5b0bcdbba67c347f6")
Report_Field__for__Report_Object = Guid.parse("b46c8caa3f46465fba117d6f385425a2")
Task__has_title__Translation = Guid.parse("D97AE03C261F4060A06D985E26FA662C")
Task__has_instructions__Translation = Guid.parse("A93878989DC0400694F11FB02EB3ECD7")
Task__has__Prompt = Guid.parse("929B106F7E3E4D30BB84E450A4FED063")
Task__has__Task_Category = Guid.parse("84048159430d4f6c9361115c8629c517")
Task__executes__Method_Call = Guid.parse("D8C0D4D4F8C64B92A2C18BF16B16203D")
Task__has_preview_action_title__Translation = Guid.parse("3f65ce0211dd4829a46bb9ea1b43e56a")
Prompt__has__Report_Field = Guid.parse("922CCB0561EA441D96E063D58231D202") # 3de784b9456142f0946fb1e90d80029e
Report_Field__for__Prompt = Guid.parse("5DED3DB4686445A9A5FF8E5A35AD6E6F") # b5f59216a1f149798642a4845e59daa8
Instance_Prompt__has_valid__Class = Guid.parse("D5BD754BF4014FD8A70782684E7E25F0")
Instance_Prompt_Value__has__Instance = Guid.parse("512B518EA89244ABAC354E9DBCABFF0B")
Method__executed_by__Method_Binding = Guid.parse("D52500F114214B739987223163BC9C04")
Method_Binding__executes__Method = Guid.parse("B782A5928AF542288296E3D0B24C70A8")
Method__has_return_type__Class = Guid.parse("1241c599e55d4dcf9200d0e48c217ef8")
Method_Binding__has__Parameter_Assignment = Guid.parse("2493810994f1463a9314c49e667cf45b")
Parameter_Assignment__for__Method_Binding = Guid.parse("19c4a5dbfd2644b8b431e081e6ffff8a")
Parameter_Assignment__assigns_from__Executable_returning_Work_Data = Guid.parse("{6f3687ed-7d88-4ece-914e-c47c57c1146d}")
Parameter_Assignment__assigns_to__Work_Data = Guid.parse("{51c37636-35d2-4528-99ca-50cf09fa1427}")
Parameter__has_data_type__Instance = Guid.parse("ccb5200c5faf4a3a9e8e2edf5c2e0785")
Instance__data_type_for__Parameter = Guid.parse("ea1e6305b2e44ba591b41ecfbebfa490")
Instance_Set__has__Instance = Guid.parse("7c9010a269f1402999c872e05c78c41e")
Parameter_Assignment__assigns_to__Parameter = Guid.parse("a6d30e787bff4fccb109ee96681b0a9e")
Parameter__assigned_from__Parameter_Assignment = Guid.parse("2085341e5e7e4a7fbb8ddfa58f6030d9")
Method_Binding__assigned_to__Parameter_Assignment = Guid.parse("cbcb23b710c449eba1cab9da73fe8b83")
Parameter_Assignment__assigns_from__Method_Binding = Guid.parse("1e055d30a96849d893fe541994fc0c51")
Validation__has__Validation_Classification = Guid.parse("BCDB6FFDD2F24B63BD7E9C2CCD9547E0")
Validation__has_true_condition__Executable = Guid.parse("AA2D3B5141534599A9836B4A13ADCBCB")
Validation__has_false_condition__Executable = Guid.parse("419047F8852B4A4DB161A8BD022FD8EB")
Validation__has_failure_message__Translation = Guid.parse("E15A97DD2A1D4DC0BD6BA957B63D9802")
Translation__failure_message_for__Validation = Guid.parse("46a7dfcb884847d59ad3d27fbd8b423f")
Build_Attribute_Method__returns__Attribute = Guid.parse("{dadbf0f3-7af0-4387-a6b7-a1724a216d88}")
# Build_Attribute_Method__builds_with__Executable_returning_Attribute = Guid.parse("{bb64cd83-85c2-4c20-82eb-2a5a5ead31f1}")
Build_Attribute_Method__builds_with__Build_Attribute_Method_Component = Guid.parse("{b4fad1b8-711c-4e84-82d0-e9a9e41e8aa7}")
Build_Attribute_Method_Component__uses__Executable_returning_Attribute = Guid.parse("{9d2acd01-5c6d-4a95-b77e-5261ba109540}")
Get_Attribute_Method__has__Attribute = Guid.parse("5eca9b3fbe754f6e8495781480774833")
Get_Referenced_Instance_Set_Method__returns__Work_Set = Guid.parse("{72057f5b-9b49-497d-852f-cd7e5e258d6c}")
Get_Referenced_Instance_Set_Method__uses_reference__Executable_returning_Instance_Set = Guid.parse("{2978238f-7cb0-4ba3-8c6f-473df782cfef}")
Get_Referenced_Instance_Set_Method__uses_answer__Executable_returning_Instance_Set = Guid.parse("{6a65819e-c8cb-4575-9af8-ee221364049b}")
Get_Referenced_Attribute_Method__returns__Attribute = Guid.parse("87f90fe95ec64b098f51b8a4d1544cae")
Get_Referenced_Attribute_Method__uses_reference__Executable_returning_Instance_Set = Guid.parse("{c7ecd498-6d05-4e07-b1bc-f7127d0d6666}")
Get_Referenced_Attribute_Method__uses_answer__Executable_returning_Attribute = Guid.parse("{022ccde3-2b9e-4573-a8fc-e7568f420cd3}")
Get_Specified_Instances_Method__returns__Work_Set = Guid.parse("{27796f3d-0cbd-42c5-a840-791d3af6c16d}")
Get_Specified_Instances_Method__uses__Instance = Guid.parse("dea1aa0b2bef4bacb4f90ce8cf7006fc")
Evaluate_Boolean_Expression_Method__returns__Boolean_Attribute = Guid.parse("{53cf2cb6-f5f2-499f-9f18-26b86bf671c4}")
Evaluate_Boolean_Expression_Method__has_source__Executable_returning_Work_Data = Guid.parse("{45d76d56-01ed-4641-9f68-cfe0c7d0d265}")
IDR_Evaluate_Boolean_Expression_Method__uses__Boolean_Operator = Guid.parse("{aa9e17a2-e4d9-4598-bcfc-2d729031d11c}")
Evaluate_Boolean_Expression_Method__has_target__Executable_returning_Work_Data = Guid.parse("{0646df91-7e3e-4d59-be71-b978a22ced8e}")
Prompt_Value__has__Prompt = Guid.parse("7CD62362DDCE4BFC87B9B5499B0BC141")
User__has_display_name__Translatable_Text_Constant = Guid.parse("6C29856C3B104F5BA291DD3CA4C04A2F")
User_Login__has__User = Guid.parse("85B40E4B849B4006A9C04E201B25975F")
User__has_default__Page = Guid.parse("f00cda6feded4e0fb6c59675ed664a75")
Dashboard__has__Dashboard_Content = Guid.parse("d26acf18afa54ccd8629e1d9dac394ed")
Dashboard_Content__for__Dashboard = Guid.parse("9f236d2d1f454096a69c42f37abbeebc")
Dashboard_Content__has__Instance = Guid.parse("1f0c40752b7d42c28488c7db06e91f5a")
Instance__for__Dashboard_Content = Guid.parse("376951c9252b48438e1dca89c94ddfa6")
Return_Instance_Set_Method_Binding__has_source__Class = Guid.parse("EE7A30498E09410C84CBC2C0D652CF40")
Report__has__Report_Column = Guid.parse("7A8F57F1A4F34BAF84A5E893FD79447D")
Report__has__Report_Data_Source = Guid.parse("1DE7B484F9E3476AA9D37D2A86B55845")
Report__has__Prompt = Guid.parse("5D112697303F419F886F3F09F0670B07")
Report_Column__has__Report_Field = Guid.parse("B90269107E914EE1B5F2D7B740614831")
Report_Column__has__Report_Column_Option = Guid.parse("41FFF5F0B4674986A6FD46FAF4A479E9")
Report_Data_Source__has_source__Method = Guid.parse("2D5CB496583946A09B9430D4E2227B56")
Report_Field__has_source__Method = Guid.parse("5db86b7669bf421f96e74c49452db82e")
Attribute_Report_Field__has_target__Attribute = Guid.parse("3796430126FD41D886611F73684C0E0A")
Relationship_Report_Field__has_target__Relationship = Guid.parse("134B2790F6DF4F979AB59878C4A715E5")
Tenant__has__Application = Guid.parse("22936f5126294503a30ba02d61a6c0e0")
Tenant__has_sidebar__Menu_Item = Guid.parse("D62DFB9F48D54697AAAD1CAD0EA7ECFA")
Tenant__has__Tenant_Type = Guid.parse("E94B6C9D330748589726F24B7DB21E2D")
Tenant__has_company_logo_image__File = Guid.parse("3540c81cb2294eacb9b59d4b4c6ad1eb")
Menu__has__Menu_Section = Guid.parse("a22d949ff8d14dcca3ebd9f910228dfd")
Menu_Item__has_title__Translatable_Text_Constant = Guid.parse("65E3C87EA2F74A339FA7781EFA801E02")
Menu_Section__has__Menu_Item = Guid.parse("5b659d7c58f9453c9826dd3205c3c97f")
Command_Menu_Item__has__Icon = Guid.parse("8859DAEF01F746FA8F3E7B2F28E0A520")
Instance_Menu_Item__has_target__Instance = Guid.parse("C599C20EF01A4B12A9195DC3B0F545C2")
Page__has_title__Translation = Guid.parse("7BE6522A4BE84CD38701C8353F7DF630")
Page__has__Style = Guid.parse("6E6E1A853EA94939B13ECBF645CB8B59")
Page__has__Page_Component = Guid.parse("24F6C596D77D4754B02300321DEBA924")
Style__has__Style_Rule = Guid.parse("4CC8A654B2DF4B17A95624939530790E")
Style_Rule__has__Style_Property = Guid.parse("B69C2708E78D413AB491ABB6F1D2A6E0")
Style__has_width__Measurement = Guid.parse("4930ca87641a426d9d67cda6d5f22303")
Style__has_height__Measurement = Guid.parse("978e6de0af7345a0bb56aaf451615b06")
Measurement__has__Measurement_Unit = Guid.parse("C97200821F40406D80B781C1B690354D")
Page__has_master__Page = Guid.parse("9bdbfd640915419f83fde8cf8bcc74ae")
Page__master_for__Page = Guid.parse("7fe8f2a2c94d401083aa9300cc99d71d")
Page_Component__has__Style = Guid.parse("818CFF507D4243B2B6A792C3C54D450D")
Style__for__Page_Component = Guid.parse("007563E7727744368C8206D5F156D8E1")
Button_Page_Component__has_text__Translatable_Text_Constant = Guid.parse("C25230B14D234CFE8B7556C33E8293AF")
Image_Page_Component__has_source__Method = Guid.parse("481E3FBEB82A4C769DDFD66C6BA8C590")
Sequential_Container_Page_Component__has__Sequential_Container_Orientation = Guid.parse("DD55F50687184240A89421346656E804")
Container_Page_Component__has__Page_Component = Guid.parse("CB7B81621C9E4E72BBB8C1C37CA69CD5")
Panel_Page_Component__has_header__Page_Component = Guid.parse("223B4073F41749CDBCA10E0749144B9D")
Panel_Page_Component__has_content__Page_Component = Guid.parse("AD8C5FAE24444700896EC5F968C0F85B")
Panel_Page_Component__has_footer__Page_Component = Guid.parse("56E339BD61894BACAB83999543FB8060")
Element_Page_Component__has__Element = Guid.parse("fe833426e25d4cde89392a6c9baac20c")
Element_Page_Component__has__Element_Content_Display_Option = Guid.parse("74e3c13a04fd4f49be7005a32cdcdfe7")
Element_Content_Display_Option__for__Element_Page_Component = Guid.parse("7d3a7045092549db9b7d24863c9848a6")
Element__for__Element_Page_Component = Guid.parse("963c5c60397947fab201a26839b9ded9")
Tenant__has_logo_image__File = Guid.parse("4C399E80ECA24A68BFB426A5E6E97047")
Tenant__has_background_image__File = Guid.parse("39B0D9634BE049C8BFA2607051CB0101")
Tenant__has_icon_image__File = Guid.parse("CC4E65BD7AAA40DAAECAC607D7042CE3")
Tenant__has_login_header__Translatable_Text_Constant = Guid.parse("41D66ACBAFDE4B6F892DE66255F10DEB")
Tenant__has_login_footer__Translatable_Text_Constant = Guid.parse("A6203B6B5BEB4008AE49DB5E7DDBA45B")
Tenant__has_application_title__Translation = Guid.parse("7668343767ba46d9a5e72945be635345")
Tenant__has_mega__Menu = Guid.parse("cdd743cbc74a46719922652c7db9f2d8")
Tenant_Type__has_title__Translatable_Text_Constant = Guid.parse("79AAE09C5690471C84421B230610456C")
Prompt__has_title__Translatable_Text_Constant = Guid.parse("081ee211753443c499b524bd9537babc")
Report__has_title__Translatable_Text_Constant = Guid.parse("DF93EFB08B5E49E78BC0553F9E7602F9")
Report__has_description__Translatable_Text_Constant = Guid.parse("D5AA18A77ACD4792B0396C620A151BAD")
Report_Field__has_title__Translatable_Text_Constant = Guid.parse("6780BFC2DBC040AE83EEBFEF979F0054")
Content_Page_Component__gets_content_from__Method = Guid.parse("0E002E6FAA79457C93B82CCE1AEF5F7E")
Method__provides_content_for__Content_Page_Component = Guid.parse("5E75000D24214AD49E5FB9FDD9CB4744")
Securable_Item__secured_by__Method = Guid.parse("15199c4995954288846d13b0ad5dcd4b")
Get_Relationship_Method__has__Relationship = Guid.parse("321581d660c1454783449d5bda027adc")
Integration_ID__has__Integration_ID_Usage = Guid.parse("6cd30735df834253aabe360d6e1a3701")
Integration_ID_Usage__for__Integration_ID = Guid.parse("d8d981ec768640dab89f006c85042444")
Conditional_Select_from_Instance_Set_Method__has__Conditional_Select_from_Instance_Set_Case = Guid.parse("b6715132b4384073b81d3ecf19584b7d")
Conditional_Select_from_Instance_Set_Case__for__Conditional_Select_from_Instance_Set_Method = Guid.parse("1c868a068fb7432d839b7a5a02a50eb6")
Condition_Group__has_true_condition__Executable_returning_Attribute = Guid.parse("d955da3f7ef443748b86167c73434f75")
Executable_returning_Attribute__true_condition_for__Condition_Group = Guid.parse("1acdefd1e1b445bb99e1bf73dea71da5")
Condition_Group__has_false_condition__Executable_returning_Attribute = Guid.parse("e46dbc4fae8d4ad8b9e610cedfa68b73")
Executable_returning_Attribute__false_condition_for__Condition_Group = Guid.parse("633af008bf7f4da194d667a9a80586d6")
Audit_Line__has__Instance = Guid.parse("c91807ed0d734729990bd90750764fb5")
Audit_Line__has__User = Guid.parse("7c1e048d3dcb44739f2ee21014a76aa5")
Method__has__Method_Parameter = Guid.parse("c455dc79ba9b4a7caf8e9ca59dbe511f")
Method_Parameter__for__Method = Guid.parse("0bcb6e5b58854747843ced4c3d3dc234")
Method__returns__Attribute = Guid.parse("eb015d320d4f4647b9b8715097f4434b")
Detail_Page_Component__has_caption__Translation = Guid.parse("4a15fa44fb7b4e268ce2f36652792b48")
Element__has__Element_Content = Guid.parse("c1d3248102f948c6baf837d93fa8da23")
Element_Content__for__Element = Guid.parse("2eff7f580edd40b79c0600774257649e")
Element__has_label__Translation = Guid.parse("7147ea909f454bb9b151025b6e2bd834")
Element_Content__has__Instance = Guid.parse("315b71ba953d45fc87e54f0a268242a9")
Instance__for__Element_Content = Guid.parse("c3959f84248d4edea3f2f262917c7b56")
Element_Content__has__Layout = Guid.parse("1ab7412005ea4acab6d3c7e0133e0c4f")
Element_Content__has__EC_Dynamic_Display_Option = Guid.parse("{4a41391a-c325-4182-920a-a94ad28c15fa}")
EC_Dynamic_Display_Option__modifies__Element_Content = Guid.parse("{4d091643-2bfc-4b83-b3e4-8a3b22c665a9}")
Dynamic_Display_Option__add__Display_Option = Guid.parse("{2ed33b28-f84d-4120-b585-be965cfb691f}")
Dynamic_Display_Option__remove__Display_Option = Guid.parse("{dc06bf0b-70dd-4f71-854d-0f5685e2124f}")
Element_Content__built_from__BEM_Process = Guid.parse("{3d7094ff-33e5-4800-9e4e-93dde0d1d331}")
BEM_Process__uses_loop__Executable_returning_Instance_Set = Guid.parse("{0fb2b538-eacb-418a-b7d8-43a584b85952}")
Layout__has__Style = Guid.parse("{e684bb26-7e78-4a21-b8b4-5a550f3053d5}")
Rotary_Switch_Layout__has__Rotary_Switch_Layout_Option = Guid.parse("{ae716c95-1e26-48f4-9013-001d1a1854aa}")
Element_Content__has__Element_Content_Display_Option = Guid.parse("f070dfa762604488a779fae291903f2d")
Element_Content__has__Parameter_Assignment = Guid.parse("51214ef0458a44fa8b9df3d9d2309388")
Parameter__assigned_from__Element_Content = Guid.parse("dcef180ba2ca4d87bb05b946c319b562")
Element_Content__has__Validation = Guid.parse("265637cd2099416b88fa4f5ed88a87e3")
Validation__for__Element_Content = Guid.parse("3a4677e89c78414980ad46e5ac3b12f5")
Instance__has__Instance_Definition = Guid.parse("329c54ee17b84550ae80be5dee9ac53c")
Task__has_initiating__Element = Guid.parse("78726736f5b74466b11429cbaf6c9329")
Element__initiates_for__Task = Guid.parse("36964c5d348e4f888a620a795b43bc14")
Detail_Page_Component__has_row_source__Method_Binding = Guid.parse("54FBD0560BD444F4921C11FB0C77996E")
Detail_Page_Component__has_column_source__Method_Binding = Guid.parse("ddabeedaaa264d87a4574e7da921a293")
Work_Set__has_valid__Class = Guid.parse("0808746241a5427184bca9bcd31a2c21")
Class__valid_for__Work_Set = Guid.parse("73c65dcf781047d498c0898ca1b17a68")
Conditional_Select_Attribute_Method__returns__Attribute = Guid.parse("{b2b9d9cc-c4dd-491b-853e-e3669ea4e66a}")
Attribute__returned_by__Conditional_Select_Attribute_Method = Guid.parse("{e3e734ce-953b-49b8-b50d-b1826b519053}")
Conditional_Select_Attribute_Method__has__Conditional_Select_Attribute_Case = Guid.parse("{49396bd0-b5a9-4384-99f4-2126d80b3b66}")
Conditional_Select_Attribute_Case__for__Conditional_Select_Attribute_Method = Guid.parse("{38e2816e-ccb4-4e89-86ab-4981f5c2d7ac}")
Conditional_Select_Attribute_Case__invokes__Executable_returning_Attribute = Guid.parse("{dbd97430-9c55-430d-815c-77fce9887ba7}")
Executable_returning_Attribute__invoked_by__Conditional_Select_Attribute_Case = Guid.parse("{f4b04072-abe8-452a-b8f8-e0369dde24d4}")
Style__gets_background_image_File_from__Return_Instance_Set_Method_Binding = Guid.parse("4b4a0a3e426c4f70bc15b6efeb338486")
Style__has__Style_Class = Guid.parse("2cebd83052aa44ff818db2d6ee273a1f")
Style_Class__for__Style = Guid.parse("b2fbce51455a42b59fd1c28bb0cbe613")
Style__implements__Style = Guid.parse("99b1c16af2cb4cc5a3bb82a96335aa39")
Style__implemented_for__Style = Guid.parse("271ef8161e944f02a8054f9536c28dca")
Style__has_horizontal__Alignment = Guid.parse("{cc8d60e3-1b42-4ab1-a918-3d109891bb4e}")
Style__has_vertical__Alignment = Guid.parse("{24c175dd-c34c-4ffc-aef0-440aa032ceeb}")
Get_Attribute_by_System_Routine_Method__uses__System_Attribute_Routine = Guid.parse("{f7aaac2c-0bfd-4b31-8c8c-3a76e9522574}")
Get_Attribute_by_System_Routine_Method__returns__Attribute = Guid.parse("{e19cf181-b5bf-4595-b5c6-b9098a7a41bb}")
Get_Instance_Set_by_System_Routine_Method__uses__System_Instance_Set_Routine = Guid.parse("{085bd706-eece-4604-ac04-b7af114d1d21}")
System_Instance_Set_Routine__used_by__Get_Instance_Set_By_System_Routine_Method = Guid.parse("{6fb6534c-2a46-4d6d-b9df-fd581f19efed}")
Get_Instance_Set_by_System_Routine_Method__returns__Instance_Set = Guid.parse("{84a864fe-84de-4901-a51c-1e103dc56aed}")
System_Account__has__User_Preferences = Guid.parse("{ada4deb2-adfd-409f-b13a-9856fabd5522}")
User_Preferences__for__System_Account = Guid.parse("{ab2372a5-a4c7-488a-89f6-67e5834f8c83}")
Button_Layout__executes_task_from__Instance_Set = Guid.parse("04d104faa6c4425ea6cd56d847c63e9d")
Button_Layout__gets_related_instance_from__Instance_Set = Guid.parse("{462bb1ab-aefa-4455-8d56-eff233e3caa7}")
Element__processed_by__Process_Related_Updates_Method = Guid.parse("{ed9c836a-04a4-4505-8953-3c567e841c66}")
Element__processed_by__Control_Transaction_Method = Guid.parse("{0f182291-6784-47b3-a8d3-d2f6ebf3950c}")
Control_Transaction_Method__uses__Build_Response_Method_Binding = Guid.parse("{d8f2f0cc-54a2-4004-a383-8c1321495531}")
Build_Response_Method_Binding__used_by__Control_Transaction_Method = Guid.parse("{9b83d1f3-6569-4e98-9d88-765684abfd18}")
Process_Related_Updates_Method__uses__Executable_for_PUMB = Guid.parse("{50e1f14a-d6e5-4c71-b7ab-1755442728dc}")
Process_Related_Updates_Method__processes_for__Class = Guid.parse("{436a20fb-f672-4397-aca4-ec0ed6e2280a}")
Assign_Attribute_Method__uses__Executable_returning_Attribute = Guid.parse("{9313f96e-58af-416f-852e-ef83725057fc}")
Assign_Attribute_Method__assigns__Attribute = Guid.parse("{74061875-8a27-403b-9456-02e52cfd13b2}")
Get_Instances_Method__returns__Work_Set = Guid.parse("{7d0f93b1-8c93-464e-a44d-d674f910b589}")
Get_Instances_Method__selects_instances_of__Class = Guid.parse("{c0b85d90-de8c-44c2-9420-c5e724ccdf2c}")
Build_UI_Response_Method__uses__Executable_returning_Element = Guid.parse("{6f066ec6-b978-4627-81da-78fee1bed5e5}")
Executable_returning_Element__used_by__Build_UI_Response_Method = Guid.parse("{0e662556-ca79-43fe-9a50-57ad22df65de}")
Select_from_Instance_Set_Method__returns__Work_Set = Guid.parse("{e7805b49-0eb3-46ea-bc8a-a5ed676a7726}")
Work_Set__returned_by__Select_from_Instance_Set_Method = Guid.parse("{df12608a-e157-4a1b-bae2-0224a18f5b94}")
Select_from_Instance_Set_Method__uses__Executable_returning_Instance_Set = Guid.parse("{a907f814-b996-4294-b347-ca16ccaf1f5b}")
Executable_returning_Instance_Set__used_by__Select_from_Instance_Set_Method = Guid.parse("{a3ec06f9-54e8-4279-a31d-d221f8697a6a}")
Select_from_Instance_Set_Method__uses__Set_Function = Guid.parse("{abda76ae-a969-40e3-aed2-1a20fcec8b31}")
Set_Function__used_by__Select_from_Instance_Set_Method = Guid.parse("{753f9f4f-3fe3-470a-890d-d799c24e47af}")
Select_from_Instance_Set_Method__uses__Selection_Function = Guid.parse("{6498e72e-f321-4be2-acfd-dfd6f916ce54}")
Selection_Function__used_by__Select_from_Instance_Set_Method = Guid.parse("{e5e6a392-a436-41f7-bc80-cb6603503be1}")
Select_from_Instance_Set_Method__uses_function__Executable_returning_Attribute = Guid.parse("{30905c53-0d64-4332-9023-12a03e60cd09}")
Executable_returning_Attribute__function_used_by__Select_from_Instance_Set_Method = Guid.parse("{79adb5ea-0257-445b-9f7c-e5f8508a59a2}")
Select_from_Instance_Set_Method__uses_order__Executable_returning_Attribute = Guid.parse("{c7a5ef47-fce3-4e7c-87b8-f5cab93b1b10}")
Executable_returning_Attribute__order_used_by__Select_from_Instance_Set_Method = Guid.parse("{48c984ea-f4da-4090-bdd0-fd659b9be13d}")
Select_from_Instance_Set_Method__uses_subset_index__Executable_returning_Attribute = Guid.parse("{b5ef8d8b-683a-4cb9-9e6c-bc470324f4e3}")
Executable_returning_Attribute__as_subset_index_for__Select_from_Instance_Set_Method = Guid.parse("{7d03574f-db28-4aff-a96c-8013832b8269}")
Select_from_Instance_Set_Method__uses_comparator__Executable_returning_Work_Data = Guid.parse("{974c6e8b-b04f-4e3c-8719-298052afa9c7}")
Executable_returning_Work_Data__comparator_for__Select_from_Instance_Set_Method = Guid.parse("{c877ea85-ee9f-4e22-bae7-4a0d7b9272e1}")

View File

@ -1,14 +1,138 @@
from ..core import InstanceKey, InstanceReference, TenantReference from ..core import InstanceKey, InstanceReference, TenantReference
from ..definitions import KnownClassGuids, KnownInstanceGuids, KnownAttributeGuids, KnownRelationshipGuids
from framework import Guid
class Oms: class Oms:
def __init__(self): def __init__(self):
pass pass
def get_user_by_username(self, username : str):
ik_User = self.get_instance_by_global_identifier(KnownClassGuids.User)
if ik_User is None:
print ("error: class `User` is not defined")
return None
users = self.get_instances(ik_User)
for user in users:
un = self.get_attribute_value(user, self.get_instance_by_global_identifier(KnownAttributeGuids.UserName))
if un == username:
return user
return None
def create_class(self, class_id : int, inst_id : int, name : str, global_identifier : Guid):
pass
def create_relationship(self, src_class : InstanceReference, type : str, dst_class : InstanceReference, singular : bool = False, sibling_relationship : InstanceReference = None, global_identifier : Guid = None):
ik_current = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.Relationship), global_identifier)
self.assign_relationship(ik_current, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_source__Class), src_class)
self.assign_attribute(ik_current, self.get_instance_by_global_identifier(KnownAttributeGuids.RelationshipType), type)
self.assign_relationship(ik_current, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_destination__Class), dst_class)
self.assign_attribute(ik_current, self.get_instance_by_global_identifier(KnownAttributeGuids.Singular), singular)
if sibling_relationship is not None:
self.assign_relationship(ik_current, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_sibling__Relationship), sibling_relationship)
return ik_current
def assign_attribute(self, instance : InstanceReference, attribute : InstanceReference, value : str):
pass
def assign_relationship(self, instance : InstanceReference, relationship : InstanceReference, related_instances : InstanceReference|list):
pass
def get_attribute_value(self, inst : InstanceReference, att : InstanceReference, default_value = None):
pass
def set_attribute_value(self, inst : InstanceReference, att : InstanceReference, value):
pass
def get_instance_by_key(self, key : InstanceKey): def get_instance_by_key(self, key : InstanceKey):
pass pass
def get_instance_by_global_identifier(self, global_identifier : Guid):
pass
def get_instances(self, of_class : InstanceReference = None): def get_instances(self, of_class : InstanceReference = None):
pass pass
def get_tenant_by_name(self, tenant_name : str) -> TenantReference: def get_tenant_by_name(self, tenant_name : str) -> TenantReference:
pass pass
def create_instance_of(self, class_inst : InstanceReference, global_identifier : Guid = None):
pass
def before_init(self):
pass
def _init(self):
ik_Class = self.create_class(1, 1, 'Class', KnownClassGuids.Class)
self.create_class(1, 2, 'Attribute', KnownClassGuids.Attribute)
ik_Relationship = self.create_class(1, 3, 'Relationship', KnownClassGuids.Relationship)
self.create_class(1, 4, 'Text Attribute', KnownClassGuids.TextAttribute)
self.create_class(1, 5, 'Boolean Attribute', KnownClassGuids.BooleanAttribute)
self.create_class(1, 6, 'Element', KnownClassGuids.Element)
self.create_class(1, 20, 'Numeric Attribute', KnownClassGuids.NumericAttribute)
self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.Name)
self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.Value)
self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.Token)
rel_Relationship__has_source__Class = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.Relationship), KnownRelationshipGuids.Relationship__has_source__Class)
rel_Relationship__has_destination__Class = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.Relationship), KnownRelationshipGuids.Relationship__has_destination__Class)
rel_Relationship__has_sibling__Relationship = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.Relationship), KnownRelationshipGuids.Relationship__has_sibling__Relationship)
ik_Singular = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.BooleanAttribute), KnownAttributeGuids.Singular)
ik_RelationshipType = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.RelationshipType)
ik_User = self.create_class(1, 39, 'System User', KnownClassGuids.User)
ik_UserLogin = self.create_class(1, 4328, 'System Account Signon', KnownClassGuids.UserLogin)
ik_UserName = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.UserName)
self.assign_attribute(ik_UserName, self.get_instance_by_global_identifier(KnownAttributeGuids.Name), "User Name")
ik_PasswordHash = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.PasswordHash)
self.assign_attribute(ik_PasswordHash, self.get_instance_by_global_identifier(KnownAttributeGuids.Name), "Password Hash")
ik_PasswordSalt = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.TextAttribute), KnownAttributeGuids.PasswordSalt)
self.assign_attribute(ik_PasswordSalt, self.get_instance_by_global_identifier(KnownAttributeGuids.Name), "Password Salt")
superuser = self.create_instance_of(self.get_instance_by_global_identifier(KnownClassGuids.User), KnownInstanceGuids.User.superuser)
self.assign_attribute(superuser, ik_UserName, "superuser")
self.assign_attribute(superuser, ik_PasswordHash, "0bdbeeecd24e93a0d84ff2946c519761d4db2c52d9449d2de5bf3b74a8bcdfbee9d72bb88121a63700d09554983e7f881021ecf493f83dec19e8f7e465529c34")
self.assign_attribute(superuser, ik_PasswordSalt, "5e28b86839ed4ca9838c112723aeaa27")
self.assign_attribute(self.get_instance_by_key(InstanceKey(1, 2)), self.get_instance_by_key(InstanceKey(4, 1)), 'Attribute')
self.assign_attribute(self.get_instance_by_key(InstanceKey(1, 3)), self.get_instance_by_key(InstanceKey(4, 1)), 'Relationship')
self.assign_attribute(self.get_instance_by_key(InstanceKey(1, 4)), self.get_instance_by_key(InstanceKey(4, 1)), 'Text Attribute')
self.assign_attribute(self.get_instance_by_key(InstanceKey(4, 1)), self.get_instance_by_key(InstanceKey(4, 1)), 'Name')
self.assign_attribute(self.get_instance_by_key(InstanceKey(4, 2)), self.get_instance_by_key(InstanceKey(4, 1)), 'Value')
self.assign_attribute(self.get_instance_by_key(InstanceKey(4, 3)), self.get_instance_by_key(InstanceKey(4, 1)), 'Token')
ik_User_Login__for__User = self.create_relationship(ik_UserLogin, "for", ik_User, False, None, KnownRelationshipGuids.User_Login__has__User)
# self.create_relationship(ik_User, "has", ik_UserLogin, False, ik_User_Login__for__User, KnownRelationshipGuids.User__has__User_Login)
self.update_relationship(rel_Relationship__has_source__Class, ik_Relationship, "has source", ik_Class, True, None)
self.update_relationship(rel_Relationship__has_destination__Class, ik_Relationship, "has destination", ik_Class, True, None)
self.update_relationship(rel_Relationship__has_sibling__Relationship, ik_Relationship, "has sibling", ik_Relationship, True, None)
def update_relationship(self, relationship : InstanceReference, src_class : InstanceReference, type : str, dst_class : InstanceReference, singular: bool, sibling_relationship : InstanceReference):
self.assign_relationship(relationship, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_source__Class), src_class)
self.assign_attribute(relationship, self.get_instance_by_global_identifier(KnownAttributeGuids.RelationshipType), type)
self.assign_relationship(relationship, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_destination__Class), dst_class)
self.assign_attribute(relationship, self.get_instance_by_global_identifier(KnownAttributeGuids.Singular), singular)
if sibling_relationship is not None:
self.assign_relationship(relationship, self.get_instance_by_global_identifier(KnownRelationshipGuids.Relationship__has_sibling__Relationship), sibling_relationship)
def after_init(self):
pass
def init(self):
self.before_init()
self._init()
self.after_init()

View File

@ -1,4 +1,4 @@
from .Oms import Oms from ..Oms import Oms
class DatabaseOms(Oms): class DatabaseOms(Oms):
pass pass

View File

@ -1,5 +1,5 @@
from .Oms import Oms from .Oms import Oms
from ..db.DatabaseOms import DatabaseOms from ..DatabaseOms import DatabaseOms
from ...core import InstanceKey, InstanceReference, TenantReference from ...core import InstanceKey, InstanceReference, TenantReference

View File

@ -0,0 +1,257 @@
from ..DatabaseOms import DatabaseOms
from ....core.InstanceKey import InstanceKey
from ....core.InstanceReference import InstanceReference
import sqlite3
from framework import Guid
from ....definitions import KnownClassGuids, KnownInstanceGuids, KnownAttributeGuids, KnownRelationshipGuids
class SQLiteDatabaseOms (DatabaseOms):
def __init__(self):
self.conn = None
self.__is_open = False
def open(self, filename : str):
"""
Opens the SQLite database with the given filename.
"""
self.conn = sqlite3.Connection(filename)
self.__is_open = True
def is_open(self):
return self.__is_open
def get_next_instance_index(self, class_inst : InstanceReference):
cursor = self.conn.execute("SELECT MAX(inst_id) + 1 FROM instances WHERE class_id = ?", [ class_inst.get_instance_key().get_instance_index() ])
result = cursor.fetchone()[0]
if result is None:
result = 1
return result
def create_instance_of(self, class_inst : InstanceReference, global_identifier : Guid = None):
if global_identifier is None:
global_identifier = Guid.create()
next_iid = self.get_next_instance_index(class_inst)
result = self.conn.execute("INSERT INTO instances (class_id, inst_id, global_identifier, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [ class_inst.get_instance_key().get_instance_index(), next_iid, global_identifier.strip() ])
lastrowid = result.lastrowid
# self.conn.execute("INSERT INTO attributes (src_inst_id, att_inst_id, att_value, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [ result.lastrowid, 5, name ])
self.conn.commit()
cursor = self.conn.execute("SELECT * FROM instances WHERE id = ?", [ lastrowid ])
results = cursor.fetchall()
result = results[0]
return self.get_instance_from_database(result)
def create_class(self, class_id : int, inst_id : int, name : str, global_identifier : Guid):
print ("create class : " + str(class_id) + "$" + str(inst_id) + " [" + name + "] " + str(global_identifier) + ";")
result = self.conn.execute("INSERT INTO instances (class_id, inst_id, global_identifier, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [ class_id, inst_id, global_identifier.strip() ])
lastrowid = result.lastrowid
print ("lastrowid: " + str(result.lastrowid))
self.conn.execute("INSERT INTO attributes (src_inst_id, att_inst_id, att_value, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [ result.lastrowid, 5, name ])
self.conn.commit()
cursor = self.conn.execute("SELECT * FROM instances WHERE id = ?", [ lastrowid ])
results = cursor.fetchall()
result = results[0]
return self.get_instance_from_database(result)
def get_attributes(self, instance : InstanceReference):
if instance is None:
return [ ]
cursor = self.conn.execute("SELECT DISTINCT att_inst_id FROM attributes WHERE src_inst_id = ? AND effective_date <= CURRENT_TIMESTAMP ORDER BY effective_date DESC", [ instance.dbid ])
results = cursor.fetchall()
retval = [ ]
for result in results:
retval.append(self.get_instance_by_dbid(result[0]))
return retval
def get_relationships(self, instance : InstanceReference):
if instance is None:
return [ ]
cursor = self.conn.execute("SELECT DISTINCT rel_inst_id FROM relationships WHERE src_inst_id = ? AND effective_date <= CURRENT_TIMESTAMP ORDER BY effective_date DESC", [ instance.dbid ])
results = cursor.fetchall()
retval = [ ]
for result in results:
retval.append(self.get_instance_by_dbid(result[0]))
return retval
def get_related_instances(self, instance : InstanceReference, relationship : InstanceReference):
if instance is None:
return [ ]
if relationship is None:
return [ ]
cursor = self.conn.execute("SELECT dst_inst_id, remove_flag FROM relationships WHERE src_inst_id = ? AND rel_inst_id = ? AND effective_date <= CURRENT_TIMESTAMP ORDER BY effective_date DESC", [ instance.dbid, relationship.dbid ])
results = cursor.fetchall()
retval_ids = [ ]
retval = [ ]
for result in results:
if result[0] in retval_ids:
if result[1] == 1:
# remove flag
retval_ids.remove(result[0])
else:
retval_ids.append(result[0])
for id in retval_ids:
retval.append(self.get_instance_by_dbid(id))
return retval
def assign_attribute(self, instance : InstanceReference, attribute : InstanceReference, value : str):
self.conn.execute("INSERT INTO attributes (src_inst_id, att_inst_id, att_value, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [ instance.get_dbid(), attribute.get_dbid(), value ])
self.conn.commit()
def assign_relationship(self, instance : InstanceReference, relationship : InstanceReference, related_instances : InstanceReference|list):
if relationship is None:
raise ValueError("relationship for assign_relationship is None")
if related_instances is None:
raise ValueError("related_instances must not be None")
if isinstance(related_instances, InstanceReference):
related_instances = [ related_instances ]
if isinstance(related_instances, list):
for inst in related_instances:
if not inst is None:
self.conn.execute("INSERT INTO relationships (src_inst_id, rel_inst_id, dst_inst_id, remove_flag, effective_date) VALUES (?, ?, ?, 0, CURRENT_TIMESTAMP)", [ instance.get_dbid(), relationship.get_dbid(), inst.get_dbid() ])
else:
print("error: target inst for assign_relationship is None")
else:
print("related_instances must be either InstanceReference or list, was " + str(type(inst)))
return
self.conn.commit()
def get_instance_by_dbid(self, dbid : int) -> InstanceReference:
if self.conn is None:
return None
cursor = self.conn.execute("SELECT * FROM instances WHERE id = ? AND (effective_date IS NULL OR effective_date <= CURRENT_TIMESTAMP)", [ dbid ])
results = cursor.fetchall()
if len(results) > 0:
return self.get_instance_from_database(results[0])
return None
def get_instance_by_key(self, key : InstanceKey) -> InstanceReference:
if self.conn is None:
return None
qry = "SELECT * FROM instances WHERE class_id = " + str(key.get_class_index()) + " AND inst_id = " + str(key.get_instance_index()) + " AND (effective_date IS NULL OR effective_date <= CURRENT_TIMESTAMP)"
result = self.conn.execute(qry)
results = result.fetchall()
if len(results) > 0:
return self.get_instance_from_database(results[0])
return None
# retval = [ ]
# for res in results:
# retval.append(InstanceReference(int(res[0]), InstanceKey(int(res[1]), int(res[2])), res[3]))
# if len(retval) == 1:
# return retval[0]
# elif len(retval) == 0:
# return None
# return retval
def get_attribute_value(self, inst : InstanceReference, att : InstanceReference, default_value = None):
if inst is None or att is None:
return None
cursor = self.conn.execute("SELECT att_value FROM attributes WHERE src_inst_id = " + str(inst.dbid) + " AND att_inst_id = " + str(att.dbid) + " AND effective_date <= CURRENT_TIMESTAMP ORDER BY effective_date DESC, id DESC")
results = cursor.fetchall()
if (len(results) > 0):
return results[0][0]
return None
def set_attribute_value(self, inst : InstanceReference, att : InstanceReference, value):
if inst is None or att is None:
return
cursor = self.conn.execute("INSERT INTO attributes (src_inst_id, att_inst_id, att_value, effective_date) VALUES (?, ?, ?, CURRENT_TIMESTAMP)", [inst.dbid, att.dbid, value])
self.conn.commit()
def before_init(self):
self.conn.execute("DROP TABLE IF EXISTS instances")
self.conn.execute("DROP TABLE IF EXISTS attributes")
self.conn.execute("DROP TABLE IF EXISTS relationships")
self.conn.execute("DROP TABLE IF EXISTS relationship_instances")
self.conn.execute("CREATE TABLE instances (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, class_id INT, inst_id INT, global_identifier CHAR(32), effective_date DATETIME)")
self.conn.execute("CREATE TABLE attributes (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, src_inst_id INTEGER NOT NULL, att_inst_id INTEGER NOT NULL, att_value TEXT, effective_date DATETIME)")
# self.conn.execute("CREATE TABLE relationships (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, src_inst_id INTEGER NOT NULL, rel_inst_id INTEGER NOT NULL, effective_date DATETIME)")
# self.conn.execute("CREATE TABLE relationship_instances (rel_id INTEGER NOT NULL, inst_id INTEGER NOT NULL, remove_flag INTEGER NOT NULL, effective_date DATETIME)")
self.conn.execute("CREATE TABLE relationships (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, src_inst_id INTEGER NOT NULL, rel_inst_id INTEGER NOT NULL, dst_inst_id INTEGER NOT NULL, remove_flag INTEGER NOT NULL, effective_date DATETIME)")
def after_init(self):
self.conn.commit()
def get_instances(self, of_class : InstanceReference = None):
if of_class is not None:
cursor = self.conn.execute("SELECT * FROM instances WHERE class_id = ?", [ of_class.get_instance_key().get_instance_index() ])
results = cursor.fetchall()
insts = [ ]
for result in results:
inst = self.get_instance_from_database(result)
insts.append(inst)
return insts
else:
cursor = self.conn.execute("SELECT * FROM instances")
results = cursor.fetchall()
insts = [ ]
for result in results:
inst = self.get_instance_from_database(result)
insts.append(inst)
return insts
def get_instance_from_database(self, result):
return InstanceReference(int(result[0]), InstanceKey(int(result[1]), int(result[2])), Guid.parse(result[3]))
def get_instance_by_global_identifier(self, global_identifier : Guid):
cursor = self.conn.execute("SELECT * FROM instances WHERE global_identifier = ?", [ global_identifier.strip() ])
results = cursor.fetchall()
if len(results) > 0:
return self.get_instance_from_database(results[0])
return None
def close(self):
self.conn.close()
self.__is_open = False

View File

@ -0,0 +1 @@
from .SQLiteDatabaseOms import SQLiteDatabaseOms

Binary file not shown.

Binary file not shown.

3
python/tenant.yaml Normal file
View File

@ -0,0 +1,3 @@
- tenant: 'super'
include:
- filename: 'test.mql'

BIN
python/test.mql Normal file

Binary file not shown.

31
suv/docker-compose.yml Normal file
View File

@ -0,0 +1,31 @@
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "8008:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./vhost.d:/etc/nginx/vhost.d:ro
# gateway:
# image: httpd
# environment:
# - VIRTUAL_HOST=mocha.local
# authgwy:
# image: jwilder/whoami
themes:
image: jwilder/whoami
volumes:
- ../php/mocha/themes:/usr/local/apache2/htdocs/
tenant:
image: php:8.2-apache
# environment:
# - VIRTUAL_HOST=mocha.local
volumes:
- ../php/mocha/:/usr/local/apache2/htdocs/
- ../apache2/conf/suv.conf:/usr/local/apache2/conf/httpd.conf

12
suv/vhost.d/mocha.local Normal file
View File

@ -0,0 +1,12 @@
location /madi/authgwy {
proxy_pass http://authgwy:8000;
}
location /tenant {
proxy_pass http://tenant:80;
}
location /themes {
proxy_pass http://themes:8000;
}