def createView(self) -> AnlageVView: self._view.openAnlageV.connect(self.onOpenAnlageV) self._view.printAnlageV.connect(self.onPrintAnlageV) self._view.printAllAnlageV.connect(self.onPrintAllAnlageV) # Feststellen, für welches Veranlagungsjahr die Anlagen V erstellt werden sollen: jahre = AnlageV_Base_Logic.getJahre() dlg = JahrAuswahlDialog(jahre) dlg.move(self._view.cursor().pos()) if dlg.exec_(): self._jahr = dlg.jahr try: self._busi = AnlageV_Preview_Logic(self._jahr) except Exception as ex: box = ErrorBox( "AnlageVController.createView()", "Instantiation AnlageV_Preview_Logic failed.\n", str(ex)) box.exec_() return None else: return None master_objekte = self._busi.getObjektNamen() accepted, objlist = self.showAnlageVAuswahlDialog(master_objekte) if accepted: self._master_objekte = objlist self._provideTabs(objlist) return self._view else: self._jahr = 0 self._master_objekte.clear() return None
def createView(self) -> QWidget: try: jahre = GeschaeftsreiseUcc.inst().getDistinctJahre() jahr = jahre[ 0] # die Liste der Jahre muss mindestens ein Jahr (das laufende) enthalten tm: GeschaeftsreisenTableModel = self._ucc.getGeschaeftsreisenTableModel( jahr) except Exception as ex: box = ErrorBox("Fehler beim Erzeugen des GeschaeftsreiseView", str(ex), "") box.exec_() return None self._view = GeschaeftsreisenView(tm) self._view.setJahre(jahre) self._view.setJahr(jahr) self._view.save.connect(self.onSave) self._view.yearChanged.connect(self.onYearChanged) self._view.createItem.connect(self.onCreate) self._view.editItem.connect(self.onEdit) self._view.deleteItem.connect(self.onDelete) w = self._view.getPreferredWidth() screenwidth = getScreenWidth() if w > screenwidth: w = screenwidth sz = self._view.size() self._view.resize(w, sz.height()) return self._view
def _doCsvExport( self, dlg:IccDialog ): model: QAbstractItemModel = dlg.getView().getModel() try: BusinessLogic.inst().exportToCsv( model ) except Exception as ex: box = ErrorBox( "Export als .csv-Datei", str( ex ), "in MainController.exportToCsv()" ) box.exec_()
def kuendigeMietverhaeltnis(self, mv_id: str, kuendDatum: str) -> None: # Kündigung in der Datenbank durchführen try: BusinessLogic.inst().kuendigeMietverhaeltnis(mv_id, kuendDatum) self.mietverhaeltnisGekuendigt.emit(mv_id, kuendDatum) except Exception as ex: box = ErrorBox( "Kündigung hat nicht geklappt", "MiniKuendigungsController.kuendigeMietverhaeltnis()", str(ex)) box.exec_()
def validate( self, x: XGeschaeftsreise ) -> bool: msg = "" if not x.mobj_id: msg = "Objekt muss angegeben sein." if not x.von: msg = "Beginn muss angegeben sein." if not x.bis: msg = "Ende muss angegeben sein." if x.von > x.bis: msg = "Beginn muss vor dem Ende sein." if not x.ziel: msg = "Ziel muss angegeben sein." if not x.zweck: msg = "Zweck muss angegeben sein." if x.km <= 0: msg = "Kilometerangabe fehlt. Muss angegeben werden." if msg: box = ErrorBox( "Angaben unvollständig", msg, "" ) box.exec_() return False return True
def main(): app = QApplication() #iccstate = IccStateHandler( "ftp.ini") setScreenSize(app) env = "DEVELOP" if not runningInDev(): # release version running terminate_if_running() # one instance only # try: # iccstate.startApplication() # download immo.db from server and set is-in-use flag # except Exception as ex: # print( str(ex) ) # box = ErrorBox( "ImmoControlCenter", "Failed starting application", str( ex ) ) # box.exec_() # return createControlFile() # flag file showing application is running env = "RELEASE" win = IccMainWindow(env) # see: https://stackoverflow.com/questions/53097415/pyside2-connect-close-by-window-x-to-custom-exit-method shutDownFilter = ShutDownFilter(win, app) win.installEventFilter(shutDownFilter) win.show() try: pos_size = getGeometryOnLastShutdown() win.move(pos_size["x"], pos_size["y"]) #win.resize( pos_size["w"], pos_size["h"] ) win.setFixedWidth(1100) win.setFixedHeight(63) except: win.resize(1900, 1000) MainController(win) icon = QIcon("./images/houses.png") app.setWindowIcon(icon) app.exec_() if not runningInDev(): try: # iccstate.stopApplication() # upload immo.db to server and set not-in-use flag pass except Exception as ex: print(str(ex)) box = ErrorBox("ImmoControlCenter", "Failed shutting down application", str(ex)) box.exec_() finally: deleteControlFile()
def validate( self ) -> bool: x = self._view.getDataCopyWithChanges() msg = "" if not x.mobj_id: msg = "Objekt muss angegeben sein." elif not x.von: msg = "Beginn muss angegeben sein." elif not x.bis: msg = "Ende muss angegeben sein." elif x.von > x.bis: msg = "Beginn muss vor dem Ende sein." elif not x.ziel: msg = "Ziel muss angegeben sein." elif not x.zweck: msg = "Zweck muss angegeben sein." elif x.km <= 0: msg = "Kilometerangabe fehlt. Muss angegeben werden." if msg: box = ErrorBox( "Angaben unvollständig", msg, "" ) box.exec_() return False return True
def uploadDatabase() -> bool: """ upload immo.db to server :return: True if upload was successful """ ftpini = FtpIni("ftp.ini") ftp = Ftp(ftpini) try: ftp.connect() ftp.upload("immo.db", "immo.db") return True except Exception as ex: box = ErrorBox("File Transfer failed", "FTP failed.\n", str(ex)) box.exec_() return False
def saveDatabase() -> None: def try_copyfile(): try: copyfile(src, dest) except Exception as ex: box = WarningBox("Datenbank auf lokalen Datenträger sichern", "Sicherung nicht möglich", "Ist der Datenträger eingehängt?", "Nochmal versuchen", "Beenden") rc = box.exec_() if rc == QMessageBox.Yes: try_copyfile() from shutil import copyfile if runningInDev(): return scriptdir = os.path.dirname(os.path.realpath(__file__)) src = "./immo.db" if "Vermietung" in scriptdir: print("Running in REL; try to copy immo.db") dest = "/media/martin/Elements1/Vermietung/ImmoControlCenter/immo.db" if os.path.isfile(src): box = QMessageBox() box.setIcon(QMessageBox.Question) box.setWindowTitle("Sicherung der Datenbank") box.setText("Datenbank\n\n '%s'\n\nsichern in\n\n '%s'?" % (scriptdir + "/immo.db", dest)) box.setStandardButtons(QMessageBox.Save | QMessageBox.Cancel) r = box.exec_() if r == QMessageBox.Save: try_copyfile() else: box = ErrorBox("Datenbank auf lokalen Datenträger sichern", "Sicherung nicht möglich", "Es gibt keine Datenbank namens immo.db") box.exec_()
def _exportDatabaseToServer( self ): ftpini = FtpIni( "ftp.ini" ) ftp = Ftp( ftpini ) try: ftp.connect() ftp.upload( "immo.db", "immo.db" ) box = InfoBox( "Immo-Datenbak exportieren", "Exportieren abgeschlossen.", "", "OK" ) box.exec_() except Exception as ex: box = ErrorBox( "File Transfer failed", "Can't export immo.db to server:\n", str(ex) ) box.exec_() finally: ftp.quit()
def writeChanges(self, changes: Any = None) -> bool: self._view.applyChanges( ) # Änderungen von der GUI in XMieterwechsel übernehmen retval: ReturnValue = MietverhaeltnisServices.processMieterwechsel( self._view.getMieterwechselData()) if not retval.missionAccomplished(): box = ErrorBox("Fehler beim Mieterwechsel", retval.exceptiontype, retval.errormessage) box.exec_() return False box = InfoBox("Mieterwechsel", "Verarbeitung erfolgreich.", "", "OK") box.exec_() self._view.setSaveButtonEnabled(False) return True
def onYearChanged(self, newyear: int): if self.isChanged(): box = QuestionBox( "Änderungen speichern?", "Sollen die Änderungen an Geschäftsreisen gespeichert werden?", "Ja", "Nein", "Abbrechen") rc = box.exec_() if rc == QMessageBox.Yes: if not self.onSave(): #title: str, msg: str, more: str box = ErrorBox("Fehler beim Speichern", "Speichern hat nicht funktioniert", "") box.exec_() else: self._setNewModel(newyear) elif rc == QMessageBox.No: # Anwender will die Änderungen nicht speichern self._setNewModel(newyear) else: pass # Anwender hat Abbrechen gedrückt else: self._setNewModel(newyear)
def _importDatabaseFromServer( self ): ftpini = FtpIni( "ftp.ini" ) dlg = QInputDialog() dlg.move( self._mainwin.cursor().pos() ) name, ok = dlg.getText( self._mainwin, "Immo-Datenbank importieren", "Datenbank wird ins Verzeichnis\n\n'%s'\n\n importiert.\n\n" "<<<<Sie wird nicht für die laufende Anwendung verwendet!!>>>>\n\n" "Lokalen Namen für die Datenbank angeben: " % ftpini.getLocalPath(), QLineEdit.Normal, "immo.db.imported" ) if not ( ok and name ): return ftp = Ftp( ftpini ) try: ftp.connect() ftp.download( "immo.db", name ) box = InfoBox( "Immo-Datenbak importieren", "Importieren abgeschlossen.", "", "OK" ) box.move( self._mainwin.cursor().pos() ) box.exec_() except Exception as ex: box = ErrorBox( "File Transfer failed", "Can't export immo.db to server:\n", str( ex ) ) box.exec_() finally: ftp.quit()
def showException(self, title, msg, more=None): box = ErrorBox(title, msg, more) crsr = QCursor.pos() box.move(crsr.x(), crsr.y()) box.exec_()
def writeChanges(self, changes: Any = None) -> bool: changes: Dict[str, List[XGeschaeftsreise]] = self.getChanges() for x in changes["INSERT"]: try: self._ucc.insertGeschaeftsreise(x) except Exception as ex: box = ErrorBox("Fehler beim Einfügen der Geschäftsreise", str(ex)) box.exec_() return False for x in changes["UPDATE"]: try: self._ucc.updateGeschaeftsreise(x) except Exception as ex: box = ErrorBox("Fehler beim Ändern der Geschäftsreise", str(ex)) box.exec_() return False for x in changes["DELETE"]: try: self._ucc.deleteGeschaeftsreise(x.id) except Exception as ex: box = ErrorBox("Fehler beim Löschen der Geschäftsreise", str(ex)) box.exec_() return False return True