예제 #1
0
class ParentDialog(object):   
    
    def __init__(self, dialog, layer, feature):
        ''' Constructor class '''     
        self.dialog = dialog
        self.layer = layer
        self.feature = feature
        self.context_name = "ws_parent"    
        self.iface = iface    
        self.init_config()             
    
        
    def init_config(self):    
        
        # initialize plugin directory
        user_folder = os.path.expanduser("~") 
        self.plugin_name = 'giswater'  
        self.plugin_dir = os.path.join(user_folder, '.qgis2/python/plugins/'+self.plugin_name)    
        
        # Get config file
        setting_file = os.path.join(self.plugin_dir, 'config', self.plugin_name+'.config')
        if not os.path.isfile(setting_file):
            message = "Config file not found at: "+setting_file
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5)  
            self.close()
            return
            
        self.settings = QSettings(setting_file, QSettings.IniFormat)
        self.settings.setIniCodec(sys.getfilesystemencoding())
        
        # Set controller to handle settings and database connection
        # TODO: Try to make only one connection
        self.controller = DaoController(self.settings, self.plugin_name, iface)
        status = self.controller.set_database_connection()      
        if not status:
            message = self.controller.getLastError()
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5) 
            return 
             
        self.schema_name = self.settings.value("db/schema_name")           
        self.dao = self.controller.dao
            
            
    def translate_form(self, context_name):
        ''' Translate widgets of the form to current language '''
        # Get objects of type: QLabel
        widget_list = self.dialog.findChildren(QLabel)
        for widget in widget_list:
            self.translate_widget(context_name, widget)
            
            
    def translate_widget(self, context_name, widget):
        ''' Translate widget text '''
        if widget:
            widget_name = widget.objectName()
            text = self.controller.tr(widget_name, context_name)
            if text != widget_name:
                widget.setText(text)         
         
       
    def load_tab_add_info(self):
        ''' Load data from tab 'Add. info' '''                
        pass

    def load_tab_analysis(self):
        ''' Load data from tab 'Analysis' '''          
        pass
                
    def load_tab_document(self):
        ''' TODO: Load data from tab 'Document' '''   
        pass
                
    def load_tab_picture(self):
        ''' TODO: Load data from tab 'Document' '''   
        pass
                
    def load_tab_event(self):
        ''' TODO: Load data from tab 'Event' '''   
        pass
                
    def load_tab_log(self):
        ''' TODO: Load data from tab 'Log' '''   
        pass
        
    def load_tab_rtc(self):
        ''' TODO: Load data from tab 'RTC' '''   
        pass
    
    def load_data(self):
        ''' Load data from related tables '''
        
        self.load_tab_add_info()
        self.load_tab_analysis()
        self.load_tab_document()
        self.load_tab_picture()
        self.load_tab_event()
        self.load_tab_log()
        self.load_tab_rtc()
        

    def save_tab_add_info(self):
        ''' Save tab from tab 'Add. info' '''                
        pass

    def save_tab_analysis(self):
        ''' Save tab from tab 'Analysis' '''          
        pass
                
    def save_tab_document(self):
        ''' TODO: Save tab from tab 'Document' '''   
        pass
                
    def save_tab_picture(self):
        ''' TODO: Save tab from tab 'Document' '''   
        pass
                
    def save_tab_event(self):
        ''' TODO: Save tab from tab 'Event' '''   
        pass
                
    def save_tab_log(self):
        ''' TODO: Save tab from tab 'Log' '''   
        pass
        
    def save_tab_rtc(self):
        ''' TODO: Save tab from tab 'RTC' '''   
        pass
        
                        
    def save_data(self):
        ''' Save data from related tables '''        
        self.save_tab_add_info()
        self.save_tab_analysis()
        self.save_tab_document()
        self.save_tab_picture()
        self.save_tab_event()
        self.save_tab_log()
        self.save_tab_rtc()       
                
        
        
    ''' Slot functions '''           
               
    def save(self):
        ''' Save feature '''
        self.save_data()   
        self.dialog.accept()
        self.layer.commitChanges()    
        self.close()     
        
        
    def close(self):
        ''' Close form without saving '''
        self.layer.rollBack()   
        self.dialog.parent().setVisible(False)         
        
        
    def set_model_to_table(self, widget, table_name, filter_): 
        ''' Set a model with selected filter.
        Attach that model to selected table '''
        
        # Set model
        model = QSqlTableModel();
        model.setTable(table_name)
        model.setEditStrategy(QSqlTableModel.OnManualSubmit)        
        model.setFilter(filter_)
        model.select()         

        # Check for errors
        if model.lastError().isValid():
            self.controller.show_warning(model.lastError().text())      

        # Attach model to table view
        widget.setModel(model)    
        
        
    def delete_records(self, widget, table_name):
        ''' Delete selected elements of the table '''
        
        # Get selected rows
        selected_list = widget.selectionModel().selectedRows()    
        if len(selected_list) == 0:
            message = "Any record selected"
            self.controller.show_warning(message, context_name='ui_message' ) 
            return
        
        inf_text = ""
        list_id = ""
        for i in range(0, len(selected_list)):
            row = selected_list[i].row()
            id_ = widget.model().record(row).value("id")
            inf_text+= str(id_)+", "
            list_id = list_id+"'"+str(id_)+"', "
        inf_text = inf_text[:-2]
        list_id = list_id[:-2]
        answer = self.controller.ask_question("Are you sure you want to delete these records?", "Delete records", inf_text)
        if answer:
            sql = "DELETE FROM "+self.schema_name+"."+table_name 
            sql+= " WHERE id IN ("+list_id+")"
            self.dao.execute_sql(sql)
            widget.model().select()
            
   
    def open_selected_document(self):
        ''' Get value from selected cell ("PATH")
        Open the document ''' 
        
        # Check if clicked value is from the column "PATH"
        position_column = self.tbl_document.currentIndex().column()
        if position_column == 4:      
            # Get data from address in memory (pointer)
            self.path = self.tbl_document.selectedIndexes()[0].data()
            # Check if file exist
            if not os.path.exists(self.path):
                message = "File not found!"
                self.controller.show_warning(message, context_name='ui_message')
               
            else:
                # Open the document
                os.startfile(self.path)                      


    def set_filter_table(self, widget):
        ''' Get values selected by the user and sets a new filter for its table model '''
        
        # Get selected dates
        date_from = self.date_document_from.date().toString('yyyyMMdd') 
        date_to = self.date_document_to.date().toString('yyyyMMdd') 
        if (date_from > date_to):
            message = "Selected date interval is not valid"
            self.controller.show_warning(message, context_name='ui_message')                   
            return
        
        # Set filter
        expr = self.field_id+" = '"+self.id+"'"
        expr+= " AND date >= '"+date_from+"' AND date <= '"+date_to+"'"
        
        # Get selected values in Comboboxes        
        doc_type_value = utils_giswater.getWidgetText("doc_type")
        if doc_type_value != 'null': 
            expr+= " AND doc_type = '"+doc_type_value+"'"
        doc_tag_value = utils_giswater.getWidgetText("doc_tag")
        if doc_tag_value != 'null': 
            expr+= " AND tagcat_id = '"+doc_tag_value+"'"
        doc_user_value = utils_giswater.getWidgetText("doc_user")
        if doc_user_value != 'null':
            expr+= " AND user_name = '"+doc_user_value+"'"
  
        # Refresh model with selected filter
        widget.model().setFilter(expr)
        widget.model().select()   
        
        
    def set_configuration(self, widget, table_name):
        ''' Configuration of tables 
        Set visibility of columns
        Set width of columns '''
        
        # Set width and alias of visible columns
        columns_to_delete = []
        sql = "SELECT column_index, width, alias, status"
        sql+= " FROM "+self.schema_name+".config_ui_forms"
        sql+= " WHERE ui_table = '"+table_name+"'"
        sql+= " ORDER BY column_index"
        rows = self.controller.get_rows(sql)
        if rows:
            for row in rows:        
                if not row['status']:
                    columns_to_delete.append(row['column_index']-1)
                else:
                    width = row['width']
                    if width is None:
                        width = 100
                    widget.setColumnWidth(row['column_index']-1, width)
                    widget.model().setHeaderData(row['column_index']-1, Qt.Horizontal, row['alias'])
        
        # Set order
        widget.model().setSort(0, Qt.AscendingOrder)    
        widget.model().select()
        
        # Delete columns        
        for column in columns_to_delete:
            widget.hideColumn(column) 


    def fill_tbl_document(self, widget, table_name, filter_):
        ''' Fill the table control to show documents'''
        
        # Get widgets
        doc_user = self.dialog.findChild(QComboBox, "doc_user")
        doc_type = self.dialog.findChild(QComboBox, "doc_type")
        doc_tag = self.dialog.findChild(QComboBox, "doc_tag")
        self.date_document_to = self.dialog.findChild(QDateEdit, "date_document_to")
        self.date_document_from = self.dialog.findChild(QDateEdit, "date_document_from")

        # Set signals
        doc_user.activated.connect(partial(self.set_filter_table, widget))
        doc_type.activated.connect(partial(self.set_filter_table, widget))
        doc_tag.activated.connect(partial(self.set_filter_table, widget))
        self.date_document_to.dateChanged.connect(partial(self.set_filter_table, widget))
        self.date_document_from.dateChanged.connect(partial(self.set_filter_table, widget))
        self.tbl_document.doubleClicked.connect(self.open_selected_document)

        # Fill ComboBox tagcat_id
        sql = "SELECT DISTINCT(tagcat_id)"
        sql+= " FROM "+table_name
        sql+= " ORDER BY tagcat_id"
        rows = self.dao.get_rows(sql)
        utils_giswater.fillComboBox("doc_tag", rows)

        # Fill ComboBox doccat_id
        sql = "SELECT DISTINCT(doc_type)"
        sql+= " FROM "+table_name
        sql+= " ORDER BY doc_type"
        rows = self.dao.get_rows(sql)
        utils_giswater.fillComboBox("doc_type", rows)

        # Fill ComboBox doc_user
        sql = "SELECT DISTINCT(user_name)"
        sql+= " FROM "+table_name
        sql+= " ORDER BY user_name"
        rows = self.dao.get_rows(sql)
        utils_giswater.fillComboBox("doc_user", rows)

        # Set model of selected widget
        self.set_model_to_table(widget, table_name, filter_)
        

    def fill_table(self, widget, table_name, filter_): 
        ''' Fill info tab of node '''
        self.set_model_to_table(widget, table_name, filter_)                  
                
        
예제 #2
0
class ParentDialog(object):
    def __init__(self, iface, dialog, layer, feature):
        ''' Constructor class '''
        self.iface = iface
        self.dialog = dialog
        self.layer = layer
        self.feature = feature
        self.init_config()

    def init_config(self):

        # initialize plugin directory
        user_folder = os.path.expanduser("~")
        self.plugin_name = 'giswater'
        self.plugin_dir = os.path.join(
            user_folder, '.qgis2/python/plugins/' + self.plugin_name)

        # Get config file
        setting_file = os.path.join(self.plugin_dir, 'config',
                                    self.plugin_name + '.config')
        if not os.path.isfile(setting_file):
            message = "Config file not found at: " + setting_file
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING,
                                                5)
            self.close()
            return

        self.settings = QSettings(setting_file, QSettings.IniFormat)
        self.settings.setIniCodec(sys.getfilesystemencoding())

        # Set controller to handle settings and database connection
        # TODO: Try to make only one connection
        self.controller = DaoController(self.settings, self.plugin_name)
        status = self.controller.set_database_connection()
        if not status:
            message = self.controller.getLastError()
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING,
                                                5)
            return

        self.schema_name = self.controller.getSchemaName()
        self.dao = self.controller.getDao()

    def translate_form(self, context_name):
        ''' Translate widgets of the form to current language '''
        # Get objects of type: QLabel
        widget_list = self.dialog.findChildren(QLabel)
        for widget in widget_list:
            self.translate_widget(context_name, widget)

    def translate_widget(self, context_name, widget):
        ''' Translate widget text '''
        if widget:
            widget_name = widget.objectName()
            text = utils_giswater.tr(context_name, widget_name)
            if text != widget_name:
                widget.setText(text)

    def load_tab_add_info(self):
        ''' Load data from tab 'Add. info' '''
        pass

    def load_tab_analysis(self):
        ''' Load data from tab 'Analysis' '''
        pass

    def load_tab_document(self):
        ''' TODO: Load data from tab 'Document' '''
        pass

    def load_tab_picture(self):
        ''' TODO: Load data from tab 'Document' '''
        pass

    def load_tab_event(self):
        ''' TODO: Load data from tab 'Event' '''
        pass

    def load_tab_log(self):
        ''' TODO: Load data from tab 'Log' '''
        pass

    def load_tab_rtc(self):
        ''' TODO: Load data from tab 'RTC' '''
        pass

    def load_data(self):
        ''' Load data from related tables '''

        self.load_tab_add_info()
        self.load_tab_analysis()
        self.load_tab_document()
        self.load_tab_picture()
        self.load_tab_event()
        self.load_tab_log()
        self.load_tab_rtc()

    def save_tab_add_info(self):
        ''' Save tab from tab 'Add. info' '''
        pass

    def save_tab_analysis(self):
        ''' Save tab from tab 'Analysis' '''
        pass

    def save_tab_document(self):
        ''' TODO: Save tab from tab 'Document' '''
        pass

    def save_tab_picture(self):
        ''' TODO: Save tab from tab 'Document' '''
        pass

    def save_tab_event(self):
        ''' TODO: Save tab from tab 'Event' '''
        pass

    def save_tab_log(self):
        ''' TODO: Save tab from tab 'Log' '''
        pass

    def save_tab_rtc(self):
        ''' TODO: Save tab from tab 'RTC' '''
        pass

    def save_data(self):
        ''' Save data from related tables '''
        self.save_tab_add_info()
        self.save_tab_analysis()
        self.save_tab_document()
        self.save_tab_picture()
        self.save_tab_event()
        self.save_tab_log()
        self.save_tab_rtc()

    ''' Slot functions '''

    def save(self):
        ''' Save feature '''
        self.save_data()
        self.dialog.accept()
        self.layer.commitChanges()
        self.close()

    def close(self):
        ''' Close form without saving '''
        self.layer.rollBack()
        self.dialog.parent().setVisible(False)
예제 #3
0
class ParentDialog(object):   
    
    def __init__(self, iface, dialog, layer, feature):
        ''' Constructor class '''     
        self.iface = iface
        self.dialog = dialog
        self.layer = layer
        self.feature = feature
        self.init_config()             
    
        
    def init_config(self):    
        
        # initialize plugin directory
        user_folder = os.path.expanduser("~") 
        self.plugin_name = 'giswater'  
        self.plugin_dir = os.path.join(user_folder, '.qgis2/python/plugins/'+self.plugin_name)    
        
        # Get config file
        setting_file = os.path.join(self.plugin_dir, 'config', self.plugin_name+'.config')
        if not os.path.isfile(setting_file):
            message = "Config file not found at: "+setting_file
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5)  
            self.close()
            return
            
        self.settings = QSettings(setting_file, QSettings.IniFormat)
        self.settings.setIniCodec(sys.getfilesystemencoding())
        
        # Set controller to handle settings and database connection
        # TODO: Try to make only one connection
        self.controller = DaoController(self.settings, self.plugin_name)
        status = self.controller.set_database_connection()      
        if not status:
            message = self.controller.getLastError()
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5) 
            return 
             
        self.schema_name = self.controller.getSchemaName()          
        self.dao = self.controller.getDao()
            
            
    def translate_form(self, context_name):
        ''' Translate widgets of the form to current language '''
        # Get objects of type: QLabel
        widget_list = self.dialog.findChildren(QLabel)
        for widget in widget_list:
            self.translate_widget(context_name, widget)
            
            
    def translate_widget(self, context_name, widget):
        ''' Translate widget text '''
        if widget:
            widget_name = widget.objectName()
            text = utils_giswater.tr(context_name, widget_name)
            if text != widget_name:
                widget.setText(text)         
         
       
    def load_tab_add_info(self):
        ''' Load data from tab 'Add. info' '''                
        pass

    def load_tab_analysis(self):
        ''' Load data from tab 'Analysis' '''          
        pass
                
    def load_tab_document(self):
        ''' TODO: Load data from tab 'Document' '''   
        pass
                
    def load_tab_picture(self):
        ''' TODO: Load data from tab 'Document' '''   
        pass
                
    def load_tab_event(self):
        ''' TODO: Load data from tab 'Event' '''   
        pass
                
    def load_tab_log(self):
        ''' TODO: Load data from tab 'Log' '''   
        pass
        
    def load_tab_rtc(self):
        ''' TODO: Load data from tab 'RTC' '''   
        pass
    
    def load_data(self):
        ''' Load data from related tables '''
        
        self.load_tab_add_info()
        self.load_tab_analysis()
        self.load_tab_document()
        self.load_tab_picture()
        self.load_tab_event()
        self.load_tab_log()
        self.load_tab_rtc()
        

    def save_tab_add_info(self):
        ''' Save tab from tab 'Add. info' '''                
        pass

    def save_tab_analysis(self):
        ''' Save tab from tab 'Analysis' '''          
        pass
                
    def save_tab_document(self):
        ''' TODO: Save tab from tab 'Document' '''   
        pass
                
    def save_tab_picture(self):
        ''' TODO: Save tab from tab 'Document' '''   
        pass
                
    def save_tab_event(self):
        ''' TODO: Save tab from tab 'Event' '''   
        pass
                
    def save_tab_log(self):
        ''' TODO: Save tab from tab 'Log' '''   
        pass
        
    def save_tab_rtc(self):
        ''' TODO: Save tab from tab 'RTC' '''   
        pass
        
                        
    def save_data(self):
        ''' Save data from related tables '''        
        self.save_tab_add_info()
        self.save_tab_analysis()
        self.save_tab_document()
        self.save_tab_picture()
        self.save_tab_event()
        self.save_tab_log()
        self.save_tab_rtc()       
                
        
        
    ''' Slot functions '''           
               
    def save(self):
        ''' Save feature '''
        self.save_data()   
        self.dialog.accept()
        self.layer.commitChanges()    
        self.close()     
        
        
    def close(self):
        ''' Close form without saving '''
        self.layer.rollBack()   
        self.dialog.parent().setVisible(False)    
예제 #4
0
class NodeDialog():
    def __init__(self, iface, dialog, layer, feature):
        self.iface = iface
        self.dialog = dialog
        self.layer = layer
        self.feature = feature
        self.initConfig()

    def initConfig(self):

        self.node_id = utils_giswater.getStringValue2("node_id")
        self.epa_type = utils_giswater.getSelectedItem("epa_type")

        # initialize plugin directory
        user_folder = os.path.expanduser("~")
        self.plugin_name = 'giswater'
        self.plugin_dir = os.path.join(
            user_folder, '.qgis2/python/plugins/' + self.plugin_name)

        # Get config file
        setting_file = os.path.join(self.plugin_dir, 'config',
                                    self.plugin_name + '.config')
        if not os.path.isfile(setting_file):
            message = "Config file not found at: " + setting_file
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING,
                                                5)
            self.close()
            return

        self.settings = QSettings(setting_file, QSettings.IniFormat)
        self.settings.setIniCodec(sys.getfilesystemencoding())

        # Get widget controls
        self.cbo_cat_nodetype_id = self.dialog.findChild(
            QComboBox, "cat_nodetype_iddd")
        self.cbo_nodecat_id = self.dialog.findChild(QComboBox, "nodecat_id")
        self.tab_analysis = self.dialog.findChild(QTabWidget, "tab_analysis")
        self.tab_event = self.dialog.findChild(QTabWidget, "tab_event")

        # Set controller to handle settings and database connection
        # TODO: Try to make only one connection
        self.controller = DaoController(self.settings, self.plugin_name)
        status = self.controller.set_database_connection()
        if not status:
            message = self.controller.getLastError()
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING,
                                                5)
            return

        self.schema_name = self.controller.getSchemaName()
        self.dao = self.controller.getDao()

        # Manage tab visibility
        self.setTabsVisibility()

        # Manage i18n
        self.translateForm()

        # Fill combo 'node type' from 'epa_type'
        self.fillNodeType()

        # Load data from related tables
        self.loadData()

        # Set layer in editing mode
        self.layer.startEditing()

    def translateForm(self):

        # Get objects of type: QLabel
        context_name = 'ws_node'
        widget_list = self.dialog.findChildren(QLabel)
        for widget in widget_list:
            self.translateWidget(context_name, widget)

    def translateWidget(self, context_name, widget):

        if widget:
            widget_name = widget.objectName()
            text = utils_giswater.tr(context_name, widget_name)
            if text != widget_name:
                widget.setText(text)

    def loadData(self):
        # Tab 'Add. info'
        if self.epa_type == 'TANK':
            sql = "SELECT vmax, area FROM " + self.schema_name + ".man_tank WHERE node_id = " + self.node_id
            row = self.dao.get_row(sql)
            if row:
                utils_giswater.setText("man_tank_vmax", str(row[0]))
                utils_giswater.setText("man_tank_area", str(row[1]))

    ''' Slots '''

    def fillNodeType(self):
        """ Define and execute query to populate combo 'cat_nodetype_id' """
        cat_nodetype_id = utils_giswater.getSelectedItem("cat_nodetype_id")
        sql = "SELECT id, man_table, epa_table FROM " + self.schema_name + ".arc_type WHERE epa_default = '" + self.epa_type + "' UNION "
        sql += "SELECT id, man_table, epa_table FROM " + self.schema_name + ".node_type WHERE epa_default = '" + self.epa_type + "' ORDER BY id"
        rows = self.dao.get_rows(sql)
        self.cbo_cat_nodetype_id = self.dialog.findChild(
            QComboBox, "cat_nodetype_id")
        utils_giswater.fillComboBox(self.cbo_cat_nodetype_id, rows)
        utils_giswater.setSelectedItem('cat_nodetype_id', cat_nodetype_id)

    def changeNodeType(self, index):
        """ Define and execute query to populate combo 'nodecat_id_dummy' """
        cat_nodetype_id = utils_giswater.getSelectedItem("cat_nodetype_id")
        sql = "SELECT id FROM " + self.schema_name + ".cat_arc WHERE arctype_id = '" + cat_nodetype_id + "' UNION "
        sql += "SELECT id FROM " + self.schema_name + ".cat_node WHERE nodetype_id = '" + cat_nodetype_id + "' ORDER BY id"
        rows = self.dao.get_rows(sql)
        self.cbo_nodecat_id = self.dialog.findChild(QComboBox,
                                                    "nodecat_id_dummy")
        utils_giswater.fillComboBox(self.cbo_nodecat_id, rows, False)
        self.changeNodeCat(0)

    def changeNodeCat(self, index):
        """ Just select item to 'real' combo 'nodecat_id' (that is hidden) """
        dummy = utils_giswater.getSelectedItem("nodecat_id_dummy")
        utils_giswater.setSelectedItem("nodecat_id", dummy)

    def changeEpaType(self, index):
        """ Just select item to 'real' combo 'nodecat_id' (that is hidden) """
        epa_type = utils_giswater.getSelectedItem("epa_type")
        self.save()
        self.iface.openFeatureForm(self.layer, self.feature)

    def setTabsVisibility(self):

        man_visible = False
        index_tab = 0
        if self.epa_type == 'JUNCTION':
            index_tab = 0
        if self.epa_type == 'RESERVOIR' or self.epa_type == 'HYDRANT':
            index_tab = 1
        if self.epa_type == 'TANK':
            index_tab = 2
            man_visible = True
        if self.epa_type == 'PUMP':
            index_tab = 3
        if self.epa_type == 'VALVE':
            index_tab = 4
        if self.epa_type == 'SHORTPIPE' or self.epa_type == 'FILTER':
            index_tab = 5
        if self.epa_type == 'MEASURE INSTRUMENT':
            index_tab = 6

        # Tab 'Add. info': Manage visibility of these widgets
        utils_giswater.setWidgetVisible("label_man_tank_vmax", man_visible)
        utils_giswater.setWidgetVisible("label_man_tank_area", man_visible)
        utils_giswater.setWidgetVisible("man_tank_vmax", man_visible)
        utils_giswater.setWidgetVisible("man_tank_area", man_visible)

        # Move 'visible' tab to last position and remove previous ones
        self.tab_analysis.tabBar().moveTab(index_tab, 5)
        for i in range(0, self.tab_analysis.count() - 1):
            self.tab_analysis.removeTab(0)
        self.tab_event.tabBar().moveTab(index_tab, 6)
        for i in range(0, self.tab_event.count() - 1):
            self.tab_event.removeTab(0)

    def save(self):
        if self.epa_type == 'TANK':
            vmax = utils_giswater.getStringValue2("man_tank_vmax")
            area = utils_giswater.getStringValue2("man_tank_area")
            sql = "UPDATE " + self.schema_name + ".man_tank SET vmax = " + str(
                vmax) + ", area = " + str(area)
            sql += " WHERE node_id = " + str(self.node_id)
            print sql
            self.dao.execute_sql(sql)
        self.dialog.accept()
        self.layer.commitChanges()
        self.close()

    def close(self):
        self.layer.rollBack()
        self.dialog.parent().setVisible(False)
class NodeDialog():   
    
    def __init__(self, iface, dialog, layer, feature):
        self.iface = iface
        self.dialog = dialog
        self.layer = layer
        self.feature = feature
        self.initConfig()
    
        
    def initConfig(self):    
        
        self.node_id = utils_giswater.getStringValue2("node_id")
        self.epa_type = utils_giswater.getSelectedItem("epa_type")
            
        # initialize plugin directory
        user_folder = os.path.expanduser("~") 
        self.plugin_name = 'giswater'  
        self.plugin_dir = os.path.join(user_folder, '.qgis2/python/plugins/'+self.plugin_name)    
        
        # Get config file
        setting_file = os.path.join(self.plugin_dir, 'config', self.plugin_name+'.config')
        if not os.path.isfile(setting_file):
            message = "Config file not found at: "+setting_file
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5)  
            self.close()
            return
            
        self.settings = QSettings(setting_file, QSettings.IniFormat)
        self.settings.setIniCodec(sys.getfilesystemencoding())
        
        # Get widget controls
        self.cbo_cat_nodetype_id = self.dialog.findChild(QComboBox, "cat_nodetype_iddd")      
        self.cbo_nodecat_id = self.dialog.findChild(QComboBox, "nodecat_id")   
        self.tab_analysis = self.dialog.findChild(QTabWidget, "tab_analysis")            
        self.tab_event = self.dialog.findChild(QTabWidget, "tab_event")         
        
        # Set controller to handle settings and database connection
        # TODO: Try to make only one connection
        self.controller = DaoController(self.settings, self.plugin_name)
        status = self.controller.set_database_connection()      
        if not status:
            message = self.controller.getLastError()
            self.iface.messageBar().pushMessage(message, QgsMessageBar.WARNING, 5) 
            return 
             
        self.schema_name = self.controller.getSchemaName()            
        self.dao = self.controller.getDao()
             
        # Manage tab visibility
        self.setTabsVisibility()
        
        # Manage i18n
        self.translateForm()
        
        # Fill combo 'node type' from 'epa_type'
        self.fillNodeType()
        
        # Load data from related tables
        self.loadData()
        
        # Set layer in editing mode
        self.layer.startEditing()
            
            
    def translateForm(self):
        
        # Get objects of type: QLabel
        context_name = 'ws_node'
        widget_list = self.dialog.findChildren(QLabel)
        for widget in widget_list:
            self.translateWidget(context_name, widget)
            
            
    def translateWidget(self, context_name, widget):
        
        if widget:
            widget_name = widget.objectName()
            text = utils_giswater.tr(context_name, widget_name)
            if text != widget_name:
                widget.setText(text)        
        
   
    def loadData(self):
        # Tab 'Add. info'
        if self.epa_type == 'TANK':
            sql = "SELECT vmax, area FROM "+self.schema_name+".man_tank WHERE node_id = "+self.node_id
            row = self.dao.get_row(sql)
            if row:
                utils_giswater.setText("man_tank_vmax", str(row[0]))
                utils_giswater.setText("man_tank_area", str(row[1]))
        
        
        
    ''' Slots '''  
    
    def fillNodeType(self):
        """ Define and execute query to populate combo 'cat_nodetype_id' """
        cat_nodetype_id = utils_giswater.getSelectedItem("cat_nodetype_id")     
        sql = "SELECT id, man_table, epa_table FROM "+self.schema_name+".arc_type WHERE epa_default = '"+self.epa_type+"' UNION "
        sql+= "SELECT id, man_table, epa_table FROM "+self.schema_name+".node_type WHERE epa_default = '"+self.epa_type+"' ORDER BY id"
        rows = self.dao.get_rows(sql)     
        self.cbo_cat_nodetype_id = self.dialog.findChild(QComboBox, "cat_nodetype_id")    
        utils_giswater.fillComboBox(self.cbo_cat_nodetype_id, rows)
        utils_giswater.setSelectedItem('cat_nodetype_id', cat_nodetype_id)
            
            
    def changeNodeType(self, index):
        """ Define and execute query to populate combo 'nodecat_id_dummy' """
        cat_nodetype_id = utils_giswater.getSelectedItem("cat_nodetype_id")     
        sql = "SELECT id FROM "+self.schema_name+".cat_arc WHERE arctype_id = '"+cat_nodetype_id+"' UNION "
        sql+= "SELECT id FROM "+self.schema_name+".cat_node WHERE nodetype_id = '"+cat_nodetype_id+"' ORDER BY id"   
        rows = self.dao.get_rows(sql)
        self.cbo_nodecat_id = self.dialog.findChild(QComboBox, "nodecat_id_dummy")
        utils_giswater.fillComboBox(self.cbo_nodecat_id, rows, False)  
        self.changeNodeCat(0)       
        
                       
    def changeNodeCat(self, index):
        """ Just select item to 'real' combo 'nodecat_id' (that is hidden) """
        dummy = utils_giswater.getSelectedItem("nodecat_id_dummy")
        utils_giswater.setSelectedItem("nodecat_id", dummy)   
        
                
    def changeEpaType(self, index):
        """ Just select item to 'real' combo 'nodecat_id' (that is hidden) """
        epa_type = utils_giswater.getSelectedItem("epa_type")
        self.save()
        self.iface.openFeatureForm(self.layer, self.feature)        
    
    
    def setTabsVisibility(self):
        
        man_visible = False
        index_tab = 0      
        if self.epa_type == 'JUNCTION':
            index_tab = 0
        if self.epa_type == 'RESERVOIR' or self.epa_type == 'HYDRANT':
            index_tab = 1
        if self.epa_type == 'TANK':
            index_tab = 2
            man_visible = True           
        if self.epa_type == 'PUMP':
            index_tab = 3
        if self.epa_type == 'VALVE':
            index_tab = 4
        if self.epa_type == 'SHORTPIPE' or self.epa_type == 'FILTER':
            index_tab = 5
        if self.epa_type == 'MEASURE INSTRUMENT':
            index_tab = 6
        
        # Tab 'Add. info': Manage visibility of these widgets 
        utils_giswater.setWidgetVisible("label_man_tank_vmax", man_visible) 
        utils_giswater.setWidgetVisible("label_man_tank_area", man_visible) 
        utils_giswater.setWidgetVisible("man_tank_vmax", man_visible) 
        utils_giswater.setWidgetVisible("man_tank_area", man_visible) 
                    
        # Move 'visible' tab to last position and remove previous ones
        self.tab_analysis.tabBar().moveTab(index_tab, 5);
        for i in range(0, self.tab_analysis.count() - 1):
            self.tab_analysis.removeTab(0)    
        self.tab_event.tabBar().moveTab(index_tab, 6);
        for i in range(0, self.tab_event.count() - 1):
            self.tab_event.removeTab(0)    
            
               
    def save(self):
        if self.epa_type == 'TANK':
            vmax = utils_giswater.getStringValue2("man_tank_vmax")
            area = utils_giswater.getStringValue2("man_tank_area")
            sql = "UPDATE "+self.schema_name+".man_tank SET vmax = "+str(vmax)+ ", area = "+str(area)
            sql+= " WHERE node_id = "+str(self.node_id)
            print sql
            self.dao.execute_sql(sql)
        self.dialog.accept()
        self.layer.commitChanges()    
        self.close()     
        
        
    def close(self):
        self.layer.rollBack()   
        self.dialog.parent().setVisible(False)