1 from PyQt4.QtCore import *
2 from PyQt4.QtGui import *
3 from PyQt4.QtSql import *
5 from chooseaction import ChooseAction
6 from editperson import EditPerson
7 from mergephotos import MergePhotos
8 from odtwriter import ODTWriter
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")
16 self.db = QSqlDatabase.addDatabase("QSQLITE")
17 self.db.setDatabaseName("families.db")
19 q = QSqlQuery(self.db)
20 q.exec_(MainApp.schema)
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)
34 self.statusBar().showMessage("Ready")
35 self.setUnifiedTitleAndToolBarOnMac(True);
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 )
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)
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")
72 self.db.setDatabaseName(fileName)
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())
79 self.statusBar().showMessage("Cancelled creating new database")
81 fileName = QFileDialog.getOpenFileName(self, "Open dataset", ".", "Databases (*.db)")
82 if not fileName.isEmpty():
84 self.db.setDatabaseName(fileName)
86 self.statusBar().showMessage("Successfully loaded database " + fileName)
87 self.emit(SIGNAL("databaseChanged(QString)"),self.db.databaseName())
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)
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()
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
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) )
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))
141 self.emit(SIGNAL("mergeDone()"))
143 self.statusBar().showMessage("Canceled merging databases")
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.
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)
162 if __name__ == "__main__" :
163 app = QApplication([""])