class LBPM(QtGui.QMainWindow): setcollection="default" def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_ManageProjects() self.ui.setupUi(self) self.collection=LoadProjects() self.ui.projectslist.clear() self.ui.jobslist.setColumnWidth(0,200) self.ui.jobslist.setColumnWidth(1,130) self.ui.jobslist.setColumnWidth(2,120) self.ui.linkslist.setColumnWidth(0,200) now=datetime.date.today() nt=datetime.time(0,0) now=datetime.datetime.combine(now,nt)+datetime.timedelta(days=1) self.ui.jobTime.setDateTime(now) for i in self.collection.projects: self.ui.projectslist.addItem(self.collection.projects[i].name) self.ui.tabs.setDisabled(True) self.ui.todaysFrame.setVisible(False) self.todays=todays.Todays() self.loadTodays() self._statuses=[self.tr('New'),self.tr("In progress"),self.tr("Done")] self.logs=Logs(self.ui.statusBar,self.tr("LBPM initialized")) @QtCore.pyqtSlot() def on_jobTimeCheck_clicked(self): if self.ui.jobTime.isEnabled(): self.ui.jobTime.setDisabled(True) else: self.ui.jobTime.setDisabled(False) def on_notetext_textChanged(self): self.ui.noteSave.setEnabled(True) def loadTodays(self): self.ui.todaysJobsList.clear() for job in self.todays.jobs: project=job.project name=job.name try: status=self.collection.projects[project].jobs[name][1] notes=self.collection.projects[project].jobs[name][2] deadline=self.collection.projects[project].jobs[name][0] a = QtGui.QTreeWidgetItem(self.ui.todaysJobsList) a.setText(0,project) a.setText(1,name) a.setText(2,status) a.setText(3,deadline) a.setText(4,notes) a=guihelpers.jobStatusColor(a,status,self._statuses) except: deadline=None status=None @QtCore.pyqtSlot() def on_op1_clicked(self):self.changeOp(1) @QtCore.pyqtSlot() def on_op2_clicked(self):self.changeOp(2) @QtCore.pyqtSlot() def on_op3_clicked(self):self.changeOp(3) def changeOp(self,op): if op==1: w=self.ui.projectsFrame if op==2: w=self.ui.tabs if op==3: w=self.ui.todaysFrame if w.isVisible(): w.setVisible(False) if op==3: self.ui.op2.setEnabled(False) self.ui.op2.setChecked(True) self.ui.tabs.setVisible(True) else: w.setVisible(True) if op==3: self.ui.op2.setEnabled(True) def on_actionAbout_activated(self): guihelpers.about() def jobNotesUpdate(self): self.ui.jobNotes.clear() self.ui.jobNotes.addItem(self.tr("None")) for i in self.project.notes: self.ui.jobNotes.addItem(i) def clearall(self): self.ui.noteslist.clear() self.ui.docslist.clear() self.ui.jobslist.clear() self.ui.linkslist.clear() self.ui.notetext.clear() self.ui.doctext.clear() self.ui.notetext.setDisabled(True) self.ui.doctext.setDisabled(True) stats=unicode(self.tr("Documents: %i\nNotes: %i\nLinks: %i\nTasks: %i")) %(0,0,0,0) self.ui.projectStatistics.setText(stats) stats=unicode(self.tr("New: %i\nIn progress: %i\nDone: %i")) %(0,0,0) self.ui.projectJobsStatistics.setText(stats) self.ui.projectName.setText(self.tr("No project selected")) def on_projectslist_itemActivated(self,e): self.ui.tabs.setDisabled(False) project=unicode(e.text()) self.clearall() self.ui.projectName.setText(project.capitalize()) self.setWindowTitle(project.capitalize()+ " - LadyBug Project Manager") project=self.collection.projects[project] for i in project.notes: self.ui.noteslist.addItem(i) for i in project.documents: self.ui.docslist.addItem(i) for i in project.links: a = QtGui.QTreeWidgetItem(self.ui.linkslist) a.setText(0, i) a.setText(1, project.links[i]) self.loadJobs(project) self.project=project self.updateStats() self.updateJobsStats() self.jobNotesUpdate() self.ui.noteSave.setEnabled(False) self.logs.add(self.tr("Project '%s' loaded" %e.text())) def updateStats(self): docs=len(self.project.documents) notes=len(self.project.notes) links=len(self.project.links) jobs=len(self.project.jobs) stats=unicode(self.tr("Documents: %i\nNotes: %i\nLinks: %i\nTasks: %i")) %(docs,notes,links,jobs) self.ui.projectStatistics.setText(stats) def updateJobsStats(self): new=0 in_progress=0 done=0 for i in self.project.jobs: status=self.project.jobs[i][1] if status==self._statuses[0]:new+=1 elif status==self._statuses[0]:done+=1 else: in_progress+=1 stats=unicode(self.tr("New: %i\nIn progress: %i\nDone: %i")) %(new,in_progress,done) self.ui.projectJobsStatistics.setText(stats) def loadJobs(self,project): self.ui.jobslist.clear() for i in project.jobs: a = QtGui.QTreeWidgetItem(self.ui.jobslist) note=project.jobs[i][2] if note==None: note="--" a.setText(0, i) a.setText(1, project.jobs[i][0]) a.setText(2, project.jobs[i][1]) a.setText(3, note) status=project.jobs[i][1] a=guihelpers.jobStatusColor(a,status,self._statuses) def on_noteslist_itemActivated(self,e): if self.ui.noteSave.isEnabled(): ret=guihelpers.message(self.tr("Warning"),self.tr("All changes made in previous note will be lost. Proceed?")) if ret!=0: return 0 note=unicode(e.text()) text=self.project.notes[note] self.ui.notetext.clear() self.ui.notetext.append(text.replace("<br/>","\n")) self.note=note self.ui.notetext.setDisabled(False) self.ui.noteSave.setEnabled(False) self.logs.add(self.tr("Note '%s' opened" %e.text())) def on_docslist_itemActivated(self,e): doc=unicode(e.text()) text=self.project.documents[doc] self.ui.doctext.clear() if docpreview(unicode(text)): f=open(text,'r') text=f.read() f.close() else: text=self.tr("Sorry\nPreview not avalaible") self.ui.doctext.append(text) self.ui.doctext.setDisabled(False) self.logs.add(self.tr("Document '%s' selected" %e.text())) @QtCore.pyqtSlot() def on_noteSave_clicked(self): text=self.ui.notetext.toPlainText() self.project.notes[self.note]=text self.project.Save("notes") self.ui.noteSave.setEnabled(False) self.logs.add(self.tr("Note '%s' saved" %self.note)) @QtCore.pyqtSlot() def on_noteCreate_clicked(self): name=self.ui.newnote.text() name=unicode(name).strip() if name=="" or name in self.project.notes: guihelpers.message(self.tr("Error"),self.tr("No name specified or already exists"),True) else: if self.ui.noteSave.isEnabled(): ret=guihelpers.message(self.tr("Warning"),self.tr("All changes made in previous note will be lost. Proceed?")) if ret!=0: return 0 self.ui.noteslist.addItem(name) self.project.notes[name]="" self.project.Save("notes") self.ui.newnote.clear() i=self.ui.noteslist.count() self.ui.noteslist.setCurrentRow(i-1) self.ui.notetext.clear() self.note=name self.ui.notetext.setDisabled(False) self.logs.add(self.tr("Note '%s' created" %name)) self.updateStats() self.jobNotesUpdate() @QtCore.pyqtSlot() def on_noteDelete_clicked(self): item=self.ui.noteslist.currentItem() n=self.ui.noteslist.currentRow() if item==None: guihelpers.message(self.tr("Error"),self.tr("No note selected"),True) else: ret=guihelpers.message(self.tr("Warning"),self.tr("Do you really want to delete note \"")+item.text()+"\" ?") if ret==0: self.ui.noteslist.takeItem(n) del self.project.notes[unicode(item.text())] self.project.Save("notes") self.ui.notetext.clear() self.ui.notetext.setDisabled(True) self.updateStats() self.jobNotesUpdate() self.logs.add(self.tr("Note '%s' deleted" %item.text())) @QtCore.pyqtSlot() def on_projectCreate_clicked(self): name=unicode(self.ui.newProject.text()) name=name.strip() if name=="" or name in self.collection.projects: guihelpers.message(self.tr("Error"),self.tr("No name specified or project already exists"),True) else: self.collection.create_project(name) self.ui.projectslist.addItem(name) self.ui.newProject.clear() self.logs.add(self.tr("Project '%s' created" %name)) @QtCore.pyqtSlot() def on_projectDelete_clicked(self): item=self.ui.projectslist.currentItem() n=self.ui.projectslist.currentRow() if item==None: guihelpers.message(self.tr("Error"),self.tr("No project selected"),True) else: ret=guihelpers.message(self.tr("Warning"),self.tr("Do you really want to delete project \"")+item.text()+"\" ?") if ret==0: try: project=self.project except: project=None if self.collection.projects[unicode(item.text())]==project: self.clearall() self.ui.tabs.setDisabled(True) self.ui.projectslist.takeItem(n) self.collection.delete_project(unicode(item.text())) self.logs.add(self.tr("Project '%s' deleted" %item.text())) @QtCore.pyqtSlot() def on_docCreate_clicked(self): fd = QtGui.QFileDialog() path=fd.getOpenFileName() file=unicode(path).split("/") file=file[len(file)-1] self.project.documents[file]=path self.project.Save("documents") self.ui.docslist.addItem(file) self.updateStats() self.logs.add(self.tr("Document '%s' added" %file)) return 0 @QtCore.pyqtSlot() def on_docOpen_clicked(self): item=self.ui.docslist.currentItem() if item==None: guihelpers.message(self.tr("Error"),self.tr("No document selected"),True) else: text=self.project.documents[unicode(item.text())] subprocess.Popen(["xdg-open",text]) self.logs.add(self.tr("Document '%s' opened" %text)) @QtCore.pyqtSlot() def on_docDelete_clicked(self): item=self.ui.docslist.currentItem() n=self.ui.docslist.currentRow() if item==None: guihelpers.message(self.tr("Error"),self.tr("No document selected"),True) else: ret=guihelpers.message(self.tr("Warning"),self.tr("This application only removes \"")+item.text()+self.tr("\" from list. Proceed?")) if ret==0: self.ui.docslist.takeItem(n) del self.project.documents[unicode(item.text())] self.project.Save("documents") self.ui.doctext.clear() self.updateStats() self.logs.add(self.tr("Document '%s' deleted" %item.text())) @QtCore.pyqtSlot() def on_linkCreate_clicked(self): name=self.ui.linkUrl.text() name=unicode(name).strip() desc=self.ui.linkDesc.text() desc=unicode(desc).strip() if not name.startswith("http://"): name="http://"+name if name=="http://" or name in self.project.links: guihelpers.message(self.tr("Error"),self.tr("No link specified or already exists"),True) else: a = QtGui.QTreeWidgetItem(self.ui.linkslist) a.setText(0, name) a.setText(1, desc) self.project.links[name]=desc self.project.Save("links") self.ui.linkUrl.clear() self.ui.linkDesc.clear() self.updateStats() self.logs.add(self.tr("Link created")) @QtCore.pyqtSlot() def on_linkDescGet_clicked(self): name=self.ui.linkUrl.text() name=unicode(name).strip() self.ui.linkDesc.setText("") if not name.startswith("http://"): name="http://"+name self.ui.linkUrl.setDisabled(True) self.ui.linkDesc.setDisabled(True) self.ui.linkDescGet.setDisabled(True) self.ui.linkDesc.setText(self.tr("Getting title")) self.loader=getHTMLTitle.TitleLoader(name) self.loader.start() QtCore.QObject.connect(self.loader,QtCore.SIGNAL("finished()"), self.linkDescGetDone) QtCore.QObject.connect(self.loader.timer, QtCore.SIGNAL("timeout()"), self.linkDescGetProgress) def linkDescGetProgress(self): text=self.ui.linkDesc.text() text+="." self.ui.linkDesc.setText(text) def linkDescGetDone(self): self.ui.linkDesc.setText(self.loader.title) self.ui.linkUrl.setDisabled(False) self.ui.linkDesc.setDisabled(False) self.ui.linkDescGet.setDisabled(False) self.logs.add(self.tr("Link description dowloaded")) def on_linkslist_itemActivated(self,e): url= unicode(e.text(0)) if not url.startswith("http://") and not url.startswith("https://") and not url.startswith("ftp://"): url="http://"+url subprocess.Popen(["xdg-open",url]) self.logs.add(self.tr("Link opened")) def on_jobslist_itemActivated(self,e): note= unicode(e.text(3)) self.OpenPopupNote(note,self.project) def on_todaysJobsList_itemActivated(self,e): note= unicode(e.text(4)) project=unicode(e.text(0)) project=self.collection.projects[project] self.OpenPopupNote(note,project) def OpenPopupNote(self,note,project): if note!="--": try: note=project.notes[note] guihelpers.message(self.tr("Assigned Note"),note,True) except: guihelpers.message(self.tr("Error"),self.tr("Something goes wrong. You've apparently deleted that note"),True) @QtCore.pyqtSlot() def on_linkDelete_clicked(self): item=self.ui.linkslist.currentItem() n=self.ui.linkslist.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No link selected"),True) else: ret=guihelpers.message(self.tr("Warning"),self.tr("Do you really want to delete link \"")+item.text(0)+"\" ?") if ret==0: del self.project.links[unicode(item.text(0))] self.ui.linkslist.takeTopLevelItem(n) self.project.Save("links") self.logs.add(self.tr("Link deleted")) self.updateStats() @QtCore.pyqtSlot() def on_jobCreate_clicked(self): name=self.ui.jobName.text() name=unicode(name).strip() if self.ui.jobTimeCheck.isChecked(): date=self.ui.jobTime.dateTime() date=date.toString("dd.MM.yyyy hh:mm") date=unicode(date) else: date="--" status=self.ui.jobStatus.currentText() status=unicode(status) content=[date,status,None] if name=="" or name in self.project.jobs: guihelpers.message(self.tr("Error"),self.tr("No task specified or already exists"),True) else: a = QtGui.QTreeWidgetItem(self.ui.jobslist) a.setText(0, name) a.setText(1, date) a.setText(2, status) a.setText(3, "--") a=guihelpers.jobStatusColor(a,status,self._statuses) self.project.jobs[name]=content self.project.Save("jobs") self.ui.jobName.clear() self.updateStats() self.updateJobsStats() self.logs.add(self.tr("Task '%s' created" %name)) @QtCore.pyqtSlot() def on_jobDelete_clicked(self): item=self.ui.jobslist.currentItem() n=self.ui.jobslist.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: ret=guihelpers.message(self.tr("Warning"),self.tr("Do you really want to delete task \"")+item.text(0)+"\" ?") if ret==0: del self.project.jobs[unicode(item.text(0))] self.ui.jobslist.takeTopLevelItem(n) self.project.Save("jobs") self.updateStats() self.updateJobsStats() self.logs.add(self.tr("Task '%s' deleted" %item.text(0))) @QtCore.pyqtSlot() def on_jobEdit_clicked(self): item=self.ui.jobslist.currentItem() n=self.ui.jobslist.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: item=self.ui.jobslist.takeTopLevelItem(n) status=self.ui.jobEditStatus.currentText() status=unicode(status) self.project.jobs[unicode(item.text(0))][1]=status item.setText(2,status) item=guihelpers.jobStatusColor(item,status,self._statuses) self.ui.jobslist.insertTopLevelItem(n,item) self.ui.jobslist.setCurrentItem(None) self.project.Save("jobs") self.updateJobsStats() self.loadTodays() self.logs.add(self.tr("Task '%s' edited" %item.text(0))) @QtCore.pyqtSlot() def on_jobAssignNote_clicked(self): item=self.ui.jobslist.currentItem() n=self.ui.jobslist.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: note=unicode(self.ui.jobNotes.currentText()) if note==self.tr("None"): note="--" item=self.ui.jobslist.takeTopLevelItem(n) self.project.jobs[unicode(item.text(0))][2]=note item.setText(3,note) self.ui.jobslist.insertTopLevelItem(n,item) self.ui.jobslist.setCurrentItem(item) self.project.Save("jobs") self.loadTodays() self.logs.add(self.tr("Note '%s' assigned to task '%s'" %(note,item.text(0)))) @QtCore.pyqtSlot() def on_jobAddToTodays_clicked(self): item=self.ui.jobslist.currentItem() n=self.ui.jobslist.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: name=unicode(item.text(0)) if self.todays.check_job(name,self.project.name): guihelpers.message(self.tr("Error"),self.tr("Task already on the list"),True) else: p=todays.TodaysJob([self.project.name,name]) self.todays.jobs.append(p) self.todays.save_jobs() self.loadTodays() self.logs.add(self.tr("Task '%s' added to Todays list" %item.text(0))) @QtCore.pyqtSlot() def on_todaysDelete_clicked(self): item=self.ui.todaysJobsList.currentItem() n=self.ui.todaysJobsList.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: project=unicode(item.text(0)) name=unicode(item.text(1)) for job in self.todays.jobs: if job.name==name and job.project==project: self.todays.jobs.pop(self.todays.jobs.index(job)) self.todays.save_jobs() self.loadTodays() self.logs.add(self.tr("Task '%s' deleted from todays list" %item.text(0))) @QtCore.pyqtSlot() def on_todaysNew_clicked(self): self.todaysJobEdit(self._statuses[0]) @QtCore.pyqtSlot() def on_todaysDone_clicked(self): self.todaysJobEdit(self._statuses[1]) @QtCore.pyqtSlot() def on_todaysInprogress_clicked(self): self.todaysJobEdit(self._statuses[2]) def todaysJobEdit(self,status): item=self.ui.todaysJobsList.currentItem() n=self.ui.todaysJobsList.indexOfTopLevelItem(item) if item==None: guihelpers.message(self.tr("Error"),self.tr("No task selected"),True) else: item=self.ui.todaysJobsList.takeTopLevelItem(n) status=unicode(status) project=self.collection.projects[unicode(item.text(0))] project.jobs[unicode(item.text(1))][1]=status item.setText(2,status) item=guihelpers.jobStatusColor(item,status,self._statuses) self.ui.todaysJobsList.insertTopLevelItem(n,item) project.Save("jobs") try: self.updateJobsStats() self.loadJobs(self.project) except: pass self.loadTodays() self.logs.add(self.tr("Task '%s' edited" %item.text(0)))