SyncServer GUI - fix - reset_provider_for_file

Removed pulling sync_server from ModulesManager (not a singleton!) to
injecting object and passing everywhere
This commit is contained in:
Petr Kalis 2021-01-18 19:06:57 +01:00
parent c7c3d6b78d
commit 21e285c2cc
2 changed files with 54 additions and 52 deletions

View file

@ -118,7 +118,6 @@ class SyncServer(PypeModule, ITrayModule):
self.sync_server_thread = None # asyncio requires new thread
self.action_show_widget = None
self.connection = AvalonMongoDB()
def connect_with_modules(self, *_a, **kw):
return
@ -136,13 +135,14 @@ class SyncServer(PypeModule, ITrayModule):
self.presets = None
self.lock = threading.Lock()
self.connection = AvalonMongoDB()
self.connection.install()
try:
self.presets = self.get_synced_presets()
self.set_active_sites(self.presets)
self.sync_server_thread = SyncServerThread(self)
from .tray.app import SyncServerWindow
self.widget = SyncServerWindow()
self.widget = SyncServerWindow(self)
except ValueError:
log.info("No system setting for sync. Not syncing.", exc_info=True)
self.enabled = False
@ -654,13 +654,13 @@ class SyncServer(PypeModule, ITrayModule):
query = {
"_id": ObjectId(representation_id)
}
self.connection.Session["AVALON_PROJECT"] = collection
representation = list(self.connection.find(query))
representation = list(self.connection.database[collection].find(query))
if not representation:
raise ValueError("Representation {} not found in {}".
format(representation_id, collection))
local_site, remote_site = self.get_active_sites(collection)
local_site, remote_site = self.get_sites_for_project(collection)
if side == 'local':
site_name = local_site
else:
@ -672,7 +672,7 @@ class SyncServer(PypeModule, ITrayModule):
site_index, _ = self._get_provider_rec(files[file_index].
get('sites', []),
site_name)
if file_index > 0 and site_index > 0:
if file_index >= 0 and site_index >= 0:
elem = {"name": site_name}
update = {
"$set": {"files.{}.sites.{}".format(file_index, site_index):
@ -680,7 +680,7 @@ class SyncServer(PypeModule, ITrayModule):
}
}
self.connection.update_one(
self.connection.database[collection].update_one(
query,
update
)

View file

@ -1,12 +1,9 @@
from Qt import QtWidgets, QtCore, QtGui
from Qt.QtCore import Qt
from avalon.api import AvalonMongoDB
from pype.tools.settings.settings.widgets.base import ProjectListWidget
from pype.modules import ModulesManager
import attr
import os
from pype.tools.settings.settings import style
#from avalon import style
from avalon.tools.delegates import PrettyTimeDelegate, pretty_timestamp
from pype.lib import PypeLogger
@ -30,7 +27,7 @@ class SyncServerWindow(QtWidgets.QDialog):
Main window that contains list of synchronizable projects and summary
view with all synchronizable representations for first project
"""
def __init__(self, parent=None):
def __init__(self, sync_server, parent=None):
super(SyncServerWindow, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.Window)
self.setFocusPolicy(QtCore.Qt.StrongFocus)
@ -39,14 +36,15 @@ class SyncServerWindow(QtWidgets.QDialog):
self.setWindowIcon(QtGui.QIcon(style.app_icon_path()))
self.resize(1400, 800)
body = QtWidgets.QWidget()
footer = QtWidgets.QWidget()
body = QtWidgets.QWidget(self)
footer = QtWidgets.QWidget(self)
footer.setFixedHeight(20)
container = QtWidgets.QWidget()
projects = SyncProjectListWidget(parent=self)
projects = SyncProjectListWidget(sync_server, self)
projects.refresh() # force selection of default
repres = SyncRepresentationWidget(project=projects.current_project,
repres = SyncRepresentationWidget(sync_server,
project=projects.current_project,
parent=self)
container_layout = QtWidgets.QHBoxLayout(container)
@ -63,7 +61,7 @@ class SyncServerWindow(QtWidgets.QDialog):
body_layout.addWidget(container)
body_layout.setContentsMargins(0, 0, 0, 0)
message = QtWidgets.QLabel()
message = QtWidgets.QLabel(footer)
message.hide()
footer_layout = QtWidgets.QVBoxLayout(footer)
@ -86,6 +84,9 @@ class SyncProjectListWidget(ProjectListWidget):
"""
Lists all projects that are synchronized to choose from
"""
def __init__(self, sync_server, parent):
super(SyncProjectListWidget, self).__init__(parent)
self.sync_server = sync_server
def validate_context_change(self):
return True
@ -93,13 +94,11 @@ class SyncProjectListWidget(ProjectListWidget):
def refresh(self):
model = self.project_list.model()
model.clear()
manager = ModulesManager()
sync_server = manager.modules_by_name["sync_server"]
for project_name in sync_server.get_synced_presets().keys():
for project_name in self.sync_server.get_synced_presets().keys():
model.appendRow(QtGui.QStandardItem(project_name))
if len(sync_server.get_synced_presets().keys()) == 0:
if len(self.sync_server.get_synced_presets().keys()) == 0:
model.appendRow(QtGui.QStandardItem("No project configured"))
self.current_project = self.project_list.currentIndex().data(
@ -132,9 +131,11 @@ class SyncRepresentationWidget(QtWidgets.QWidget):
("state", 50)
)
def __init__(self, project=None, parent=None):
def __init__(self, sync_server, project=None, parent=None):
super(SyncRepresentationWidget, self).__init__(parent)
self.sync_server = sync_server
self.filter = QtWidgets.QLineEdit()
self.filter.setPlaceholderText("Filter representations..")
@ -144,7 +145,7 @@ class SyncRepresentationWidget(QtWidgets.QWidget):
self.table_view = QtWidgets.QTableView()
headers = [item[0] for item in self.default_widths]
model = SyncRepresentationModel(headers, project)
model = SyncRepresentationModel(sync_server, headers, project)
self.table_view.setModel(model)
self.table_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.table_view.setSelectionMode(
@ -185,17 +186,23 @@ class SyncRepresentationWidget(QtWidgets.QWidget):
layout.addWidget(self.table_view)
self.table_view.doubleClicked.connect(self._doubleClicked)
self.table_view.clicked.connect(self._clicked)
self.filter.textChanged.connect(lambda: model.set_filter(
self.filter.text()))
self.table_view.customContextMenuRequested.connect(
self._on_context_menu)
def _clicked(self, index):
print("clicked")
self.table_view.model()._selected_id = self.table_view.model().\
data(index, Qt.UserRole)
def _doubleClicked(self, index):
"""
Opens representation dialog with all files after doubleclick
"""
_id = self.table_view.model().data(index, Qt.UserRole)
detail_window = SyncServerDetailWindow(_id,
detail_window = SyncServerDetailWindow(self.sync_server, _id,
self.table_view.model()._project)
detail_window.exec()
@ -253,7 +260,7 @@ class SyncRepresentationModel(QtCore.QAbstractTableModel):
priority = attr.ib(default=None)
state = attr.ib(default=None)
def __init__(self, header, project=None):
def __init__(self, sync_server, header, project=None):
super(SyncRepresentationModel, self).__init__()
self._header = header
self._data = []
@ -261,19 +268,15 @@ class SyncRepresentationModel(QtCore.QAbstractTableModel):
self._rec_loaded = 0
self._buffer = [] # stash one page worth of records (actually cursor)
self.filter = None
self._selected_id = None
self._initialized = False
self.dbcon = AvalonMongoDB()
self.dbcon.install()
self.dbcon.Session["AVALON_PROJECT"] = self._project
manager = ModulesManager()
sync_server = manager.modules_by_name["sync_server"]
self.sync_server = sync_server
# TODO think about admin mode
# this is for regular user, always only single local and single remote
self.local_site, self.remote_site = \
sync_server.get_sites_for_project(self._project)
self.sync_server.get_sites_for_project(self._project)
self.projection = self.get_default_projection()
@ -290,6 +293,10 @@ class SyncRepresentationModel(QtCore.QAbstractTableModel):
self.timer.timeout.connect(self.tick)
self.timer.start(self.REFRESH_SEC)
@property
def dbcon(self):
return self.sync_server.connection.database[self._project]
def data(self, index, role):
item = self._data[index.row()]
@ -456,7 +463,6 @@ class SyncRepresentationModel(QtCore.QAbstractTableModel):
project (str): name of project
"""
self._project = project
self.dbcon.Session["AVALON_PROJECT"] = self._project
self.refresh()
def get_default_query(self, limit=0):
@ -672,7 +678,7 @@ class SyncRepresentationModel(QtCore.QAbstractTableModel):
class SyncServerDetailWindow(QtWidgets.QDialog):
def __init__(self, _id, project, parent=None):
def __init__(self, sync_server, _id, project, parent=None):
log.debug(
"!!! SyncServerDetailWindow _id:: {}".format(_id))
super(SyncServerDetailWindow, self).__init__(parent)
@ -687,11 +693,8 @@ class SyncServerDetailWindow(QtWidgets.QDialog):
footer = QtWidgets.QWidget()
footer.setFixedHeight(20)
self.dbcon = AvalonMongoDB()
self.dbcon.install()
self.dbcon.Session["AVALON_PROJECT"] = None
container = SyncRepresentationDetailWidget(_id, project, parent=self)
container = SyncRepresentationDetailWidget(sync_server, _id, project,
parent=self)
body_layout = QtWidgets.QHBoxLayout(body)
body_layout.addWidget(container)
body_layout.setContentsMargins(0, 0, 0, 0)
@ -730,17 +733,16 @@ class SyncRepresentationDetailWidget(QtWidgets.QWidget):
("remote_site", 60),
("size", 60),
("priority", 20),
("state", 50)
("state", 90)
)
def __init__(self, _id=None, project=None, parent=None):
def __init__(self, sync_server, _id=None, project=None, parent=None):
super(SyncRepresentationDetailWidget, self).__init__(parent)
self.representation_id = _id
self.item = None # set to item that mouse was clicked over
manager = ModulesManager()
self.sync_server = manager.modules_by_name["sync_server"]
self.sync_server = sync_server
self.filter = QtWidgets.QLineEdit()
self.filter.setPlaceholderText("Filter representation..")
@ -751,7 +753,8 @@ class SyncRepresentationDetailWidget(QtWidgets.QWidget):
self.table_view = QtWidgets.QTableView()
headers = [item[0] for item in self.default_widths]
model = SyncRepresentationDetailModel(headers, _id, project)
model = SyncRepresentationDetailModel(sync_server, headers, _id,
project)
self.table_view.setModel(model)
self.table_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.table_view.setSelectionMode(
@ -905,7 +908,7 @@ class SyncRepresentationDetailModel(QtCore.QAbstractTableModel):
tries = attr.ib(default=None)
error = attr.ib(default=None)
def __init__(self, header, _id, project=None):
def __init__(self, sync_server, header, _id, project=None):
super(SyncRepresentationDetailModel, self).__init__()
self._header = header
self._data = []
@ -916,16 +919,11 @@ class SyncRepresentationDetailModel(QtCore.QAbstractTableModel):
self._id = _id
self._initialized = False
self.dbcon = AvalonMongoDB()
self.dbcon.install()
self.dbcon.Session["AVALON_PROJECT"] = self._project
manager = ModulesManager()
sync_server = manager.modules_by_name["sync_server"]
self.sync_server = sync_server
# TODO think about admin mode
# this is for regular user, always only single local and single remote
self.local_site, self.remote_site = \
sync_server.get_sites_for_project(self._project)
self.sync_server.get_sites_for_project(self._project)
self.sort = self.DEFAULT_SORT
@ -943,6 +941,10 @@ class SyncRepresentationDetailModel(QtCore.QAbstractTableModel):
self.timer.timeout.connect(self.tick)
self.timer.start(SyncRepresentationModel.REFRESH_SEC)
@property
def dbcon(self):
return self.sync_server.connection.database[self._project]
def tick(self):
self.refresh(representations=None, load_records=self._rec_loaded)
self.timer.start(SyncRepresentationModel.REFRESH_SEC)
@ -1026,7 +1028,7 @@ class SyncRepresentationDetailModel(QtCore.QAbstractTableModel):
errors.append(repre.get('failed_local_error'))
item = self.SyncRepresentationDetail(
repre.get("_id"),
file.get("_id"),
os.path.basename(file["path"]),
local_updated,
remote_updated,