diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md new file mode 100644 index 0000000..cbd82bd --- /dev/null +++ b/PRIVACY_POLICY.md @@ -0,0 +1,78 @@ +# Privacy Policy for cometrics +## Date: Aug 2022 + +The developer of cometrics is mindful of the security and protection of user data and patient data. This Privacy Policy document explains the types of information that are collected and recorded by cometrics and in which situations the developers will have access to generated data. + +By using cometrics, you hereby consent to this Privacy Policy and agree to its terms and conditions. + +## Information cometrics collects + +Cometrics automatically collects computer resource usage, file names, and errors encountered into standard log files that are stored on the computer that cometrics is installed on. Only users of that computer with appropriate privileges can view these records. + +Cometrics, as part of its functionality, will log and record keystroke information, behavioral data, physiological data, control parameters for external devices, session dates and times, and, possibly, personally identifiable information about a patient that falls under HIPAA restrictions. Cometrics saves this data in the location specified by the user in the creation of their project. This may or may not be a shared computer network or server system that other users have access to. This data can only be accessed by users with permissions to access the data folders on the computer system it is stored on. Cometrics does not send this data to any person or computer system other than the computer system pointed to by the user. + +Cometrics does not log or transmit any usage data, user data, or patient data to any server or computer system that is under the control of the developer or visible to any other third party. + +## How is data collected + +Feedback data is sent and stored on https://github.com in our public code repository located at https://github.com/Munroe-Meyer-Institute-VR-Laboratory/cometrics. This data is public and includes the feedback text, feedback type, and feedback title that is provided using the built-in submission user interface in cometrics. + +## Why is this data collected + +This feedback data is collected and stored publicly on our public code repository to improve the functionality of cometrics and provide semi-anonymized feedback with minimal user friction. This data allows the developer and maintainer of cometrics to isolate, identify, and resolve problems that are affecting the user base. + +## Who can see this collected data + +This data is public and accessible by any individual with an internet capable computing device. + +## When is this data collected + +This data is only collected by voluntarily submitting feedback through the built-in feedback function within cometrics. + +## Where is this data stored + +Submitted feedback can be found and monitored here https://github.com/Munroe-Meyer-Institute-VR-Laboratory/cometrics/issues. + +## Third parties + +No data is sold, shared, or controlled by third parties. + +## When will data be deleted + +Data will be deleted if it is determined that the feedback contains personally identifiable information as it relates to patient data, private usernames, or private logins. If a request is made to remove feedback, it will be deleted within a month. Requests can be made to wsarcera@gmail.com. + +## CCPA Privacy Rights (Do Not Sell My Personal Information) + +Under the CCPA, among other rights, California consumers have the right to: + +Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers. + +Request that a business delete any personal data about the consumer that a business has collected. + +Request that a business that sells a consumer's personal data, not sell the consumer's personal data. + +If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us. + +## GDPR Data Protection Rights + +We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following: + +The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service. + +The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete. + +The right to erasure – You have the right to request that we erase your personal data, under certain conditions. + +The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions. + +The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions. + +The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions. + +If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us. + +## Children's Information + +Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity. + +Cometrics does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records. diff --git a/cometrics.py b/cometrics.py index 8c060d6..5e06ae2 100644 --- a/cometrics.py +++ b/cometrics.py @@ -1,6 +1,5 @@ import os import sys -import gc # Custom library imports import traceback from tkinter import messagebox @@ -18,7 +17,7 @@ from logger_util import CreateLogger, log_startup from logger_util.logger_util import get_process_memory from project_setup_ui import ProjectSetupWindow -from ui_params import cometrics_data_root, cometrics_ver_root +from ui_params import cometrics_data_root, cometrics_ver_root, cometrics_version def main(config_file, first_time_user): @@ -36,7 +35,7 @@ def main(config_file, first_time_user): CreateLogger(os.path.join(cometrics_ver_root, 'logs')) # Log computer information log_startup() - print(f"STARTUP: {cwd}") + print(f"STARTUP: {cometrics_version}") print(f"INFO: imageio_ffmpeg exe location - {imageio_ffmpeg.get_ffmpeg_exe()}") # Load our configuration config = ConfigUtils() diff --git a/cx_exe_setup.py b/cx_exe_setup.py index 86cc605..77cecf1 100644 --- a/cx_exe_setup.py +++ b/cx_exe_setup.py @@ -1,9 +1,16 @@ import sys +import markdown from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. from ui_params import cometrics_version +with open('PRIVACY_POLICY.md', 'r') as f: + text = f.read() + html = markdown.markdown(text) +with open('reference/PRIVACY_POLICY.html', 'w') as f: + f.write(html) + base = None if sys.platform == "win32": base = "Win32GUI" @@ -52,7 +59,7 @@ build_exe_options = dict( packages=["os", "sys", "tkinter", 'logger_util', 'scipy'], includes=['pynput', 'pynput.keyboard._win32', 'pynput.mouse._win32', 'logger_util', 'scipy._lib.deprecation'], - excludes=[], + excludes=['markdown'], include_files=['external_bin', 'images', 'reference', 'config.yml', 'LICENSE', (r'venv\Lib\site-packages\imageio', r'lib\imageio')], ) @@ -61,7 +68,12 @@ 'add_to_path': False, 'initial_target_dir': r'[ProgramFilesFolder]\%s\%s' % ("cometrics", cometrics_version), 'data': msi_data, - 'upgrade_code': '{9DD1C082-2D1D-4AC5-9150-22CA5DF3D780}' + 'upgrade_code': '{9DD1C082-2D1D-4AC5-9150-22CA5DF3D780}', + "summary_data": { + "author": "Walker Arce", + "comments": "Copyright (C) 2022", + }, + "install_icon": r'images\icon.ico', } executable = [Executable("cometrics.py", @@ -75,7 +87,11 @@ setup(name="cometrics", version=cometrics_version, + author_email="wsarcera@gmail.com", + url="https://github.com/Munroe-Meyer-Institute-VR-Laboratory/cometrics/issues", + author="Walker Arce", description=f'cometrics v{cometrics_version}', options={"bdist_msi": bdist_msi_options, "build_exe": build_exe_options}, - executables=executable) + executables=executable + ) diff --git a/menu_bar.py b/menu_bar.py index 90954dd..aa01a7e 100644 --- a/menu_bar.py +++ b/menu_bar.py @@ -42,9 +42,16 @@ def __init__(self, parent, caller, *args, **kwargs): help_menu.add_command(label="Open Current Directory", command=self.open_current_dir) help_menu.add_command(label="Download E4 Streaming Server", command=self.download_e4_ss) help_menu.add_command(label="Open Source Code", command=self.open_source_code) + help_menu.add_command(label="View Privacy Policy", command=self.view_privacy_policy) help_menu.add_command(label="Submit Feedback", command=self.submit_feedback) menu.add_cascade(label="Help", menu=help_menu) + @staticmethod + def view_privacy_policy(): + config = ConfigUtils() + cwd = config.get_cwd() + webbrowser.open_new_tab(os.path.join(cwd, 'reference/PRIVACY_POLICY.html')) + def submit_feedback(self): log_pattern = r'*.txt' latest_log_file = max(pathlib.Path(os.path.join(cometrics_ver_root, 'logs')).glob(log_pattern), diff --git a/project_setup_ui.py b/project_setup_ui.py index ba35f53..1b0caea 100644 --- a/project_setup_ui.py +++ b/project_setup_ui.py @@ -183,6 +183,11 @@ def __init__(self, config, first_time_user): self.main_root.deiconify() center(self.main_root) if first_time_user: + response = messagebox.askyesno("Privacy Policy", "Open privacy policy?\n" + "By using cometrics, you hereby consent to this Privacy " + "Policy and agree to its terms and conditions.") + if response: + MenuBar.view_privacy_policy() # Display link to user guide response = messagebox.askyesno("Welcome to cometrics!", "Would you like to open the user guide for cometrics?") diff --git a/reference/Cometrics User Guide.pdf b/reference/Cometrics User Guide.pdf index 9100fd7..635424d 100644 Binary files a/reference/Cometrics User Guide.pdf and b/reference/Cometrics User Guide.pdf differ diff --git a/reference/PRIVACY_POLICY.html b/reference/PRIVACY_POLICY.html new file mode 100644 index 0000000..1d2773b --- /dev/null +++ b/reference/PRIVACY_POLICY.html @@ -0,0 +1,40 @@ +
The developer of cometrics is mindful of the security and protection of user data and patient data. This Privacy Policy document explains the types of information that are collected and recorded by cometrics and in which situations the developers will have access to generated data.
+By using cometrics, you hereby consent to this Privacy Policy and agree to its terms and conditions.
+Cometrics automatically collects computer resource usage, file names, and errors encountered into standard log files that are stored on the computer that cometrics is installed on. Only users of that computer with appropriate privileges can view these records.
+Cometrics, as part of its functionality, will log and record keystroke information, behavioral data, physiological data, control parameters for external devices, session dates and times, and, possibly, personally identifiable information about a patient that falls under HIPAA restrictions. Cometrics saves this data in the location specified by the user in the creation of their project. This may or may not be a shared computer network or server system that other users have access to. This data can only be accessed by users with permissions to access the data folders on the computer system it is stored on. Cometrics does not send this data to any person or computer system other than the computer system pointed to by the user.
+Cometrics does not log or transmit any usage data, user data, or patient data to any server or computer system that is under the control of the developer or visible to any other third party.
+Feedback data is sent and stored on https://github.com in our public code repository located at https://github.com/Munroe-Meyer-Institute-VR-Laboratory/cometrics. This data is public and includes the feedback text, feedback type, and feedback title that is provided using the built-in submission user interface in cometrics.
+This feedback data is collected and stored publicly on our public code repository to improve the functionality of cometrics and provide semi-anonymized feedback with minimal user friction. This data allows the developer and maintainer of cometrics to isolate, identify, and resolve problems that are affecting the user base.
+This data is public and accessible by any individual with an internet capable computing device.
+This data is only collected by voluntarily submitting feedback through the built-in feedback function within cometrics.
+Submitted feedback can be found and monitored here https://github.com/Munroe-Meyer-Institute-VR-Laboratory/cometrics/issues.
+No data is sold, shared, or controlled by third parties.
+Data will be deleted if it is determined that the feedback contains personally identifiable information as it relates to patient data, private usernames, or private logins. If a request is made to remove feedback, it will be deleted within a month. Requests can be made to wsarcera@gmail.com.
+Under the CCPA, among other rights, California consumers have the right to:
+Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers.
+Request that a business delete any personal data about the consumer that a business has collected.
+Request that a business that sells a consumer's personal data, not sell the consumer's personal data.
+If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
+We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:
+The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service.
+The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete.
+The right to erasure – You have the right to request that we erase your personal data, under certain conditions.
+The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions.
+The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions.
+The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.
+If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.
+Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.
+Cometrics does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.
\ No newline at end of file diff --git a/tkinter_utils.py b/tkinter_utils.py index a4be174..95f9000 100644 --- a/tkinter_utils.py +++ b/tkinter_utils.py @@ -9,13 +9,11 @@ from tkinter import TOP, W, N, NW, messagebox, END, ttk, filedialog, INSERT from tkinter.ttk import Style, Combobox from tkinter.ttk import Treeview - import numpy as np from PIL import ImageTk as itk from github import Github from logger_util import parse_log from tkvideoutils import ImageLabel - from ui_params import treeview_default_tag_dict, cometrics_ver_root @@ -1047,7 +1045,6 @@ def submit_issue(self): if desc == '\n' or desc == self.default_desc_text + '\n': messagebox.showerror("Error", "Enter a description of the issue encountered!") return - desc = desc + '\n'.join(self.log_file[0]) + '\n'.join(self.log_file[3]) label_set = self.label_var.get() if label_set == "Select a Label": messagebox.showerror("Error", "Select a label for the issue encountered!") @@ -1057,15 +1054,25 @@ def submit_issue(self): messagebox.showerror("Error", "Enter a title for the issue encountered!") return - g = Github(self.token) - repo = g.get_repo("Munroe-Meyer-Institute-VR-Laboratory/cometrics") - - repo.create_issue( - title=title, - body=desc, - labels=[ - repo.get_label(label_set.lower()) - ] - ) - messagebox.showinfo("Success!", "Feedback has been submitted!") + response = messagebox.askyesno("Submit?", "You are submitting a feedback ticket to the developer.\n" + "The feedback provided in the textbox will be posted to a public" + "repository.\n" + "Details of this feedback collection can be found in our Privacy Policy.\n" + "Continue?") + if response: + try: + g = Github(self.token) + repo = g.get_repo('Munroe-Meyer-Institute-VR-Laboratory/cometrics') + + repo.create_issue( + title=title, + body=desc, + labels=[ + repo.get_label(label_set.lower()) + ] + ) + messagebox.showinfo("Success!", "Feedback has been submitted!") + except Exception as e: + messagebox.showerror("Error", f"An exception was encountered!\n{str(e)}") + print(f"ERROR: An exception was encountered!\n{str(e)}") self.popup_root.destroy() diff --git a/ui_params.py b/ui_params.py index 4e3c0f7..c4f2319 100644 --- a/ui_params.py +++ b/ui_params.py @@ -1,4 +1,4 @@ -cometrics_version = "1.3.0" +cometrics_version = "1.3.1" ui_title = f"cometrics v{cometrics_version}" cometrics_data_root = fr'C:\cometrics' diff --git a/user_guide/Cometrics User Guide_v8.docx b/user_guide/Cometrics User Guide_v9.docx similarity index 89% rename from user_guide/Cometrics User Guide_v8.docx rename to user_guide/Cometrics User Guide_v9.docx index 9f2f517..42bba20 100644 Binary files a/user_guide/Cometrics User Guide_v8.docx and b/user_guide/Cometrics User Guide_v9.docx differ diff --git a/user_guide/Cometrics User Guide_v9.pdf b/user_guide/Cometrics User Guide_v9.pdf new file mode 100644 index 0000000..635424d Binary files /dev/null and b/user_guide/Cometrics User Guide_v9.pdf differ