mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 13:24:54 +01:00
Sites are configured in System Schemas and defaults were modified All providers carry dict of modifiable properties for Local Settings
167 lines
4.3 KiB
Python
167 lines
4.3 KiB
Python
from Qt import QtCore
|
|
import attr
|
|
import abc
|
|
import six
|
|
|
|
from openpype.lib import PypeLogger
|
|
|
|
|
|
log = PypeLogger().get_logger("SyncServer")
|
|
|
|
STATUS = {
|
|
0: 'In Progress',
|
|
1: 'Queued',
|
|
2: 'Failed',
|
|
3: 'Paused',
|
|
4: 'Synced OK',
|
|
-1: 'Not available'
|
|
}
|
|
|
|
DUMMY_PROJECT = "No project configured"
|
|
|
|
ProviderRole = QtCore.Qt.UserRole + 2
|
|
ProgressRole = QtCore.Qt.UserRole + 4
|
|
DateRole = QtCore.Qt.UserRole + 6
|
|
FailedRole = QtCore.Qt.UserRole + 8
|
|
HeaderNameRole = QtCore.Qt.UserRole + 10
|
|
FullItemRole = QtCore.Qt.UserRole + 12
|
|
EditIconRole = QtCore.Qt.UserRole + 14
|
|
|
|
|
|
@six.add_metaclass(abc.ABCMeta)
|
|
class AbstractColumnFilter:
|
|
|
|
def __init__(self, column_name, dbcon=None):
|
|
self.column_name = column_name
|
|
self.dbcon = dbcon
|
|
self._search_variants = []
|
|
|
|
def search_variants(self):
|
|
"""
|
|
Returns all flavors of search available for this column,
|
|
"""
|
|
return self._search_variants
|
|
|
|
@abc.abstractmethod
|
|
def values(self):
|
|
"""
|
|
Returns dict of available values for filter {'label':'value'}
|
|
"""
|
|
pass
|
|
|
|
@abc.abstractmethod
|
|
def prepare_match_part(self, values):
|
|
"""
|
|
Prepares format valid for $match part from 'values
|
|
|
|
Args:
|
|
values (dict): {'label': 'value'}
|
|
Returns:
|
|
(dict): {'COLUMN_NAME': {'$in': ['val1', 'val2']}}
|
|
"""
|
|
pass
|
|
|
|
|
|
class PredefinedSetFilter(AbstractColumnFilter):
|
|
|
|
def __init__(self, column_name, values):
|
|
super().__init__(column_name)
|
|
self._search_variants = ['checkbox']
|
|
self._values = values
|
|
if self._values and \
|
|
list(self._values.keys())[0] == list(self._values.values())[0]:
|
|
self._search_variants.append('text')
|
|
|
|
def values(self):
|
|
return {k: v for k, v in self._values.items()}
|
|
|
|
def prepare_match_part(self, values):
|
|
return {'$in': list(values.keys())}
|
|
|
|
|
|
class RegexTextFilter(AbstractColumnFilter):
|
|
|
|
def __init__(self, column_name):
|
|
super().__init__(column_name)
|
|
self._search_variants = ['text']
|
|
|
|
def values(self):
|
|
return {}
|
|
|
|
def prepare_match_part(self, values):
|
|
""" values = {'text1 text2': 'text1 text2'} """
|
|
if not values:
|
|
return {}
|
|
|
|
regex_strs = set()
|
|
text = list(values.keys())[0] # only single key always expected
|
|
for word in text.split():
|
|
regex_strs.add('.*{}.*'.format(word))
|
|
|
|
return {"$regex": "|".join(regex_strs),
|
|
"$options": 'i'}
|
|
|
|
|
|
class MultiSelectFilter(AbstractColumnFilter):
|
|
|
|
def __init__(self, column_name, values=None, dbcon=None):
|
|
super().__init__(column_name)
|
|
self._values = values
|
|
self.dbcon = dbcon
|
|
self._search_variants = ['checkbox']
|
|
|
|
def values(self):
|
|
if self._values:
|
|
return {k: v for k, v in self._values.items()}
|
|
|
|
recs = self.dbcon.find({'type': self.column_name}, {"name": 1,
|
|
"_id": -1})
|
|
values = {}
|
|
for item in recs:
|
|
values[item["name"]] = item["name"]
|
|
return dict(sorted(values.items(), key=lambda it: it[1]))
|
|
|
|
def prepare_match_part(self, values):
|
|
return {'$in': list(values.keys())}
|
|
|
|
|
|
@attr.s
|
|
class FilterDefinition:
|
|
type = attr.ib()
|
|
values = attr.ib(factory=list)
|
|
|
|
|
|
def pretty_size(value, suffix='B'):
|
|
for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']:
|
|
if abs(value) < 1024.0:
|
|
return "%3.1f%s%s" % (value, unit, suffix)
|
|
value /= 1024.0
|
|
return "%.1f%s%s" % (value, 'Yi', suffix)
|
|
|
|
|
|
def convert_progress(value):
|
|
try:
|
|
progress = float(value)
|
|
except (ValueError, TypeError):
|
|
progress = 0.0
|
|
|
|
return progress
|
|
|
|
|
|
def translate_provider_for_icon(sync_server, project, site):
|
|
"""
|
|
Get provider for 'site'
|
|
|
|
This is used for getting icon, 'studio' should have different icon
|
|
then local sites, even the provider 'local_drive' is same
|
|
|
|
"""
|
|
if site == sync_server.DEFAULT_SITE:
|
|
return sync_server.DEFAULT_SITE
|
|
return sync_server.get_provider_for_site(site=site)
|
|
|
|
|
|
def get_item_by_id(model, object_id):
|
|
index = model.get_index(object_id)
|
|
item = model.data(index, FullItemRole)
|
|
return item
|