def onShowSelector(self, *args, **kwargs): """ Opens a ListWidget so that the user can select new values """ currentSelector = ListWidget(self.destModule, selectMode="multi", context=self.context) currentSelector.selectionActivatedEvent.register(self) conf["mainWindow"].stackWidget(currentSelector) self.parent()["class"].append("is_active")
def onShowSelector(self, *args, **kwargs): """ Opens a ListWidget so that the user can select new values """ try: currentSelector = ListWidget(self.destModule, isSelector=True, context=self.context) except AssertionError: return currentSelector.selectionActivatedEvent.register(self) conf["mainWindow"].stackWidget(currentSelector) self.parent()["class"].append("is_active")
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 openSelector(self, *args, **kwargs): currentSelector = ListWidget(self.extension["module"], selectMode="multi") currentSelector.selectionActivatedEvent.register(self) conf["mainWindow"].stackWidget(currentSelector)