Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

SiteSync: fix transitive alternate sites, fix dropdown in Local Settings #3018

Merged
merged 5 commits into from
Apr 8, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions openpype/modules/sync_server/sync_server_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -848,6 +848,11 @@ def _get_enabled_sites_from_settings(self, sync_settings):
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):
Expand Down
83 changes: 64 additions & 19 deletions openpype/plugins/publish/integrate_new.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import six
import re
import shutil
from collections import deque

from bson.objectid import ObjectId
from pymongo import DeleteOne, InsertOne
Expand Down Expand Up @@ -1116,18 +1117,17 @@ def prepare_file_info(self, path, size=None, file_hash=None,
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
Expand Down Expand Up @@ -1158,22 +1158,67 @@ def _add_alternative_sites(self,
"""
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 = {}
iLLiCiTiT marked this conversation as resolved.
Show resolved Hide resolved
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
if not alt_site_pairs.get(site_name):
alt_site_pairs[site_name] = []

alt_site_pairs[site_name].extend(alt_sites)

for alt_site in alt_sites:
if not alt_site_pairs.get(alt_site):
alt_site_pairs[alt_site] = []
alt_site_pairs[alt_site].extend([site_name])

# transitive relationship, eg site is alternative to another which is
# alternative to nex site
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

return rec
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
Expand Down