Пример #1
0
    def editProject(self):

        editWidget = QWizard()
        editWidget.setWindowTitle("Edit Project")
        editWidget.setWindowIcon(QIcon("./images/editproject.png"))
        editWidget.setWizardStyle(QWizard.ClassicStyle)
        editWidget.setOption(QWizard.NoBackButtonOnStartPage)

        self.page = SummaryPage()
        self.page.setTitle("Summary")
        self.page.projectLocationDummy = True
        self.page.projectDatabaseDummy = True
        self.page.fillPage(self.project)
        self.page.enableEditableWidgets()
        editWidget.addPage(self.page)

        if editWidget.exec_():
            check1 = (self.page.projectDescLineEdit.text() ==
                      self.project.description)
            check2 = (self.page.projectResolutionComboBox.currentText() ==
                      self.project.resolution)

            #print check1, check2, 'checkkkkkkkkksssssssssssssssssss'

            if check1 and check2:
                pass
            else:
                #print 'Poject properties altered'
                self.page.updateProject()
                self.project = self.page.project
                self.project.save()
                self.populate()

            if not check2 and not self.project.controlUserProv.userProv:

                #print 'Project resolution changed'
                autoImportSFDataInstance = AutoImportSF2000Data(self.project)
                autoImportSFDataInstance.createMasterSubSFTable()
                autoImportSFDataInstance.projectDBC.dbc.close()
                resolution = (
                    '%s' %
                    self.page.projectResolutionComboBox.currentText()).lower()
                tablename = 'mastersftable%s' % (resolution)
                self.project.save()
                self.populate()
Пример #2
0
    def editProject(self):

        editWidget = QWizard()
        editWidget.setWindowTitle("Edit Project")
        editWidget.setWindowIcon(QIcon("./images/editproject.png"))
        editWidget.setWizardStyle(QWizard.ClassicStyle)
        editWidget.setOption(QWizard.NoBackButtonOnStartPage)

        self.page = SummaryPage()
        self.page.setTitle("Summary")
        self.page.projectLocationDummy = True
        self.page.projectDatabaseDummy = True
        self.page.fillPage(self.project)
        self.page.enableEditableWidgets()
        editWidget.addPage(self.page)


        if editWidget.exec_():
            check1 = (self.page.projectDescLineEdit.text() == self.project.description)
            check2 = (self.page.projectResolutionComboBox.currentText() == self.project.resolution)

            #print check1, check2, 'checkkkkkkkkksssssssssssssssssss'

            if check1 and check2:
                pass
            else:
                #print 'Poject properties altered'
                self.page.updateProject()
                self.project = self.page.project
                self.project.save()
                self.populate()

            if not check2 and not self.project.controlUserProv.userProv:

                #print 'Project resolution changed'
                autoImportSFDataInstance = AutoImportSF2000Data(self.project)
                autoImportSFDataInstance.createMasterSubSFTable()
                autoImportSFDataInstance.projectDBC.dbc.close()
                resolution = ('%s'%self.page.projectResolutionComboBox.currentText()).lower()
                tablename = 'mastersftable%s' %(resolution)
                self.project.save()
                self.populate()
Пример #3
0
class QTreeWidgetCMenu(QTreeWidget):
    def __init__(self, project=None, parent = None):
        super(QTreeWidgetCMenu, self).__init__(parent)
        self.setMinimumSize(350, 400)
        self.setColumnCount(2)
        self.setHeaderLabels(["Name", "Value"])
        self.setColumnWidth(0, 150)
        self.setItemsExpandable(True)
        self.setEnabled(False)
        self.project = project
        self.tables = []


    def contextMenuEvent(self, event):
        menu = QMenu()
        importDataAction = menu.addAction("&Import Data")
        editProjectAction = menu.addAction("&Edit Project")

        menuTableEdit = QMenu()
        displayTableAction = menuTableEdit.addAction("Display")
        menuTableEdit.addSeparator()
        createVarAction = menuTableEdit.addAction("Create New Variable")
        recodeCatsAction = menuTableEdit.addAction("Recode Categories")
        deleteColAction = menuTableEdit.addAction("Delete Column(s)")
        deleteRowsAction = menuTableEdit.addAction("Delete Record(s)")
        dropAction = menuTableEdit.addAction("Delete Table")
        copyAction = menuTableEdit.addAction("Copy Table")
        renameAction = menuTableEdit.addAction("Rename Table")
        menuTableEdit.addSeparator()
        exportActionCSV = menuTableEdit.addAction("Export Table (CSV format)")
        exportActionTab = menuTableEdit.addAction("Export Table (Tab-delimited format)")
        menuTableEdit.addSeparator()
        defaultTransforAction = menuTableEdit.addAction("Default Transformation")

        self.connect(importDataAction, SIGNAL("triggered()"), self.importData)
        self.connect(editProjectAction, SIGNAL("triggered()"), self.editProject)
        self.connect(displayTableAction, SIGNAL("triggered()"), self.displayTable)
        self.connect(recodeCatsAction, SIGNAL("triggered()"), self.modifyCategories)
        self.connect(createVarAction, SIGNAL("triggered()"), self.createVariable)
        self.connect(deleteColAction, SIGNAL("triggered()"), self.deleteColumns)
        self.connect(deleteRowsAction, SIGNAL("triggered()"), self.deleteRows)
        self.connect(copyAction, SIGNAL("triggered()"), self.copyTable)
        self.connect(renameAction, SIGNAL("triggered()"), self.renameTable)
        self.connect(dropAction, SIGNAL("triggered()"), self.dropTable)

        self.connect(exportActionCSV, SIGNAL("triggered()"), self.exportTableCSV)
        self.connect(exportActionTab, SIGNAL("triggered()"), self.exportTableTab)
        self.connect(defaultTransforAction, SIGNAL("triggered()"), self.defaultTransformations)


        if self.item.parent() is None:
            menu.exec_(event.globalPos())
        else:
            if self.item.parent().text(0) == 'Project Tables' or self.item.parent().text(0) == 'Scenario Tables':
                menuTableEdit.exec_(event.globalPos())


    def exportTableCSV(self):
        tablename = self.item.text(0)
        fileDlg = SaveFile(self.project, "csv", tablename, self.item.parent().text(0))

    def exportTableTab(self):
        tablename = self.item.text(0)
        fileDlg = SaveFile(self.project, "dat", tablename, self.item.parent().text(0))


    def deleteRows(self):
        tablename = self.item.text(0)

        parentText = self.item.parent().text(0)
        if parentText == 'Project Tables':
            database = self.project.name
        elif parentText == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            
            
        self.populateVariableDictionary(tablename)

        projectDBC = createDBC(self.project.db, database)
        projectDBC.dbc.open()

        deleteRows = DeleteRows(self.project, parentText, tablename, self.variableTypeDictionary, "Delete Records", "modifydata")
        if deleteRows.exec_():
            projectDBC.dbc.open()
            reply = QMessageBox.question(self, "Delete Records", "Would you like to continue?",
                                         QMessageBox.Yes| QMessageBox.Cancel)
            if reply == QMessageBox.Yes:

                query = QSqlQuery(projectDBC.dbc)
                whereExpression = deleteRows.whereEdit.toPlainText()
                #print whereExpression, 'is the text'
                if not whereExpression == "":

                    if not query.exec_("""delete from %s where %s""" %(tablename, whereExpression)):
                        raise FileError, query.lastError().text()
                else:
                    QMessageBox.warning(self, "Delete Records", """No filter expression selected, 0 records deleted.""",
                                        QMessageBox.Ok)

        projectDBC.dbc.close()


    def copyTable(self):
        tablename = self.item.text(0)

        parent = self.item.parent().text(0)
        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            

        copyNameDialog = NameDialog("Copy Table - %s" %tablename)
        if copyNameDialog.exec_():
            newTablename = copyNameDialog.nameLineEdit.text()
            projectDBC = createDBC(self.project.db, database)
            projectDBC.dbc.open()

            query = QSqlQuery(projectDBC.dbc)
            if not query.exec_("""create table %s select * from %s""" %(newTablename, tablename)):
                raise FileError, query.lastError().text()
            self.populate()
            projectDBC.dbc.close()

    def renameTable(self):
        tablename = self.item.text(0)
        parent = self.item.parent().text(0)
        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            

        renameNameDialog = NameDialog("Rename Table - %s" %tablename)
        if renameNameDialog.exec_():
            newTablename = renameNameDialog.nameLineEdit.text()

            projectDBC = createDBC(self.project.db, database)
            projectDBC.dbc.open()

            query = QSqlQuery(projectDBC.dbc)
            if not query.exec_("""alter table %s rename to %s""" %(tablename, newTablename)):
                raise FileError, query.lastError().text()
            self.populate()
            projectDBC.dbc.close()

    def dropTable(self):
        tablename = self.item.text(0)

        parent = self.item.parent().text(0)
        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            

        reply = QMessageBox.question(self, "Delete Table - %s" %tablename, "Do you wish to continue?",
                                     QMessageBox.Yes| QMessageBox.Cancel)
        if reply == QMessageBox.Yes:
            projectDBC = createDBC(self.project.db, database)

            projectDBC.dbc.open()

            query = QSqlQuery(projectDBC.dbc)
            if not query.exec_("""drop table %s""" %tablename):
                raise FileError, query.lastError().text()
            self.populate()
            projectDBC.dbc.close()


    def click(self, item, column):
        self.item = item

    def createVariable(self):
        parent = self.item.parent().text(0)
        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            

        projectDBC = createDBC(self.project.db, database)
        projectDBC.dbc.open()

        tablename = self.item.text(0)
        self.populateVariableDictionary(tablename)

        create = CreateVariable(self.project, database, tablename, self.variableTypeDictionary, "Create New Variable", "modifydata")
        if create.exec_():
            projectDBC.dbc.open()
            newVarName = create.newVarNameEdit.text()
            numericExpression = create.formulaEdit.toPlainText()
            whereExpression = create.whereEdit.toPlainText()
            if len(whereExpression)<1:
                whereExpression = '1'
            if len(numericExpression) <1:
                QMessageBox.warning(self, "Data", QString("""Invalid numeric expression, enter again"""))
            else:
                query = QSqlQuery(projectDBC.dbc)
                if not query.exec_("""alter table %s add column %s text""" %(tablename, newVarName)):
                    print ("""alter table %s add column %s text""" %(tablename, newVarName))
                    raise FileError, query.lastError().text()
                if not query.exec_("""update %s set %s = %s where %s""" %(tablename, newVarName,
                                                                          numericExpression, whereExpression)):
                    raise FileError, query.lastError().text()

        projectDBC.dbc.close()



    def displayTable(self):
        tablename = self.item.text(0)

        disp = DisplayTable(self.project, "%s" %tablename, self.item.parent().text(0))
        disp.exec_()

    def modifyCategories(self):
        parentText = self.item.parent().text(0)
        """
        if parentText == 'Project Tables':
            database = self.project.name
        elif parentText == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            
        projectDBC = createDBC(self.project.db, database)

        projectDBC.dbc.open()
        """
        tablename = self.item.text(0)
        modify = RecodeDialog(self.project, parentText, tablename, title = "Recode Categories - %s" %tablename, icon = "modifydata")
        modify.exec_()

        #projectDBC.dbc.close()


    def deleteColumns(self):
        parent = self.item.parent().text(0)

        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            

        projectDBC = createDBC(self.project.db, database)

        tablename = self.item.text(0)
        self.populateVariableDictionary(tablename)
        projectDBC.dbc.open()
        query = QSqlQuery(projectDBC.dbc)

        title = "Delete Dialog - %s" %tablename
        deleteVariablesdia = VariableSelectionDialog(self.variableTypeDictionary, title = title, icon = "modifydata",
                                                     warning = "Note: Select variables to delete.")

        if deleteVariablesdia.exec_():
            deleteVariablesSelected = deleteVariablesdia.selectedVariableListWidget.variables

            for i in deleteVariablesSelected:
                if not query.exec_("""alter table %s drop %s""" %(tablename, i)):
                    raise FileError, query.lastError().text()

        projectDBC.dbc.close()


    def defaultTransformations(self):
        projectDBC = createDBC(self.project.db, self.project.name)
        projectDBC.dbc.open()

        query = QSqlQuery(projectDBC.dbc)

        tablename = self.item.text(0)

        checkPUMSTableTransforms = False
        checkSFTableTransforms = False

        if not self.project.sampleUserProv.userProv:
            if tablename == 'housing_pums':
                if self.project.sampleUserProv.defSource == 'Census 2000':
                    queries = DEFAULT_HOUSING_PUMS2000_QUERIES
                    checkPUMSTableTransforms = True
                else:
                    queries = DEFAULT_HOUSING_PUMSACS_QUERIES
                    checkPUMSTableTransforms = True

            if tablename == 'person_pums':
                if self.project.sampleUserProv.defSource == 'Census 2000':
                    queries = DEFAULT_PERSON_PUMS2000_QUERIES
                    checkPUMSTableTransforms = True
                else:
                    queries = DEFAULT_PERSON_PUMSACS_QUERIES
                    checkPUMSTableTransforms = True

            if checkPUMSTableTransforms:
                for i in queries:
                    #print "Executing Query: %s" %i
                    if not query.exec_("""%s""" %i):
                        if not query.lastError().number() == 1051:
                            print "FileError: %s" %query.lastError().text()


        if not self.project.controlUserProv.userProv:
            if tablename[:13] == 'mastersftable':
                checkSFTableTransforms = True

            if checkSFTableTransforms:
                if self.project.controlUserProv.defSource == 'Census 2000':
                    queries = DEFAULT_SF2000_QUERIES
                else:
                    queries = DEFAULT_SFACS_QUERIES

                for i in queries:
                    #print "Executing Query: %s" %i
                    if not query.exec_(i %tablename):
                        print "FileError: %s" %query.lastError().text()

        if not (checkPUMSTableTransforms or checkSFTableTransforms):
            QMessageBox.warning(self, "Default Transformations", 
                                """No default transformations are defined for the table""",
                                QMessageBox.Ok)
            #print "FileError: The file does not have default transformations"

        projectDBC.dbc.close()
        self.populate()


    def populateVariableDictionary(self, tablename):
        parent = self.item.parent().text(0)

        if parent == 'Project Tables':
            database = self.project.name
        elif parent == 'Scenario Tables':
            database = '%s%s%s' %(self.project.name, 'scenario', self.project.scenario)            


        projectDBC = createDBC(self.project.db, database)
        projectDBC.dbc.open()

        self.variableTypeDictionary = {}
        query = QSqlQuery(projectDBC.dbc)
        query.exec_("""desc %s""" %tablename)

        FIELD, TYPE, NULL, KEY, DEFAULT, EXTRA = range(6)

        while query.next():
            field = query.value(FIELD).toString()
            type = query.value(TYPE).toString()
            null = query.value(NULL).toString()
            key = query.value(KEY).toString()
            default = query.value(DEFAULT).toString()
            extra = query.value(EXTRA).toString()

            self.variableTypeDictionary['%s' %field] = type
        projectDBC.dbc.close()

    def editProject(self):

        editWidget = QWizard()
        editWidget.setWindowTitle("Edit Project")
        editWidget.setWindowIcon(QIcon("./images/editproject.png"))
        editWidget.setWizardStyle(QWizard.ClassicStyle)
        editWidget.setOption(QWizard.NoBackButtonOnStartPage)

        self.page = SummaryPage()
        self.page.setTitle("Summary")
        self.page.projectLocationDummy = True
        self.page.projectDatabaseDummy = True
        self.page.fillPage(self.project)
        self.page.enableEditableWidgets()
        editWidget.addPage(self.page)


        if editWidget.exec_():
            check1 = (self.page.projectDescLineEdit.text() == self.project.description)
            check2 = (self.page.projectResolutionComboBox.currentText() == self.project.resolution)

            #print check1, check2, 'checkkkkkkkkksssssssssssssssssss'

            if check1 and check2:
                pass
            else:
                #print 'Poject properties altered'
                self.page.updateProject()
                self.project = self.page.project
                self.project.save()
                self.populate()

            if not check2 and not self.project.controlUserProv.userProv:

                #print 'Project resolution changed'
                autoImportSFDataInstance = AutoImportSF2000Data(self.project)
                autoImportSFDataInstance.createMasterSubSFTable()
                autoImportSFDataInstance.projectDBC.dbc.close()
                tablename = 'mastersftable%s' %(self.page.projectResolutionComboBox.currentText())
                self.project.save()
                self.populate()




    def importData(self):
        #QMessageBox.information(None, "Check", "Import Data", QMessageBox.Ok)
        dataprocesscheck = DataDialog(self.project)
        dataprocesscheck.exec_()
        self.populate()


    def populate(self):
        self.setEnabled(True)
        self.clear()

        projectAncestor = QTreeWidgetItem(self, [QString("Project: " + self.project.name)])
        informationParent = QTreeWidgetItem(projectAncestor, [QString("Information")])

        dummy = ""
        if self.project.region is not None:
            for i in self.project.region.keys():
                dummy = dummy + i + ", "+ self.project.region[i]+ "; "


        resolutionText = self.project.resolution

        if resolutionText == "Tract":
            resolution = 'Census Tract'
        elif resolutionText == "Blockgroup":
            resolution = 'Census Blockgroup'
        elif resolutionText == 'TAZ':
            resolution = 'Traffic Analysis Zone (TAZ)'
        else:
            resolution = 'County'



        informationItems = {"Location":self.project.location,
                            "Description":self.project.description,
                            "Region":dummy,
                            "Resolution":resolution}
        for i,j in informationItems.items():
            child = QTreeWidgetItem(informationParent, [i, QString(j)])

        geocorrParent = QTreeWidgetItem(projectAncestor, [QString("Geographic Correspondence")])
        geocorrUserProvText = self.userProvText(self.project.geocorrUserProv.userProv)
        geocorrItems = {"User Provided":geocorrUserProvText,
                        "Location":self.project.geocorrUserProv.location}

        for i,j in geocorrItems.items():
            child = QTreeWidgetItem(geocorrParent, [i, QString("%s"%j)])

        sampleParent = QTreeWidgetItem(projectAncestor, [QString("Sample")])
        sampleUserProvText = self.userProvText(self.project.sampleUserProv.userProv, 
                                               self.project.sampleUserProv.defSource)
        sampleItems = {"User Provided":sampleUserProvText,
                       "Household Data Location": self.project.sampleUserProv.hhLocation,
                       "GQ Data Location": self.project.sampleUserProv.gqLocation,
                       "Person Data Location": self.project.sampleUserProv.personLocation}

        for i,j in sampleItems.items():
            child = QTreeWidgetItem(sampleParent, [i, QString("%s"%j)])

        controlParent = QTreeWidgetItem(projectAncestor, [QString("Control")])
        controlUserProvText = self.userProvText(self.project.controlUserProv.userProv,
                                                self.project.controlUserProv.defSource)
        controlItems = {"User Provided":controlUserProvText,
                       "Household Data Location": self.project.controlUserProv.hhLocation,
                       "GQ Data Location": self.project.controlUserProv.gqLocation,
                       "Person Data Location": self.project.controlUserProv.personLocation}

        for i,j in controlItems.items():
            child = QTreeWidgetItem(controlParent, [i, QString("%s"%j)])

        dbParent = QTreeWidgetItem(projectAncestor, [QString("Database")])
        dbItems = {"Hostname":self.project.db.hostname,
                   "Username":self.project.db.username}
        #"Password":self.project.db.password}

        for i,j in dbItems.items():
            child = QTreeWidgetItem(dbParent, [QString(i), QString(j)])


        projectTableParent = QTreeWidgetItem(projectAncestor, [QString("Project Tables")])
        scenarioTableParent = QTreeWidgetItem(projectAncestor, [QString("Scenario Tables")])

        self.tableChildren(projectTableParent, 0)
        self.tableChildren(scenarioTableParent, 1)

        self.expandItem(projectAncestor)
        self.expandSort(informationParent, 0)
        self.expandSort(geocorrParent, 0)
        self.expandSort(sampleParent, 0)
        self.expandSort(controlParent, 0)
        self.expandSort(dbParent, 0)
        self.expandSort(projectTableParent, 0)
        self.expandSort(scenarioTableParent, 0)


    def userProvText(self, text, source='default'):
        if text:
            return "Yes"
        else:
            return "No, %s data will be used" %source



    def tableChildren(self, parent, scenario=0):

        if scenario > 0:
            databaseName = self.project.name + 'scenario' + str(self.project.scenario)
        else:
            databaseName = self.project.name

        projectDBC = createDBC(self.project.db, databaseName)

        projectDBC.dbc.open()

        self.query = QSqlQuery(projectDBC.dbc)

        if not self.query.exec_("""show tables"""):
            raise FileError, self.query.lastError().text()

        tableItems = []

        while self.query.next():
            tableItems.append(self.query.value(0).toString())

        projectDBC.dbc.close()

        tableItems.sort()

        for i in tableItems:
            child = QTreeWidgetItem(parent, [QString(i)])

    def expandSort(self, item, index):
        self.expandItem(item)
        item.sortChildren(index, Qt.AscendingOrder)
Пример #4
0
 def _create_widgets(self):
     gtk.Assistant.__init__(self)
     # Page 0
     ip = gtk.Label(self.intro_msg)
     self.append_page(ip)
     self.set_page_type(ip, gtk.ASSISTANT_PAGE_INTRO)
     self.set_page_title(ip, _("jwsProcessor assistant"))
     self.set_page_complete(ip, True)
     self.intro_page = ip
     # Page 1
     sp = SelectionPage(self, self.current_folder)
     self.append_page(sp)
     self.set_page_type(sp, gtk.ASSISTANT_PAGE_CONTENT)
     self.set_page_title(sp, _("#1 - Select spectra"))
     self.set_page_complete(sp, False)
     self.selection_page = sp
     # Page 2
     op = OptionsPage(options=self.options,
                      current_folder=sp.current_folder,
                      assistant=self)
     self.append_page(op)
     self.set_page_type(op, gtk.ASSISTANT_PAGE_CONFIRM)
     self.set_page_title(op, _("#2 - Processing options"))
     self.set_page_complete(op, False)
     self.options_page = op
     # Page 3
     fp = SummaryPage(self)
     self.append_page(fp)
     self.set_page_title(fp, _("#3 - Results"))
     self.set_page_complete(fp, False)
     self.summary_page = fp
     # Page 4
     sop = SaveOptionsPage(self)
     self.append_page(sop)
     self.set_page_type(sop, gtk.ASSISTANT_PAGE_CONFIRM)
     self.set_page_title(sop, _("#4 - Save results as..."))
     self.set_page_complete(sop, True)
     self.save_options_page = sop
     # Page 5
     fp = gtk.Label(_("Saving files..."))
     self.append_page(fp)
     self.set_page_type(fp, gtk.ASSISTANT_PAGE_SUMMARY)
     self.set_page_title(fp, _("Summary"))
     self.set_page_complete(fp, False)
     self.final_page = fp
     # Restart assistant button
     self.restart_button = gtk.Button(_("Start again"))
     self.restart_button.set_image(
         gtk.image_new_from_stock(gtk.STOCK_GOTO_FIRST,
                                  gtk.ICON_SIZE_BUTTON))
     self.restart_button.connect("clicked", self._restart_clicked_cb)
     self.restart_button.show_all()
     # Configure window
     self.set_title("jwsProcessor")
     self.set_border_width(12)
     self.set_position(gtk.WIN_POS_CENTER)
     self.set_forward_page_func(self._fwd_page_func)
     self.show_all()
     self.connect("delete-event", self._close_cb)
     self.connect("prepare", self._prepare_cb)
     self.connect("apply", self._apply_cb)
     self.connect("close", self._close_cb)
     self.connect("cancel", self._close_cb)