Example #1
0
    def on_btnExecute_released(self, *args: Any, **kwargs: Any) -> None:
        item = self.ui.listWidget.currentItem()
        if not item:
            return
        taskID = item.task["key"]

        for i in range(self.ui.horizontalLayout.count()):
            if self.ui.horizontalLayout.itemAt(i).widget():
                self.ui.horizontalLayout.itemAt(i).widget().close()
        for i in range(self.ui.verticalLayout.count()):
            if self.ui.verticalLayout.itemAt(i).widget():
                self.ui.verticalLayout.itemAt(i).widget().close()
        task = None
        for t in self.tasks["skellist"]:
            if t["key"] == taskID:
                task = t
                break
        if not task:
            return
        nameLbl = QtWidgets.QLabel(task["name"], self)
        self.ui.verticalLayout.addWidget(nameLbl)
        descrLbl = QtWidgets.QLabel(task["descr"], self)
        self.ui.verticalLayout.addWidget(descrLbl)

        event.emit("stackWidget",
                   EditWidget("_tasks", ApplicationType.SINGLETON, taskID))
Example #2
0
 def onTabCurrentChanged(self, idx: int) -> None:
     wdg = self.tabWidget.widget(idx)
     for k, v in self.languageContainer.items():
         if v == wdg:
             event.emit("tabLanguageChanged", k)
             wdg.setFocus()
             return
Example #3
0
	def onBtnCancelReleased(self, *args: Any, **kwargs: Any) -> None:
		logger.debug("onBtnCancelReleased")
		try:
			self.selection.prepareDeletion()
		except AttributeError:
			pass
		event.emit("popWidget", self)
Example #4
0
 def openEditor(self, *args: Any, **kwargs: Any) -> None:
     if isPyodide:
         switchToSummernote(self.html, self.onSave)
         #js.switchToEditor(self.html)
         #js.document.getElementById("editorframe").style.setProperty("display", "")
         #js.document.getElementById("textBone").value = "asdasdas"
         return
     if self.languages:
         lang = self.languages[self.tabWidget.currentIndex()]
         if self.plaintext:
             editor = RawTextEdit(self.html[lang])
         else:
             if self.validHtml:
                 editor = TextEdit(self.html[lang], self.validHtml, lang)
             else:
                 editor = RawTextEdit(self.html[lang])
     else:
         if self.plaintext:
             editor = RawTextEdit(self.html)
         else:
             if self.validHtml:
                 editor = TextEdit(self.html, self.validHtml, "en")
             else:
                 editor = RawTextEdit(self.html)
     editor.onDataChanged.connect(self.onSave)
     event.emit("stackWidget", editor)
Example #5
0
 def onLoginSucceeded(self) -> None:
     logger.debug("onLoginSucceeded")
     self.overlay.inform(
         self.overlay.SUCCESS,
         QtCore.QCoreApplication.translate("Login", "Login successful"))
     # config.conf.loadPortalConfig(NetworkService.url, withCookies=False)
     event.emit("loginSucceeded")
     self.setDisabled(False)
     self.hide()
Example #6
0
	def onSourceItemDoubleClicked(self, item: QtWidgets.QListWidgetItem) -> None:
		"""
				An item has been doubleClicked in our listWidget.
				Read its properties and add them to our selection.
		"""
		logger.debug("RelationalEditBone.onSourceItemDoubleClicked: %r", item)
		data = item
		self.selectionChanged.emit([data])
		event.emit("popWidget", self)
Example #7
0
 def onLoadConfig(self, request: RequestWrapper) -> None:
     logger.debug("Checkpoint: onLoadConfig")
     try:
         conf.serverConfig = NetworkService.decode(request)
     except:
         self.onError(msg="Unable to parse portalconfig!")
         return
     event.emit("configDownloaded")
     if conf.currentUserEntry is not None:
         self.setup()
Example #8
0
    def onSourceItemDoubleClicked(self,
                                  item: QtWidgets.QListWidgetItem) -> None:
        """
			An item has been doubleClicked in our listWidget.
			Read its properties and add them to our selection.
		"""
        data = item.entryData
        if self.multiple:
            self.selection.extend([data])
        else:
            self.selectionChanged.emit([data])
            event.emit("popWidget", self)
Example #9
0
	def onSaveSuccess(self, editTaskID: int) -> None:
		"""
			Adding/editing an entry just succeeded
		"""
		logger.debug("onSaveSuccess: %r, %r", editTaskID, self.editTaskID)
		if editTaskID != self.editTaskID:  # Not our task
			return
		self.setDisabled(False)
		logToUser(QtCore.QCoreApplication.translate("EditWidget", "Entry saved"))
		#self.overlay.inform(self.overlay.SUCCESS, QtCore.QCoreApplication.translate("EditWidget", "Entry saved"))
		if self.closeOnSuccess:
			event.emit('popWidget', self)
		else:
			self.reloadData()
Example #10
0
 def timerEvent(self, e: QtCore.QTimerEvent) -> None:
     total = 0
     missing = 0
     for modul in conf.serverConfig["modules"]:
         total += 1
         protoWrap = protocolWrapperInstanceSelector.select(modul)
         if protoWrap is None:
             continue
         if protoWrap.busy:
             missing += 1
     if not total:
         print("No Modules available!!!")
         total = 1
         missing = 0
     self.ui.progressBar.setValue(10 + int(100.0 *
                                           ((total - missing) / total)))
     #print("%s - %s" % (total, missing))
     if not missing:
         event.emit("preloadingFinished")
         self.finished.emit()
         self.killTimer(self.timerID)
         self.timerID = None
Example #11
0
	def __init__(
			self,
			moduleName: str,
			boneName: str,
			multiple: bool,
			toModul: str,
			selection: list,
			*args: Any,
			**kwargs: Any):
		super(RelationalBoneSelector, self).__init__(*args, **kwargs)
		logger.debug("RelationalBoneSelector.init: %r, %r, %r, %r, %r", moduleName, boneName, multiple, toModul,
		             selection)
		self.moduleName = moduleName
		self.boneName = boneName
		self.multiple = multiple
		self.module = toModul
		self.selection = selection
		self.ui = Ui_relationalSelector()
		self.ui.setupUi(self)
		layout = QtWidgets.QHBoxLayout(self.ui.tableWidget)
		self.ui.tableWidget.setLayout(layout)
		self.list = self.displaySourceWidget(self.module, editOnDoubleClick=False, parent=self)
		layout.addWidget(self.list)
		self.list.show()
		layout = QtWidgets.QHBoxLayout(self.ui.listSelected)
		self.ui.listSelected.setLayout(layout)
		self.selection = self.displaySelectionWidget(self.module, selection, parent=self)
		layout.addWidget(self.selection)
		self.selection.show()
		# self.list.setSelectionMode( self.list.SingleSelection )
		if not self.multiple:
			self.selection.hide()
			self.ui.lblSelected.hide()
		self.list.itemDoubleClicked.connect(self.onSourceItemDoubleClicked)
		self.list.itemClicked.connect(self.onSourceItemClicked)
		self.ui.btnSelect.clicked.connect(self.onBtnSelectReleased)
		self.ui.btnCancel.clicked.connect(self.onBtnCancelReleased)
		event.emit('stackWidget', self)
Example #12
0
 def onHasSession(self, req):
     data = NetworkService.decode(req)
     if data["values"] and data["values"]["access"] and "root" in data[
             "values"]["access"]:
         event.emit("loginSucceeded")
         self.hide()
     else:
         try:
             userName = data["values"]["name"]
         except:
             userName = "******"
         self.requestLogoutBox = QtWidgets.QMessageBox(
             QtWidgets.QMessageBox.Question,
             QtCore.QCoreApplication.translate("SimpleLogin", "Logout?"),
             QtCore.QCoreApplication.translate(
                 "SimpleLogin",
                 "This user (%s) cannot be used with ViUR Admin. Do you want to log out?"
             ) % userName,
             (QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No), self)
         self.requestLogoutBox.buttonClicked.connect(self.reqLogoutCallback)
         self.requestLogoutBox.open()
         QtGui.QGuiApplication.processEvents()
         self.requestLogoutBox.adjustSize()
Example #13
0
	def addData(self, queryKey: Any) -> None:
		self.isLoading -= 1
		if queryKey is not None and queryKey != self.loadingKey:  # The Data is for a list we don't display anymore
			return
		protoWrap = protocolWrapperInstanceSelector.select(self.module)
		assert protoWrap is not None
		protoData = protoWrap.queryCache[queryKey]
		skellist = [protoWrap.entryCache[x] for x in protoData["skelkeys"]]
		cursor = protoData["cursor"]
		for item in skellist:  # Insert the new Data at the corresponding Position
			self.dataCache.append(item)
		self.cursor = cursor
		self.loadingKey = None
		count = len(skellist)
		self.count += count
		self.ui.countLabel.setText(str(self.count))
		if count < 20:
			self.completeList = True
			self.serializeToCsv(self.dataCache, protoWrap.viewStructure)
			self.model.dataCache = self.dataCache
			self.model.layoutChanged.emit()
			event.emit('popWidget', self)
		else:
			self.loadNext()
Example #14
0
	def setData(
			self,
			request: RequestWrapper = None,
			data: Dict[str, Any] = None,
			ignoreMissing: bool = False) -> None:
		"""
		Rebuilds the UI according to the skeleton received from server

		:param request: the request to handle
		:param data: The data received
		:param ignoreMissing: if missing data should be reported as errors
		"""
		assert request or data
		if request:
			data = NetworkService.decode(request)
		# Clear the UI
		while self.ui.tabWidget.count():
			item = self.ui.tabWidget.widget(0)
			if item and item.widget():
				if "remove" in dir(item.widget()):
					item.widget().remove()
			self.ui.tabWidget.removeTab(0)
		self.bones = {}
		self.boneToTabMap = {}
		self.dataCache = data
		tmpDict = {}
		tabs: Dict[str, QtWidgets.QFormLayout] = dict()
		tmpTabs: List[Tuple[QtWidgets.QScrollArea, str]] = list()  # Sort tabs by their description
		tabMaxError: Dict[str, int] = {} # Map of max-error code per tap
		for key, bone in data["structure"]:
			tmpDict[key] = bone
		for key, bone in data["structure"]:
			if not bone["visible"]:
				continue

			if "params" in bone and bone["params"] and "category" in bone["params"]:
				tabName = bone["params"]["category"]
			else:
				tabName = QtCore.QCoreApplication.translate("EditWidget", "General")

			if tabName not in tabs:
				scrollArea = QtWidgets.QScrollArea()
				outerContainer = QtWidgets.QWidget(scrollArea)
				outerLayout = QtWidgets.QVBoxLayout(outerContainer)
				scrollArea.setWidget(outerContainer)
				containerWidget = QtWidgets.QWidget(outerContainer)
				outerLayout.addWidget(containerWidget, 1)
				formLayout = QtWidgets.QFormLayout(containerWidget)
				formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
				formLayout.setLabelAlignment(QtCore.Qt.AlignLeft)
				formLayout.setAlignment(QtCore.Qt.AlignTop)
				tabs[tabName] = formLayout
				containerWidget.setLayout(formLayout)
				containerWidget.setSizePolicy(
					QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred))
				tmpTabs.append((scrollArea, tabName))
				outerLayout.addStretch(100)
				scrollArea.setWidgetResizable(True)
			for error in data["errors"]:
				if error["fieldPath"] and error["fieldPath"][0] == key:
					severity = error["severity"]
					if severity == 2 and bone.get("required"):
						severity = 3
					if severity > tabMaxError.get(tabName, 0):
						tabMaxError[tabName] = severity
		tmpTabs.sort(key=lambda x: x[1])

		for scrollArea, tabName in tmpTabs:
			tabIndex = self.ui.tabWidget.addTab(scrollArea, tabName)
			maxErrCode = tabMaxError.get(tabName, 0)
			if maxErrCode == 1:
				self.ui.tabWidget.setTabIcon(tabIndex, loadIcon("bone-invalidates-other"))
			elif maxErrCode == 2:
				self.ui.tabWidget.setTabIcon(tabIndex, loadIcon("bone-empty"))
			elif maxErrCode == 3:
				self.ui.tabWidget.setTabIcon(tabIndex, loadIcon("bone-error"))
			else:
				self.ui.tabWidget.setTabIcon(tabIndex, loadIcon("bone-valid"))

		for key, bone in data["structure"]:
			if bone["visible"] == False:
				continue
			if "params" in bone and bone["params"] and "category" in bone["params"]:
				tabName = bone["params"]["category"]
			else:
				tabName = QtCore.QCoreApplication.translate("EditWidget", "General")
			wdgGen = editBoneSelector.select(self.module, key, tmpDict)
			widget = wdgGen.fromSkelStructure(self.module, key, tmpDict, editWidget=self)
			widget.setSizePolicy(
				QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding))
			dataWidget = widget
			# TODO: Temporary MacOS Fix
			if sys.platform.startswith("darwin"):
				dataWidget.setMaximumWidth(500)
				dataWidget.setMinimumWidth(500)
			# TODO: Temporary MacOS Fix
			lblWidget = QtWidgets.QWidget(self)
			layout = QtWidgets.QHBoxLayout(lblWidget)
			if "params" in bone and isinstance(bone["params"], dict) and "tooltip" in bone["params"]:
				lblWidget.setToolTip(self.parseHelpText(bone["params"]["tooltip"]))
			descrLbl = QtWidgets.QLabel(bone["descr"], lblWidget)
			descrLbl.setWordWrap(True)
			if bone["required"]:
				font = descrLbl.font()
				font.setBold(True)
				font.setUnderline(True)
				descrLbl.setFont(font)
			layout.addWidget(descrLbl)
			tabs[tabName].addRow(lblWidget, dataWidget)
			dataWidget.show()
			self.bones[key] = widget
			self.boneToTabMap[dataWidget] = [x[1] for x in tmpTabs].index(tabName)

		self.unserialize(data["values"], data["errors"])
		# self._lastData = data
		# logger.debug("setData _lastData: %r", self._lastData)
		event.emit("rebuildBreadCrumbs()")
Example #15
0
	def onBtnCloseReleased(
			self,
			*args: Any,
			**kwargs: Any) -> None:
		event.emit("popWidget", self)
Example #16
0
 def save(self, *args: Any, **kwargs: Any) -> None:
     self.onDataChanged.emit(self.ui.textEdit.toPlainText())
     event.emit('popWidget', self)
Example #17
0
 def addWidget(self, widget: Any) -> None:
     assert self.stackedWidget.indexOf(widget) == -1
     event.emit("addWidget", widget)
     self.stackedWidget.addWidget(widget)
Example #18
0
 def onFinishSave(self, data: Dict[str, Any]) -> None:
     logger.debug("onFinishSave TODO:: %r", data)
     self.onDataChanged.emit(data)
     event.emit('popWidget', self)
Example #19
0
    def resetLoginWindow(self) -> None:
        """
		Emits QtCore.SIGNAL('resetLoginWindow()')
		"""
        event.emit('resetLoginWindow')
        self.hide()
Example #20
0
    def setup(self) -> None:
        """
		Initializes everything based on the config received from the server.
		It
			- Resets the ui to sane defaults.
			- Selects a startPage for the application
			- Selects Protocolwrapper and Module-Handler for each module
			- Requests a toplevel handler for each module
			- Finally emits modulHandlerInitialized and mainWindowInitialized
		"""
        if not self.startPage:
            if "configuration" in conf.serverConfig:
                if "analyticsKey" in conf.serverConfig["configuration"]:
                    logger.debug("setting analytics widget as startpage")
                    self.startPage = startpages.AnalytisWidget()
                elif "startPage" in conf.serverConfig["configuration"]:
                    logger.debug("retrieving startpage from server")
                    self.startPage = startpages.WebWidget()
            if not self.startPage:  # Still not
                logger.debug("setting default startpage")
                self.startPage = DefaultWidget()
            self.stackedWidget.addWidget(self.startPage)
        self.treeWidget.clear()
        data = conf.serverConfig
        handlers = []
        groupHandlers = {}
        by_group: Dict[str, List[Any]] = dict()

        if "configuration" in data and "moduleGroups" in data["configuration"]:
            for group in data["configuration"]["moduleGroups"]:
                if (self.groupWhitelist is not None and group["name"]
                        not in self.groupWhitelist) or not all([
                            x in group for x in ["name", "prefix", "icon"]
                        ]):  # Assert that all required properties are there
                    continue
                group_handler = GroupHandler(None,
                                             group["name"],
                                             group["icon"],
                                             sortIndex=group.get(
                                                 "sortIndex", 0))
                group_prefix = group["prefix"]
                groupHandlers[group_prefix] = group_handler
                by_group[group_prefix] = list()
                # self.treeWidget.addTopLevelItem(groupHandlers[group["prefix"]])
        if "modules" not in conf.portal:
            conf.portal["modules"] = {}

        def sortItemHandlers(pair: Tuple[Any, Any]) -> Any:
            return pair[1].sortIndex

        groupHandlers = OrderedDict(
            sorted(groupHandlers.items(), key=sortItemHandlers))

        access = conf.currentUserEntry["access"]
        for module, cfg in data["modules"].items():
            logger.debug("starting to load module %r", module)
            if (self.moduleWhitelist is not None
                    and cfg["name"] not in self.moduleWhitelist
                ) or "root" not in access and not "{0}-view".format(
                    module) in access:
                continue
            queue = RegisterQueue()
            event.emit('requestModuleHandler', queue, module)
            handler = queue.getBest()()
            if "name" in cfg and groupHandlers:
                parent = None
                for groupName in groupHandlers:
                    if cfg["name"].startswith(groupName):
                        parent = groupHandlers[groupName]
                        break
                if parent:
                    # parent.addChild(handler)
                    by_group[groupName].append(handler)
                else:
                    self.treeWidget.addTopLevelItem(handler)
            else:
                self.treeWidget.addTopLevelItem(handler)
            handlers.append(handler)
            wrapperClass = protocolWrapperClassSelector.select(
                module, data["modules"])
            if wrapperClass is not None:
                wrapperClass(module)
            event.emit('modulHandlerInitialized', module)

        def subhandlerSorter(x: Any) -> int:
            return x.sortIndex

        emptyGroups = list()
        for group, handlers in by_group.items():
            handlers.sort(key=subhandlerSorter, reverse=True)
            for handler in handlers:
                groupHandlers[group].addChild(handler)
            if handlers:
                self.treeWidget.addTopLevelItem(groupHandlers[group])
            else:
                emptyGroups.append((group, groupHandlers[group]))

        for prefix, groupHandler in emptyGroups:
            groupHandlers.pop(prefix)
            del by_group[prefix]

        self.treeWidget.sortItems(1, QtCore.Qt.DescendingOrder)

        event.emit('mainWindowInitialized')
        QtWidgets.QApplication.restoreOverrideCursor()
Example #21
0
	def onQuerySuccess(self, query: Any) -> None:
		self.model().reload()
		event.emit(QtCore.SIGNAL("listChanged(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self, self.module, None)
		self.overlay.inform(self.overlay.SUCCESS)