def eval_template(template, sobject=None, parent=None, snapshot=None): ''' generic method to values an sobject template expression''' # parse the pattern string expression = re.compile(r'{([\w|\.|\#]+\[?\d?\]?)}') temp_list = expression.findall(template) # if nothing is found, then just return parse through an expression if not temp_list: #return template # put in the ability to add expressions env_sobjects = { 'snapshot': snapshot } xp = ExpressionParser() result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects) test = template test = test.replace("{", "") test = test.replace("}", "") if test != result: return result # if nothing is found, temp_list is empty if not temp_list: temp_list = [] # the main sobject if sobject: project = sobject.get_project() else: project = Project.get() result = template for part in temp_list: if part.find(".") != -1: # explict declarasions object, attr = part.split(".") index = -1 if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": value = sobject.get_value(attr) elif object == "parent": if not parent: parent = sobject.get_parent() if parent: value = parent.get_value(attr) else: value = '' elif object in ["login", "user"]: login = Environment.get_security().get_login() value = login.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) if index != -1: value = re.split("[/._]", value) value = value[index] else: value = part result = result.replace("{%s}" % part, str(value)) return result
def naming_to_dir(my, template, sobject, snapshot, file=None, file_type=None): ''' # shot/SEQ001/shot_001 ''' # the main sobject project = sobject.get_project() # parse the pattern string expression = re.compile(r'{([\w|\.|\#]+\[?\d?\]?)}') temp_list = expression.findall(template) # if nothing is found, then just return parse through an expression if not temp_list: #return template # put in the ability to add expressions from pyasm.biz import ExpressionParser xp = ExpressionParser() env_sobjects = { 'snapshot': snapshot, 'file': file } result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects) test = template test = test.replace("{", "") test = test.replace("}", "") if test != result: return result # version padding defaults version_padding = Config.get_value("checkin", "version_padding") if version_padding: version_padding = int(version_padding) else: version_padding = 3 version_expr = "%%0.%dd" % version_padding # use simplified expressions result = template for part in temp_list: index = -1 if part.find(".") != -1: # explict declarasions object, attr = part.split(".") if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": if attr == "timestamp": value = my._get_timestamp(sobject) else: value = sobject.get_value(attr) elif object == "snapshot": if not snapshot: continue if attr == "timestamp": value = my._get_timestamp(snapshot) else: value = snapshot.get_value(attr) if attr in ['version', 'revision']: if value: value = version_expr % int(value) else: value = "0"*version_padding elif object == "search_type": search_type_obj = sobject.get_search_type_obj() value = search_type_obj.get_value(attr) elif object == "parent": parent = sobject.get_parent() if not parent: value = "NO_PARENT" else: if attr == 'timestamp': value = my._get_timestamp(parent) else: value = parent.get_value(attr) elif object == "project": project = Project.get() value = project.get_value(attr) elif object in ["login","user"]: login = Environment.get_login() value = login.get_value(attr) elif object == "file": if attr == 'file_type': if file_type: value = file_type else: value = 'main' else: value = file.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) else: # use implicit declarations attr = part if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if attr in ['context','snapshot_type','version','revision'] \ and not snapshot: continue if attr == "context": value = snapshot.get_value(attr) elif attr == "snapshot_type": value = snapshot.get_value(attr) elif attr == "version": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr == "revision": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr.startswith("#"): if not snapshot: continue value = snapshot.get_value("version") expr = "%%0.%sd" % len(attr) if value: value = expr % int(value) else: value = "0" * len(attr) elif attr.startswith("id"): value = "%0.5d" % sobject.get_id() elif attr in ["login","user"]: login = Environment.get_login() value = login.get_value("login") elif attr == "file_type": if file_type: value = file_type else: value = 'main' else: if attr == "timestamp": value = my._get_timestamp(sobject) else: value = sobject.get_value(attr) if index != -1: value = re.split("[/]", value) if len(value) <= index: value = '!' else: try: value = value[index] except IndexError, e: value = "" if not sobject.is_insert() and not value: value = "" #raise NamingException("Naming convention error: Value for part [%s] is empty" % part) if isinstance(value, int): value = str(value) result = result.replace("{%s}" % part, value)
def naming_to_file(my, template, sobject, snapshot, file=None, ext=None, file_type=None): ''' # chr001_model_v004_00001.ext ''' version_padding = Config.get_value("checkin", "version_padding") if version_padding: version_padding = int(version_padding) else: version_padding = 3 version_expr = "%%0.%dd" % version_padding # the main sobject project = sobject.get_project() # parse the pattern string expression = re.compile(r'{([\w|\.|\#]+\[?\d?\]?)}') temp_list = expression.findall(template) # if nothing is found, then just return parse through an expression if not temp_list: #return template # put in the ability to add expressions from pyasm.biz import ExpressionParser xp = ExpressionParser() env_sobjects = { 'snapshot': snapshot, 'file': file } file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': base = file_name ext = None else: base, ext = os.path.splitext(file_name) if not ext: value = None else: # external ext starts with a . ext = ext.lstrip(".") value = ext vars = {'EXT': value, 'BASEFILE': base} result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects, vars=vars) test = template test = test.replace("{", "") test = test.replace("}", "") # don't allow / in filename test = test.replace("/", "_") if test != result: return result result = template for part in temp_list: index = -1 if part.find(".") != -1: # explict declarations object, attr = part.split(".") if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": value = sobject.get_value(attr) elif object == "snapshot": if not snapshot: continue value = snapshot.get_value(attr) if attr in ['version', 'revision']: if value: value = version_expr % int(value) else: value = "0"*version_padding #value = snapshot.get_value(attr) elif object == "file": if attr == 'file_type': if file_type: value = file_type else: value = 'main' else: value = file.get_value(attr) elif object == "parent": parent = sobject.get_parent() if not parent: value = "NO_PARENT" else: value = parent.get_value(attr) elif object in ["login","user"]: login = Environment.get_login() value = login.get_value(attr) elif object == "project": project = Project.get() value = project.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) else: # use implicit declarations attr = part if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if attr == "context": value = snapshot.get_value(attr) elif attr == "snapshot_type": value = snapshot.get_value(attr) elif attr == "version": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr == "revision": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr.startswith("#"): if not snapshot: continue value = snapshot.get_value("version") expr = "%%0.%sd" % len(attr) if value: value = expr % int(value) else: value = "0" * len(attr) elif attr == "basefile": file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': value = file_name else: base, ext = os.path.splitext(file_name) value = base elif attr == "ext": if not ext: file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': value = '' else: base, ext = os.path.splitext(file_name) value = ext.lstrip(".") else: # external ext starts with a . ext = ext.lstrip(".") value = ext elif attr in ["login","user"]: login = Environment.get_login() value = login.get_value("login") elif attr == "file_type": if file_type: value = file_type else: value = 'main' elif attr.startswith('date'): # {date,%Y-%m-%d_%H-%M-%S]} import time parts = attr.split(",", 1) if len(parts) == 2: format = parts[1] else: format = "%Y%m%d" value = time.strftime(format, time.localtime()) else: value = sobject.get_value(attr) # tbis applies to context for now if index != -1: value = re.split("[/]", value) if len(value) <= index: value = '!' else: value = value[index] #if not value: # raise NamingException("Value for part [%s] is empty" % part) if isinstance(value, int): value = str(value) result = result.replace("{%s}" % part, value) # don't allow / in filename, # FIXME: it's not put in get_filesystem_name since it # is used for directory name also, need to modify that result = result.replace("/", "_") # post process result so that it looks good result = Common.get_filesystem_name(result) return result
def eval_template(template, sobject=None, parent=None, snapshot=None): ''' generic method to values an sobject template expression. ''' #NOTE: no file kwarg # parse the pattern string #expression = re.compile(r'{([\w|\.|\#]+\[?\d?\]?)}') expression = re.compile(r'{(.*?)}') temp_list = expression.findall(template) # if nothing is found, then just return parse through an expression xp = ExpressionParser() if not temp_list: #return template # put in the ability to add expressions env_sobjects = { 'snapshot': snapshot } result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects) test = template test = test.replace("{", "") test = test.replace("}", "") if test != result: return result # if nothing is found, temp_list is empty if not temp_list: temp_list = [] # the main sobject if sobject: project = sobject.get_project() else: project = Project.get() result = template for part in temp_list: index = -1 if part.startswith(("@","$")): env_sobjects = { 'snapshot': snapshot, } value = xp.eval("{%s}" % part, sobject, env_sobjects=env_sobjects, vars=vars, single=True) elif part.find(".") != -1: # explict declarasions object, attr = part.split(".") if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": value = sobject.get_value(attr) elif object == "parent": if not parent: parent = sobject.get_parent() if parent: value = parent.get_value(attr) else: value = '' elif object in ["login", "user"]: login = Environment.get_security().get_login() value = login.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) if index != -1: value = re.split("[/._]", value) value = value[index] else: value = part result = result.replace("{%s}" % part, str(value)) return result
def naming_to_dir(my, template, sobject, snapshot, file=None, file_type=None): ''' # shot/SEQ001/shot_001 ''' # the main sobject project = sobject.get_project() # parse the pattern string expression = re.compile(r'{(.*?)}') temp_list = expression.findall(template) from pyasm.biz import ExpressionParser xp = ExpressionParser() ''' # if nothing is found, then just return parse through an expression if not temp_list: #return template # put in the ability to add expressions env_sobjects = { 'snapshot': snapshot, 'file': file } result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects) test = template test = test.replace("{", "") test = test.replace("}", "") if test != result: return result ''' # version padding defaults version_padding = Config.get_value("checkin", "version_padding") if version_padding: version_padding = int(version_padding) else: version_padding = 3 version_expr = "%%0.%dd" % version_padding # use simplified expressions result = template for part in temp_list: index = -1 if part.startswith(("@","$")): env_sobjects = { 'snapshot': snapshot, 'file': file } value = xp.eval("{%s}" % part, sobject, env_sobjects=env_sobjects, single=True) elif part.find(".") != -1: # explict declarasions object, attr = part.split(".") if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": if attr == "timestamp": value = my._get_timestamp(sobject) else: value = sobject.get_value(attr) elif object == "snapshot": if not snapshot: continue if attr == "timestamp": value = my._get_timestamp(snapshot) else: value = snapshot.get_value(attr) if attr in ['version', 'revision']: if value: value = version_expr % int(value) else: value = "0"*version_padding elif object == "search_type": search_type_obj = sobject.get_search_type_obj() value = search_type_obj.get_value(attr) elif object == "parent": parent = sobject.get_parent() if not parent: value = "NO_PARENT" else: if attr == 'timestamp': value = my._get_timestamp(parent) else: value = parent.get_value(attr) elif object == "project": project = Project.get() value = project.get_value(attr) elif object in ["login","user"]: login = Environment.get_login() value = login.get_value(attr) elif object == "file": if attr == 'file_type': if file_type: value = file_type else: value = 'main' else: value = file.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) else: # use implicit declarations attr = part if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if attr in ['context','process','snapshot_type','version','revision'] \ and not snapshot: continue if attr in ["context","process","snapshot_type"]: value = snapshot.get_value(attr) elif attr == "version": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr == "revision": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr.startswith("#"): if not snapshot: continue value = snapshot.get_value("version") expr = "%%0.%sd" % len(attr) if value: value = expr % int(value) else: value = "0" * len(attr) elif attr.startswith("id"): value = "%0.5d" % sobject.get_id() elif attr in ["login","user"]: login = Environment.get_login() value = login.get_value("login") elif attr == "file_type": if file_type: value = file_type else: value = 'main' else: if attr == "timestamp": value = my._get_timestamp(sobject) else: value = sobject.get_value(attr) if index != -1: value = re.split("[/]", value) if len(value) <= index: value = '!' else: try: value = value[index] except IndexError, e: value = "" if not sobject.is_insert() and not value: value = "" #raise NamingException("Naming convention error: Value for part [%s] is empty" % part) if isinstance(value, int): value = str(value) result = result.replace("{%s}" % part, value)
def naming_to_file(my, template, sobject, snapshot, file=None, ext=None, file_type=None): ''' # chr001_model_v004_00001.ext ''' version_padding = Config.get_value("checkin", "version_padding") if version_padding: version_padding = int(version_padding) else: version_padding = 3 version_expr = "%%0.%dd" % version_padding # the main sobject project = sobject.get_project() # parse the pattern string expression = re.compile(r'{(.*?)}') #expression = re.compile(r'{([\w|\.|\#]+\[?\d?\]?)}') temp_list = expression.findall(template) result = template from pyasm.biz import ExpressionParser xp = ExpressionParser() # if nothing is found, then just return parse through an expression ''' if not temp_list: #return template # put in the ability to add expressions env_sobjects = { 'snapshot': snapshot, 'file': file } file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': base = file_name ext = None else: base, ext = os.path.splitext(file_name) if not ext: value = None else: # external ext starts with a . ext = ext.lstrip(".") value = ext vars = {'EXT': value, 'BASEFILE': base} result = xp.eval(template, sobject, mode='string', env_sobjects=env_sobjects, vars=vars) test = template test = test.replace("{", "") test = test.replace("}", "") # don't allow / in filename test = test.replace("/", "_") if test != result: return result ''' base = None if file: file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': base = file_name ext = None else: base, file_ext = os.path.splitext(file_name) # passed in ext takes prescedence if not ext: ext = file_ext if not ext: value = None else: # external ext starts with a . ext = ext.lstrip(".") value = ext vars = {'EXT': value, 'BASEFILE': base} for part in temp_list: index = -1 if part.startswith(("@","$")): env_sobjects = { 'snapshot': snapshot, 'file': file } value = xp.eval("{%s}" % part, sobject, env_sobjects=env_sobjects, vars=vars, single=True) elif part.find(".") != -1: # explict declarations object, attr = part.split(".") if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if object == "sobject": value = sobject.get_value(attr) elif object == "snapshot": if not snapshot: continue value = snapshot.get_value(attr) if attr in ['version', 'revision']: if value: value = version_expr % int(value) else: value = "0"*version_padding #value = snapshot.get_value(attr) elif object == "file": if attr == 'file_type': if file_type: value = file_type else: value = 'main' else: value = file.get_value(attr) elif object == "parent": parent = sobject.get_parent() if not parent: value = "NO_PARENT" else: value = parent.get_value(attr) elif object in ["login","user"]: login = Environment.get_login() value = login.get_value(attr) elif object == "project": project = Project.get() value = project.get_value(attr) else: raise NamingException("Can't parse part [%s] in template" % part) else: # use implicit declarations attr = part if attr.endswith(']'): # ugly, but it works attr, index = attr.split("[") index = int(index.rstrip("]")) if attr in ["context","process","snapshot_type"]: value = snapshot.get_value(attr) elif attr == "version": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr == "revision": value = snapshot.get_value(attr) if value: value = version_expr % int(value) else: value = "0"*version_padding elif attr.startswith("#"): if not snapshot: continue value = snapshot.get_value("version") expr = "%%0.%sd" % len(attr) if value: value = expr % int(value) else: value = "0" * len(attr) elif attr == "basefile": file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': value = file_name else: base, ext = os.path.splitext(file_name) value = base elif attr == "ext": if not ext: file_name = file.get_value("file_name") base_type = file.get_value("base_type") if base_type =='directory': value = '' else: base, ext = os.path.splitext(file_name) value = ext.lstrip(".") else: # external ext starts with a . ext = ext.lstrip(".") value = ext elif attr in ["login","user"]: login = Environment.get_login() value = login.get_value("login") elif attr == "file_type": if file_type: value = file_type else: value = 'main' elif attr.startswith('date'): # {date,%Y-%m-%d_%H-%M-%S]} import time parts = attr.split(",", 1) if len(parts) == 2: format = parts[1] else: format = "%Y%m%d" value = time.strftime(format, time.localtime()) else: value = sobject.get_value(attr) # tbis applies to context for now if index != -1: value = re.split("[/]", value) if len(value) <= index: value = '!' else: value = value[index] #if not value: # raise NamingException("Value for part [%s] is empty" % part) if isinstance(value, int): value = str(value) elif value is None: value = "" result = result.replace("{%s}" % part, value) # don't allow / in filename, # FIXME: it's not put in get_filesystem_name since it # is used for directory name also, need to modify that result = result.replace("/", "_") # remove trailing . if any if result and result[-1] == '.': result = result[:-1] # post process result so that it looks good result = Common.get_filesystem_name(result) return result