Exemple #1
0
 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
Exemple #2
0
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"]
Exemple #3
0
    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