]> git.zarvox.org Git - wp3.git/blob - mainapp.py
Merge branch 'master' of rabbit:/home/zarvox/wp3
[wp3.git] / mainapp.py
1 from PyQt4.QtCore import *
2 from PyQt4.QtGui import *
3 from PyQt4.QtSql import *
4
5 from chooseaction import ChooseAction
6 from editperson import EditPerson
7 from mergephotos import MergePhotos
8 from odtwriter import ODTWriter
9
10 class MainApp (QMainWindow):
11         schema = "CREATE TABLE people ( id INTEGER PRIMARY KEY AUTOINCREMENT, forename TEXT NOT NULL, surname TEXT NOT NULL, netid TEXT NOT NULL, email TEXT, birthday TEXT, phone TEXT, major TEXT, dorm TEXT, room INTEGER, photo BLOB, createtime TEXT NOT NULL, mtime TEXT NOT NULL);"
12         def __init__(self, Parent=None):
13                 QMainWindow.__init__(self, Parent)
14                 self.setWindowTitle("Whitepages V3")
15
16                 self.db = QSqlDatabase.addDatabase("QSQLITE")
17                 self.db.setDatabaseName("families.db")
18                 self.db.open()
19                 q = QSqlQuery(self.db)
20                 q.exec_(MainApp.schema)
21
22                 self.center = QStackedWidget()
23                 self.chooseaction = ChooseAction(self,self.db)
24                 self.editperson = EditPerson(self,self.db)
25                 self.mergephotos = MergePhotos(self,self.db)
26                 self.center.addWidget(self.chooseaction)
27                 self.center.addWidget(self.editperson)
28                 self.center.addWidget(self.mergephotos)
29                 self.setCentralWidget(self.center)
30
31                 self.createActions()
32                 self.createMenus()
33
34                 self.statusBar().showMessage("Ready")
35                 self.setUnifiedTitleAndToolBarOnMac(True);
36                 self.resize(800,600)
37                 self.show()
38
39         def createActions(self):
40                 self.fileNewAction = QAction("&New Database",self)
41                 QObject.connect( self.fileNewAction, SIGNAL("triggered()"), self.newFile)
42                 self.fileOpenAction = QAction("&Open Database",self)
43                 QObject.connect( self.fileOpenAction, SIGNAL("triggered()"), self.openFile)
44                 self.fileImportAction = QAction("&Import (Merge)", self)
45                 QObject.connect( self.fileImportAction, SIGNAL("triggered()"), self.mergeWizard)
46                 self.fileQuitAction = QAction("&Quit",self)
47                 QObject.connect( self.fileQuitAction, SIGNAL("triggered()"), self.quit)
48                 QObject.connect( self.chooseaction, SIGNAL("editPerson()"), self.editPersonSlot)
49                 QObject.connect( self.chooseaction, SIGNAL("mergePhotos()"), self.mergePhotos)
50                 QObject.connect( self.chooseaction, SIGNAL("exportDocument(QString)"), self.exportDocumentSlot)
51                 QObject.connect( self.editperson, SIGNAL("done()"), self.returnToMainMenu)
52                 QObject.connect( self.mergephotos, SIGNAL("done()"), self.returnToMainMenu)
53                 QObject.connect( self, SIGNAL("databaseChanged(QString)"), self.editperson.updateDB)
54                 QObject.connect( self, SIGNAL("mergeDone()"), self.editperson.reselect )
55                 
56         
57         def createMenus(self):
58                 self.fileMenu = self.menuBar().addMenu("&File")
59                 self.fileMenu.addAction(self.fileNewAction)
60                 self.fileMenu.addAction(self.fileOpenAction)
61                 self.fileMenu.addAction(self.fileImportAction)
62                 self.fileMenu.addSeparator()
63                 self.fileMenu.addAction(self.fileQuitAction)
64
65
66         def newFile(self):
67                 fileName = QFileDialog.getSaveFileName(self, "Save new file as:", ".", "Databases (*.db)")
68                 if not fileName.isEmpty(): # If they cancelled, do nothing
69                         if not fileName.endsWith(".db"): # if they leave off the extension, add it
70                                 fileName = fileName.append(".db")
71                         self.db.close()
72                         self.db.setDatabaseName(fileName)
73                         self.db.open()
74                         q = QSqlQuery(self.db)
75                         q.exec_(MainApp.schema)
76                         self.statusBar().showMessage("Closed the existing database, created " + fileName)
77                         self.emit(SIGNAL("databaseChanged(QString)"),self.db.databaseName())
78                 else:
79                         self.statusBar().showMessage("Cancelled creating new database")
80         def openFile(self):
81                 fileName = QFileDialog.getOpenFileName(self, "Open dataset", ".", "Databases (*.db)")
82                 if not fileName.isEmpty():
83                         self.db.close()
84                         self.db.setDatabaseName(fileName)
85                         self.db.open()
86                         self.statusBar().showMessage("Successfully loaded database " + fileName)
87                         self.emit(SIGNAL("databaseChanged(QString)"),self.db.databaseName())
88                 else:
89                         self.statusBar().showMessage("Canceled loading database")
90         def mergeWizard(self):
91                 fileName = QFileDialog.getOpenFileName(self, "Import which dataset?", ".", "Databases (*.db)" )
92                 if not fileName.isEmpty():
93                         tempdb = QSqlDatabase.addDatabase("QSQLITE","tempdb")
94                         tempdb.setDatabaseName(fileName)
95                         tempdb.open()
96                         q = QSqlQuery(self.db)
97                         import_q = QSqlQuery(tempdb)
98                         import_q.exec_("SELECT * FROM people;")
99                         rec = import_q.record()
100                         col_id = rec.indexOf("id")
101                         col_forename = rec.indexOf("forename")
102                         col_surname = rec.indexOf("surname")
103                         col_netid = rec.indexOf("netid")
104                         col_email = rec.indexOf("email")
105                         col_birthday = rec.indexOf("birthday")
106                         col_phone = rec.indexOf("phone")
107                         col_major = rec.indexOf("major")
108                         col_dorm = rec.indexOf("dorm")
109                         col_room = rec.indexOf("room")
110                         col_photo = rec.indexOf("photo")
111                         col_createtime = rec.indexOf("createtime")
112                         col_mtime = rec.indexOf("mtime")
113                         #print "Number of columns:",rec.count()
114                         records_merged = 0
115                         while import_q.next():
116                                 qtestnewnetid = QSqlQuery(self.db)
117                                 qtestnewnetid.prepare("SELECT * FROM people WHERE netid = :netid")
118                                 qtestnewnetid.bindValue(":netid", import_q.value(col_netid) )
119                                 qtestnewnetid.exec_()
120                                 if qtestnewnetid.next(): # if the person's already in the DB, keep the old data
121                                         continue
122                                 q.prepare("INSERT INTO people (netid, forename, surname, email, birthday, phone, major, dorm, room, createtime, mtime, photo )"
123                                                                 "VALUES (:netid, :forename, :surname, :email, :birthday, :phone, :major, :dorm, :room, :createtime, :mtime, :photo )" )
124                                 q.bindValue(":netid", import_q.value(col_netid) )
125                                 q.bindValue(":forename", import_q.value(col_forename) )
126                                 q.bindValue(":surname", import_q.value(col_surname) )
127                                 q.bindValue(":email", import_q.value(col_email) )
128                                 q.bindValue(":birthday", import_q.value(col_birthday) )
129                                 q.bindValue(":phone", import_q.value(col_phone) )
130                                 q.bindValue(":major", import_q.value(col_major) )
131                                 q.bindValue(":dorm", import_q.value(col_dorm) )
132                                 q.bindValue(":room", import_q.value(col_room) )
133                                 q.bindValue(":createtime", import_q.value(col_createtime) )
134                                 q.bindValue(":mtime", import_q.value(col_mtime) )
135                                 q.bindValue(":photo", import_q.value(col_photo) )
136                                 q.exec_()
137                                 print "Inserted", import_q.value(col_forename).toString(), import_q.value(col_surname).toString(), "into DB"
138                                 records_merged = records_merged + 1
139                         self.statusBar().showMessage(QString("Successfully merged %1 records from %2").arg(QString(str(records_merged))).arg(fileName))
140                         tempdb.close()
141                         self.emit(SIGNAL("mergeDone()"))
142                 else:
143                         self.statusBar().showMessage("Canceled merging databases")
144         def quit(self):
145                 # You could do cleanup, like closing/flushing the database, an "Are you sure you want to quit?"
146                 # modal dialog, or saving the window layout/state.
147                 qApp.quit()
148         def returnToMainMenu(self):
149                 self.center.setCurrentWidget(self.chooseaction)
150         def editPersonSlot(self):
151                 self.editperson.model.select() # update the table
152                 self.center.setCurrentWidget(self.editperson)
153         def mergePhotos(self):
154                 print "beginning photo merge"
155                 self.center.setCurrentWidget(self.mergephotos)
156                 #self.mergephotos.beginMerge()
157         def exportDocumentSlot(self, filename):
158                 writer = ODTWriter(self.db)
159                 writer.write(filename)
160
161
162 if __name__ == "__main__" :
163         app = QApplication([""])
164         widget = MainApp()
165         app.exec_()
166