def onSelectionDataAvailable(self, req): data = NetworkService.decode(req) assert self.data["dest"]["key"] == data["values"]["key"] self.data["dest"] = data["values"] self.updateLabel() self.previewImg.setFile(self.data["dest"])
def onSelectionDataAvailable(self, req): """ We just received the full information for this entry from the server and can start displaying it """ data = NetworkService.decode(req) assert self.selection["dest"]["key"] == data["values"]["key"] if self.using: res = (utils.formatString( utils.formatString(self.format, data["values"], data["structure"], prefix=["dest"], language=conf["currentlanguage"]), self.selection["rel"], self.using, prefix=["rel"], language=conf["currentlanguage"]) or data["values"]["key"]) else: res = (utils.formatString( utils.formatString(self.format, data["values"], data["structure"], prefix=["dest"], language=conf["currentlanguage"]), data["values"], data["structure"], language=conf["currentlanguage"]) or data["values"]["key"]) self.selectionTxt["value"] = res
def onCheckUpdate(self) -> None: data = NetworkService.decode(self.req) self.req.deleteLater() try: currentVersion = float(open("version.dat", "r").read()) except: currentVersion = 0.0 needsUpdate = False for skel in data["skellist"]: rev = float(skel["version"]) if rev > currentVersion: if not self.targetVersion or self.targetVersion < rev: fn = "%sfile" % self.getPlattform() if fn in skel and skel[fn]: self.targetVersion = rev self.targetDL = skel[fn]["dlkey"] self.addLog("%s: %s" % (rev, skel["changelog"])) needsUpdate = True if needsUpdate: self.showUpdateBtn() self.addLog( QtCore.QCoreApplication.translate( "Updater", "Updates avaiable. Ready to upgrade.")) else: self.showExitBtn() self.addLog( QtCore.QCoreApplication.translate( "Updater", "There is no new version avaiable.")) self.overlay.clear()
def onRequestSucceded(self, req): if not req in self._currentRequests: return self._currentRequests.remove(req) data = NetworkService.decode(req) for skel in data["skellist"]: if req.reqType == "node": n = self.nodeWidget(self.module, skel, data["structure"]) else: n = self.leafWidget(self.module, skel, data["structure"]) self.entryFrame.appendChild(n) self.entryFrame.sortChildren(self.getChildKey) if "cursor" in data.keys() and len(data["skellist"]) == req.params["amount"]: self._currentCursor[req.reqType] = data["cursor"] req.params["cursor"] = data["cursor"] r = NetworkService.request(self.module, "list/%s" % req.reqType, req.params, successHandler=self.onRequestSucceded, failureHandler=self.showErrorMsg) r.reqType = req.reqType self._currentRequests.append(r) else: self._currentCursor[req.reqType] = None self.actionBar.resetLoadingState()
def onTaskListAvailable(self, req): data = NetworkService.decode(req) if not "skellist" in data.keys() or not data["skellist"]: conf["tasks"]["server"] = [] self.hide() return conf["tasks"]["server"] = data["skellist"]
def _onRequestViewsAvailable(self, req): self.requestedViews = NetworkService.decode(req) self._buildViewPanes(self.requestedViews, register=True) conf["mainWindow"].unlock() if not self.isExpanded: super(ListHandler, self).onClick()
def onSetDefaultRootNode(self, req): """ We requested the list of rootNodes for that module and that request just finished. Parse the respone and set our rootNode to the first rootNode received. """ data = NetworkService.decode( req ) if len(data)>0: self.setRootNode( data[0]["key"])
def parseAnswer(self, req): res = re.search("JSON\(\((.*)\)\)", req.result) if res: answ = json.loads(res.group(1)) else: answ = NetworkService.decode(req) return answ
def nextChunkComplete(self, req): answ = NetworkService.decode(req) if self.structure is None: self.structure = answ["structure"] if not answ["skellist"]: self.exportToFile() return self.data.extend(answ["skellist"]) self.nextChunk(answ["cursor"])
def _onRequestViewsAvailable(self, req): self.requestedViews = NetworkService.decode(req) self._buildViewPanes(self.requestedViews, register=True, requested=True) self.unlock() if not self.isExpanded: if self.mode == "normal": super(ListHandler, self).onClick() elif self.childPanes: self.childPanes[0].onClick()
def onRootNodesAvailable(self, req): res = NetworkService.decode( req ) for node in res: option = html5.Option() option["value"] = node["key"] option.appendChild( html5.TextNode( node[ "name"] ) ) if node["key"] == self.parent().parent().rootNode: option["selected"] = True self.appendChild( option ) if len(self.children()) > 1 and not self.parent().parent().context: self.show() else: self.hide()
def onUserTestSuccess(self, req): """ We received a response from the server """ try: data = NetworkService.decode(req) except: self.showMessage() return if self.isCurrentlyFailed: if conf["currentUser"] != None and conf["currentUser"][ "key"] == data["values"]["key"]: self.hideMessage()
def onGetAuthMethodsSuccess(self, req): answ = NetworkService.decode(req) methods = [] for method in answ: handler = loginHandlerSelector.select(method[0], method[1]) if not handler: print("Warning: Login-Handler \"%s\" with second factor \"%s\" unknown" % (method[0], method[1])) continue # Check if this handler is already inserted! if not any([c.__class__.__name__ == handler.__name__ for c in self.loginMethodSelector._children]): handler(self) self.haveLoginHandlers = True self.invoke()
def doSkipLogin(self, req): answ = NetworkService.decode(req) if answ.get("action") != "view": self.doShowLogin() return conf["currentUser"] = answ["values"] if conf["vi.access.rights"]: if not any([x in conf["currentUser"].get("access", []) for x in conf["vi.access.rights"]]): self.insufficientRights() return #self.loginScreen.redirectNoAdmin() print("User already logged in") conf["theApp"].admin()
def setIndexSuccess(self, req): answ = NetworkService.decode(req) if answ["action"] == "setSortIndexSuccess": table = self.getDataTable() if DynaTable and isinstance(table, DynaTable): data = table.data else: data = table._model data[req.src]["sortindex"] = float(answ["values"]["sortindex"]) print("retrieved new sortindex", data[req.src]["sortindex"]) self.switchRows(req.src, req.dst)
def showErrorMsg(self, req=None, code=None): """ Removes all currently visible elements and displays an error message """ try: print(req.result) print(NetworkService.decode(req)) except: pass if code and (code==401 or code==403): txt = translate("Access denied!") else: txt = translate("An error occurred: {code}", code=code or 0) conf["mainWindow"].log("error", txt) if self.wasInitialRequest: conf["mainWindow"].removeWidget(self)
def onCompletion(self, req): """ Pass the rows received to the datatable. @param req: The network request that succeed. """ if not req in self._currentRequests: return self._currentRequests.remove(req) self.actionBar.resetLoadingState() data = NetworkService.decode(req) if data["structure"] is None: if self.table.getRowCount(): self.table.setDataProvider( None) #We cant load any more results else: self.table["style"]["display"] = "none" self.emptyNotificationDiv["style"]["display"] = "" #self.element.innerHTML = "<center><strong>Keine Ergebnisse</strong></center>" return self.table["style"]["display"] = "" self.emptyNotificationDiv["style"]["display"] = "none" self._structure = data["structure"] if not self._tableHeaderIsValid: if not self.columns: self.columns = [] for boneName, boneInfo in data["structure"]: if boneInfo["visible"]: self.columns.append(boneName) self.setFields(self.columns) if data["skellist"] and "cursor" in data.keys(): self._currentCursor = data["cursor"] self.table.setDataProvider(self) else: self.table.setDataProvider(None) self.table.extend(data["skellist"])
def onSkeyAvailable(self, req): """ Internal callback - the Security-Key is known. """ formData = eval("new FormData();") formData.append("file", req.file) if self.context: for k, v in self.context.items(): formData.append(k, v) if req.node and str(req.node) != "null": formData.append("node", req.node) formData.append("skey", NetworkService.decode(req)) self.xhr = eval("new XMLHttpRequest()") self.xhr.open("POST", req.destUrl) self.xhr.onload = self.onLoad self.xhr.upload.onprogress = self.onProgress self.xhr.send(formData)
def onPathRequestSucceded(self, req): """ Rebuild the displayed path-list according to request data """ answ = NetworkService.decode(req) skel = answ["values"] if skel["parentdir"] and skel["parentdir"] != skel["key"]: c = NodeWidget(self.module, skel, []) NetworkService.request( self.module, "view/node/%s" % skel["parentdir"], successHandler=self.onPathRequestSucceded ) else: c = NodeWidget(self.module, {"key": self.rootNode, "name": "root"}, []) c.addClass("is_rootnode") self.pathList.prependChild(c)
def onRequestSucceded(self, req): """ The NetworkRequest for a (sub)node finished. Create a new HierarchyItem for each entry received and add them to our view """ if not req in self._currentRequests: #Prevent inserting old (stale) data self.actionBar.resetLoadingState() return self._currentRequests.remove(req) data = NetworkService.decode(req) if req.node == self.rootNode: ol = self.entryFrame else: tmp = self.itemForKey(req.node) ol = tmp.ol assert ol is not None for skel in data["skellist"]: hi = HierarchyItem( self.module, skel, data["structure"] ) ol.appendChild( hi ) if hi.data["key"] in self._expandedNodes: hi.toggleExpand() if not hi.isLoaded: hi.isLoaded = True self.loadNode(hi.data["key"]) if not ol._children and ol != self.entryFrame: ol.parent()["class"].append("has_no_childs") if data["skellist"] and data["cursor"]: self.loadNode(req.node, data["cursor"]) self.actionBar.resetLoadingState()
def onModuleViewAvailable(self, req): answ = NetworkService.decode(req) self.data["dest"] = answ["values"] self.updateLabel()
def getCurrentUserSuccess(self, req): answ = NetworkService.decode(req) conf["currentUser"] = answ["values"] self.startup()
def setData( self, request=None, data=None, ignoreMissing=False ): """ Rebuilds the UI according to the skeleton received from server @param request: A finished NetworkService request @type request: NetworkService @type data: dict @param data: The data received """ assert (request or data) if request: data = NetworkService.decode( request ) try: skelStructure = {k: v for k, v in data["structure"]} except AttributeError: NetworkService.notifyChange(self.module) conf["mainWindow"].removeWidget( self ) return print print("data", data) print("action", data["action"]) if "action" in data and (data["action"] in ["addSuccess", "editSuccess"]): NetworkService.notifyChange(self.module) logDiv = html5.Div() logDiv["class"].append("msg") spanMsg = html5.Span() spanMsg.appendChild( html5.TextNode( translate("Entry saved!") )) spanMsg["class"].append("msgspan") logDiv.appendChild(spanMsg) if self.module in conf["modules"].keys(): spanMsg = html5.Span() spanMsg.appendChild( html5.TextNode( conf["modules"][self.module]["name"] )) spanMsg["class"].append("modulspan") logDiv.appendChild(spanMsg) if "values" in data.keys() and "name" in data["values"].keys(): spanMsg = html5.Span() spanMsg.appendChild( html5.TextNode( str(data["values"]["name"]) )) spanMsg["class"].append("namespan") logDiv.appendChild(spanMsg) conf["mainWindow"].log("success",logDiv) if self.closeOnSuccess: conf["mainWindow"].removeWidget( self ) return self.clear() # self.bones = {} self.reloadData() return self.clear() self.actionbar.resetLoadingState() self.dataCache = data fieldSets = {} cat = "byweek" fs = html5.Fieldset() fs["class"] = cat if cat=="byweek": fs["class"].append("active") fs["name"] = cat legend = html5.Legend() fshref = fieldset_A() fshref.appendChild(html5.TextNode(cat) ) legend.appendChild( fshref ) fs.appendChild(legend) section = html5.Section() fs.appendChild(section) fs._section = section fieldSets[ cat ] = fs self.dtstart = data["values"]["startdate"] startdateLabel = html5.Label("Termin") startdateLabel["class"].append("termin") startdateLabel["class"].append("date") startdate_id = "vi_%s_%s_edit_bn_%s" % ( self.editIdx, self.module, "repeatdate") startdateLabel["for"] = startdate_id startdate = date.DateViewBoneDelegate("termin", "startdate", skelStructure).render(data["values"], "startdate") startdate["id"] = startdate_id containerDiv = html5.Div() containerDiv.appendChild(startdateLabel) containerDiv.appendChild(startdate) containerDiv["class"].append("bone") containerDiv["class"].append("bone_startdate") containerDiv["class"].append("date") fieldSets[ cat ]._section.appendChild( containerDiv ) countLabel = html5.Label("Wiederholungen") countLabel["class"].append("count") countLabel["class"].append("numeric") count_id = "vi_%s_%s_edit_bn_%s" % ( self.editIdx, self.module, "count") countLabel["for"] = count_id self.count = html5.Input() self.count["id"] = count_id containerDiv2 = html5.Div() containerDiv2["class"].append("bone") containerDiv2["class"].append("bone_count") containerDiv2["class"].append("date") containerDiv2.appendChild(countLabel) containerDiv2.appendChild(self.count) # containerDiv3 = html5.Div() # self.byweekday = list() # for key, value in [["MO", "Mo"], ["TU", "Di"], ["TH", "Mi"], ["WE", "Do"], ["FR", "Fr"], ["SA", "Sa"], ["SU", "So"]]: # alabel=html5.Label() # acheckbox=html5.Input() # acheckbox["type"]="checkbox" # acheckbox["name"]=key # alabel.appendChild(acheckbox) # aspan=html5.Span() # aspan.element.innerHTML=value # alabel.appendChild(aspan) # containerDiv3.appendChild(alabel) # containerDiv2["class"].append("bone") # containerDiv2["class"].append("bone_count") # containerDiv2["class"].append("byweekday") # self.byweekday.append(acheckbox) fieldSets[ cat ]._section.appendChild(containerDiv2) # fieldSets[ cat ]._section.appendChild(containerDiv3) for (k,v) in fieldSets.items(): if not "active" in v["class"]: v["class"].append("active") tmpList = [(k,v) for (k,v) in fieldSets.items()] tmpList.sort( key=lambda x:x[0]) for k,v in tmpList: self.form.appendChild( v ) v._section = None
def onSetDefaultRootNode(self, req): data = NetworkService.decode(req) if len(data) > 0: self.setRootNode(data[0]["key"], self.node)
def setData(self, request=None, data=None, ignoreMissing=False, askHierarchyCloning=True): """ Rebuilds the UI according to the skeleton received from server :param request: A finished NetworkService request :type request: NetworkService :type data: dict :param data: The data received """ assert (request or data) if request: data = NetworkService.decode(request) if "action" in data and (data["action"] == "addSuccess" or data["action"] == "editSuccess"): self.modified = False logDiv = html5.Div() logDiv["class"].append("msg") spanMsg = html5.Span() spanMsg.appendChild( html5.TextNode( translate( self.logaction ) ) ) spanMsg["class"].append("msgspan") logDiv.appendChild(spanMsg) if self.module in conf["modules"].keys(): spanMsg = html5.Span() if self.module.startswith( "_" ): spanMsg.appendChild( html5.TextNode( self.key ) ) else: spanMsg.appendChild( html5.TextNode( conf["modules"][self.module]["name"] )) spanMsg["class"].append("modulespan") logDiv.appendChild(spanMsg) if "values" in data.keys() and "name" in data["values"].keys(): spanMsg = html5.Span() name = data["values"].get("name") or data["values"].get("key", "") if isinstance(name, dict): if conf["currentlanguage"] in name.keys(): name = name[conf["currentlanguage"]] else: name = name.values() if isinstance(name, list): name = ", ".join(name) spanMsg.appendChild(html5.TextNode(str(html5.utils.unescape(name)))) spanMsg["class"].append("namespan") logDiv.appendChild(spanMsg) try: self.key = data["values"]["key"] except: self.key = None conf["mainWindow"].log("success",logDiv) if askHierarchyCloning and self.clone: # for lists, which are rootNode entries of hierarchies, ask to clone entire hierarchy if self.applicationType == EditWidget.appList and "rootNodeOf" in conf[ "modules" ][ self.module ]: YesNoDialog( translate( u"Do you want to clone the entire hierarchy?" ), yesCallback=self.doCloneHierarchy, noCallback=self.closeOrContinue ) return # for cloning within a hierarchy, ask for cloning all subentries. elif self.applicationType == EditWidget.appHierarchy: YesNoDialog( translate( u"Do you want to clone all subentries of this item?" ), yesCallback=self.doCloneHierarchy, noCallback=self.closeOrContinue ) return self.closeOrContinue() return #Clear the UI self.clear() self.bones = {} self.views = {} self.containers = {} self.actionbar.resetLoadingState() self.dataCache = data self.modified = False tmpDict = {k: v for k, v in data["structure"]} fieldSets = {} firstCat = None currRow = 0 hasMissing = False defaultCat = conf["modules"][self.module].get("visibleName", self.module) contextVariable = conf["modules"][self.module].get("editContext") if self.mode == "edit" and contextVariable: if not self.context: self.context = {} if "=" in contextVariable: contextVariable, contextKey = contextVariable.split("=", 1) else: contextKey = "key" self.context.update({ contextVariable: data["values"].get(contextKey) }) for key, bone in data["structure"]: cat = defaultCat #meow! if ("params" in bone.keys() and isinstance(bone["params"], dict) and "category" in bone["params"].keys()): cat = bone["params"]["category"] if not cat in fieldSets.keys(): fieldSets[cat] = EditWidgetFieldset(cat) wdgGen = editBoneSelector.select(self.module, key, tmpDict) widget = wdgGen.fromSkelStructure(self.module, key, tmpDict) widget["id"] = "vi_%s_%s_%s_%s_bn_%s" % (self.editIdx, self.module, self.mode, cat, key) if "setContext" in dir(widget) and callable(widget.setContext): widget.setContext(self.context) if "changeEvent" in dir(widget): widget.changeEvent.register(self) descrLbl = html5.Label(key if conf["showBoneNames"] else bone.get("descr", key)) descrLbl["class"].append(key) descrLbl["class"].append(bone["type"].replace(".","_")) # Elements if ("params" in bone.keys() and isinstance(bone["params"], dict) and "elements.source" in bone["params"].keys()): descrLbl.addClass("elements-%s" % bone["params"]["elements.source"]) descrLbl["for"] = "vi_%s_%s_%s_%s_bn_%s" % (self.editIdx, self.module, self.mode, cat, key) if bone["required"] or (bone.get("unique") and bone["error"]): descrLbl["class"].append("is_required") if bone["error"] is not None: descrLbl["class"].append("is_invalid") descrLbl["title"] = bone["error"] fieldSets[ cat ]["class"].append("is_incomplete") # Put info into message center conf["mainWindow"].log("info", "%s: %s" % (bone.get("descr", key), translate(bone["error"]))) hasMissing = True elif bone["error"] is None and not self.wasInitialRequest: descrLbl["class"].append("is_valid") if isinstance(bone["error"], dict): widget.setExtendedErrorInformation(bone["error"]) containerDiv = html5.Div() containerDiv.appendChild(descrLbl) containerDiv.appendChild(widget) if ("params" in bone.keys() and isinstance(bone["params"], dict) and "tooltip" in bone["params"].keys()): containerDiv.appendChild(ToolTip(longText=bone["params"]["tooltip"])) fieldSets[cat]._section.appendChild(containerDiv) containerDiv.addClass("bone", "bone_%s" % key, bone["type"].replace(".","_")) if "." in bone["type"]: for t in bone["type"].split("."): containerDiv["class"].append(t) currRow += 1 self.bones[key] = widget self.containers[key] = containerDiv #Hide invisible bones or logic-flavored bones with their default desire if not bone["visible"] or (bone["params"] and bone["params"].get("logic.visibleIf")): self.containers[key].hide() elif bone["visible"] and not firstCat: firstCat = fieldSets[cat] # NO elif! if bone["params"] and bone["params"].get("logic.readonlyIf"): self.containers[key].disable() # Hide all fieldSets where all fields are invisible for fs in fieldSets.values(): fs.checkVisibility() # Show default category if firstCat: firstCat.removeClass("inactive") firstCat.addClass("active") tmpList = [(k,v) for (k,v) in fieldSets.items()] tmpList.sort(key=lambda x:x[0]) for k, v in tmpList: self.form.appendChild( v ) v._section = None # Views views = conf["modules"][self.module].get("editViews") if self.mode == "edit" and isinstance(views, list): for view in views: vmodule = view.get("module") vvariable = view.get("context") vclass = view.get("class") vtitle = view.get("title") vcolumns = view.get("columns") vfilter = view.get("filter") vactions = view.get("actions") if not vmodule: print("Misconfiured view: %s" % view) continue if vmodule not in conf["modules"]: print("Module '%s' is not described." % vmodule) continue vdescr = conf["modules"][vmodule] fs = EditWidgetFieldset(vmodule, vtitle or vdescr.get("name", vmodule)) fs.addClass("editview", "inactive") if vclass: fs.addClass(*vclass) fieldSets[vmodule] = EditWidgetFieldset(vmodule, vtitle or vdescr.get("name", vmodule)) if vvariable: context = self.context.copy() if self.context else {} if "=" in vvariable: vkey, vvalue = vvariable.split("=", 1) if vvalue[0] == "$": vvalue = data["values"].get(vvalue[1:]) else: vkey = vvariable vvalue = data["values"].get("key") context[vkey] = vvalue else: context = self.context self.views[vmodule] = ListWidget( vmodule, filter=vfilter or vdescr.get("filter", {}), columns=vcolumns or vdescr.get("columns"), context=context, actions=vactions ) fs._section.appendChild(self.views[vmodule]) self.form.appendChild(fs) self.unserialize(data["values"]) if self._hashArgs: #Apply the default values (if any) self.unserialize(self._hashArgs) self._hashArgs = None self._lastData = data if hasMissing and not self.wasInitialRequest: conf["mainWindow"].log("warning",translate("Could not save entry!")) DeferredCall(self.performLogics)
def onCurrentUserAvailable(self, req): data = NetworkService.decode(req) conf["currentUser"] = data["values"] self.update()