Merge pull request #3018 from pypeclub/bugfix/fix_alternate_sites

SiteSync: fix transitive alternate sites, fix dropdown in Local Settings
This commit is contained in:
Petr Kalis 2022-04-08 17:39:15 +02:00 committed by GitHub
commit 92bf8d0035
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 19 deletions

View file

@ -848,6 +848,11 @@ class SyncServerModule(OpenPypeModule, ITrayModule):
if self.enabled and sync_settings.get('enabled'):
sites.append(self.LOCAL_SITE)
active_site = sync_settings["config"]["active_site"]
# for Tray running background process
if active_site not in sites and active_site == get_local_site_id():
sites.append(active_site)
return sites
def tray_init(self):

View file

@ -8,6 +8,7 @@ import errno
import six
import re
import shutil
from collections import deque, defaultdict
from bson.objectid import ObjectId
from pymongo import DeleteOne, InsertOne
@ -1116,18 +1117,17 @@ class IntegrateAssetNew(pyblish.api.InstancePlugin):
rec["sites"].append(meta)
already_attached_sites[meta["name"]] = None
# add alternative sites
rec, already_attached_sites = self._add_alternative_sites(
system_sync_server_presets, already_attached_sites, rec)
# add skeleton for site where it should be always synced to
for always_on_site in always_accesible:
for always_on_site in set(always_accesible):
if always_on_site not in already_attached_sites.keys():
meta = {"name": always_on_site.strip()}
rec["sites"].append(meta)
already_attached_sites[meta["name"]] = None
# add alternative sites
rec = self._add_alternative_sites(system_sync_server_presets,
already_attached_sites,
rec)
log.debug("final sites:: {}".format(rec["sites"]))
return rec
@ -1158,22 +1158,60 @@ class IntegrateAssetNew(pyblish.api.InstancePlugin):
"""
conf_sites = system_sync_server_presets.get("sites", {})
alt_site_pairs = self._get_alt_site_pairs(conf_sites)
already_attached_keys = list(already_attached_sites.keys())
for added_site in already_attached_keys:
real_created = already_attached_sites[added_site]
for alt_site in alt_site_pairs.get(added_site, []):
if alt_site in already_attached_sites.keys():
continue
meta = {"name": alt_site}
# alt site inherits state of 'created_dt'
if real_created:
meta["created_dt"] = real_created
rec["sites"].append(meta)
already_attached_sites[meta["name"]] = real_created
return rec, already_attached_sites
def _get_alt_site_pairs(self, conf_sites):
"""Returns dict of site and its alternative sites.
If `site` has alternative site, it means that alt_site has 'site' as
alternative site
Args:
conf_sites (dict)
Returns:
(dict): {'site': [alternative sites]...}
"""
alt_site_pairs = defaultdict(list)
for site_name, site_info in conf_sites.items():
alt_sites = set(site_info.get("alternative_sites", []))
already_attached_keys = list(already_attached_sites.keys())
for added_site in already_attached_keys:
if added_site in alt_sites:
if site_name in already_attached_keys:
continue
meta = {"name": site_name}
real_created = already_attached_sites[added_site]
# alt site inherits state of 'created_dt'
if real_created:
meta["created_dt"] = real_created
rec["sites"].append(meta)
already_attached_sites[meta["name"]] = real_created
alt_site_pairs[site_name].extend(alt_sites)
return rec
for alt_site in alt_sites:
alt_site_pairs[alt_site].append(site_name)
for site_name, alt_sites in alt_site_pairs.items():
sites_queue = deque(alt_sites)
while sites_queue:
alt_site = sites_queue.popleft()
# safety against wrong config
# {"SFTP": {"alternative_site": "SFTP"}
if alt_site == site_name or alt_site not in alt_site_pairs:
continue
for alt_alt_site in alt_site_pairs[alt_site]:
if (
alt_alt_site != site_name
and alt_alt_site not in alt_sites
):
alt_sites.append(alt_alt_site)
sites_queue.append(alt_alt_site)
return alt_site_pairs
def handle_destination_files(self, integrated_file_sizes, mode):
""" Clean destination files