diff --git a/pype/ftrack/actions/ftrack_action_handler.py b/pype/ftrack/actions/ftrack_action_handler.py index d147a2630b..3b4610de55 100644 --- a/pype/ftrack/actions/ftrack_action_handler.py +++ b/pype/ftrack/actions/ftrack_action_handler.py @@ -353,6 +353,7 @@ class AppAction(object): task = session.query('Task where id is {}'.format(entity['id'])).one() self.log.info('Starting timer for task: ' + task['name']) user.start_timer(task, force=True) + os.environ["FTRACK_LAST_TASK_ID"] = entity['id'] return { 'success': True, diff --git a/pype/ftrack/ftrack_run.py b/pype/ftrack/ftrack_run.py index 99ec2ec841..f084514c40 100644 --- a/pype/ftrack/ftrack_run.py +++ b/pype/ftrack/ftrack_run.py @@ -1,7 +1,6 @@ import sys import os -import argparse -import subprocess +import json import threading import time import ftrack_api @@ -168,7 +167,6 @@ class FtrackRunner: if self.bool_timer_event is False: self.start_timer_thread() - def start_timer_thread(self): if self.thread_timer is None: self.thread_timer = FtrackEventsThread(self) @@ -197,7 +195,7 @@ class FtrackRunner: def stop_countdown_thread(self): if self.thread_timer_coundown is not None: - self.thread_timer_coundown.runs=False + self.thread_timer_coundown.runs = False self.thread_timer_coundown.terminate() self.thread_timer_coundown.wait() self.thread_timer_coundown = None @@ -209,7 +207,8 @@ class FtrackRunner: # self.widget_timer.activateWindow() def change_count_widget(self, time): - self.widget_timer.lbl_rest_time.setText(str(time)) + str_time = str(time).replace(".0", "") + self.widget_timer.lbl_rest_time.setText(str_time) def timer_started(self): self.start_countdown_thread() @@ -225,22 +224,32 @@ class FtrackRunner: if self.thread_timer_coundown is not None: self.stop_countdown_thread() + def timer_restart(self): + if self.thread_timer is not None: + self.thread_timer.signal_restart_timer.emit() + + self.timer_started() + def timer_continue(self): if self.thread_timer_coundown is not None: self.thread_timer_coundown.signal_continue_timer.emit() + class FtrackEventsThread(QtCore.QThread): # Senders signal_timer_started = QtCore.Signal() signal_timer_stopped = QtCore.Signal() # Listeners signal_stop_timer = QtCore.Signal() + signal_restart_timer = QtCore.Signal() def __init__(self, parent): super(FtrackEventsThread, self).__init__() cred = credentials._get_credentials() self.username = cred['username'] self.signal_stop_timer.connect(self.ftrack_stop_timer) + self.signal_restart_timer.connect(self.ftrack_restart_timer) + self.user = None def run(self): self.timer_session = ftrack_api.Session(auto_connect_event_hub=True) @@ -248,6 +257,9 @@ class FtrackEventsThread(QtCore.QThread): 'topic=ftrack.update and source.user.username={}'.format(self.username), self.event_handler) + query = 'User where username is "{}"'.format(self.username) + self.user = self.timer_session.query(query).one() + self.timer_session.event_hub.wait() def event_handler(self, event): @@ -256,9 +268,10 @@ class FtrackEventsThread(QtCore.QThread): return except: return + new = event['data']['entities'][0]['changes']['start']['new'] old = event['data']['entities'][0]['changes']['start']['old'] - self.userId = event['source']['user']['id'] + if old is None and new is None: return elif old is None: @@ -268,12 +281,25 @@ class FtrackEventsThread(QtCore.QThread): def ftrack_stop_timer(self): try: - user = self.timer_session.query('User where id is ' + self.userId).one() - user.stop_timer() + self.user.stop_timer() self.timer_session.commit() except Exception as e: log.debug("Timer stop had issues: {}".format(e)) + def ftrack_restart_timer(self): + try: + last_task = None + if "FTRACK_LAST_TASK_ID" in os.environ: + task_id = os.environ["FTRACK_LAST_TASK_ID"] + query = 'Task where id is {}'.format(task_id) + last_task = self.timer_session.query(query).one() + + if (last_task is not None) and (self.user is not None): + self.user.start_timer(last_task) + self.timer_session.commit() + except Exception as e: + log.debug("Timer stop had issues: {}".format(e)) + class CountdownThread(QtCore.QThread): # Senders @@ -287,10 +313,12 @@ class CountdownThread(QtCore.QThread): def __init__(self, parent): super(CountdownThread, self).__init__() + self.runs = True self.over_line = False - self.count_length = 60*5 # 5 minutes - self.border_line = 31 + config_data = self.load_timer_values() + self.count_length = config_data['full_time']*60 + self.border_line = config_data['message_time']*60 + 1 self.reset_count() self.signal_reset_timer.connect(self.reset_count) self.signal_continue_timer.connect(self.continue_timer) @@ -335,6 +363,38 @@ class CountdownThread(QtCore.QThread): thread_keyboard.terminate() thread_keyboard.wait() + def load_timer_values(self): + templates = os.environ['PYPE_STUDIO_TEMPLATES'] + path_items = [templates, 'presets', 'ftrack', 'ftrack_config.json'] + filepath = os.path.sep.join(path_items) + data = dict() + try: + with open(filepath) as data_file: + json_dict = json.load(data_file) + data = json_dict['timer'] + except Exception as e: + msg = 'Loading "Ftrack Config file" Failed. Please check log for more information. Times are set to default.' + self.log.warning("{} - {}".format(msg, str(e))) + + data = self.validate_timer_values(data) + + return data + + def validate_timer_values(self, data): + # default values + if 'full_time' not in data: + data['full_time'] = 15 + if 'message_time' not in data: + data['message_time'] = 0.5 + + # minimum values + if data['full_time'] < 2: + data['full_time'] = 2 + # message time is earlier that full time + if data['message_time'] > data['full_time']: + data['message_time'] = data['full_time'] - 0.5 + return data + class MouseThread(QtCore.QThread): signal_stop = QtCore.Signal() @@ -377,6 +437,7 @@ class KeyboardThread(QtCore.QThread): self.k_listener = keyboard.Listener(on_press=self.on_press) self.k_listener.start() + class StopTimer(QtWidgets.QWidget): SIZE_W = 300 @@ -419,31 +480,31 @@ class StopTimer(QtWidgets.QWidget): msg_info = "You didn't work for a long time." msg_question = "Would you like to stop Ftrack timer?" - msg_stopped = "Your Ftrack timer was stopped!" + msg_stopped = "Your Ftrack timer was stopped. Do you want to start again?" self.lbl_info = QtWidgets.QLabel(msg_info) self.lbl_info.setFont(self.font) self.lbl_info.setTextFormat(QtCore.Qt.RichText) self.lbl_info.setObjectName("lbl_info") - self.lbl_info.setWordWrap(True); + self.lbl_info.setWordWrap(True) self.lbl_question = QtWidgets.QLabel(msg_question) self.lbl_question.setFont(self.font) self.lbl_question.setTextFormat(QtCore.Qt.RichText) self.lbl_question.setObjectName("lbl_question") - self.lbl_question.setWordWrap(True); + self.lbl_question.setWordWrap(True) self.lbl_stopped = QtWidgets.QLabel(msg_stopped) self.lbl_stopped.setFont(self.font) self.lbl_stopped.setTextFormat(QtCore.Qt.RichText) self.lbl_stopped.setObjectName("lbl_stopped") - self.lbl_stopped.setWordWrap(True); + self.lbl_stopped.setWordWrap(True) self.lbl_rest_time = QtWidgets.QLabel("") self.lbl_rest_time.setFont(self.font) self.lbl_rest_time.setTextFormat(QtCore.Qt.RichText) self.lbl_rest_time.setObjectName("lbl_rest_time") - self.lbl_rest_time.setWordWrap(True); + self.lbl_rest_time.setWordWrap(True) self.lbl_rest_time.setAlignment(QtCore.Qt.AlignCenter) self.form.addRow(self.lbl_info) @@ -463,13 +524,18 @@ class StopTimer(QtWidgets.QWidget): self.btn_continue.setToolTip('Timer will continue') self.btn_continue.clicked.connect(self.continue_timer) - self.btn_ok = QtWidgets.QPushButton("OK") - self.btn_ok.setToolTip('Close window') - self.btn_ok.clicked.connect(self.close_widget) + self.btn_close = QtWidgets.QPushButton("Close") + self.btn_close.setToolTip('Close window') + self.btn_close.clicked.connect(self.close_widget) + + self.btn_restart = QtWidgets.QPushButton("Start timer") + self.btn_restart.setToolTip('Timer will be started again') + self.btn_restart.clicked.connect(self.restart_timer) self.group_btn.addWidget(self.btn_continue) self.group_btn.addWidget(self.btn_stop) - self.group_btn.addWidget(self.btn_ok) + self.group_btn.addWidget(self.btn_restart) + self.group_btn.addWidget(self.btn_close) self.main.addLayout(self.form) self.main.addLayout(self.group_btn) @@ -483,12 +549,17 @@ class StopTimer(QtWidgets.QWidget): self.btn_continue.setVisible(self.main_context) self.btn_stop.setVisible(self.main_context) - self.btn_ok.setVisible(not self.main_context) + self.btn_restart.setVisible(not self.main_context) + self.btn_close.setVisible(not self.main_context) def stop_timer(self): self.parent.timer_stop() self.close_widget() + def restart_timer(self): + self.parent.timer_restart() + self.close_widget() + def continue_timer(self): self.parent.timer_continue() self.close_widget()