def refresh(cls, skelValues): super().refresh(skelValues) if conf.get("viur.viur2import.blobsource"): importData = importBlobFromViur2(skelValues["dlkey"]) if importData: if not skelValues["downloadUrl"]: skelValues["downloadUrl"] = importData skelValues["pendingparententry"] = False
def importBlobFromViur2(dlKey, fileName): if not conf.get("viur.viur2import.blobsource"): return False existingImport = db.Get(db.Key("viur-viur2-blobimport", dlKey)) if existingImport: if existingImport["success"]: return existingImport["dlurl"] return False if conf["viur.viur2import.blobsource"]["infoURL"]: try: importDataReq = urlopen( conf["viur.viur2import.blobsource"]["infoURL"] + dlKey) except: marker = db.Entity(db.Key("viur-viur2-blobimport", dlKey)) marker["success"] = False marker["error"] = "Failed URL-FETCH 1" db.Put(marker) return False if importDataReq.status != 200: marker = db.Entity(db.Key("viur-viur2-blobimport", dlKey)) marker["success"] = False marker["error"] = "Failed URL-FETCH 2" db.Put(marker) return False importData = json.loads(importDataReq.read()) oldBlobName = conf["viur.viur2import.blobsource"][ "gsdir"] + "/" + importData["key"] srcBlob = storage.Blob( bucket=bucket, name=conf["viur.viur2import.blobsource"]["gsdir"] + "/" + importData["key"]) else: oldBlobName = conf["viur.viur2import.blobsource"]["gsdir"] + "/" + dlKey srcBlob = storage.Blob( bucket=bucket, name=conf["viur.viur2import.blobsource"]["gsdir"] + "/" + dlKey) if not srcBlob.exists(): marker = db.Entity(db.Key("viur-viur2-blobimport", dlKey)) marker["success"] = False marker["error"] = "Local SRC-Blob missing" marker["oldBlobName"] = oldBlobName db.Put(marker) return False bucket.rename_blob(srcBlob, "%s/source/%s" % (dlKey, fileName)) marker = db.Entity(db.Key("viur-viur2-blobimport", dlKey)) marker["success"] = True marker["old_src_key"] = dlKey marker["old_src_name"] = fileName marker["dlurl"] = utils.downloadUrlFor(dlKey, fileName, False, None) db.Put(marker) return marker["dlurl"]
def unserialize(self, skel: 'viur.core.skeleton.SkeletonInstance', name: str) -> bool: """ Inverse of serialize. Evaluates whats read from the datastore and populates this bone accordingly. :param name: The property-name this bone has in its Skeleton (not the description!) :type name: str :param expando: An instance of the dictionary-like db.Entity class :type expando: db.Entity :returns: bool """ if name in skel.dbEntity: loadVal = skel.dbEntity[name] elif conf.get("viur.viur2import.blobsource") and any( [x.startswith("%s." % name) for x in skel.dbEntity.keys()]): # We're importing from an old ViUR2 instance - there may only be keys prefixed with our name loadVal = None else: skel.accessedValues[name] = self.getDefaultValue(skel) return False if self.languages and self.multiple: res = {} if isinstance(loadVal, dict) and "_viurLanguageWrapper_" in loadVal: for language in self.languages: res[language] = [] if language in loadVal: tmpVal = loadVal[language] if not isinstance(tmpVal, list): tmpVal = [tmpVal] for singleValue in tmpVal: res[language].append( self.singleValueUnserialize( singleValue, skel, name)) else: # We could not parse this, maybe it has been written before languages had been set? for language in self.languages: res[language] = [] mainLang = self.languages[0] if loadVal is None: pass elif isinstance(loadVal, list): for singleValue in loadVal: res[mainLang].append( self.singleValueUnserialize( singleValue, skel, name)) else: # Hopefully it's a value stored before languages and multiple has been set res[mainLang].append( self.singleValueUnserialize(loadVal, skel, name)) elif self.languages: res = {} if isinstance(loadVal, dict) and "_viurLanguageWrapper_" in loadVal: for language in self.languages: res[language] = None if language in loadVal: tmpVal = loadVal[language] if isinstance(tmpVal, list) and tmpVal: tmpVal = tmpVal[0] res[language] = self.singleValueUnserialize( tmpVal, skel, name) else: # We could not parse this, maybe it has been written before languages had been set? for language in self.languages: res[language] = None oldKey = "%s.%s" % (name, language) if oldKey in skel.dbEntity and skel.dbEntity[oldKey]: res[language] = self.singleValueUnserialize( skel.dbEntity[oldKey], skel, name) loadVal = None # Don't try to import later again, this format takes precedence mainLang = self.languages[0] if loadVal is None: pass elif isinstance(loadVal, list) and loadVal: res[mainLang] = self.singleValueUnserialize( loadVal, skel, name) else: # Hopefully it's a value stored before languages and multiple has been set res[mainLang] = self.singleValueUnserialize( loadVal, skel, name) elif self.multiple: res = [] if isinstance(loadVal, dict) and "_viurLanguageWrapper_" in loadVal: # Pick one language we'll use if conf["viur.defaultLanguage"] in loadVal: loadVal = loadVal[conf["viur.defaultLanguage"]] else: loadVal = [x for x in loadVal.values() if x is not True] if loadVal and not isinstance(loadVal, list): loadVal = [loadVal] if loadVal: for val in loadVal: res.append(self.singleValueUnserialize(val, skel, name)) else: # Not multiple, no languages res = None if isinstance(loadVal, dict) and "_viurLanguageWrapper_" in loadVal: # Pick one language we'll use if conf["viur.defaultLanguage"] in loadVal: loadVal = loadVal[conf["viur.defaultLanguage"]] else: loadVal = [x for x in loadVal.values() if x is not True] if loadVal and isinstance(loadVal, list): loadVal = loadVal[0] if loadVal is not None: res = self.singleValueUnserialize(loadVal, skel, name) skel.accessedValues[name] = res return True