class pyarchinit_Thesaurus(QDialog, Ui_DialogThesaurus):
    MSG_BOX_TITLE = "PyArchInit - pyarchinit_version 0.4 - Scheda Campioni"
    DATA_LIST = []
    DATA_LIST_REC_CORR = []
    DATA_LIST_REC_TEMP = []
    REC_CORR = 0
    REC_TOT = 0
    STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
    BROWSE_STATUS = "b"
    SORT_MODE = 'asc'
    SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
    SORT_STATUS = "n"
    UTILITY = Utility()
    DB_MANAGER = ""
    TABLE_NAME = 'pyarchinit_thesaurus_sigle'
    MAPPER_TABLE_CLASS = "PYARCHINIT_THESAURUS_SIGLE"
    NOME_SCHEDA = "Scheda Thesaurus Sigle"
    ID_TABLE = "id_thesaurus_sigle"
    CONVERSION_DICT = {
        ID_TABLE: ID_TABLE,
        "Nome tabella": "nome_tabella",
        "Sigla": "sigla",
        "Sigla estesa": "sigla_estesa",
        "Descrizione": "descrizione",
        "Tipologia sigla": "tipologia_sigla"
    }

    SORT_ITEMS = [
        ID_TABLE, "Nome tabella", "Sigla", "Sigla estesa", "Descrizione",
        "Tipologia sigla"
    ]

    TABLE_FIELDS = [
        "nome_tabella", "sigla", "sigla_estesa", "descrizione",
        "tipologia_sigla"
    ]
    DB_SERVER = "not defined"  ####nuovo sistema sort

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        QDialog.__init__(self)
        self.setupUi(self)
        self.currentLayerId = None
        try:
            self.on_pushButton_connect_pressed()
        except Exception as e:
            QMessageBox.warning(self, "Sistema di connessione", str(e),
                                QMessageBox.Ok)

    def enable_button(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_new_search.setEnabled(n)

        self.pushButton_search_go.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def enable_button_search(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_save.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def on_pushButton_connect_pressed(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        test_conn = conn_str.find('sqlite')

        if test_conn == 0:
            self.DB_SERVER = "sqlite"

        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.charge_records()  #charge records from DB
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = 'b'
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
            else:
                QMessageBox.warning(
                    self, "BENVENUTO",
                    "Benvenuto in pyArchInit" + self.NOME_SCHEDA +
                    ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",
                    QMessageBox.Ok)
                self.charge_list()
                self.BROWSE_STATUS = 'x'
                self.on_pushButton_new_rec_pressed()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS"
                    + str(e), QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def charge_list(self):
        pass
##		sito_vl = self.UTILITY.tup_2_list_III(self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))
##
##		try:
##			sito_vl.remove('')
##		except:
##			pass
##		self.comboBox_sito.clear()
##		sito_vl.sort()
##		self.comboBox_sito.addItems(sito_vl)

#buttons functions

    def on_pushButton_pdf_pressed(self):
        pass

    def on_pushButton_sort_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            dlg = SortPanelMain(self)
            dlg.insertItems(self.SORT_ITEMS)
            dlg.exec_()

            items, order_type = dlg.ITEMS, dlg.TYPE_ORDER

            self.SORT_ITEMS_CONVERTED = []
            for i in items:
                self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

            self.SORT_MODE = order_type
            self.empty_fields()

            id_list = []
            for i in self.DATA_LIST:
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))
            self.DATA_LIST = []

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                self.MAPPER_TABLE_CLASS, self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR

            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.SORT_STATUS = "o"
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.fill_fields()

    def on_pushButton_new_rec_pressed(self):
        if bool(self.DATA_LIST) == True:
            if self.data_error_check() == 1:
                pass
            else:
                if self.BROWSE_STATUS == "b":
                    if bool(self.DATA_LIST) == True:
                        if self.records_equal_check() == 1:
                            msg = self.update_if(
                                QMessageBox.warning(
                                    self, 'Errore',
                                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                                    QMessageBox.Cancel, 1))

        #set the GUI for a new record
        if self.BROWSE_STATUS != "n":
            self.BROWSE_STATUS = "n"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            self.empty_fields()
            self.label_sort.setText(self.SORTED_ITEMS["n"])

            self.setComboBoxEditable(["self.comboBox_sigla"], 1)
            self.setComboBoxEditable(["self.comboBox_sigla_estesa"], 1)
            self.setComboBoxEditable(["self.comboBox_tipologia_sigla"], 1)
            self.setComboBoxEditable(["self.comboBox_nome_tabella"], 1)

            self.setComboBoxEnable(["self.comboBox_sigla"], "True")
            self.setComboBoxEnable(["self.comboBox_sigla_estesa"], "True")
            self.setComboBoxEnable(["self.comboBox_tipologia_sigla"], "True")
            self.setComboBoxEnable(["self.comboBox_nome_tabella"], "True")

            self.set_rec_counter('', '')
            self.enable_button(0)

    def on_pushButton_save_pressed(self):
        #save record
        if self.BROWSE_STATUS == "b":
            if self.data_error_check() == 0:
                if self.records_equal_check() == 1:
                    self.update_if(
                        QMessageBox.warning(
                            self, 'ATTENZIONE',
                            "Il record e' stato modificato. Vuoi salvare le modifiche?",
                            QMessageBox.Cancel, 1))
                    self.SORT_STATUS = "n"
                    self.label_sort.setText(
                        self.SORTED_ITEMS[self.SORT_STATUS])
                    self.enable_button(1)
                    self.fill_fields(self.REC_CORR)
                else:
                    QMessageBox.warning(
                        self, "ATTENZIONE",
                        "Non è stata realizzata alcuna modifica.",
                        QMessageBox.Ok)
        else:
            if self.data_error_check() == 0:
                test_insert = self.insert_new_rec()
                if test_insert == 1:
                    self.empty_fields()
                    self.label_sort.setText(self.SORTED_ITEMS["n"])
                    self.charge_list()
                    self.charge_records()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.REC_TOT, self.REC_CORR = len(
                        self.DATA_LIST), len(self.DATA_LIST) - 1
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)

                    self.setComboBoxEditable(["self.comboBox_sigla"], 1)
                    self.setComboBoxEditable(["self.comboBox_sigla_estesa"], 1)
                    self.setComboBoxEditable(["self.comboBox_tipologia_sigla"],
                                             1)
                    self.setComboBoxEditable(["self.comboBox_nome_tabella"], 1)

                    self.setComboBoxEnable(["self.comboBox_sigla"], "False")
                    self.setComboBoxEnable(["self.comboBox_sigla_estesa"],
                                           "False")
                    self.setComboBoxEnable(["self.comboBox_tipologia_sigla"],
                                           "False")
                    self.setComboBoxEnable(["self.comboBox_nome_tabella"],
                                           "False")

                    self.fill_fields(self.REC_CORR)
                    self.enable_button(1)
                else:
                    pass

    def data_error_check(self):
        test = 0
        EC = Error_check()

        if EC.data_is_empty(str(self.comboBox_sigla.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Sigla \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(
                self.comboBox_sigla_estesa.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Sigla estesa \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(
                self.comboBox_tipologia_sigla.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Tipologia sigla. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(
                self.comboBox_nome_tabella.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Nome tabella \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(
                self.textEdit_descrizione_sigla.toPlainText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Descrizione \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        return test

    def insert_new_rec(self):
        try:
            data = self.DB_MANAGER.insert_values_thesaurus(
                self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS,
                                           self.ID_TABLE) + 1,
                str(self.comboBox_nome_tabella.currentText()
                    ),  #1 - nome tabella
                str(self.comboBox_sigla.currentText()),  #2 - sigla
                str(self.comboBox_sigla_estesa.currentText()
                    ),  #3 - sigla estesa
                str(self.textEdit_descrizione_sigla.toPlainText()
                    ),  #4 - descrizione
                str(self.comboBox_tipologia_sigla.currentText())
            )  #5 - tipologia sigla

            try:
                self.DB_MANAGER.insert_data_session(data)
                return 1
            except Exception as e:
                e_str = str(e)
                if e_str.__contains__("Integrity"):
                    msg = self.ID_TABLE + " gia' presente nel database"
                else:
                    msg = e
                QMessageBox.warning(self, "Errore",
                                    "Attenzione 1 ! \n" + str(msg),
                                    QMessageBox.Ok)
                return 0
        except Exception as e:
            QMessageBox.warning(self, "Errore", "Attenzione 2 ! \n" + str(e),
                                QMessageBox.Ok)
            return 0

    def check_record_state(self):
        ec = self.data_error_check()
        if ec == 1:
            return 1  #ci sono errori di immissione
        elif self.records_equal_check() == 1 and ec == 0:
            self.update_if(
                QMessageBox.warning(
                    self, 'Errore',
                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                    QMessageBox.Cancel, 1))
            #self.charge_records() incasina lo stato trova
            return 0  #non ci sono errori di immissione

    def on_pushButton_view_all_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.empty_fields()
            self.charge_records()
            self.fill_fields()
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.label_sort.setText(self.SORTED_ITEMS["n"])

    #records surf functions
    def on_pushButton_first_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.fill_fields(0)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_last_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(
                    self.DATA_LIST), len(self.DATA_LIST) - 1
                self.fill_fields(self.REC_CORR)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_prev_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR - 1
            if self.REC_CORR == -1:
                self.REC_CORR = 0
                QMessageBox.warning(self, "Errore", "Sei al primo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_next_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR + 1
            if self.REC_CORR >= self.REC_TOT:
                self.REC_CORR = self.REC_CORR - 1
                QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_delete_pressed(self):
        msg = QMessageBox.warning(
            self, "Attenzione!!!",
            "Vuoi veramente eliminare il record? \n L'azione è irreversibile",
            QMessageBox.Cancel, 1)
        if msg != 1:
            QMessageBox.warning(self, "Messagio!!!", "Azione Annullata!")
        else:
            try:
                id_to_delete = ast.literal_eval(
                    "self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
                self.DB_MANAGER.delete_one_record(self.TABLE_NAME,
                                                  self.ID_TABLE, id_to_delete)
                self.charge_records()  #charge records from DB
                QMessageBox.warning(self, "Messaggio!!!", "Record eliminato!")
            except Exception as e:
                QMessageBox.warning(self, "Messaggio!!!",
                                    "Tipo di errore: " + str(e))
            if bool(self.DATA_LIST) == False:
                QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",
                                    QMessageBox.Ok)
                self.DATA_LIST = []
                self.DATA_LIST_REC_CORR = []
                self.DATA_LIST_REC_TEMP = []
                self.REC_CORR = 0
                self.REC_TOT = 0
                self.empty_fields()
                self.set_rec_counter(0, 0)
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]

                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
        self.SORT_STATUS = "n"
        self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

    def on_pushButton_new_search_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.enable_button_search(0)

            #set the GUI for a new search
            if self.BROWSE_STATUS != "f":
                self.BROWSE_STATUS = "f"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                ###
                self.setComboBoxEditable(["self.comboBox_sigla"], 1)
                self.setComboBoxEditable(["self.comboBox_sigla_estesa"], 1)
                self.setComboBoxEditable(["self.comboBox_tipologia_sigla"], 1)
                self.setComboBoxEditable(["self.comboBox_nome_tabella"], 1)

                self.setComboBoxEnable(["self.comboBox_sigla"], "True")
                self.setComboBoxEnable(["self.comboBox_sigla_estesa"], "True")
                self.setComboBoxEnable(["self.comboBox_tipologia_sigla"],
                                       "True")
                self.setComboBoxEnable(["self.comboBox_nome_tabella"], "True")

                self.setComboBoxEnable(["self.textEdit_descrizione_sigla"],
                                       "False")
                ###
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter('', '')
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.charge_list()
                self.empty_fields()

    def on_pushButton_search_go_pressed(self):
        if self.BROWSE_STATUS != "f":
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",
                QMessageBox.Ok)
        else:
            search_dict = {
                self.TABLE_FIELDS[0]:
                "'" + str(self.comboBox_nome_tabella.currentText()) +
                "'",  #1 - Nome tabella
                self.TABLE_FIELDS[1]:
                "'" + str(self.comboBox_sigla.currentText()) + "'",  #2 - sigla
                self.TABLE_FIELDS[2]:
                "'" + str(self.comboBox_sigla_estesa.currentText()) +
                "'",  #3 - sigla estesa
                self.TABLE_FIELDS[4]:
                "'" + str(self.comboBox_tipologia_sigla.currentText()) +
                "'"  #3 - tipologia sigla
            }

            u = Utility()
            search_dict = u.remove_empty_items_fr_dict(search_dict)

            if bool(search_dict) == False:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Non e' stata impostata alcuna ricerca!!!", QMessageBox.Ok)
            else:
                res = self.DB_MANAGER.query_bool(search_dict,
                                                 self.MAPPER_TABLE_CLASS)
                if bool(res) == False:
                    QMessageBox.warning(self, "ATTENZIONE",
                                        "Non e' stato trovato alcun record!",
                                        QMessageBox.Ok)

                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]

                    self.fill_fields(self.REC_CORR)
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])

                    self.setComboBoxEditable(["self.comboBox_sigla"], 1)
                    self.setComboBoxEditable(["self.comboBox_sigla_estesa"], 1)
                    self.setComboBoxEditable(["self.comboBox_tipologia_sigla"],
                                             1)
                    self.setComboBoxEditable(["self.comboBox_nome_tabella"], 1)

                    self.setComboBoxEnable(["self.comboBox_sigla"], "False")
                    self.setComboBoxEnable(["self.comboBox_sigla_estesa"],
                                           "False")
                    self.setComboBoxEnable(["self.comboBox_tipologia_sigla"],
                                           "False")
                    self.setComboBoxEnable(["self.comboBox_nome_tabella"],
                                           "False")

                    self.setComboBoxEnable(["self.textEdit_descrizione_sigla"],
                                           "True")

                else:
                    self.DATA_LIST = []

                    for i in res:
                        self.DATA_LIST.append(i)

                    self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]
                    self.fill_fields()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)

                    if self.REC_TOT == 1:
                        strings = ("E' stato trovato", self.REC_TOT, "record")
                    else:
                        strings = ("Sono stati trovati", self.REC_TOT,
                                   "records")

                        self.setComboBoxEditable(["self.comboBox_sigla"], 1)
                        self.setComboBoxEditable(
                            ["self.comboBox_sigla_estesa"], 1)
                        self.setComboBoxEditable(
                            ["self.comboBox_tipologia_sigla"], 1)
                        self.setComboBoxEditable(
                            ["self.comboBox_nome_tabella"], 1)

                        self.setComboBoxEnable(["self.comboBox_sigla"],
                                               "False")
                        self.setComboBoxEnable(["self.comboBox_sigla_estesa"],
                                               "False")
                        self.setComboBoxEnable(
                            ["self.comboBox_tipologia_sigla"], "False")
                        self.setComboBoxEnable(["self.comboBox_nome_tabella"],
                                               "False")

                        self.setComboBoxEnable(
                            ["self.textEdit_descrizione_sigla"], "True")

                    QMessageBox.warning(self, "Messaggio",
                                        "%s %d %s" % strings, QMessageBox.Ok)

        self.enable_button_search(1)

    def on_pushButton_test_pressed(self):
        pass
##		data = "Sito: " + str(self.comboBox_sito.currentText())
##
##		test = Test_area(data)
##		test.run_test()

    def on_pushButton_draw_pressed(self):
        pass
        #self.pyQGIS.charge_layers_for_draw(["1", "2", "3", "4", "5", "7", "8", "9", "10", "12"])

    def on_pushButton_sites_geometry_pressed(self):
        pass
##		sito = unicode(self.comboBox_sito.currentText())
##		self.pyQGIS.charge_sites_geometry(["1", "2", "3", "4", "8"], "sito", sito)

    def on_pushButton_rel_pdf_pressed(self):
        pass
##		check=QMessageBox.warning(self, "Attention", "Under testing: this method can contains some bugs. Do you want proceed?",QMessageBox.Cancel,1)
##		if check == 1:
##			erp = exp_rel_pdf(unicode(self.comboBox_sito.currentText()))
##			erp.export_rel_pdf()

    def update_if(self, msg):
        rec_corr = self.REC_CORR
        self.msg = msg
        if self.msg == 1:
            test = self.update_record()
            if test == 1:
                id_list = []
                for i in self.DATA_LIST:
                    id_list.append(ast.literal_eval("i." + self.ID_TABLE))
                self.DATA_LIST = []
                if self.SORT_STATUS == "n":
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, [self.ID_TABLE], 'asc',
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE
                    )  #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
                else:
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE)
                for i in temp_data_list:
                    self.DATA_LIST.append(i)
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                if type(self.REC_CORR) == "<type 'str'>":
                    corr = 0
                else:
                    corr = self.REC_CORR
                return 1
            elif test == 0:
                return 0

    #custom functions
    def charge_records(self):
        self.DATA_LIST = []

        if self.DB_SERVER == 'sqlite':
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                self.DATA_LIST.append(i)
        else:
            id_list = []
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS,
                self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)

    def datestrfdate(self):
        now = date.today()
        today = now.strftime("%d-%m-%Y")
        return today

    def table2dict(self, n):
        self.tablename = n
        row = ast.literal_eval(self.tablename + ".rowCount()")
        col = ast.literal_eval(self.tablename + ".columnCount()")
        lista = []
        for r in range(row):
            sub_list = []
            for c in range(col):
                value = ast.literal_eval(self.tablename + ".item(r,c)")
                if bool(value) == True:
                    sub_list.append(str(value.text()))
            lista.append(sub_list)
        return lista

    def empty_fields(self):
        self.comboBox_sigla.setEditText("")  #1 - Sigla
        self.comboBox_sigla_estesa.setEditText("")  #2 - Sigla estesa
        self.comboBox_tipologia_sigla.setEditText("")  #1 - Tipologia sigla
        self.comboBox_nome_tabella.setEditText("")  #2 - Nome tabella
        self.textEdit_descrizione_sigla.clear()  #4 - Descrizione

    def fill_fields(self, n=0):
        self.rec_num = n

        str(self.comboBox_sigla.setEditText(
            self.DATA_LIST[self.rec_num].sigla))  #1 - Sigla
        str(
            self.comboBox_sigla_estesa.setEditText(
                self.DATA_LIST[self.rec_num].sigla_estesa))  #2 - Sigla estesa
        str(
            self.comboBox_tipologia_sigla.setEditText(self.DATA_LIST[
                self.rec_num].tipologia_sigla))  #3 - tipologia sigla
        str(
            self.comboBox_nome_tabella.setEditText(
                self.DATA_LIST[self.rec_num].nome_tabella))  #4 - nome tabella
        str(
            str(
                self.textEdit_descrizione_sigla.setText(self.DATA_LIST[
                    self.rec_num].descrizione)))  #5 - descrizione sigla

    def set_rec_counter(self, t, c):
        self.rec_tot = t
        self.rec_corr = c
        self.label_rec_tot.setText(str(self.rec_tot))
        self.label_rec_corrente.setText(str(self.rec_corr))

    def set_LIST_REC_TEMP(self):

        #data
        self.DATA_LIST_REC_TEMP = [
            str(self.comboBox_nome_tabella.currentText()),  #1 - Nome tabella
            str(self.comboBox_sigla.currentText()),  #2 - sigla
            str(self.comboBox_sigla_estesa.currentText()),  #3 - sigla estesa
            str(self.textEdit_descrizione_sigla.toPlainText()
                ),  #4 - descrizione
            str(self.comboBox_tipologia_sigla.currentText()
                )  #3 - tipologia sigla
        ]

    def set_LIST_REC_CORR(self):
        self.DATA_LIST_REC_CORR = []
        for i in self.TABLE_FIELDS:
            self.DATA_LIST_REC_CORR.append(
                ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i +
                                 ")"))

    def setComboBoxEnable(self, f, v):
        field_names = f
        value = v

        for fn in field_names:
            cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
            ast.literal_eval(cmd)

    def setComboBoxEditable(self, f, n):
        field_names = f
        value = n

        for fn in field_names:
            cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
            ast.literal_eval(cmd)

    def rec_toupdate(self):
        rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)
        return rec_to_update

    def records_equal_check(self):
        self.set_LIST_REC_TEMP()
        self.set_LIST_REC_CORR()

        if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
            return 0
        else:
            return 1

    def update_record(self):
        try:
            self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [
                ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." +
                                 self.ID_TABLE + ")")
            ], self.TABLE_FIELDS, self.rec_toupdate())
            return 1
        except Exception as e:
            QMessageBox.warning(
                self, "Messaggio",
                "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :"
                + str(e), QMessageBox.Ok)
            return 0

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
class pyArchInitDialog_Config(QDialog, Ui_Dialog_Config):
    if os.name == 'posix':
        HOME = os.environ['HOME']
    elif os.name == 'nt':
        HOME = os.environ['HOMEPATH']

    PARAMS_DICT = {
        'SERVER': '',
        'HOST': '',
        'DATABASE': '',
        'PASSWORD': '',
        'PORT': '',
        'USER': '',
        'THUMB_PATH': '',
        'EXPERIMENTAL': ''
    }

    def __init__(self, parent=None, db=None):
        QDialog.__init__(self, parent)
        # Set up the user interface from Designer.
        self.setupUi(self)
        self.load_dict()
        self.charge_data()
        self.connect(self.comboBox_Database,
                     SIGNAL("editTextChanged (const QString&)"),
                     self.set_db_parameter)
        self.connect(self.comboBox_server_rd,
                     SIGNAL("editTextChanged (const QString&)"),
                     self.set_db_import_from_parameter)
        self.connect(self.comboBox_server_wt,
                     SIGNAL("editTextChanged (const QString&)"),
                     self.set_db_import_to_parameter)
        self.connect(self.comboBox_experimental,
                     SIGNAL("editTextChanged (const QString&)"), self.message)

    def set_db_parameter(self):
        if str(self.comboBox_Database.currentText()) == 'postgres':
            self.lineEdit_DBname.setText("pyarchinit")
            self.lineEdit_Host.setText('127.0.0.1')
            self.lineEdit_Port.setText('5432')
            self.lineEdit_User.setText('postgres')

        if str(self.comboBox_Database.currentText()) == 'sqlite':
            self.lineEdit_DBname.setText("pyarchinit_db.sqlite")
            self.lineEdit_Host.setText('')
            self.lineEdit_Password.setText('')
            self.lineEdit_Port.setText('')
            self.lineEdit_User.setText('')

    def set_db_import_from_parameter(self):
        QMessageBox.warning(self, "ok", "entrato in read.", QMessageBox.Ok)

        if str(self.comboBox_server_rd.currentText()) == 'postgres':
            QMessageBox.warning(self, "ok", "entrato in if", QMessageBox.Ok)
            self.lineEdit_host_rd.setText('127.0.0.1')
            self.lineEdit_username_rd.setText('postgres')
            self.lineEdit_database_rd.setText('pyarchinit')
            self.lineEdit_port_rd.setText('5432')

        if str(self.comboBox_server_rd.currentText()) == 'sqlite':
            QMessageBox.warning(self, "ok", "entrato in if", QMessageBox.Ok)

            self.lineEdit_host_rd.setText.setText('')
            self.lineEdit_username_rd.setText('')
            self.lineEdit_lineEdit_pass_rd.setText('')
            self.lineEdit_database_rd.setText('pyarchinit_db.sqlite')
            self.lineEdit_port_rd.setText('')

    def set_db_import_to_parameter(self):
        QMessageBox.warning(self, "ok", "entrato in write", QMessageBox.Ok)

        if str(self.comboBox_server_wt.currentText()) == 'postgres':
            QMessageBox.warning(self, "ok", "entrato in if", QMessageBox.Ok)

            self.lineEdit_host_wt.setText('127.0.0.1')
            self.lineEdit_username_wt.setText('postgres')
            self.lineEdit_database_wt.setText('pyarchinit')
            self.lineEdit_port_wt.setText('5432')

        if str(self.comboBox_server_wt.currentText()) == 'sqlite':
            QMessageBox.warning(self, "ok", "entrato in if", QMessageBox.Ok)

            self.lineEdit_host_wt.setText.setText('')
            self.lineEdit_username_wt.setText('')
            self.lineEdit_lineEdit_pass_wt.setText('')
            self.lineEdit_database_wt.setText('pyarchinit_db.sqlite')
            self.lineEdit_port_wt.setText('')

    def load_dict(self):
        path_rel = os.path.join(os.sep, str(self.HOME), 'pyarchinit_DB_folder',
                                'config.cfg')
        conf = open(path_rel, "r")
        data = conf.read()
        self.PARAMS_DICT = ast.literal_eval(data)

    def save_dict(self):
        #save data into config.cfg file
        path_rel = os.path.join(os.sep, str(self.HOME), 'pyarchinit_DB_folder',
                                'config.cfg')
        f = open(path_rel, "w")
        f.write(str(self.PARAMS_DICT))
        f.close()

    def message(self):
        QMessageBox.warning(
            self, "ok",
            "Per rendere effettive le modifiche e' necessario riavviare Qgis. Grazie.",
            QMessageBox.Ok)
        self.on_pushButton_save_pressed()

    def on_pushButton_save_pressed(self):
        self.PARAMS_DICT['SERVER'] = str(self.comboBox_Database.currentText())
        self.PARAMS_DICT['HOST'] = str(self.lineEdit_Host.text())
        self.PARAMS_DICT['DATABASE'] = str(self.lineEdit_DBname.text())
        self.PARAMS_DICT['PASSWORD'] = str(self.lineEdit_Password.text())
        self.PARAMS_DICT['PORT'] = str(self.lineEdit_Port.text())
        self.PARAMS_DICT['USER'] = str(self.lineEdit_User.text())
        self.PARAMS_DICT['THUMB_PATH'] = str(self.lineEdit_Thumb_path.text())
        self.PARAMS_DICT['EXPERIMENTAL'] = str(
            self.comboBox_experimental.currentText())

        self.save_dict()
        self.try_connection()

    def on_pushButton_crea_database_pressed(self):
        import time
        try:
            db = os.popen(
                "createdb -U postgres -p %s -h localhost -E UTF8  -T %s -e %s"
                % (str(self.lineEdit_port_db.text()),
                   str(self.lineEdit_template_postgis.text()),
                   str(self.lineEdit_dbname.text())))
            barra = self.pyarchinit_progressBar_db
            barra.setMinimum(0)
            barra.setMaximum(9)
            for a in range(10):
                time.sleep(1)
                barra.setValue(a)
            QMessageBox.warning(self, "ok",
                                "Installazione avvenuta con successo",
                                QMessageBox.Ok)
        except Exception as e:
            QMessageBox.warning(self, "opss", "qualcosa non va" + str(e),
                                QMessageBox.Ok)

    def on_pushButton_crea_layer_pressed(self):
        import time
        if os.name == 'posix':
            home = os.environ['HOME']
        elif os.name == 'nt':
            home = os.environ['HOMEPATH']
        try:
            module_path_rel = os.path.join(os.sep, '.qgis2', 'python',
                                           'plugins', 'pyarchinit', 'modules',
                                           'utility', 'DBfiles',
                                           'pyarchinit_postgis15_empty.dump')
            module_path = ('%s%s') % (home, module_path_rel)
            postgis15 = os.popen(
                "pg_restore --host localhost --port %s --username postgres --dbname %s --role postgres --no-password  --verbose %s"
                % (str(self.lineEdit_port_db.text()),
                   str(self.lineEdit_dbname.text()), str(module_path)))
            barra2 = self.pyarchinit_progressBar_template
            barra2.setMinimum(0)
            barra2.setMaximum(9)
            for a in range(10):
                time.sleep(1)
                barra2.setValue(a)
            QMessageBox.warning(self, "ok",
                                "Installazione avvenuta con successo",
                                QMessageBox.Ok)
        except Exception as e:
            QMessageBox.warning(self, "opss", "qualcosa non va" + str(e),
                                QMessageBox.Ok)

    def on_pushButton_crea_layer_2_pressed(self):
        from pyarchinit_OS_utility import *
        import time
        if os.name == 'posix':
            home = os.environ['HOME']
        elif os.name == 'nt':
            home = os.environ['HOMEPATH']
        try:
            module_path_rel = os.path.join(os.sep, '.qgis2', 'python',
                                           'plugins', 'pyarchinit', 'modules',
                                           'utility', 'DBfiles',
                                           'pyarchinit_postgis20_empty.dump')
            module_path = ('%s%s') % (home, module_path_rel)
            postgis15 = os.popen(
                "pg_restore --host localhost --port %s --username postgres --dbname %s --role postgres --no-password  --verbose %s"
                % (str(self.lineEdit_port_db.text()),
                   str(self.lineEdit_dbname.text()), str(module_path)))
            barra2 = self.pyarchinit_progressBar_template
            barra2.setMinimum(0)
            barra2.setMaximum(9)
            for a in range(10):
                time.sleep(1)
                barra2.setValue(a)
            QMessageBox.warning(self, "ok",
                                "Installazione avvenuta con successo",
                                QMessageBox.Ok)
        except Exception as e:
            QMessageBox.warning(self, "opss", "qualcosa non va" + str(e),
                                QMessageBox.Ok)

    def on_pushButton_crea_db_sqlite_pressed(self):
        try:
            from pyarchinit_conn_strings import *
            conn = Connection()
            conn_str = conn.conn_str()
            from pyarchinit_db_manager import *
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.DB_MANAGER.execute_sql_create_spatialite_db()
        except:
            QMessageBox.warning(
                self, "Alert",
                "L'installazione e' fallita. Riavvia Qgis. Se l'errore persiste verifica che i layer non siano gia' installati oppure sia stia usando un db Postgres",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(self, "Alert",
                                "L'installazione ha avuto successo!",
                                QMessageBox.Ok)

    def try_connection(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()

        from pyarchinit_db_manager import *
        self.DB_MANAGER = Pyarchinit_db_management(
            conn_str
        )  #sqlite:///\Users\Windows\pyarchinit_DB_folder\pyarchinit_db.sqlite
        test = self.DB_MANAGER.connection()
        test = str(test)
        if test == "":
            QMessageBox.warning(self, "Messaggio",
                                "Connessione avvenuta con successo",
                                QMessageBox.Ok)
        elif test.find("create_engine") != -1:
            QMessageBox.warning(
                self, "Alert",
                "Verifica i parametri di connessione. <br> Se sono corretti RIAVVIA QGIS",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(
                self, "Alert", "Errore di connessione: <br>" + str(test) +
                "<br> Cambia i parametri e riprova a connetterti. Se cambi server (Postgres o Sqlite) ricordati di cliccare su connetti e RIAVVIARE Qgis",
                QMessageBox.Ok)

    def charge_data(self):
        #load data from config.cfg file
        #print self.PARAMS_DICT
        self.comboBox_Database.setEditText(self.PARAMS_DICT['SERVER'])
        self.lineEdit_Host.setText(self.PARAMS_DICT['HOST'])
        self.lineEdit_DBname.setText(self.PARAMS_DICT['DATABASE'])
        self.lineEdit_Password.setText(self.PARAMS_DICT['PASSWORD'])
        self.lineEdit_Port.setText(self.PARAMS_DICT['PORT'])
        self.lineEdit_User.setText(self.PARAMS_DICT['USER'])
        self.lineEdit_Thumb_path.setText(self.PARAMS_DICT['THUMB_PATH'])
        try:
            self.comboBox_experimental.setEditText(
                self.PARAMS_DICT['EXPERIMENTAL'])
        except:
            self.comboBox_experimental.setEditText("No")
        ###############
    def test_def(self):
        pass

    def on_pushButton_import_pressed(self):
        id_table_class_mapper_conv_dict = {
            'US': 'id_us',
            'UT': 'id_ut',
            'SITE': 'id_sito',
            'PERIODIZZAZIONE': 'id_perfas',
            'INVENTARIO_MATERIALI': 'id_invmat',
            'STRUTTURA': 'id_struttura',
            'TAFONOMIA': 'id_tafonomia',
            'SCHEDAIND': 'id_scheda_ind',
            'CAMPIONE': 'id_campione',
            'DOCUMENTAZIONE': 'id_documentazione'
        }
        #creazione del cursore di lettura
        if os.name == 'posix':
            home = os.environ['HOME']
        elif os.name == 'nt':
            home = os.environ['HOMEPATH']
        ####RICAVA I DATI IN LETTURA PER LA CONNESSIONE DALLA GUI
        conn_str_dict_read = {
            "server": str(self.comboBox_server_rd.currentText()),
            "user": str(self.lineEdit_username_rd.text()),
            "password": str(self.lineEdit_pass_rd.text()),
            "host": str(self.lineEdit_host_rd.text()),
            "port": str(self.lineEdit_port_rd.text()),
            "db_name": str(self.lineEdit_database_rd.text())
        }
        ####CREA LA STRINGA DI CONNESSIONE IN LETTURA
        if conn_str_dict_read["server"] == 'postgres':
            try:
                conn_str_read = "%s://%s:%s@%s:%s/%s%s?charset=utf8" % (
                    "postgresql", conn_str_dict_read["user"],
                    conn_str_dict_read["password"], conn_str_dict_read["host"],
                    conn_str_dict_read["port"], conn_str_dict_read["db_name"],
                    "?sslmode=allow")
            except:
                conn_str_read = "%s://%s:%s@%s:%d/%s" % (
                    "postgresql", conn_str_dict_read["user"],
                    conn_str_dict_read["password"], conn_str_dict_read["host"],
                    conn_str_dict_read["port"], conn_str_dict_read["db_name"])
        elif conn_str_dict_read["server"] == 'sqlite':
            sqlite_DB_path = ('%s%s%s') % (
                home, os.sep, "pyarchinit_DB_folder"
            )  #"C:\\Users\\Windows\\Dropbox\\pyarchinit_san_marco\\" fare modifiche anche in pyarchinit_pyqgis
            dbname_abs = sqlite_DB_path + os.sep + conn_str_dict_read["db_name"]
            conn_str_read = "%s:///%s" % (conn_str_dict_read["server"],
                                          dbname_abs)
            QMessageBox.warning(self, "Alert",
                                str(conn_str_dict_read["db_name"]),
                                QMessageBox.Ok)
        ####SI CONNETTE AL DATABASE
        self.DB_MANAGER_read = Pyarchinit_db_management(conn_str_read)
        test = self.DB_MANAGER_read.connection()
        test = str(test)
        if test == "":
            QMessageBox.warning(self, "Messaggio",
                                "Connessione avvenuta con successo",
                                QMessageBox.Ok)
        elif test.find("create_engine") != -1:
            QMessageBox.warning(
                self, "Alert",
                "Verifica i parametri di connessione. <br> Se sono corretti RIAVVIA QGIS",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(self, "Alert",
                                "Errore di connessione: <br>" + str(test),
                                QMessageBox.Ok)

        ####LEGGE I RECORD IN BASE AL PARAMETRO CAMPO=VALORE
        search_dict = {
            self.lineEdit_field_rd.text():
            "'" + str(self.lineEdit_value_rd.text()) + "'"
        }
        mapper_class_read = str(self.comboBox_mapper_read.currentText())
        res_read = self.DB_MANAGER_read.query_bool(search_dict,
                                                   mapper_class_read)

        ####INSERISCE I DATI DA UPLOADARE DENTRO ALLA LISTA DATA_LIST_TOIMP
        data_list_toimp = []
        for i in res_read:
            data_list_toimp.append(i)

        QMessageBox.warning(self, "Totale record da importare",
                            str(len(data_list_toimp)), QMessageBox.Ok)
        #creazione del cursore di scrittura

        ####RICAVA I DATI IN LETTURA PER LA CONNESSIONE DALLA GUI
        conn_str_dict_write = {
            "server": str(self.comboBox_server_wt.currentText()),
            "user": str(self.lineEdit_username_wt.text()),
            "password": str(self.lineEdit_pass_wt.text()),
            "host": str(self.lineEdit_host_wt.text()),
            "port": str(self.lineEdit_port_wt.text()),
            "db_name": str(self.lineEdit_database_wt.text())
        }

        ####CREA LA STRINGA DI CONNESSIONE IN LETTURA
        if conn_str_dict_write["server"] == 'postgres':
            try:
                conn_str_write = "%s://%s:%s@%s:%s/%s%s?charset=utf8" % (
                    "postgresql", conn_str_dict_writed["user"],
                    conn_str_dict_write["password"],
                    conn_str_dict_write["host"], conn_str_dict_write["port"],
                    conn_str_dict_write["db_name"], "?sslmode=allow")
            except:
                conn_str_write = "%s://%s:%s@%s:%d/%s" % (
                    "postgresql", conn_str_dict_write["user"],
                    conn_str_dict_write["password"],
                    conn_str_dict_write["host"],
                    int(conn_str_dict_write["port"]),
                    conn_str_dict_write["db_name"])
        elif conn_str_dict_write["server"] == 'sqlite':
            sqlite_DB_path = ('%s%s%s') % (
                home, os.sep, "pyarchinit_DB_folder"
            )  #"C:\\Users\\Windows\\Dropbox\\pyarchinit_san_marco\\" fare modifiche anche in pyarchinit_pyqgis
            dbname_abs = sqlite_DB_path + os.sep + conn_str_dict_write[
                "db_name"]
            conn_str_write = "%s:///%s" % (conn_str_dict_write["server"],
                                           dbname_abs)
            QMessageBox.warning(self, "Alert",
                                str(conn_str_dict_write["db_name"]),
                                QMessageBox.Ok)
        ####SI CONNETTE AL DATABASE IN SCRITTURA

        self.DB_MANAGER_write = Pyarchinit_db_management(conn_str_write)
        test = self.DB_MANAGER_write.connection()
        test = str(test)

        if test == "":
            QMessageBox.warning(self, "Messaggio",
                                "Connessione avvenuta con successo",
                                QMessageBox.Ok)
        elif test.find("create_engine") != -1:
            QMessageBox.warning(
                self, "Alert",
                "Verifica i parametri di connessione. <br> Se sono corretti RIAVVIA QGIS",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(self, "Alert",
                                "Errore di connessione: <br>" + str(test),
                                QMessageBox.Ok)

        mapper_class_write = str(self.comboBox_mapper_read.currentText())
        ####inserisce i dati dentro al database

        #### US TABLE
        if mapper_class_write == 'US':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_values(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1,
                    data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].area,
                    data_list_toimp[sing_rec].us,
                    data_list_toimp[sing_rec].d_stratigrafica,
                    data_list_toimp[sing_rec].d_interpretativa,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].interpretazione,
                    data_list_toimp[sing_rec].periodo_iniziale,
                    data_list_toimp[sing_rec].fase_iniziale,
                    data_list_toimp[sing_rec].periodo_finale,
                    data_list_toimp[sing_rec].fase_finale,
                    data_list_toimp[sing_rec].scavato,
                    data_list_toimp[sing_rec].attivita,
                    data_list_toimp[sing_rec].anno_scavo,
                    data_list_toimp[sing_rec].metodo_di_scavo,
                    data_list_toimp[sing_rec].inclusi,
                    data_list_toimp[sing_rec].campioni,
                    data_list_toimp[sing_rec].rapporti,
                    data_list_toimp[sing_rec].data_schedatura,
                    data_list_toimp[sing_rec].schedatore,
                    data_list_toimp[sing_rec].formazione,
                    data_list_toimp[sing_rec].stato_di_conservazione,
                    data_list_toimp[sing_rec].colore,
                    data_list_toimp[sing_rec].consistenza,
                    data_list_toimp[sing_rec].struttura,
                    data_list_toimp[sing_rec].cont_per,
                    data_list_toimp[sing_rec].order_layer,
                    data_list_toimp[sing_rec].documentazione,
                    data_list_toimp[sing_rec].
                    unita_tipo,  #campi aggiunti per USM
                    data_list_toimp[sing_rec].settore,
                    data_list_toimp[sing_rec].quad_par,
                    data_list_toimp[sing_rec].ambient,
                    data_list_toimp[sing_rec].saggio,
                    data_list_toimp[sing_rec].elem_datanti,
                    data_list_toimp[sing_rec].funz_statica,
                    data_list_toimp[sing_rec].lavorazione,
                    data_list_toimp[sing_rec].spess_giunti,
                    data_list_toimp[sing_rec].letti_posa,
                    data_list_toimp[sing_rec].alt_mod,
                    data_list_toimp[sing_rec].un_ed_riass,
                    data_list_toimp[sing_rec].reimp,
                    data_list_toimp[sing_rec].posa_opera,
                    data_list_toimp[sing_rec].quota_min_usm,
                    data_list_toimp[sing_rec].quota_max_usm,
                    data_list_toimp[sing_rec].cons_legante,
                    data_list_toimp[sing_rec].col_legante,
                    data_list_toimp[sing_rec].aggreg_legante,
                    data_list_toimp[sing_rec].con_text_mat,
                    data_list_toimp[sing_rec].col_materiale,
                    data_list_toimp[sing_rec].inclusi_materiali_usm)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####SITE TABLE
        if mapper_class_write == 'SITE':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_site_values(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].nazione,
                    data_list_toimp[sing_rec].regione,
                    data_list_toimp[sing_rec].comune,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].provincia,
                    data_list_toimp[sing_rec].definizione_sito,
                    data_list_toimp[sing_rec].find_check)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####PERIODIZZAZIONE TABLE
        if mapper_class_write == 'PERIODIZZAZIONE':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_periodizzazione_values(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].periodo,
                    data_list_toimp[sing_rec].fase,
                    data_list_toimp[sing_rec].cron_iniziale,
                    data_list_toimp[sing_rec].cron_finale,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].datazione_estesa,
                    data_list_toimp[sing_rec].cont_per)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####INVENTARIO MATERIALI TABLE
        if mapper_class_write == 'INVENTARIO_MATERIALI':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_values_reperti(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].numero_inventario,
                    data_list_toimp[sing_rec].tipo_reperto,
                    data_list_toimp[sing_rec].criterio_schedatura,
                    data_list_toimp[sing_rec].definizione,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].area,
                    data_list_toimp[sing_rec].us,
                    data_list_toimp[sing_rec].lavato,
                    data_list_toimp[sing_rec].nr_cassa,
                    data_list_toimp[sing_rec].luogo_conservazione,
                    data_list_toimp[sing_rec].stato_conservazione,
                    data_list_toimp[sing_rec].datazione_reperto,
                    data_list_toimp[sing_rec].elementi_reperto,
                    data_list_toimp[sing_rec].misurazioni,
                    data_list_toimp[sing_rec].rif_biblio,
                    data_list_toimp[sing_rec].tecnologie,
                    data_list_toimp[sing_rec].forme_minime,
                    data_list_toimp[sing_rec].forme_massime,
                    data_list_toimp[sing_rec].totale_frammenti,
                    data_list_toimp[sing_rec].corpo_ceramico,
                    data_list_toimp[sing_rec].rivestimento,
                    data_list_toimp[sing_rec].diametro_orlo,
                    data_list_toimp[sing_rec].peso,
                    data_list_toimp[sing_rec].tipo,
                    data_list_toimp[sing_rec].eve_orlo,
                    data_list_toimp[sing_rec].repertato,
                    data_list_toimp[sing_rec].diagnostico)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####STRUTTURA TABLE
        if mapper_class_write == 'STRUTTURA':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_struttura_values(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].sigla_struttura,
                    data_list_toimp[sing_rec].numero_struttura,
                    data_list_toimp[sing_rec].categoria_struttura,
                    data_list_toimp[sing_rec].tipologia_struttura,
                    data_list_toimp[sing_rec].definizione_struttura,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].interpretazione,
                    data_list_toimp[sing_rec].periodo_iniziale,
                    data_list_toimp[sing_rec].fase_iniziale,
                    data_list_toimp[sing_rec].periodo_finale,
                    data_list_toimp[sing_rec].fase_finale,
                    data_list_toimp[sing_rec].datazione_estesa,
                    data_list_toimp[sing_rec].materiali_impiegati,
                    data_list_toimp[sing_rec].elementi_strutturali,
                    data_list_toimp[sing_rec].rapporti_struttura,
                    data_list_toimp[sing_rec].misure_struttura)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####TAFONOMIA TABLE
        if mapper_class_write == 'TAFONOMIA':
            for sing_rec in range(len(data_list_toimp)):

                #blocco oritentamento_azimut
                test_azimut = data_list_toimp[sing_rec].orientamento_azimut

                if test_azimut == "" or test_azimut == None:
                    orientamento_azimut = None
                else:
                    orientamento_azimut = float(
                        data_list_toimp[sing_rec].orientamento_azimut)
##					if conn_str_dict_write['server'] == 'postgres':
##						orientamento_azimut = float(orientamento_azimut)
##

#blocco oritentamento_azimut
                test_lunghezza_scheletro = data_list_toimp[
                    sing_rec].lunghezza_scheletro

                if test_lunghezza_scheletro == "" or test_lunghezza_scheletro == None:
                    lunghezza_scheletro = None
                else:
                    lunghezza_scheletro = float(
                        data_list_toimp[sing_rec].lunghezza_scheletro)

                #blocco periodo_iniziale
                test_per_iniz = data_list_toimp[sing_rec].periodo_iniziale

                if test_per_iniz == "" or test_per_iniz == None:
                    per_iniz = None
                else:
                    per_iniz = int(data_list_toimp[sing_rec].periodo_iniziale)

                #blocco fase_iniziale
                test_fas_iniz = data_list_toimp[sing_rec].fase_iniziale

                if test_fas_iniz == "" or test_fas_iniz == None:
                    fase_iniz = None
                else:
                    fase_iniz = int(data_list_toimp[sing_rec].fase_iniziale)

                #blocco periodo_finale
                test_per_fin = data_list_toimp[sing_rec].periodo_finale

                if test_per_fin == "" or test_per_fin == None:
                    per_fin = None
                else:
                    per_fin = int(data_list_toimp[sing_rec].periodo_finale)

                #blocco fase_finale
                test_fas_fin = data_list_toimp[sing_rec].fase_finale

                if test_fas_fin == "" or test_fas_fin == None:
                    fase_fin = None
                else:
                    fase_fin = int(data_list_toimp[sing_rec].fase_finale)

                data = self.DB_MANAGER_write.insert_values_tafonomia(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, str(data_list_toimp[sing_rec].sito),
                    int(data_list_toimp[sing_rec].nr_scheda_taf),
                    str(data_list_toimp[sing_rec].sigla_struttura),
                    int(data_list_toimp[sing_rec].nr_struttura),
                    int(data_list_toimp[sing_rec].nr_individuo),
                    str(data_list_toimp[sing_rec].rito),
                    str(data_list_toimp[sing_rec].descrizione_taf),
                    str(data_list_toimp[sing_rec].interpretazione_taf),
                    str(data_list_toimp[sing_rec].segnacoli),
                    str(data_list_toimp[sing_rec].canale_libatorio_si_no),
                    str(data_list_toimp[sing_rec].oggetti_rinvenuti_esterno),
                    str(data_list_toimp[sing_rec].stato_di_conservazione),
                    str(data_list_toimp[sing_rec].copertura_tipo),
                    str(data_list_toimp[sing_rec].tipo_contenitore_resti),
                    str(data_list_toimp[sing_rec].orientamento_asse),
                    orientamento_azimut,
                    str(data_list_toimp[sing_rec].corredo_presenza),
                    str(data_list_toimp[sing_rec].corredo_tipo),
                    str(data_list_toimp[sing_rec].corredo_descrizione),
                    lunghezza_scheletro,
                    str(data_list_toimp[sing_rec].posizione_scheletro),
                    str(data_list_toimp[sing_rec].posizione_cranio),
                    str(data_list_toimp[sing_rec].posizione_arti_superiori),
                    str(data_list_toimp[sing_rec].posizione_arti_inferiori),
                    str(data_list_toimp[sing_rec].completo_si_no),
                    str(data_list_toimp[sing_rec].disturbato_si_no),
                    str(data_list_toimp[sing_rec].in_connessione_si_no),
                    str(data_list_toimp[sing_rec].caratteristiche), per_iniz,
                    fase_iniz, per_fin, fase_fin,
                    str(data_list_toimp[sing_rec].datazione_estesa),
                    str(data_list_toimp[sing_rec].misure_tafonomia))
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####INDIVIDUI TABLE
        if mapper_class_write == 'SCHEDAIND':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_values_ind(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].area,
                    data_list_toimp[sing_rec].us,
                    data_list_toimp[sing_rec].nr_individuo,
                    data_list_toimp[sing_rec].data_schedatura,
                    data_list_toimp[sing_rec].schedatore,
                    data_list_toimp[sing_rec].sesso,
                    data_list_toimp[sing_rec].eta_min,
                    data_list_toimp[sing_rec].eta_max,
                    data_list_toimp[sing_rec].classi_eta,
                    data_list_toimp[sing_rec].osservazioni)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####CAMPIONE TABLE
        if mapper_class_write == 'CAMPIONE':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_values_campioni(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].area,
                    data_list_toimp[sing_rec].nr_campione,
                    data_list_toimp[sing_rec].tipo_campione,
                    data_list_toimp[sing_rec].descrizione,
                    data_list_toimp[sing_rec].area,
                    data_list_toimp[sing_rec].us,
                    data_list_toimp[sing_rec].numero_inventario_materiale,
                    data_list_toimp[sing_rec].nr_cassa,
                    data_list_toimp[sing_rec].luogo_conservazione)
                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####DOCUMENTAZIONE TABLE
        if mapper_class_write == 'DOCUMENTAZIONE':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_values_documentazione(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].nome_doc,
                    data_list_toimp[sing_rec].data,
                    data_list_toimp[sing_rec].tipo_documentazione,
                    data_list_toimp[sing_rec].sorgente,
                    data_list_toimp[sing_rec].scala,
                    data_list_toimp[sing_rec].disegnatore,
                    data_list_toimp[sing_rec].note)

                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
##				except Exception, e:
##					e_str = str(e)
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(e_str),  QMessageBox.Ok)
##					if e_str.__contains__("Integrity"):
##						msg = 'id_us' + " gia' presente nel database"
##					else:
##						msg = e
##					QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
##					return 0
##
####UT TABLE
        if mapper_class_write == 'UT':
            for sing_rec in range(len(data_list_toimp)):
                data = self.DB_MANAGER_write.insert_ut_values(
                    self.DB_MANAGER_write.max_num_id(
                        mapper_class_write,
                        id_table_class_mapper_conv_dict[mapper_class_write]) +
                    1, data_list_toimp[sing_rec].sito,
                    data_list_toimp[sing_rec].progetto,
                    data_list_toimp[sing_rec].nr_ut,
                    data_list_toimp[sing_rec].ut_letterale,
                    data_list_toimp[sing_rec].def_ut,
                    data_list_toimp[sing_rec].descrizione_ut,
                    data_list_toimp[sing_rec].interpretazione_ut,
                    data_list_toimp[sing_rec].nazione,
                    data_list_toimp[sing_rec].regione,
                    data_list_toimp[sing_rec].provincia,
                    data_list_toimp[sing_rec].comune,
                    data_list_toimp[sing_rec].frazione,
                    data_list_toimp[sing_rec].localita,
                    data_list_toimp[sing_rec].indirizzo,
                    data_list_toimp[sing_rec].nr_civico,
                    data_list_toimp[sing_rec].carta_topo_igm,
                    data_list_toimp[sing_rec].coord_geografiche,
                    data_list_toimp[sing_rec].coord_piane,
                    data_list_toimp[sing_rec].andamento_terreno_pendenza,
                    data_list_toimp[sing_rec].utilizzo_suolo_vegetazione,
                    data_list_toimp[sing_rec].descrizione_empirica_suolo,
                    data_list_toimp[sing_rec].descrizione_luogo,
                    data_list_toimp[sing_rec].metodo_rilievo_e_ricognizione,
                    data_list_toimp[sing_rec].geometria,
                    data_list_toimp[sing_rec].bibliografia,
                    data_list_toimp[sing_rec].data,
                    data_list_toimp[sing_rec].ora_meteo,
                    data_list_toimp[sing_rec].descrizione_luogo,
                    data_list_toimp[sing_rec].responsabile,
                    data_list_toimp[sing_rec].dimensioni_ut,
                    data_list_toimp[sing_rec].rep_per_mq,
                    data_list_toimp[sing_rec].rep_datanti,
                    data_list_toimp[sing_rec].periodo_I,
                    data_list_toimp[sing_rec].datazione_I,
                    data_list_toimp[sing_rec].responsabile,
                    data_list_toimp[sing_rec].interpretazione_I,
                    data_list_toimp[sing_rec].periodo_II,
                    data_list_toimp[sing_rec].datazione_II,
                    data_list_toimp[sing_rec].interpretazione_II,
                    data_list_toimp[sing_rec].documentazione,
                    data_list_toimp[sing_rec].enti_tutela_vincoli,
                    data_list_toimp[sing_rec].indagini_preliminari)

                ##				try:
                self.DB_MANAGER_write.insert_data_session(data)
class pyarchinit_Gis_Time_Controller(QDialog, Ui_DialogGisTimeController):
    MSG_BOX_TITLE = "PyArchInit - Gis Time Management"
    DB_MANAGER = ""
    ORDER_LAYER_VALUE = ""
    MAPPER_TABLE_CLASS = "US"

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        QDialog.__init__(self)
        self.setupUi(self)

        self.currentLayerId = None
        try:
            self.connect()
        except:
            pass

        QObject.connect(self.dial_relative_cronology,
                        SIGNAL("valueChanged(int)"), self.set_max_num)
        QObject.connect(self.spinBox_relative_cronology,
                        SIGNAL("valueChanged(int)"), self.set_max_num)

        QObject.connect(self.dial_relative_cronology,
                        SIGNAL("valueChanged(int)"),
                        self.define_order_layer_value)
        QObject.connect(self.dial_relative_cronology,
                        SIGNAL("valueChanged(int)"),
                        self.spinBox_relative_cronology.setValue)

        QObject.connect(self.spinBox_relative_cronology,
                        SIGNAL("valueChanged(int)"),
                        self.define_order_layer_value)
        QObject.connect(self.spinBox_relative_cronology,
                        SIGNAL("valueChanged(int)"),
                        self.dial_relative_cronology.setValue)

    def connect(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS",
                    QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def set_max_num(self):
        max_num_order_layer = self.DB_MANAGER.max_num_id(
            self.MAPPER_TABLE_CLASS, "order_layer") + 1,
        self.dial_relative_cronology.setMaximum(max_num_order_layer[0])
        self.spinBox_relative_cronology.setMaximum(max_num_order_layer[0])

    def define_order_layer_value(self, v):
        try:
            self.ORDER_LAYER_VALUE = v
            layer = self.iface.mapCanvas().currentLayer().dataProvider()
            originalSubsetString = layer.subsetString()
            newSubSetString = "order_layer <= %s" % (self.ORDER_LAYER_VALUE
                                                     )  #4D dimension
            layer.setSubsetString(newSubSetString)
            layer = self.iface.mapCanvas().currentLayer()
            layer.triggerRepaint()

        except Exception as e:
            QgsMessageLog.logMessage(
                "You must to load pyarchinit_us_view and/or select it from pyarchinit GeoDatabase"
                + str(e))
            self.iface.messageBar().pushMessage(
                "Help",
                "You must to load pyarchinit_us_view and/or select it from pyarchinit GeoDatabase",
                level=QgsMessageBar.WARNING)

    def reset_query(self):
        self.ORDER_LAYER_VALUE = v

    def on_pushButton_visualize_pressed(self):
        op_cron_iniz = '<='
        op_cron_fin = '>='

        per_res = self.DB_MANAGER.query_operator([
            ['cron_finale', op_cron_fin,
             int(self.spinBox_cron_iniz.text())],
            ['cron_iniziale', op_cron_iniz,
             int(self.spinBox_cron_fin.text())],
        ], 'PERIODIZZAZIONE')

        if bool(per_res) == False:
            QMessageBox.warning(
                self, "Alert",
                "Non vi sono Periodizzazioni in questo intervallo di tempo",
                QMessageBox.Ok)
        else:
            us_res = []
            for sing_per in range(len(per_res)):
                params = {
                    'sito': "'" + str(per_res[sing_per].sito) + "'",
                    'periodo_iniziale':
                    "'" + str(per_res[sing_per].periodo) + "'",
                    'fase_iniziale': "'" + str(per_res[sing_per].fase) + "'"
                }
                us_res.append(self.DB_MANAGER.query_bool(params, 'US'))

            us_res_dep = []

            for i in us_res:
                for n in i:
                    us_res_dep.append(n)

            if bool(us_res_dep) == False:
                QMessageBox.warning(self, "Alert",
                                    "Non ci sono geometrie da visualizzare",
                                    QMessageBox.Ok)
            else:
                self.pyQGIS.charge_vector_layers(us_res_dep)
예제 #4
0
class pyarchinit_Schedaind(QDialog, Ui_DialogInd):
    MSG_BOX_TITLE = "PyArchInit - pyarchinit_US_version 0.4 - Scheda Individuo"
    DATA_LIST = []
    DATA_LIST_REC_CORR = []
    DATA_LIST_REC_TEMP = []
    REC_CORR = 0
    REC_TOT = 0
    BROWSE_STATUS = "b"
    STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
    SORT_MODE = 'asc'
    SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
    SORT_STATUS = "n"
    UTILITY = Utility()
    DB_MANAGER = ""
    TABLE_NAME = 'individui_table'
    MAPPER_TABLE_CLASS = "SCHEDAIND"
    NOME_SCHEDA = "Scheda Individuo"
    ID_TABLE = "id_scheda_ind"
    CONVERSION_DICT = {
        ID_TABLE: ID_TABLE,
        "Sito": "sito",
        "US": "us",
        "Area": "area",
        "Nr. Individuo": "nr_individuo",
        "Data Schedatura": "data_schedatura",
        "Schedatore": "schedatore",
        "Stima del sesso": "sesso",
        "Stima dell'eta' di morte min": "eta_min",
        "Stima dell'eta' di morte max": "eta_max",
        "Classi di eta'": "classi_eta",
        "Osservazioni": "osservazioni"
    }
    SORT_ITEMS = [
        ID_TABLE, "Sito", "Area", "US", "Nr. Individuo", "Data schedatura",
        "Schedatore", "Stima del sesso", "Stima dell'eta' di morte min",
        "Stima dell'eta' di morte max", "Classi di eta'", "Osservazioni"
    ]

    TABLE_FIELDS = [
        'sito', 'area', 'us', 'nr_individuo', 'data_schedatura', 'schedatore',
        'sesso', 'eta_min', 'eta_max', 'classi_eta', 'osservazioni'
    ]

    DB_SERVER = "not defined"  ####nuovo sistema sort

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        QDialog.__init__(self)
        self.setupUi(self)
        self.currentLayerId = None
        try:
            self.on_pushButton_connect_pressed()
        except Exception as e:
            QMessageBox.warning(self, "Sistema di connessione", str(e),
                                QMessageBox.Ok)

    def enable_button(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_new_search.setEnabled(n)

        self.pushButton_search_go.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def enable_button_search(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_save.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def on_pushButton_connect_pressed(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.charge_records()  #charge records from DB
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
            else:
                QMessageBox.warning(
                    self, "BENVENUTO",
                    "Benvenuto in pyArchInit" + self.NOME_SCHEDA +
                    ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",
                    QMessageBox.Ok)
                self.charge_list()
                self.BROWSE_STATUS = 'x'
                self.on_pushButton_new_rec_pressed()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS",
                    QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def customize_GUI(self):
        pass

    def loadMapPreview(self, mode=0):
        pass

    def charge_list(self):
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))
        try:
            sito_vl.remove('')
        except:
            pass

        self.comboBox_sito.clear()

        sito_vl.sort()
        self.comboBox_sito.addItems(sito_vl)

    def charge_periodo_list(self):
        pass

    def charge_fase_iniz_list(self):
        pass

    def charge_fase_fin_list(self):
        pass

    #buttons functions

    def generate_list_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):
            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                int(self.DATA_LIST[i].area),  #2 - Area
                int(self.DATA_LIST[i].us),  #3 - us
                int(self.DATA_LIST[i].nr_individuo),  #4 -  nr individuo
                str(self.DATA_LIST[i].data_schedatura),  #5 - data schedatura
                str(self.DATA_LIST[i].schedatore),  #6 - schedatore
                str(self.DATA_LIST[i].sesso),  #7 - sesso
                str(self.DATA_LIST[i].eta_min),  #8 - eta' minima
                str(self.DATA_LIST[i].eta_max),  #9- eta massima
                str(self.DATA_LIST[i].classi_eta),  #10 - classi di eta'
                str(self.DATA_LIST[i].osservazioni)  #11 - osservazioni
            ])
        return data_list

    def on_pushButton_pdf_exp_pressed(self):
        Individui_pdf_sheet = generate_pdf()
        data_list = self.generate_list_pdf()
        Individui_pdf_sheet.build_Individui_sheets(data_list)

    def on_pushButton_exp_index_ind_pressed(self):
        Individui_pdf_index = generate_pdf()
        data_list = self.generate_list_pdf()
        Individui_pdf_index.build_index_individui(data_list, data_list[0][0])

    """
	def on_toolButtonPan_toggled(self):
		self.toolPan = QgsMapToolPan(self.mapPreview)
		self.mapPreview.setMapTool(self.toolPan)
	"""
    """
	def on_pushButton_showSelectedFeatures_pressed(self):
		
		field_position = self.pyQGIS.findFieldFrDict(self.ID_TABLE)

		field_list = self.pyQGIS.selectedFeatures()

		id_list_sf = self.pyQGIS.findItemInAttributeMap(field_position, field_list)
		id_list = []
		for idl in id_list_sf:
			sid = idl.toInt()
			id_list.append(sid[0])

		items,order_type = [self.ID_TABLE], "asc"
		self.empty_fields()

		self.DATA_LIST = []
		
		temp_data_list = self.DB_MANAGER.query_sort(id_list, items, order_type, self.MAPPER_TABLE_CLASS, self.ID_TABLE)

		for us in temp_data_list:
			self.DATA_LIST.append(us)

		self.fill_fields()
		self.label_status.setText(self.STATUS["usa"])
		if type(self.REC_CORR) == "<type 'str'>":
			corr = 0
		else:
			corr = self.REC_CORR

		self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
		self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
		self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]
	"""

    #buttons functions
    def on_pushButton_sort_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            dlg = SortPanelMain(self)
            dlg.insertItems(self.SORT_ITEMS)
            dlg.exec_()

            items, order_type = dlg.ITEMS, dlg.TYPE_ORDER

            self.SORT_ITEMS_CONVERTED = []
            for i in items:
                self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

            self.SORT_MODE = order_type
            self.empty_fields()

            id_list = []
            for i in self.DATA_LIST:
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))
            self.DATA_LIST = []

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                self.MAPPER_TABLE_CLASS, self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.SORT_STATUS = "o"
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.fill_fields()

    def on_toolButtonGis_toggled(self):
        if self.toolButtonGis.isChecked() == True:
            QMessageBox.warning(
                self, "Messaggio",
                "Modalita' GIS attiva. Da ora le tue ricerche verranno visualizzate sul GIS",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(
                self, "Messaggio",
                "Modalita' GIS disattivata. Da ora le tue ricerche non verranno piu' visualizzate sul GIS",
                QMessageBox.Ok)

    def on_toolButtonPreview_toggled(self):
        if self.toolButtonPreview.isChecked() == True:
            QMessageBox.warning(
                self, "Messaggio",
                "Modalita' Preview US attivata. Le piante delle US saranno visualizzate nella sezione Piante",
                QMessageBox.Ok)
            self.loadMapPreview()
        else:
            self.loadMapPreview(1)

    """
	def on_pushButton_addRaster_pressed(self):
		if self.toolButtonGis.isChecked() == True:
			self.pyQGIS.addRasterLayer()
	"""

    def on_pushButton_new_rec_pressed(self):
        if bool(self.DATA_LIST) == True:
            if self.data_error_check() == 1:
                pass
            else:
                if self.BROWSE_STATUS == "b":
                    if bool(self.DATA_LIST) == True:
                        if self.records_equal_check() == 1:
                            msg = self.update_if(
                                QMessageBox.warning(
                                    self, 'Errore',
                                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                                    QMessageBox.Cancel, 1))
        #set the GUI for a new record
        if self.BROWSE_STATUS != "n":
            self.BROWSE_STATUS = "n"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            self.empty_fields()
            self.label_sort.setText(self.SORTED_ITEMS["n"])

            self.setComboBoxEditable(["self.comboBox_sito"], 0)
            self.setComboBoxEnable(["self.comboBox_sito"], "True")
            self.setComboBoxEnable(["self.lineEdit_area"], "True")
            self.setComboBoxEnable(["self.lineEdit_us"], "True")
            self.setComboBoxEnable(["self.lineEdit_individuo"], "True")

            self.set_rec_counter('', '')
            self.enable_button(0)

    def on_pushButton_save_pressed(self):
        #save record
        if self.BROWSE_STATUS == "b":
            if self.data_error_check() == 0:
                if self.records_equal_check() == 1:
                    self.update_if(
                        QMessageBox.warning(
                            self, 'ATTENZIONE',
                            "Il record e' stato modificato. Vuoi salvare le modifiche?",
                            QMessageBox.Cancel, 1))
                    self.SORT_STATUS = "n"
                    self.label_sort.setText(
                        self.SORTED_ITEMS[self.SORT_STATUS])
                    self.enable_button(1)
                    self.fill_fields(self.REC_CORR)
                else:
                    QMessageBox.warning(
                        self, "ATTENZIONE",
                        "Non è stata realizzata alcuna modifica.",
                        QMessageBox.Ok)
        else:
            if self.data_error_check() == 0:
                test_insert = self.insert_new_rec()
                if test_insert == 1:
                    self.empty_fields()
                    self.label_sort.setText(self.SORTED_ITEMS["n"])
                    self.charge_list()
                    self.charge_records()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.REC_TOT, self.REC_CORR = len(
                        self.DATA_LIST), len(self.DATA_LIST) - 1
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)

                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                    self.setComboBoxEditable(["self.comboBox_sito"], 1)
                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.lineEdit_area"], "False")
                    self.setComboBoxEnable(["self.lineEdit_us"], "False")
                    self.setComboBoxEnable(["self.lineEdit_individuo"],
                                           "False")
                    self.fill_fields(self.REC_CORR)
                    self.enable_button(1)
            else:
                pass

    def data_error_check(self):
        test = 0
        EC = Error_check()

        if EC.data_is_empty(str(self.comboBox_sito.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Sito. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(self.lineEdit_area.text())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Area. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(self.lineEdit_us.text())) == 0:
            QMessageBox.warning(self, "ATTENZIONE",
                                "Campo US. \n Il campo non deve essere vuoto",
                                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(self.lineEdit_individuo.text())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo nr individuo. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        area = self.lineEdit_area.text()
        us = self.lineEdit_us.text()
        nr_individuo = self.lineEdit_individuo.text()
        eta_min = self.comboBox_eta_min.currentText()
        eta_max = self.comboBox_eta_max.currentText()

        if area != "":
            if EC.data_lenght(area, 3) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Area. \n Il valore deve essere lungo massimo 4 caratteri alfanumerici",
                    QMessageBox.Ok)
                test = 1

        if us != "":
            if EC.data_is_int(us) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo US. \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if nr_individuo != "":
            if EC.data_is_int(nr_individuo) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Nr individuo. \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if eta_min != "":
            if EC.data_is_int(eta_min) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Età minima \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if eta_max != "":
            if EC.data_is_int(eta_max) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Età massima \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        return test

    def insert_new_rec(self):
        if self.comboBox_eta_min.currentText() == "":
            eta_min = None
        else:
            eta_min = int(self.comboBox_eta_min.currentText())

        if self.comboBox_eta_max.currentText() == "":
            eta_max = None
        else:
            eta_max = int(self.comboBox_eta_max.currentText())

        if self.comboBox_classi_eta.currentText() == "":
            classi_eta = ''
        else:
            classi_eta = str(self.comboBox_classi_eta.currentText())

        try:
            data = self.DB_MANAGER.insert_values_ind(
                self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS,
                                           self.ID_TABLE) + 1,
                str(self.comboBox_sito.currentText()),  #1 - Sito
                str(self.lineEdit_area.text()),  #2 - area
                int(self.lineEdit_us.text()),  #3 - US
                int(self.lineEdit_individuo.text()),  #4 - individuo
                str(self.lineEdit_data_schedatura.text()
                    ),  #5 - data schedatura
                str(self.lineEdit_schedatore.text()),  #6 - schedatore
                str(self.comboBox_sesso.currentText()),  #7 - sesso
                eta_min,  #8 - eta' min
                eta_max,  #9 - eta' max
                classi_eta,  #10 - classi eta
                str(self.textEdit_osservazioni.toPlainText()
                    )  #11 - osservazioni
            )
            try:
                self.DB_MANAGER.insert_data_session(data)
                return 1
            except Exception as e:
                e_str = str(e)
                if e_str.__contains__("Integrity"):
                    msg = self.ID_TABLE + " gia' presente nel database"
                else:
                    msg = e
                QMessageBox.warning(self, "Errore",
                                    "Attenzione 1 ! \n" + str(msg),
                                    QMessageBox.Ok)
                return 0
        except Exception as e:
            QMessageBox.warning(self, "Errore", "Attenzione 2 ! \n" + str(e),
                                QMessageBox.Ok)
            return 0

    #insert new row into tableWidget
    def on_pushButton_insert_row_rapporti_pressed(self):
        self.insert_new_row('self.tableWidget_rapporti')

    def on_pushButton_insert_row_inclusi_pressed(self):
        self.insert_new_row('self.tableWidget_inclusi')

    def on_pushButton_insert_row_campioni_pressed(self):
        self.insert_new_row('self.tableWidget_campioni')

    def check_record_state(self):
        ec = self.data_error_check()
        if ec == 1:
            return 1  #ci sono errori di immissione
        elif self.records_equal_check() == 1 and ec == 0:
            self.update_if(
                QMessageBox.warning(
                    self, 'Errore',
                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                    QMessageBox.Cancel, 1))
            #self.charge_records() incasina lo stato trova
            return 0  #non ci sono errori di immissione

    def on_pushButton_view_all_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.empty_fields()
            self.charge_records()
            self.fill_fields()
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.label_sort.setText(self.SORTED_ITEMS["n"])

    #records surf functions
    def on_pushButton_first_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.fill_fields(0)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_last_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(
                    self.DATA_LIST), len(self.DATA_LIST) - 1
                self.fill_fields(self.REC_CORR)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_prev_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR - 1
            if self.REC_CORR == -1:
                self.REC_CORR = 0
                QMessageBox.warning(self, "Errore", "Sei al primo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_next_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR + 1
            if self.REC_CORR >= self.REC_TOT:
                self.REC_CORR = self.REC_CORR - 1
                QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_delete_pressed(self):
        msg = QMessageBox.warning(
            self, "Attenzione!!!",
            "Vuoi veramente eliminare il record? \n L'azione è irreversibile",
            QMessageBox.Cancel, 1)
        if msg != 1:
            QMessageBox.warning(self, "Messagio!!!", "Azione Annullata!")
        else:
            try:
                id_to_delete = ast.literal_eval(
                    "self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
                self.DB_MANAGER.delete_one_record(self.TABLE_NAME,
                                                  self.ID_TABLE, id_to_delete)
                self.charge_records()  #charge records from DB
                QMessageBox.warning(self, "Messaggio!!!", "Record eliminato!")
            except Exception as e:
                QMessageBox.warning(self, "Messaggio!!!",
                                    "Tipo di errore: " + str(e))
            if bool(self.DATA_LIST) == False:
                QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",
                                    QMessageBox.Ok)
                self.DATA_LIST = []
                self.DATA_LIST_REC_CORR = []
                self.DATA_LIST_REC_TEMP = []
                self.REC_CORR = 0
                self.REC_TOT = 0
                self.empty_fields()
                self.set_rec_counter(0, 0)
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
        self.SORT_STATUS = "n"
        self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

    def on_pushButton_new_search_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.enable_button_search(0)
            #set the GUI for a new search

            if self.BROWSE_STATUS != "f":
                self.BROWSE_STATUS = "f"
                ###

                self.setComboBoxEditable(["self.comboBox_sito"], 1)
                self.setComboBoxEnable(["self.comboBox_sito"], "True")
                self.setComboBoxEnable(["self.lineEdit_area"], "True")
                self.setComboBoxEnable(["self.lineEdit_us"], "True")
                self.setComboBoxEnable(["self.lineEdit_individuo"], "True")
                self.setComboBoxEnable(["self.textEdit_osservazioni"], "False")

                ###
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter('', '')
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.charge_list()
                self.empty_fields()

    def on_pushButton_search_go_pressed(self):
        if self.BROWSE_STATUS != "f":
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",
                QMessageBox.Ok)
        else:
            if self.lineEdit_us.text() != "":
                us = int(self.lineEdit_us.text())
            else:
                us = ""

            if self.lineEdit_individuo.text() != "":
                individuo = int(self.lineEdit_individuo.text())
            else:
                individuo = ""

            if self.comboBox_eta_min.currentText() != "":
                eta_min = int(self.comboBox_eta_min.currentText())
            else:
                eta_min = ""

            if self.comboBox_eta_max.currentText() != "":
                eta_max = int(self.comboBox_eta_max.currentText())
            else:
                eta_max = ""

            search_dict = {
                self.TABLE_FIELDS[0]:
                "'" + str(self.comboBox_sito.currentText()) + "'",  #1 - Sito
                self.TABLE_FIELDS[1]:
                "'" + str(self.lineEdit_area.text()) + "'",  #2 - Area
                self.TABLE_FIELDS[2]:
                us,  #3 - US
                self.TABLE_FIELDS[3]:
                individuo,  #4 - individuo
                self.TABLE_FIELDS[4]:
                "'" + str(self.lineEdit_data_schedatura.text()) +
                "'",  #5 - data schedatura
                self.TABLE_FIELDS[5]:
                "'" + str(self.lineEdit_schedatore.text()) +
                "'",  #6 - schedatore
                self.TABLE_FIELDS[6]:
                "'" + str(self.comboBox_sesso.currentText()) + "'",  #7 - sesso
                self.TABLE_FIELDS[7]:
                eta_min,  #8 - eta min
                self.TABLE_FIELDS[8]:
                eta_max,  #9 - eta max
                self.TABLE_FIELDS[9]:
                "'" + str(self.comboBox_classi_eta.currentText()) +
                "'",  #10 - classi eta
                self.TABLE_FIELDS[10]:
                str(self.textEdit_osservazioni.toPlainText()
                    )  #11 - osservazioni
            }

            u = Utility()
            search_dict = u.remove_empty_items_fr_dict(search_dict)

            if bool(search_dict) == False:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Non e' stata impostata alcuna ricerca!!!", QMessageBox.Ok)
            else:
                res = self.DB_MANAGER.query_bool(search_dict,
                                                 self.MAPPER_TABLE_CLASS)
                if bool(res) == False:
                    QMessageBox.warning(self, "ATTENZIONE",
                                        "Non e' stato trovato alcun record!",
                                        QMessageBox.Ok)

                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]
                    self.fill_fields(self.REC_CORR)
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])

                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.lineEdit_area"], "False")
                    self.setComboBoxEnable(["self.lineEdit_us"], "False")
                    self.setComboBoxEnable(["self.lineEdit_individuo"],
                                           "False")
                    self.setComboBoxEnable(["self.textEdit_osservazioni"],
                                           "True")
                else:
                    self.DATA_LIST = []
                    for i in res:
                        self.DATA_LIST.append(i)
                    self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]
                    self.fill_fields()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)

                    if self.REC_TOT == 1:
                        strings = ("E' stato trovato", self.REC_TOT, "record")
                        if self.toolButtonGis.isChecked() == True:
                            id_us_list = self.charge_id_us_for_individuo()
                            self.pyQGIS.charge_individui_us(id_us_list)
                            self.pyQGIS.charge_individui_from_research(
                                self.DATA_LIST)

                    else:
                        strings = ("Sono stati trovati", self.REC_TOT,
                                   "records")
                        if self.toolButtonGis.isChecked() == True:
                            id_us_list = self.charge_id_us_for_individuo()
                            self.pyQGIS.charge_individui_us(id_us_list)
                            self.pyQGIS.charge_individui_from_research(
                                self.DATA_LIST)

                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.lineEdit_area"], "False")
                    self.setComboBoxEnable(["self.lineEdit_us"], "False")
                    self.setComboBoxEnable(["self.lineEdit_individuo"],
                                           "False")
                    self.setComboBoxEnable(["self.textEdit_osservazioni"],
                                           "True")
                    QMessageBox.warning(self, "Messaggio",
                                        "%s %d %s" % strings, QMessageBox.Ok)

        self.enable_button_search(1)

    def update_if(self, msg):
        rec_corr = self.REC_CORR
        self.msg = msg
        if self.msg == 1:
            test = self.update_record()
            if test == 1:
                id_list = []
                for i in self.DATA_LIST:
                    id_list.append(ast.literal_eval("i." + self.ID_TABLE))
                self.DATA_LIST = []
                if self.SORT_STATUS == "n":
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, [self.ID_TABLE], 'asc',
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE
                    )  #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
                else:
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE)
                for i in temp_data_list:
                    self.DATA_LIST.append(i)
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                if type(self.REC_CORR) == "<type 'str'>":
                    corr = 0
                else:
                    corr = self.REC_CORR
                return 1
            elif test == 0:
                return 0

    #custom functions
    def charge_records(self):
        self.DATA_LIST = []

        if self.DB_SERVER == 'sqlite':
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                self.DATA_LIST.append(i)
        else:
            id_list = []
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS,
                self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)

    def datestrfdate(self):
        now = date.today()
        today = now.strftime("%d-%m-%Y")
        return today

    def table2dict(self, n):
        self.tablename = n
        row = ast.literal_eval(self.tablename + ".rowCount()")
        col = ast.literal_eval(self.tablename + ".columnCount()")
        lista = []
        for r in range(row):
            sub_list = []
            for c in range(col):
                value = ast.literal_eval(self.tablename + ".item(r,c)")
                if value != None:
                    sub_list.append(str(value.text()))

            if bool(sub_list) == True:
                lista.append(sub_list)

        return lista

    def tableInsertData(self, t, d):
        pass
        """
		self.table_name = t
		self.data_list = ast.literal_eval(d)
		self.data_list.sort()

		#column table count
		table_col_count_cmd = ("%s.columnCount()") % (self.table_name)
		table_col_count = ast.literal_eval(table_col_count_cmd)

		#clear table
		table_clear_cmd = ("%s.clearContents()") % (self.table_name)
		ast.literal_eval(table_clear_cmd)

		for i in range(table_col_count):
			table_rem_row_cmd = ("%s.removeRow(%d)") % (self.table_name, i)
			ast.literal_eval(table_rem_row_cmd)

		#for i in range(len(self.data_list)):
			#self.insert_new_row(self.table_name)
		
		for row in range(len(self.data_list)):
			cmd = ('%s.insertRow(%s)') % (self.table_name, row)
			ast.literal_eval(cmd)
			for col in range(len(self.data_list[row])):
				#item = self.comboBox_sito.setEditText(self.data_list[0][col]
				item = QTableWidgetItem(self.data_list[row][col])
				exec_str = ('%s.setItem(%d,%d,item)') % (self.table_name,row,col)
				ast.literal_eval(exec_str)
		"""

    def insert_new_row(self, table_name):
        """insert new row into a table based on table_name"""
        cmd = table_name + ".insertRow(0)"
        ast.literal_eval(cmd)

    def empty_fields(self):
        #rapporti_row_count = self.tableWidget_rapporti.rowCount()
        #campioni_row_count = self.tableWidget_campioni.rowCount()
        #inclusi_row_count = self.tableWidget_inclusi.rowCount()

        self.comboBox_sito.setEditText("")  #1 - Sito
        self.lineEdit_area.clear()  #2 - area
        self.lineEdit_us.clear()  #3 - US
        self.lineEdit_data_schedatura.clear()  #4 - data schedatura
        self.lineEdit_schedatore.clear()  #5 - schedatore
        self.lineEdit_individuo.clear()  #6 - individuo
        self.comboBox_sesso.setEditText("")  #7 - sesso
        self.comboBox_eta_min.setEditText("")  #8 - eta' minima
        self.comboBox_eta_max.setEditText("")  #9 - eta' massima
        self.comboBox_classi_eta.setEditText("")  #10 - classi di eta'
        self.textEdit_osservazioni.clear()  #11 - osservazioni

    def fill_fields(self, n=0):
        self.rec_num = n
        try:
            self.comboBox_sito.setEditText(
                str(self.DATA_LIST[self.rec_num].sito))  #1 - Sito
            self.lineEdit_area.setText(str(
                self.DATA_LIST[self.rec_num].area))  #2 - area
            self.lineEdit_us.setText(str(
                self.DATA_LIST[self.rec_num].us))  #3 - us
            self.lineEdit_individuo.setText(
                str(self.DATA_LIST[
                    self.rec_num].nr_individuo))  #4 - nr individuo
            self.lineEdit_data_schedatura.setText(
                str(self.DATA_LIST[
                    self.rec_num].data_schedatura))  #5 - data schedatura
            self.lineEdit_schedatore.setText(
                str(self.DATA_LIST[self.rec_num].schedatore))  #6 - schedatore
            self.comboBox_sesso.setEditText(
                str(self.DATA_LIST[self.rec_num].sesso))  #7 - sesso

            if self.DATA_LIST[self.rec_num].eta_min == None:  #8 - eta minima
                self.comboBox_eta_min.setEditText("")
            else:
                self.comboBox_eta_min.setEditText(
                    str(self.DATA_LIST[self.rec_num].eta_min))

            if self.DATA_LIST[self.rec_num].eta_max == None:  #9 - eta massima
                self.comboBox_eta_max.setEditText("")
            else:
                self.comboBox_eta_max.setEditText(
                    str(self.DATA_LIST[self.rec_num].eta_max))

            self.comboBox_classi_eta.setEditText(
                str(self.DATA_LIST[
                    self.rec_num].classi_eta))  #10 - classi di eta

            str(
                self.textEdit_osservazioni.setText(self.DATA_LIST[
                    self.rec_num].osservazioni))  #11 - osservazioni
            if self.toolButtonPreview.isChecked() == True:
                self.loadMapPreview()
        except Exception as e:
            QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def set_rec_counter(self, t, c):
        self.rec_tot = t
        self.rec_corr = c
        self.label_rec_tot.setText(str(self.rec_tot))
        self.label_rec_corrente.setText(str(self.rec_corr))

    def set_LIST_REC_TEMP(self):
        if self.comboBox_eta_min.currentText() == "":
            eta_min = None
        else:
            eta_min = self.comboBox_eta_min.currentText()

        if self.comboBox_eta_max.currentText() == "":
            eta_max = None
        else:
            eta_max = self.comboBox_eta_max.currentText()

        #data
        self.DATA_LIST_REC_TEMP = [
            str(self.comboBox_sito.currentText()),  #1 - Sito
            str(self.lineEdit_area.text()),  #2 - Area
            str(self.lineEdit_us.text()),  #3 - US
            str(self.lineEdit_individuo.text()),  #4 - individuo
            str(self.lineEdit_data_schedatura.text()),  #5 - data schedatura
            str(self.lineEdit_schedatore.text()),  #6 - schedatore
            str(self.comboBox_sesso.currentText()),  #7 - sesso
            str(eta_min),  #8- eta minima
            str(eta_max),  #9 - eta massima
            str(self.comboBox_classi_eta.currentText()),  #10 - classi eta
            str(self.textEdit_osservazioni.toPlainText())
        ]  #11 - osservazioni

    def set_LIST_REC_CORR(self):
        self.DATA_LIST_REC_CORR = []
        for i in self.TABLE_FIELDS:
            self.DATA_LIST_REC_CORR.append(
                ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i +
                                 ")"))

    def records_equal_check(self):
        self.set_LIST_REC_TEMP()
        self.set_LIST_REC_CORR()

        if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
            return 0
        else:
            return 1

    def setComboBoxEditable(self, f, n):
        field_names = f
        value = n

        for fn in field_names:
            cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
            ast.literal_eval(cmd)

    def setComboBoxEnable(self, f, v):
        field_names = f
        value = v

        for fn in field_names:
            cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
            ast.literal_eval(cmd)

    def update_record(self):
        try:
            self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [
                ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." +
                                 self.ID_TABLE + ")")
            ], self.TABLE_FIELDS, self.rec_toupdate())
            return 1
        except Exception as e:
            QMessageBox.warning(
                self, "Messaggio",
                "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :"
                + str(e), QMessageBox.Ok)
            return 0

    def rec_toupdate(self):
        rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)

        #f = open('/test_rec_to_update_ind.txt', 'w')
        #f.write(str(rec_to_update))
        #f.close()

        return rec_to_update

    def charge_id_us_for_individuo(self):
        data_list_us = []
        for rec in range(len(self.DATA_LIST)):
            sito = "'" + str(self.DATA_LIST[rec].sito) + "'"
            area = "'" + str(self.DATA_LIST[rec].area) + "'"
            us = int(self.DATA_LIST[rec].us)

            serch_dict_us = {'sito': sito, 'area': area, 'us': us}
            us_ind = self.DB_MANAGER.query_bool(serch_dict_us, "US")
            data_list_us.append(us_ind)

        data_list_id_us = []
        for us in range(len(data_list_us)):
            data_list_id_us.append(data_list_us[us][0].id_us)

        return data_list_id_us

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
예제 #5
0
class pyarchinit_Documentazione(QDialog, Ui_DialogDocumentazione_tipo_doc):
    MSG_BOX_TITLE = "PyArchInit - pyarchinit_version 0.4 - Scheda Documentazione"
    DATA_LIST = []
    DATA_LIST_REC_CORR = []
    DATA_LIST_REC_TEMP = []
    REC_CORR = 0
    REC_TOT = 0
    STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
    BROWSE_STATUS = "b"
    SORT_MODE = 'asc'
    SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
    SORT_STATUS = "n"
    UTILITY = Utility()
    DB_MANAGER = ""
    TABLE_NAME = 'documentazione_table'
    MAPPER_TABLE_CLASS = "DOCUMENTAZIONE"
    NOME_SCHEDA = "Scheda Documentazione"
    ID_TABLE = "id_documentazione"
    CONVERSION_DICT = {
        ID_TABLE: ID_TABLE,
        "Sito": "sito",
        "Nome documentazione": "nome_doc",
        "Data": "data",
        "Tipo documentazione": "tipo_documentazione",
        "Sorgente": "sorgente",
        "Scala": "scala",
        "Disegnatore": "disegnatore",
        "Note": "note",
    }

    SORT_ITEMS = [
        ID_TABLE,
        "Sito",
        "Nome documentazione",
        "Data",
        "Tipo documentazione",
        "Sorgente",
        "Scala",
        "Disegnatore",
        "Note",
    ]

    TABLE_FIELDS = [
        "sito",
        "nome_doc",
        "data",
        "tipo_documentazione",
        "sorgente",
        "scala",
        "disegnatore",
        "note",
    ]

    DB_SERVER = "not defined"  ####nuovo sistema sort

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        QDialog.__init__(self)
        self.setupUi(self)
        self.currentLayerId = None
        try:
            self.on_pushButton_connect_pressed()
        except Exception as e:
            QMessageBox.warning(self, "Sistema di connessione", str(e),
                                QMessageBox.Ok)

    def enable_button(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_new_search.setEnabled(n)

        self.pushButton_search_go.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def enable_button_search(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_save.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def on_pushButton_connect_pressed(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        test_conn = conn_str.find('sqlite')
        if test_conn == 0:
            self.DB_SERVER = "sqlite"
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.charge_records()  #charge records from DB
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = 'b'
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
            else:
                QMessageBox.warning(
                    self, "BENVENUTO",
                    "Benvenuto in pyArchInit" + self.NOME_SCHEDA +
                    ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",
                    QMessageBox.Ok)
                self.charge_list()
                self.BROWSE_STATUS = 'x'
                self.on_pushButton_new_rec_pressed()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS"
                    + str(e), QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

####################################

    def charge_list(self):
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))

        try:
            sito_vl.remove('')
        except:
            pass
        self.comboBox_sito_doc.clear()
        sito_vl.sort()
        self.comboBox_sito_doc.addItems(sito_vl)

###################################

#buttons functions

    def generate_list_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):

            sito = str(self.DATA_LIST[i].sito)
            tipo_doc = str(self.DATA_LIST[i].tipo_documentazione)
            nome_doc = str(self.DATA_LIST[i].nome_doc)
            note = str(self.DATA_LIST[i].note)

            res_us_doc = self.DB_MANAGER.select_us_doc_from_db_sql(
                sito, tipo_doc, nome_doc)

            res_usneg_doc = self.DB_MANAGER.select_usneg_doc_from_db_sql(
                sito, tipo_doc, nome_doc)

            elenco_us_doc = []
            elenco_usneg_doc = []

            if bool(res_us_doc) == True:
                for sing_rec in res_us_doc:
                    tup_area_us = (int(sing_rec[1]), int(sing_rec[3]))
                    elenco_us_doc.append(tup_area_us)

            if bool(res_usneg_doc) == True:
                for sing_rec in res_usneg_doc:
                    tup_area_usneg = (int(sing_rec[2]), int(sing_rec[3]))
                    elenco_usneg_doc.append(tup_area_usneg)

            elenco_us_pdf = elenco_us_doc + elenco_usneg_doc

            string_to_pdf = ""

            if bool(elenco_us_pdf) == True:

                elenco_us_pdf.sort()

                area_corr = str(elenco_us_pdf[0][0])
                us_elenco = ""

                string_to_pdf = ""

                for rec_us in range(len(elenco_us_pdf)):
                    if area_corr == str(elenco_us_pdf[rec_us][0]):
                        us_elenco += str(elenco_us_pdf[rec_us][1]) + ", "
                    else:
                        if string_to_pdf == "":
                            string_to_pdf = "Area " + area_corr + ": " + us_elenco[:
                                                                                   -2]
                            area_corr = str(elenco_us_pdf[rec_us][0])
                            us_elenco = str(elenco_us_pdf[rec_us][1]) + ", "
                        else:
                            string_to_pdf += "<br/>Area " + area_corr + ": " + us_elenco[:
                                                                                         -2]
                            area_corr = str(elenco_us_pdf[rec_us][0])
                            us_elenco = str(elenco_us_pdf[rec_us][1]) + ", "

                string_to_pdf += "<br/>Area " + area_corr + ": " + us_elenco[:
                                                                             -2]
            else:
                pass

            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                str(self.DATA_LIST[i].nome_doc),  #2 - Area
                str(self.DATA_LIST[i].data),  #4 - definizione stratigrafica
                str(self.DATA_LIST[i].tipo_documentazione
                    ),  #5 - definizione intepretata
                str(self.DATA_LIST[i].sorgente),  #6 - descrizione
                str(self.DATA_LIST[i].scala),  #7 - interpretazione
                str(self.DATA_LIST[i].disegnatore),  #8 - periodo iniziale
                str(self.DATA_LIST[i].note),  #9 - fase iniziale
                note
            ])

        return data_list

    def on_pushButton_disegno_doc_pressed(self):
        sing_layer = [self.DATA_LIST[self.REC_CORR]]
        self.pyQGIS.charge_vector_layers_doc(sing_layer)

    def on_pushButton_exp_scheda_doc_pressed(self):
        single_Documentazione_pdf_sheet = generate_documentazione_pdf()
        data_list = self.generate_list_pdf()
        single_Documentazione_pdf_sheet.build_Documentazione_sheets(data_list)

    def on_pushButton_exp_elenco_doc_pressed(self):
        Documentazione_index_pdf = generate_documentazione_pdf()
        data_list = self.generate_list_pdf()
        Documentazione_index_pdf.build_index_Documentazione(
            data_list, data_list[0][0])

    def on_pushButtonPreview_pressed(self):

        docstr = (' \"%s\"=\'%s\' AND \"%s\"=\'%s\' AND \"%s\"=\'%s\' ') % (
            'sito', str(self.DATA_LIST[self.REC_CORR].sito), 'nome_doc',
            str(self.DATA_LIST[self.REC_CORR].nome_doc), 'tipo_doc',
            str(self.DATA_LIST[self.REC_CORR].tipo_documentazione))

        QMessageBox.warning(self, "query", str(docstr), QMessageBox.Ok)

        dlg = pyarchinit_doc_preview(self, docstr)

        dlg.exec_()

    def on_pushButton_sort_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            dlg = SortPanelMain(self)
            dlg.insertItems(self.SORT_ITEMS)
            dlg.exec_()

            items, order_type = dlg.ITEMS, dlg.TYPE_ORDER

            self.SORT_ITEMS_CONVERTED = []
            for i in items:
                self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

            self.SORT_MODE = order_type
            self.empty_fields()

            id_list = []
            for i in self.DATA_LIST:
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))
            self.DATA_LIST = []

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                self.MAPPER_TABLE_CLASS, self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR

            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.SORT_STATUS = "o"
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.fill_fields()

    def on_pushButton_new_rec_pressed(self):
        if bool(self.DATA_LIST) == True:
            if self.data_error_check() == 1:
                pass
            else:
                if self.BROWSE_STATUS == "b":
                    if bool(self.DATA_LIST) == True:
                        if self.records_equal_check() == 1:
                            msg = self.update_if(
                                QMessageBox.warning(
                                    self, 'Errore',
                                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                                    QMessageBox.Cancel, 1))

##########################################

#set the GUI for a new record
        if self.BROWSE_STATUS != "n":
            self.BROWSE_STATUS = "n"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            self.empty_fields()
            self.label_sort.setText(self.SORTED_ITEMS["n"])

            self.setComboBoxEditable(["self.comboBox_sito_doc"], 1)
            self.setComboBoxEnable(["self.comboBox_sito_doc"], "True")
            self.setComboBoxEnable(["self.comboBox_tipo_doc"], "True")
            self.setComboBoxEnable(["self.lineEdit_nome_doc"], "True")

            self.set_rec_counter('', '')
            self.enable_button(0)

###########################################

    def on_pushButton_save_pressed(self):
        #save record
        if self.BROWSE_STATUS == "b":
            if self.data_error_check() == 0:
                if self.records_equal_check() == 1:
                    self.update_if(
                        QMessageBox.warning(
                            self, 'ATTENZIONE',
                            "Il record e' stato modificato. Vuoi salvare le modifiche?",
                            QMessageBox.Cancel, 1))
                    self.label_sort.setText(self.SORTED_ITEMS["n"])
                    self.enable_button(1)
                    self.fill_fields(self.REC_CORR)
                else:
                    QMessageBox.warning(
                        self, "ATTENZIONE",
                        "Non è stata realizzata alcuna modifica.",
                        QMessageBox.Ok)
        else:
            if self.data_error_check() == 0:
                test_insert = self.insert_new_rec()
                if test_insert == 1:
                    self.empty_fields()
                    self.label_sort.setText(self.SORTED_ITEMS["n"])
                    self.charge_list()
                    self.charge_records()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.REC_TOT, self.REC_CORR = len(
                        self.DATA_LIST), len(self.DATA_LIST) - 1
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)

                    ##################################################

                    self.setComboBoxEditable(["self.comboBox_sito_doc"], 1)
                    self.setComboBoxEnable(["self.comboBox_sito_doc"], "False")
                    self.setComboBoxEnable(["self.comboBox_tipo_doc"], "False")
                    self.setComboBoxEnable(["self.lineEdit_nome_doc"], "False")

                    self.fill_fields(self.REC_CORR)
                    self.enable_button(1)
                else:
                    pass

##################################################

    def data_error_check(self):
        test = 0
        EC = Error_check()

        if EC.data_is_empty(str(self.comboBox_sito_doc.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Sito. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(self.comboBox_tipo_doc.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Tipo documentazione \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        if EC.data_is_empty(str(self.lineEdit_nome_doc.text())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Nome documentazione \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        return test

    def insert_new_rec(self):
        try:

            data = self.DB_MANAGER.insert_values_documentazione(
                self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS,
                                           self.ID_TABLE) + 1,
                str(self.comboBox_sito_doc.currentText()),  #1 - Sito
                str(self.lineEdit_nome_doc.text()),  #2 - Nome Documentazione
                str(self.lineEdit_data_doc.text()),  #3 - Data
                str(self.comboBox_tipo_doc.currentText()
                    ),  #4 - Tipo Documentazione
                str(self.comboBox_sorgente_doc.currentText()),  #5 - Sorgente
                str(self.comboBox_scala_doc.currentText()),  #6 - Scala
                str(self.lineEdit_disegnatore_doc.text()),  #7 - Disegnatore
                str(self.textEdit_note_doc.toPlainText()))  #8 - Note

            try:
                self.DB_MANAGER.insert_data_session(data)
                return 1
            except Exception as e:
                e_str = str(e)
                if e_str.__contains__("Integrity"):
                    msg = self.ID_TABLE + " gia' presente nel database"
                else:
                    msg = e
                QMessageBox.warning(self, "Errore",
                                    "Attenzione 1 ! \n" + str(msg),
                                    QMessageBox.Ok)
                return 0
        except Exception as e:
            QMessageBox.warning(self, "Errore", "Attenzione 2 ! \n" + str(e),
                                QMessageBox.Ok)
            return 0

    def check_record_state(self):
        ec = self.data_error_check()
        if ec == 1:
            return 1  #ci sono errori di immissione
        elif self.records_equal_check() == 1 and ec == 0:
            self.update_if(
                QMessageBox.warning(
                    self, 'Errore',
                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                    QMessageBox.Cancel, 1))
            #self.charge_records() incasina lo stato trova
            return 0  #non ci sono errori di immissione

    def on_pushButton_view_all_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.empty_fields()
            self.charge_records()
            self.fill_fields()
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.label_sort.setText(self.SORTED_ITEMS["n"])

    #records surf functions
    def on_pushButton_first_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.fill_fields(0)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_last_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(
                    self.DATA_LIST), len(self.DATA_LIST) - 1
                self.fill_fields(self.REC_CORR)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_prev_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR - 1
            if self.REC_CORR == -1:
                self.REC_CORR = 0
                QMessageBox.warning(self, "Errore", "Sei al primo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_next_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR + 1
            if self.REC_CORR >= self.REC_TOT:
                self.REC_CORR = self.REC_CORR - 1
                QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_delete_pressed(self):
        msg = QMessageBox.warning(
            self, "Attenzione!!!",
            "Vuoi veramente eliminare il record? \n L'azione è irreversibile",
            QMessageBox.Cancel, 1)
        if msg != 1:
            QMessageBox.warning(self, "Messaggio!!!", "Azione Annullata!")
        else:
            try:
                id_to_delete = ast.literal_eval(
                    "self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
                self.DB_MANAGER.delete_one_record(self.TABLE_NAME,
                                                  self.ID_TABLE, id_to_delete)
                self.charge_records()  #charge records from DB
                QMessageBox.warning(self, "Messaggio!!!", "Record eliminato!")
            except Exception as e:
                QMessageBox.warning(self, "Messaggio!!!",
                                    "Tipo di errore: " + str(e))
            if bool(self.DATA_LIST) == False:
                QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",
                                    QMessageBox.Ok)
                self.DATA_LIST = []
                self.DATA_LIST_REC_CORR = []
                self.DATA_LIST_REC_TEMP = []
                self.REC_CORR = 0
                self.REC_TOT = 0
                self.empty_fields()
                self.set_rec_counter(0, 0)
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]

                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
        self.SORT_STATUS = "n"
        self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

    def on_pushButton_new_search_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.enable_button_search(0)

            ################################################

            #set the GUI for a new search
            if self.BROWSE_STATUS != "f":
                self.BROWSE_STATUS = "f"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.setComboBoxEnable(["self.comboBox_sito_doc"], "True")
                self.setComboBoxEnable(["self.lineEdit_nome_doc"], "True")
                self.setComboBoxEnable(["self.comboBox_tipo_doc"], "True")
                self.setComboBoxEnable(["self.textEdit_note_doc"], "False")
                self.setComboBoxEditable(["self.comboBox_sito_doc"], 1)
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter('', '')
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.charge_list()
                self.empty_fields()

################################################

    def on_pushButton_search_go_pressed(self):
        if self.BROWSE_STATUS != "f":
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",
                QMessageBox.Ok)
        else:
            search_dict = {
                self.TABLE_FIELDS[0]:
                "'" + str(self.comboBox_sito_doc.currentText()) +
                "'",  #1 - Sito
                self.TABLE_FIELDS[1]:
                "'" + str(self.lineEdit_nome_doc.text()) +
                "'",  #2 - Nome Documentazione
                self.TABLE_FIELDS[2]:
                "'" + str(self.lineEdit_data_doc.text()) + "'",  #3 - Data
                self.TABLE_FIELDS[3]:
                "'" + str(self.comboBox_tipo_doc.currentText()) +
                "'",  #4 - Tipo Documentazione
                self.TABLE_FIELDS[4]:
                "'" + str(self.comboBox_sorgente_doc.currentText()) +
                "'",  #5 - Sorgente
                self.TABLE_FIELDS[5]:
                "'" + str(self.comboBox_scala_doc.currentText()) +
                "'",  #6 - Scala
                self.TABLE_FIELDS[6]:
                "'" + str(self.lineEdit_disegnatore_doc.text()) +
                "'"  #7 - Disegnatore
            }

            u = Utility()
            search_dict = u.remove_empty_items_fr_dict(search_dict)

            if bool(search_dict) == False:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Non e' stata impostata alcuna ricerca!!!", QMessageBox.Ok)
            else:
                res = self.DB_MANAGER.query_bool(search_dict,
                                                 self.MAPPER_TABLE_CLASS)
                if bool(res) == False:
                    QMessageBox.warning(self, "ATTENZIONE",
                                        "Non e' stato trovato alcun record!",
                                        QMessageBox.Ok)

                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]

                    self.fill_fields(self.REC_CORR)
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])

                    self.setComboBoxEnable(["self.comboBox_sito_doc"], "False")
                    self.setComboBoxEnable(["self.lineEdit_nome_doc"], "False")
                    self.setComboBoxEnable(["self.comboBox_tipo_doc"], "False")
                    self.setComboBoxEnable(["self.textEdit_note_doc"], "True")
                    self.setComboBoxEditable(["self.comboBox_sito_doc"], 1)

                else:
                    self.DATA_LIST = []

                    for i in res:
                        self.DATA_LIST.append(i)

                    self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]
                    self.fill_fields()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)

                    if self.REC_TOT == 1:
                        strings = ("E' stato trovato", self.REC_TOT, "record")
                    else:
                        strings = ("Sono stati trovati", self.REC_TOT,
                                   "records")

                    self.setComboBoxEnable(["self.comboBox_sito_doc"], "False")
                    self.setComboBoxEnable(["self.lineEdit_nome_doc"], "False")
                    self.setComboBoxEnable(["self.comboBox_tipo_doc"], "False")
                    self.setComboBoxEnable(["self.textEdit_note_doc"], "True")
                    self.setComboBoxEditable(["self.comboBox_sito_doc"], 1)

                    QMessageBox.warning(self, "Messaggio",
                                        "%s %d %s" % strings, QMessageBox.Ok)

        self.enable_button_search(1)

    def on_pushButton_test_pressed(self):
        pass

    def update_if(self, msg):
        rec_corr = self.REC_CORR
        self.msg = msg
        if self.msg == 1:
            test = self.update_record()
            if test == 1:
                id_list = []
                for i in self.DATA_LIST:
                    id_list.append(ast.literal_eval("i." + self.ID_TABLE))
                self.DATA_LIST = []
                if self.SORT_STATUS == "n":
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, [self.ID_TABLE], 'asc',
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE
                    )  #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
                else:
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE)
                for i in temp_data_list:
                    self.DATA_LIST.append(i)
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                if type(self.REC_CORR) == "<type 'str'>":
                    corr = 0
                else:
                    corr = self.REC_CORR
                return 1
            elif test == 0:
                return 0

    #custom functions
    def charge_records(self):
        self.DATA_LIST = []

        if self.DB_SERVER == 'sqlite':
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                self.DATA_LIST.append(i)
        else:
            id_list = []
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS,
                self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)

    def datestrfdate(self):
        now = date.today()
        today = now.strftime("%d-%m-%Y")
        return today

    def table2dict(self, n):
        self.tablename = n
        row = ast.literal_eval(self.tablename + ".rowCount()")
        col = ast.literal_eval(self.tablename + ".columnCount()")
        lista = []
        for r in range(row):
            sub_list = []
            for c in range(col):
                value = ast.literal_eval(self.tablename + ".item(r,c)")
                if bool(value) == True:
                    sub_list.append(str(value.text()))
            lista.append(sub_list)
        return lista

    def empty_fields(self):
        self.comboBox_sito_doc.setEditText("")  #1 - Sito
        self.lineEdit_nome_doc.clear()  #2 - Nome Dcumentazione
        self.lineEdit_data_doc.clear()  #3 - Data
        self.comboBox_tipo_doc.setEditText("")  #4 - Tipo Documentazione
        self.comboBox_sorgente_doc.setEditText("")  #5 - Sorgente
        self.comboBox_scala_doc.setEditText("")  #6 - Scala
        self.lineEdit_disegnatore_doc.clear()  #7 - Dsegnatore
        self.textEdit_note_doc.clear()  #8 - Note

    def fill_fields(self, n=0):
        self.rec_num = n

        str(
            self.comboBox_sito_doc.setEditText(
                self.DATA_LIST[self.rec_num].sito))  #1 - Sito
        str(
            self.lineEdit_nome_doc.setText(self.DATA_LIST[
                self.rec_num].nome_doc))  #2 - Nome Dcumentazione
        str(self.lineEdit_data_doc.setText(
            self.DATA_LIST[self.rec_num].data))  #3 - Data
        str(
            self.comboBox_tipo_doc.setEditText(self.DATA_LIST[
                self.rec_num].tipo_documentazione))  #4 - Tipo Documentazione
        str(
            self.comboBox_sorgente_doc.setEditText(
                self.DATA_LIST[self.rec_num].sorgente))  #5 - Sorgente
        str(
            self.comboBox_scala_doc.setEditText(
                self.DATA_LIST[self.rec_num].scala))  #6 - Scala
        str(
            self.lineEdit_disegnatore_doc.setText(
                self.DATA_LIST[self.rec_num].disegnatore))  #7 - Dsegnatore
        str(self.textEdit_note_doc.setText(
            self.DATA_LIST[self.rec_num].note))  #8 - Note

    def set_rec_counter(self, t, c):
        self.rec_tot = t
        self.rec_corr = c
        self.label_rec_tot.setText(str(self.rec_tot))
        self.label_rec_corrente.setText(str(self.rec_corr))

    def set_LIST_REC_TEMP(self):

        #data
        self.DATA_LIST_REC_TEMP = [
            str(self.comboBox_sito_doc.currentText()),  #1 - Sito
            str(self.lineEdit_nome_doc.text()),  #2 - Nome Documentazione
            str(self.lineEdit_data_doc.text()),  #3 - Data
            str(self.comboBox_tipo_doc.currentText()
                ),  #4 - Tipo Documentazione
            str(self.comboBox_sorgente_doc.currentText()),  #5 - Sorgente
            str(self.comboBox_scala_doc.currentText()),  #6 - Scala
            str(self.lineEdit_disegnatore_doc.text()),  #7 - Disegnatore
            str(self.textEdit_note_doc.toPlainText())  #8 - Note
        ]

    def set_LIST_REC_CORR(self):
        self.DATA_LIST_REC_CORR = []
        for i in self.TABLE_FIELDS:
            self.DATA_LIST_REC_CORR.append(
                ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i +
                                 ")"))

    def setComboBoxEnable(self, f, v):
        field_names = f
        value = v

        for fn in field_names:
            cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
            ast.literal_eval(cmd)

    def setComboBoxEditable(self, f, n):
        field_names = f
        value = n

        for fn in field_names:
            cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
            ast.literal_eval(cmd)

    def rec_toupdate(self):
        rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)
        return rec_to_update

    def records_equal_check(self):
        self.set_LIST_REC_TEMP()
        self.set_LIST_REC_CORR()

        if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
            return 0
        else:
            return 1

    def update_record(self):
        try:
            self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [
                ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." +
                                 self.ID_TABLE + ")")
            ], self.TABLE_FIELDS, self.rec_toupdate())
            return 1
        except Exception as e:
            QMessageBox.warning(
                self, "Messaggio",
                "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :"
                + str(e), QMessageBox.Ok)
            return 0

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
예제 #6
0
class pyarchinit_Campioni(QDialog, Ui_DialogCampioni):
	MSG_BOX_TITLE = "PyArchInit - pyarchinit_version 0.4 - Scheda Campioni"
	DATA_LIST = []
	DATA_LIST_REC_CORR = []
	DATA_LIST_REC_TEMP = []
	REC_CORR = 0
	REC_TOT = 0
	STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
	BROWSE_STATUS = "b"
	SORT_MODE = 'asc'
	SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
	SORT_STATUS = "n"
	UTILITY = Utility()
	DB_MANAGER = ""
	TABLE_NAME = 'campioni_table'
	MAPPER_TABLE_CLASS = "CAMPIONI"
	NOME_SCHEDA = "Scheda Campioni"
	ID_TABLE = "id_campione"
	CONVERSION_DICT = {
	ID_TABLE:ID_TABLE, 
	"Sito":"sito",
	"Nr Campione":"nr_campione",
	"Tipo campione":"tipo_campione",
	"Descrizione":"descrizione",
	"Area":"area",
	"US":"us",
	"Nr. Inventario Materiale":"numero_inventario_materiale",
	"Nr Cassa":"nr_cassa",
	"Luogo di conservazione":"luogo_conservazione"
	}

	SORT_ITEMS = [
				ID_TABLE,
				"Sito",
				"Nr Campione",
				"Tipo campione",
				"Descrizione",
				"Area",
				"US",
				"Nr. Inventario Materiale",
				"Nr Cassa",
				"Luogo di conservazione"
				]

	TABLE_FIELDS = [
				"sito",
				"nr_campione",
				"tipo_campione",
				"descrizione",
				"area",
				"us",
				"numero_inventario_materiale",
				"nr_cassa",
				"luogo_conservazione"
				]

	DB_SERVER = 'not defined'

	def __init__(self, iface):
		self.iface = iface
		self.pyQGIS = Pyarchinit_pyqgis(self.iface)
		QDialog.__init__(self)
		self.setupUi(self)
		self.currentLayerId = None
		try:
			self.on_pushButton_connect_pressed()
		except Exception as e:
			QMessageBox.warning(self, "Sistema di connessione", str(e),  QMessageBox.Ok)
			

	def enable_button(self, n):
		self.pushButton_connect.setEnabled(n)

		self.pushButton_new_rec.setEnabled(n)

		self.pushButton_view_all.setEnabled(n)

		self.pushButton_first_rec.setEnabled(n)

		self.pushButton_last_rec.setEnabled(n)

		self.pushButton_prev_rec.setEnabled(n)

		self.pushButton_next_rec.setEnabled(n)

		self.pushButton_delete.setEnabled(n)

		self.pushButton_new_search.setEnabled(n)

		self.pushButton_search_go.setEnabled(n)

		self.pushButton_sort.setEnabled(n)

	def enable_button_search(self, n):
		self.pushButton_connect.setEnabled(n)

		self.pushButton_new_rec.setEnabled(n)

		self.pushButton_view_all.setEnabled(n)

		self.pushButton_first_rec.setEnabled(n)

		self.pushButton_last_rec.setEnabled(n)

		self.pushButton_prev_rec.setEnabled(n)

		self.pushButton_next_rec.setEnabled(n)

		self.pushButton_delete.setEnabled(n)

		self.pushButton_save.setEnabled(n)

		self.pushButton_sort.setEnabled(n)

	def on_pushButton_connect_pressed(self):
		from pyarchinit_conn_strings import *
		conn = Connection()
		conn_str = conn.conn_str()
		test_conn = conn_str.find('sqlite')

		if test_conn == 0:
			self.DB_SERVER = "sqlite"
		try:
			self.DB_MANAGER = Pyarchinit_db_management(conn_str)
			self.DB_MANAGER.connection()
			self.charge_records() #charge records from DB
			#check if DB is empty
			if bool(self.DATA_LIST) == True:
				self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
				self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]
				self.BROWSE_STATUS = 'b'
				self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
				self.label_sort.setText(self.SORTED_ITEMS["n"])
				self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
				self.charge_list()
				self.fill_fields()
			else:
				QMessageBox.warning(self, "BENVENUTO", "Benvenuto in pyArchInit" + self.NOME_SCHEDA + ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",  QMessageBox.Ok)
				self.charge_list()
				self.BROWSE_STATUS = 'x'
				self.on_pushButton_new_rec_pressed()
		except Exception as e:
			e = str(e)
			if e.find("no such table"):
				QMessageBox.warning(self, "Alert", "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS" + str(e) ,  QMessageBox.Ok)
			else:
				QMessageBox.warning(self, "Alert", "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>" + str(e) ,  QMessageBox.Ok)


	def charge_list(self):
		sito_vl = self.UTILITY.tup_2_list_III(self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))

		try:
			sito_vl.remove('')
		except:
			pass
		self.comboBox_sito.clear()
		sito_vl.sort()
		self.comboBox_sito.addItems(sito_vl)

	#buttons functions
	def on_pushButton_pdf_pressed(self):
		pass
	
	def on_pushButton_sort_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			dlg = SortPanelMain(self)
			dlg.insertItems(self.SORT_ITEMS)
			dlg.exec_()

			items,order_type = dlg.ITEMS, dlg.TYPE_ORDER

			self.SORT_ITEMS_CONVERTED = []
			for i in items:
				self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

			self.SORT_MODE = order_type
			self.empty_fields()

			id_list = []
			for i in self.DATA_LIST:
				id_list.append(ast.literal_eval("i." + self.ID_TABLE))
			self.DATA_LIST = []

			temp_data_list = self.DB_MANAGER.query_sort(id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE, self.MAPPER_TABLE_CLASS, self.ID_TABLE)

			for i in temp_data_list:
				self.DATA_LIST.append(i)
			self.BROWSE_STATUS = "b"
			self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
			if type(self.REC_CORR) == "<type 'str'>":
				corr = 0
			else:
				corr = self.REC_CORR

			self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
			self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]
			self.SORT_STATUS = "o"
			self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
			self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
			self.fill_fields()

	def on_pushButton_new_rec_pressed(self):
		if bool(self.DATA_LIST) == True:
			if self.data_error_check() == 1:
				pass
			else:
				if self.BROWSE_STATUS == "b":
					if bool(self.DATA_LIST) == True:
						if self.records_equal_check() == 1:
							msg = self.update_if(QMessageBox.warning(self,'Errore',"Il record e' stato modificato. Vuoi salvare le modifiche?", QMessageBox.Cancel,1))

		#set the GUI for a new record
		if self.BROWSE_STATUS != "n":
			self.BROWSE_STATUS = "n"
			self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
			self.empty_fields()
			self.label_sort.setText(self.SORTED_ITEMS["n"])

			self.setComboBoxEditable(["self.comboBox_sito"],1)
			
			self.setComboBoxEnable(["self.comboBox_sito"],"True")
			self.setComboBoxEnable(["self.lineEdit_nr_campione"],"True")
			
			self.set_rec_counter('', '')
			self.enable_button(0)

	def on_pushButton_save_pressed(self):
		#save record
		if self.BROWSE_STATUS == "b":
			if self.data_error_check() == 0:
				if self.records_equal_check() == 1:
					self.update_if(QMessageBox.warning(self,'ATTENZIONE',"Il record e' stato modificato. Vuoi salvare le modifiche?", QMessageBox.Cancel,1))
					self.label_sort.setText(self.SORTED_ITEMS["n"])
					self.enable_button(1)
					self.fill_fields(self.REC_CORR)
				else:
					QMessageBox.warning(self, "ATTENZIONE", "Non è stata realizzata alcuna modifica.",  QMessageBox.Ok)
		else:
			if self.data_error_check() == 0:
				test_insert = self.insert_new_rec()
				if test_insert == 1:
					self.empty_fields()
					self.label_sort.setText(self.SORTED_ITEMS["n"])
					self.charge_list()
					self.charge_records()
					self.BROWSE_STATUS = "b"
					self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
					self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), len(self.DATA_LIST)-1
					self.set_rec_counter(self.REC_TOT, self.REC_CORR+1)


					self.setComboBoxEditable(["self.comboBox_sito"],1)
					self.setComboBoxEnable(["self.comboBox_sito"],"False")
					self.setComboBoxEnable(["self.lineEdit_nr_campione"],"False")
					self.fill_fields(self.REC_CORR)
					self.enable_button(1)
				else:
					pass

	def data_error_check(self):
		test = 0
		EC = Error_check()

		if EC.data_is_empty(str(self.comboBox_sito.currentText())) == 0:
			QMessageBox.warning(self, "ATTENZIONE", "Campo Sito. \n Il campo non deve essere vuoto",  QMessageBox.Ok)
			test = 1

		if EC.data_is_empty(str(self.lineEdit_nr_campione.text())) == 0:
			QMessageBox.warning(self, "ATTENZIONE", "Campo nr_campione \n Il campo non deve essere vuoto",  QMessageBox.Ok)
			test = 1

		nr_campione = self.lineEdit_nr_campione.text()

		if nr_campione != "":
			if EC.data_is_int(nr_campione) == 0:
				QMessageBox.warning(self, "ATTENZIONE", "Campo Nr Campione \n Il valore deve essere di tipo numerico",  QMessageBox.Ok)
				test = 1

		return test

	def insert_new_rec(self):
		try:
			if self.lineEdit_nr_campione.text() == "":
				nr_campione = None
			else:
				nr_campione = int(self.lineEdit_nr_campione.text())

			if self.lineEdit_us.text() == "":
				us = None
			else:
				us = int(self.lineEdit_us.text())

			if self.lineEdit_cassa.text() == "":
				nr_cassa = None
			else:
				nr_cassa = int(self.lineEdit_cassa.text())

			if self.lineEdit_n_inv_mat.text() == "":
				numero_inventario_materiale = None
			else:
				numero_inventario_materiale = int(self.lineEdit_n_inv_mat.text())

			data = self.DB_MANAGER.insert_campioni_values(
			self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS, self.ID_TABLE)+1,
			str(self.comboBox_sito.currentText()), 								#1 - Sito
			nr_campione,																		#2 - nr campione
			str(self.comboBox_tipo_campione.currentText()), 				#3 - tipo_campione
			str(self.textEdit_descrizione_camp.toPlainText()),					#4 - descrizione
			str(self.lineEdit_area.text()),											#5 - area
			us,																					#6 - us
			numero_inventario_materiale,													#7 - inv materiale
			nr_cassa,																			#8 - nr_cassa
			str(self.lineEdit_luogo_conservazione.text()))						#9 - luogo conservazione

			try:
				self.DB_MANAGER.insert_data_session(data)
				return 1
			except Exception as e:
				e_str = str(e)
				if e_str.__contains__("Integrity"):
					msg = self.ID_TABLE + " gia' presente nel database"
				else:
					msg = e
				QMessageBox.warning(self, "Errore", "Attenzione 1 ! \n"+ str(msg),  QMessageBox.Ok)
				return 0
		except Exception as e:
			QMessageBox.warning(self, "Errore", "Attenzione 2 ! \n"+str(e),  QMessageBox.Ok)
			return 0

	def check_record_state(self):
		ec = self.data_error_check()
		if ec == 1:
			return 1 #ci sono errori di immissione
		elif self.records_equal_check() == 1 and ec == 0:
			self.update_if(QMessageBox.warning(self,'Errore',"Il record e' stato modificato. Vuoi salvare le modifiche?", QMessageBox.Cancel,1))
			#self.charge_records() incasina lo stato trova
			return 0 #non ci sono errori di immissione

	def on_pushButton_view_all_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			self.empty_fields()
			self.charge_records()
			self.fill_fields()
			self.BROWSE_STATUS = "b"
			self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
			if type(self.REC_CORR) == "<type 'str'>":
				corr = 0
			else:
				corr = self.REC_CORR
			self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
			self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
			self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]
			self.label_sort.setText(self.SORTED_ITEMS["n"])

	#records surf functions
	def on_pushButton_first_rec_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			try:
				self.empty_fields()
				self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
				self.fill_fields(0)
				self.set_rec_counter(self.REC_TOT, self.REC_CORR+1)
			except Exception as e:
				QMessageBox.warning(self, "Errore", str(e),  QMessageBox.Ok)

	def on_pushButton_last_rec_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			try:
				self.empty_fields()
				self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), len(self.DATA_LIST)-1
				self.fill_fields(self.REC_CORR)
				self.set_rec_counter(self.REC_TOT, self.REC_CORR+1)
			except Exception as e:
				QMessageBox.warning(self, "Errore", str(e),  QMessageBox.Ok)

	def on_pushButton_prev_rec_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			self.REC_CORR = self.REC_CORR-1
			if self.REC_CORR == -1:
				self.REC_CORR = 0
				QMessageBox.warning(self, "Errore", "Sei al primo record!",  QMessageBox.Ok)
			else:
				try:
					self.empty_fields()
					self.fill_fields(self.REC_CORR)
					self.set_rec_counter(self.REC_TOT, self.REC_CORR+1)
				except Exception as e:
					QMessageBox.warning(self, "Errore", str(e),  QMessageBox.Ok)

	def on_pushButton_next_rec_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			self.REC_CORR = self.REC_CORR+1
			if self.REC_CORR >= self.REC_TOT:
				self.REC_CORR = self.REC_CORR-1
				QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",  QMessageBox.Ok)
			else:
				try:
					self.empty_fields()
					self.fill_fields(self.REC_CORR)
					self.set_rec_counter(self.REC_TOT, self.REC_CORR+1)
				except Exception as e:
					QMessageBox.warning(self, "Errore", str(e),  QMessageBox.Ok)

	def on_pushButton_delete_pressed(self):
		msg = QMessageBox.warning(self,"Attenzione!!!","Vuoi veramente eliminare il record? \n L'azione è irreversibile", QMessageBox.Cancel,1)
		if msg != 1:
			QMessageBox.warning(self,"Messagio!!!","Azione Annullata!")
		else:
			try:
				id_to_delete = ast.literal_eval("self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
				self.DB_MANAGER.delete_one_record(self.TABLE_NAME, self.ID_TABLE, id_to_delete)
				self.charge_records() #charge records from DB
				QMessageBox.warning(self,"Messaggio!!!","Record eliminato!")
			except Exception as e:
				QMessageBox.warning(self,"Messaggio!!!","Tipo di errore: "+str(e))
			if bool(self.DATA_LIST) == False:
				QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",  QMessageBox.Ok)
				self.DATA_LIST = []
				self.DATA_LIST_REC_CORR = []
				self.DATA_LIST_REC_TEMP = []
				self.REC_CORR = 0
				self.REC_TOT = 0
				self.empty_fields()
				self.set_rec_counter(0, 0)
			#check if DB is empty
			if bool(self.DATA_LIST) == True:
				self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
				self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]

				self.BROWSE_STATUS = "b"
				self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
				self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
				self.charge_list()
				self.fill_fields()
		self.SORT_STATUS = "n"
		self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

	def on_pushButton_new_search_pressed(self):
		if self.check_record_state() == 1:
			pass
		else:
			self.enable_button_search(0)

			#set the GUI for a new search
			if self.BROWSE_STATUS != "f":
				self.BROWSE_STATUS = "f"
				self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
				###
				self.setComboBoxEnable(["self.comboBox_sito"],"True")
				self.setComboBoxEnable(["self.lineEdit_nr_campione"],"True")
				self.setComboBoxEnable(["self.textEdit_descrizione_camp"],"False")
				###
				self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
				self.set_rec_counter('','')
				self.label_sort.setText(self.SORTED_ITEMS["n"])
				self.charge_list()
				self.empty_fields()

	def on_pushButton_search_go_pressed(self):
		if self.BROWSE_STATUS != "f":
			QMessageBox.warning(self, "ATTENZIONE", "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",  QMessageBox.Ok)
		else:

			if self.lineEdit_nr_campione.text() == "":
				nr_campione = None
			else:
				nr_campione = int(self.lineEdit_nr_campione.text())

			if self.lineEdit_us.text() == "":
				us = None
			else:
				us = int(self.lineEdit_us.text())

			if self.lineEdit_cassa.text() == "":
				nr_cassa = None
			else:
				nr_cassa = int(self.lineEdit_cassa.text())

			if self.lineEdit_n_inv_mat.text() == "":
				numero_inventario_materiale = None
			else:
				numero_inventario_materiale = int(self.lineEdit_n_inv_mat.text())

			search_dict = {
			self.TABLE_FIELDS[0] : "'"+str(self.comboBox_sito.currentText())+"'",							#1 - Sito
			self.TABLE_FIELDS[1] : nr_campione, 																		#2 - numero_campione
			self.TABLE_FIELDS[2] : "'"+str(self.comboBox_tipo_campione.currentText())+"'",			#3 - tipo campione
			self.TABLE_FIELDS[4] : "'"+str(self.lineEdit_area.text()) +"'", 										#4- area
			self.TABLE_FIELDS[5] : us, 																					#5 - us
			self.TABLE_FIELDS[6] : numero_inventario_materiale,													#6 - numero inventario materiale
			self.TABLE_FIELDS[7] : nr_cassa,																			#7- nr cassa
			self.TABLE_FIELDS[8] : "'"+str(self.lineEdit_luogo_conservazione.text())+"'"					#8 - periodo finale
			}

			u = Utility()
			search_dict = u.remove_empty_items_fr_dict(search_dict)

			if bool(search_dict) == False:
				QMessageBox.warning(self, "ATTENZIONE", "Non e' stata impostata alcuna ricerca!!!",  QMessageBox.Ok)
			else:
				res = self.DB_MANAGER.query_bool(search_dict, self.MAPPER_TABLE_CLASS)
				if bool(res) == False:
					QMessageBox.warning(self, "ATTENZIONE", "Non e' stato trovato alcun record!",  QMessageBox.Ok)

					self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)
					self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]

					self.fill_fields(self.REC_CORR)
					self.BROWSE_STATUS = "b"
					self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])

					self.setComboBoxEnable(["self.comboBox_sito"],"False")
					self.setComboBoxEnable(["self.lineEdit_nr_campione"],"True")
					self.setComboBoxEnable(["self.textEdit_descrizione_camp"],"True")

				else:
					self.DATA_LIST = []

					for i in res:
						self.DATA_LIST.append(i)

					self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
					self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[0]
					self.fill_fields()
					self.BROWSE_STATUS = "b"
					self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
					self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR+1)

					if self.REC_TOT == 1:
						strings = ("E' stato trovato", self.REC_TOT, "record")
					else:
						strings = ("Sono stati trovati", self.REC_TOT, "records")

					self.setComboBoxEnable(["self.comboBox_sito"],"False")
					self.setComboBoxEnable(["self.lineEdit_nr_campione"],"True")
					self.setComboBoxEnable(["self.textEdit_descrizione_camp"],"True")

					QMessageBox.warning(self, "Messaggio", "%s %d %s" % strings, QMessageBox.Ok)

		self.enable_button_search(1)


	def on_pushButton_test_pressed(self):
		pass

	def on_pushButton_index_pdf_pressed(self):
		Camp_index_pdf = generate_campioni_pdf()
		data_list = self.generate_list_pdf()
		Camp_index_pdf.build_index_Campioni(data_list, data_list[0][0])

		sito_ec = str(self.comboBox_sito.currentText())
		Mat_casse_pdf = generate_campioni_pdf()
		data_list = self.generate_el_casse_pdf(sito_ec)
		Mat_casse_pdf.build_index_Casse(data_list, sito_ec)
		Mat_casse_pdf.build_box_labels_Campioni(data_list, sito_ec)

	def on_pushButton_exp_champ_sheet_pdf_pressed(self):
		if self.records_equal_check() == 1:
			self.update_if(QMessageBox.warning(self,'Errore',"Il record è stato modificato. Vuoi salvare le modifiche?", QMessageBox.Cancel,1))

		Champ_pdf_sheet = generate_campioni_pdf()
		data_list =  self.generate_list_pdf()
		Champ_pdf_sheet.build_Champ_sheets(data_list)


#********************************************************************************
	def generate_el_casse_pdf(self, sito):
		self.sito_ec = sito
		elenco_casse_res = self.DB_MANAGER.query_distinct('CAMPIONI',[['sito','"' + str(self.sito_ec)+'"']], ['nr_cassa'])

		elenco_casse_list  = [] #accoglie la sigla numerica delle casse presenti per un determinato sito.
		for i in elenco_casse_res:
			elenco_casse_list.append(i.nr_cassa)

		data_for_pdf = [] #contiene i singoli dati per l'esportazione dell'elenco casse

		elenco_casse_list.sort()
		for cassa in elenco_casse_list:
			single_cassa = [] #contiene i dati della singola cassa

			str_cassa = "<b>"+str(cassa)+"</b>"
			single_cassa.append(str_cassa) #inserisce la sigla di cassa

			###cerca le singole area/us presenti in quella cassa
			res_inv = self.DB_MANAGER.query_distinct('CAMPIONI',[['sito','"' + str(self.sito_ec)+'"'], ['nr_cassa',cassa]], ['nr_campione', 'tipo_campione'])
			
			res_inv_list = []
			for i in res_inv:
				res_inv_list.append(i)
			
			n_inv_res_list = ""
			for i in range(len(res_inv_list)):
				if i != len(res_inv_list)-1:
					n_inv_res_list += " N.inv:" + str(res_inv_list[i].nr_campione) + "/"+ str(res_inv_list[i].tipo_campione)+","
				else:
					n_inv_res_list += " N.inv:" + str(res_inv_list[i].nr_campione) + "/"+ str(res_inv_list[i].tipo_campione)
					
			#inserisce l'elenco degli inventari
			single_cassa.append(n_inv_res_list)


			###cerca le singole area/us presenti in quella cassa
			res_us = self.DB_MANAGER.query_distinct('CAMPIONI',[['sito','"' + str(self.sito_ec)+'"'], ['nr_cassa',cassa]], ['area', 'us'])
			
			res_us_list = []
			for i in res_us:
				res_us_list.append(i)
			
			us_res_list = ""#[] #accoglie l'elenco delle US presenti in quella cassa
			for i in range(len(res_us_list)):
				params_dict = {'sito':'"'+str(self.sito_ec)+'"', 'area': '"'+str(res_us_list[i].area)+'"', 'us':'"'+str(res_us_list[i].us)+'"'}
				res_struct = self.DB_MANAGER.query_bool(params_dict, 'US')
				
				res_struct_list = []
				for s_strutt in res_struct:
					res_struct_list.append(s_strutt)

				structure_string = ""
				if len(res_struct_list) > 0:
					for sing_us in res_struct_list:
						if sing_us.struttura != '':
							structure_string += "(" + str(sing_us.struttura) + '/'
					
					if structure_string != "":
						structure_string += ")"

				if i != len(res_us_list)-1:
					us_res_list += "Area:"+str(res_us_list[i].area) + ",US:"+str(res_us_list[i].us)+structure_string+", "  #.append("Area:"+str(i.area) + ",US:"+str(i.us))
				else:
					us_res_list += "Area:"+str(res_us_list[i].area) + ",US:"+str(res_us_list[i].us)+structure_string #.append("Area:"+str(i.area) + ",US:"+str(i.us))

			#us_res_list.sort()
			#inserisce l'elenco delle us
			single_cassa.append(us_res_list)


			###cerca il luogo di conservazione della cassa
			params_dict = {'sito':'"'+str(self.sito_ec)+'"', 'nr_cassa': '"'+str(cassa)+'"'}
			res_luogo_conservazione = self.DB_MANAGER.query_bool(params_dict, 'CAMPIONI')
			luogo_conservazione = res_luogo_conservazione[0].luogo_conservazione
			single_cassa.append(luogo_conservazione) #inserisce la sigla di cassa

			data_for_pdf.append(single_cassa)

		#QMessageBox.warning(self,'tk',str(data_for_pdf), QMessageBox.Ok)
		return data_for_pdf



	def generate_list_pdf(self):
		data_list = []
		for i in range(len(self.DATA_LIST)):
			if str(self.DATA_LIST[i].nr_campione) == 'None':
				numero_campione = ''
			else:
				numero_campione = str(self.DATA_LIST[i].nr_campione)

			if str(self.DATA_LIST[i].us) == 'None':
				us = ''
			else:
				us = str(self.DATA_LIST[i].us)

			if str(self.DATA_LIST[i].numero_inventario_materiale) == 'None':
				numero_inventario_materiale = ''
			else:
				numero_inventario_materiale = str(self.DATA_LIST[i].numero_inventario_materiale)

			if str(self.DATA_LIST[i].nr_cassa) == 'None':
				nr_cassa = ''
			else:
				nr_cassa = str(self.DATA_LIST[i].nr_cassa)

			data_list.append([
			str(self.DATA_LIST[i].sito),														#1 - Sito
			str(numero_campione),																			#2 - Numero campione
			str(self.DATA_LIST[i].tipo_campione),									#3 - Tipo campione
			str(self.DATA_LIST[i].descrizione),											#4 - Descrizione
			str(self.DATA_LIST[i].area),													#5 - Area
			str(us),																								#6 - us
			str(numero_inventario_materiale),																#7 - numero inventario materiale
			str(self.DATA_LIST[i].luogo_conservazione),								#8 - luogo_conservazione
			str(nr_cassa)																						#9 - nr cassa
			])

		return data_list

	def update_if(self, msg):
		rec_corr = self.REC_CORR
		self.msg = msg
		if self.msg == 1:
			test = self.update_record()
			if test == 1:
				id_list = []
				for i in self.DATA_LIST:
					id_list.append(ast.literal_eval("i."+ self.ID_TABLE))
				self.DATA_LIST = []
				if self.SORT_STATUS == "n":
					temp_data_list = self.DB_MANAGER.query_sort(id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS, self.ID_TABLE) #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
				else:
					temp_data_list = self.DB_MANAGER.query_sort(id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE, self.MAPPER_TABLE_CLASS, self.ID_TABLE)
				for i in temp_data_list:
					self.DATA_LIST.append(i)
				self.BROWSE_STATUS = "b"
				self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
				if type(self.REC_CORR) == "<type 'str'>":
					corr = 0
				else:
					corr = self.REC_CORR 
				return 1
			elif test == 0:
				return 0


	#custom functions
	def charge_records(self):
		self.DATA_LIST = []
		id_list = []
		for i in self.DB_MANAGER.query(ast.literal_eval(self.MAPPER_TABLE_CLASS)):
			id_list.append(ast.literal_eval("i."+ self.ID_TABLE))
		temp_data_list = self.DB_MANAGER.query_sort(id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS, self.ID_TABLE)
		for i in temp_data_list:
			self.DATA_LIST.append(i)

	def datestrfdate(self):
		now = date.today()
		today = now.strftime("%d-%m-%Y")
		return today


	def table2dict(self, n):
		self.tablename = n
		row = ast.literal_eval(self.tablename+".rowCount()")
		col = ast.literal_eval(self.tablename+".columnCount()")
		lista=[]
		for r in range(row):
			sub_list = []
			for c in range(col):
				value = ast.literal_eval(self.tablename+".item(r,c)")
				if bool(value) == True:
					sub_list.append(str(value.text()))
			lista.append(sub_list)
		return lista

	def empty_fields(self):
		self.comboBox_sito.setEditText("")						#1 - Sito
		self.lineEdit_nr_campione.clear()							#2 - Nr campione
		self.comboBox_tipo_campione.setEditText("")		#3 - Sito
		self.textEdit_descrizione_camp.clear()					#4 - descrizione
		self.lineEdit_nr_campione.clear()							#5 - Nr campione
		self.lineEdit_area.clear()										#6 - area
		self.lineEdit_us.clear()										#7 - us
		self.lineEdit_n_inv_mat.clear()								#8 - numero inventario_materiale
		self.lineEdit_luogo_conservazione.clear()				#9 - luogo di conservazione
		self.lineEdit_cassa.clear()									#10 - cassa

	def fill_fields(self, n=0):
		self.rec_num = n
		if str(self.DATA_LIST[self.rec_num].nr_campione) == 'None':
			numero_campione = ''
		else:
			numero_campione = str(self.DATA_LIST[self.rec_num].nr_campione)

		if str(self.DATA_LIST[self.rec_num].us) == 'None':
			us = ''
		else:
			us = str(self.DATA_LIST[self.rec_num].us)

		if str(self.DATA_LIST[self.rec_num].numero_inventario_materiale) == 'None':
			numero_inventario_materiale = ''
		else:
			numero_inventario_materiale = str(self.DATA_LIST[self.rec_num].numero_inventario_materiale)

		if str(self.DATA_LIST[self.rec_num].nr_cassa) == 'None':
			nr_cassa = ''
		else:
			nr_cassa = str(self.DATA_LIST[self.rec_num].nr_cassa)


		str(self.comboBox_sito.setEditText(self.DATA_LIST[self.rec_num].sito))											#1 - Sito
		str(self.lineEdit_nr_campione.setText(numero_campione))																#2 - Numero campione
		str(self.comboBox_tipo_campione.setEditText(self.DATA_LIST[self.rec_num].tipo_campione))				#3 - Tipo campione
		str(self.textEdit_descrizione_camp.setText(self.DATA_LIST[self.rec_num].descrizione))						#4 - Descrizione
		str(self.lineEdit_area.setText(self.DATA_LIST[self.rec_num].area))													#5 - Area
		str(self.lineEdit_us.setText(us))																								#6 - us
		str(self.lineEdit_n_inv_mat.setText(numero_inventario_materiale))													#7 - numero inventario materiale
		str(self.lineEdit_luogo_conservazione.setText(self.DATA_LIST[self.rec_num].luogo_conservazione))		#8 - luogo_conservazione
		str(self.lineEdit_cassa.setText(nr_cassa))																					#9 - nr cassa


	def set_rec_counter(self, t, c):
		self.rec_tot = t
		self.rec_corr = c
		self.label_rec_tot.setText(str(self.rec_tot))
		self.label_rec_corrente.setText(str(self.rec_corr))

	def set_LIST_REC_TEMP(self):

		if self.lineEdit_nr_campione.text() == "":
			nr_campione = None
		else:
			nr_campione = int(self.lineEdit_nr_campione.text())

		if self.lineEdit_us.text() == "":
			us = None
		else:
			us = int(self.lineEdit_us.text())

		if self.lineEdit_cassa.text() == "":
			nr_cassa = None
		else:
			nr_cassa = int(self.lineEdit_cassa.text())

		if self.lineEdit_n_inv_mat.text() == "":
			numero_inventario_materiale = None
		else:
			numero_inventario_materiale = int(self.lineEdit_n_inv_mat.text())

		#data
		self.DATA_LIST_REC_TEMP = [
		str(self.comboBox_sito.currentText()), 								#1 - Sito
		str(nr_campione), 															#2 - nr campione
		str(self.comboBox_tipo_campione.currentText()), 				#3 - tipo campione
		str(self.textEdit_descrizione_camp.toPlainText()), 				#4 - descrizione
		str(self.lineEdit_area.text()),											#5 - area
		str(us),																		#6 - us
		str(numero_inventario_materiale),										#7 - numero_inventario_materiale
		str(nr_cassa),																#8 - numero cassa
		str(self.lineEdit_luogo_conservazione.text())						#9 - luogo conservazione
		]

	def set_LIST_REC_CORR(self):
		self.DATA_LIST_REC_CORR = []
		for i in self.TABLE_FIELDS:
			self.DATA_LIST_REC_CORR.append(ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i + ")"))

	def setComboBoxEnable(self, f, v):
		field_names = f
		value = v

		for fn in field_names:
			cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
			ast.literal_eval(cmd)


	def setComboBoxEditable(self, f, n):
		field_names = f
		value = n

		for fn in field_names:
			cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
			ast.literal_eval(cmd)

	def rec_toupdate(self):
		rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)
		return rec_to_update

	def records_equal_check(self):
		self.set_LIST_REC_TEMP()
		self.set_LIST_REC_CORR()

		if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
			return 0
		else:
			return 1

	def update_record(self):
		try:
			self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, 
						self.ID_TABLE,
						[ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE+")")],
						self.TABLE_FIELDS,
						self.rec_toupdate())
			return 1
		except Exception as e:
			QMessageBox.warning(self, "Messaggio", "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :" + str(e), QMessageBox.Ok)
			return 0

	def testing(self, name_file, message):
		f = open(str(name_file), 'w')
		f.write(str(message))
		f.close()
예제 #7
0
class pyarchinit_Interactive_Matrix(QDialog, Ui_DialogInteractiveMatrix):
    MSG_BOX_TITLE = "PyArchInit - Scheda Sistema Matrix Interattivo"
    DB_MANAGER = ""
    DATA_LIST = ""
    ID_US_DICT = {}

    if os.name == 'posix':
        HOME = os.environ['HOME']
    elif os.name == 'nt':
        HOME = os.environ['HOMEPATH']

    QUANT_PATH = ('%s%s%s') % (HOME, os.sep,
                               "pyarchinit_Quantificazioni_folder")

    def __init__(self, iface, data_list, id_us_dict):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        self.DATA_LIST = data_list
        self.ID_US_DICT = id_us_dict
        QDialog.__init__(self)
        self.setupUi(self)

        ##		self.textbox.setText('1 2 3 4')
        #self.on_draw()
        try:
            self.DB_connect()
        except:
            pass

    def DB_connect(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
        except Exception as e:
            e = str(e)
            QMessageBox.warning(
                self, "Alert",
                "Attenzione rilevato bug! Segnalarlo allo sviluppatore <br> Errore: <br>"
                + str(e), QMessageBox.Ok)

    def generate_matrix(self):
        data = []
        for sing_rec in self.DATA_LIST:
            us = str(sing_rec.us)
            rapporti_stratigrafici = ast.literal_eval(sing_rec.rapporti)
            for sing_rapp in rapporti_stratigrafici:
                try:
                    if sing_rapp[0] == 'Taglia' or sing_rapp[
                            0] == 'Copre' or sing_rapp[
                                0] == 'Si appoggia a' or sing_rapp[
                                    0] == 'Riempie' or sing_rapp[
                                        0] == 'Si lega a' or sing_rapp[
                                            0] == 'Uguale a':
                        if sing_rapp[1] != '':
                            harris_rapp = (us, str(sing_rapp[1]))
                            data.append(harris_rapp)
                except Exception as e:
                    QMessageBox.warning(
                        self, "Messaggio",
                        "Problema nel sistema di esportazione del Matrix:" +
                        str(e), QMessageBox.Ok)

        sito = self.DATA_LIST[0].sito

        search_dict = {'sito': "'" + str(sito) + "'"}

        periodizz_data_list = self.DB_MANAGER.query_bool(
            search_dict, 'PERIODIZZAZIONE')

        periodi_data_values = []
        for i in periodizz_data_list:
            periodi_data_values.append([i.periodo, i.fase])

        periodi_us_list = []

        clust_number = 0
        for i in periodi_data_values:
            search_dict = {
                'sito': "'" + str(sito) + "'",
                'periodo_iniziale': "'" + str(i[0]) + "'",
                'fase_iniziale': "'" + str(i[1]) + "'"
            }

            us_group = self.DB_MANAGER.query_bool(search_dict, 'US')

            cluster_label = "cluster%d" % (clust_number)

            periodo_label = "Periodo %s - Fase %s" % (str(i[0]), str(i[1]))

            sing_per = [cluster_label, periodo_label]

            sing_us = []
            for rec in us_group:
                sing_us.append(rec.us)

            sing_per.insert(0, sing_us)

            periodi_us_list.append(sing_per)

            clust_number += 1

        matrix_exp = HARRIS_MATRIX_EXP(data, periodi_us_list)
        data_plotting = matrix_exp.export_matrix()

        return data_plotting

        QMessageBox.warning(self, "Messaggio",
                            "Esportazione del Matrix terminata",
                            QMessageBox.Ok)

    def plot_matrix(self, dp):
        self.data_plot = dp

        G1 = nx.DiGraph(self.data_plot)  # now make it a Graph
        #G1.write_dot(G1,'test.dot')
        #nx.write_dot(G1,'test.dot')
        #plt.title("draw_networkx")
        pos = nx.graphviz_layout(G1, prog='dot')
        #fig = plt.figure()

        #self.widgetMatrix.canvas.ax = self.fig.add_subplot(111)

        self.widgetMatrix.canvas.ax.set_title(
            'click su una US per disegnarla a video', picker=True)
        self.widgetMatrix.canvas.ax.set_ylabel('ylabel',
                                               picker=True,
                                               bbox=dict(facecolor='red'))

        points = []
        key = []
        for k, v in list(pos.items()):
            key.append(k)
            points.append(v)

        for i in range(len(key)):
            self.widgetMatrix.canvas.ax.text(points[i][0],
                                             points[i][1],
                                             key[i],
                                             picker=True,
                                             ha='center',
                                             alpha=0)

        self.widgetMatrix.canvas.ax.plot(nx.draw(G1,
                                                 pos,
                                                 with_labels=True,
                                                 arrows=True,
                                                 node_color='w',
                                                 node_shape='s',
                                                 node_size=400),
                                         'o',
                                         picker=1000)

        #self.widgetMatrix.canvas.fig.canvas.mpl_connect('pick_event', self.on_pick)
        self.widgetMatrix.canvas.mpl_connect('pick_event', self.on_pick)
        self.widgetMatrix.canvas.draw()

    def on_pick(self, event):
        # The event received here is of the type
        # matplotlib.backend_bases.PickEvent
        #.canvas
        # It carries lots of information, of which we're using
        # only a small amount here.
        # 		def onpick1(event):
        #if isinstance(event.artist, Text):
        text = event.artist
        value = text.get_prop_tup()
        text_to_pass = value[2]
        ##				print('Hai selezionato l\'US:', text.get_text())
        ##		box_points = event.artist.get_bbox().get_points()
        idus = self.ID_US_DICT[int(text_to_pass)]
        self.pyQGIS.charge_vector_layers_from_matrix(idus)
        #msg = "'Hai selezionato l\'US:' %s" % text_to_pass #str(dir(text.get_label))

        #QMessageBox.information(self, "Click!", msg)

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
class pyarchinit_Site(QDialog, Ui_DialogSite):
    """This class provides to manage the Site Sheet"""

    MSG_BOX_TITLE = "pyArchInit - Scheda Sito"
    DATA_LIST = []
    DATA_LIST_REC_CORR = []
    DATA_LIST_REC_TEMP = []
    REC_CORR = 0
    REC_TOT = 0
    STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
    BROWSE_STATUS = "b"
    SORT_MODE = 'asc'
    SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
    SORT_STATUS = "n"
    UTILITY = Utility()
    DB_MANAGER = ""
    TABLE_NAME = 'site_table'
    MAPPER_TABLE_CLASS = "SITE"
    NOME_SCHEDA = "Scheda di Sito"
    ID_TABLE = "id_sito"
    CONVERSION_DICT = {
        ID_TABLE: ID_TABLE,
        "Sito": "sito",
        "Nazione": "nazione",
        "Regione": "regione",
        "Descrizione": "descrizione",
        "Comune": "comune",
        "Provincia": "provincia",
        "Definizione sito": "definizione_sito"
    }
    SORT_ITEMS = [
        ID_TABLE, "Sito", "Descrizione", "Nazione", "Regione", "Comune",
        "Provincia", "Definizione sito"
    ]

    TABLE_FIELDS = [
        "sito", "nazione", "regione", "comune", "descrizione", "provincia",
        "definizione_sito"
    ]

    DB_SERVER = "not defined"  ####nuovo sistema sort

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)
        QDialog.__init__(self)
        self.setupUi(self)
        self.currentLayerId = None
        try:
            self.on_pushButton_connect_pressed()
        except Exception as e:
            QMessageBox.warning(self, "Sistema di connessione", str(e),
                                QMessageBox.Ok)

    def enable_button(self, n):
        """This method Unable or Enable the GUI buttons on browse modality"""

        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_new_search.setEnabled(n)

        self.pushButton_search_go.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def enable_button_search(self, n):
        """This method Unable or Enable the GUI buttons on searching modality"""

        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_save.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def on_pushButton_connect_pressed(self):
        """This method establishes a connection between GUI and database"""

        from pyarchinit_conn_strings import *
        conn = Connection()

        conn_str = conn.conn_str()

        test_conn = conn_str.find('sqlite')

        if test_conn == 0:
            self.DB_SERVER = "sqlite"

        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.charge_records()  #charge records from DB
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = 'b'
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
            else:
                QMessageBox.warning(
                    self, "BENVENUTO",
                    "Benvenuto in pyArchInit" + self.NOME_SCHEDA +
                    ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",
                    QMessageBox.Ok)
                self.charge_list()
                self.BROWSE_STATUS = 'x'
                self.on_pushButton_new_rec_pressed()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS"
                    + str(e), QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def charge_list(self):
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))

        try:
            sito_vl.remove('')
        except:
            pass
        self.comboBox_sito.clear()
        sito_vl.sort()
        self.comboBox_sito.addItems(sito_vl)

        regioni_list = [
            'Abruzzo', 'Basilicata', 'Calabria', 'Campania', 'Emilia-Romagna',
            'Friuli Venezia Giulia', 'Lazio', 'Liguria', 'Lombardia', 'Marche',
            'Molise', 'Piemonte', 'Puglia', 'Sardegna', 'Sicilia', 'Toscana',
            'Trentino Alto Adige', 'Umbria', 'Valle d\'Aosta', 'Veneto'
        ]
        self.comboBox_regione.addItems(regioni_list)

        province_list = [
            'Agrigento', 'Alessandria', 'Ancona', 'Aosta', 'Arezzo',
            'Ascoli Piceno', 'Asti', 'Avellino', 'Bari',
            'Barletta-Andria-Trani', 'Basilicata', 'Belluno', 'Benevento',
            'Bergamo', 'Biella', 'Bologna', 'Bolzano', 'Brescia', 'Brindisi',
            'Cagliari', 'Calabria', 'Caltanissetta', 'Campania', 'Campobasso',
            'Carbonia-Iglesias', 'Caserta', 'Catania', 'Catanzaro', 'Chieti',
            'Como', 'Cosenza', 'Cremona', 'Crotone', 'Cuneo', 'Emilia-Romagna',
            'Enna', 'Fermo', 'Ferrara', 'Firenze', 'Foggia', "Forl'-Cesena",
            'Frosinone', 'Genova', 'Gorizia', 'Grosseto', 'Imperia', 'Isernia',
            "L'Aquila", 'La Spezia', 'Latina', 'Lecce', 'Lecco', 'Livorno',
            'Lodi', 'Lucca', 'Macerata', 'Mantova', 'Massa e Carrara',
            'Matera', 'Medio Campidano', 'Messina', 'Milano', 'Modena',
            'Monza e Brianza', 'Napoli', 'Novara', 'Nuoro', 'Ogliastra',
            'Olbia-Tempio', 'Oristano', 'Padova', 'Palermo', 'Parma', 'Pavia',
            'Perugia', 'Pesaro e Urbino', 'Pescara', 'Piacenza', 'Pisa',
            'Pistoia', 'Pordenone', 'Potenza', 'Prato', 'Ragusa', 'Ravenna',
            'Reggio Calabria', 'Reggio Emilia', 'Rieti', 'Rimini', 'Roma',
            'Rovigo', 'Salerno', 'Sassari', 'Savona', 'Siena', 'Siracusa',
            'Sondrio', 'Taranto', 'Teramo', 'Terni', 'Torino', 'Trapani',
            'Trento', 'Treviso', 'Trieste', 'Udine', 'Varese', 'Venezia',
            'Verbano-Cusio-Ossola', 'Vercelli', 'Verona', 'Vibo Valentia',
            'Vicenza', 'Viterbo'
        ]

        self.comboBox_provincia.addItems(province_list)

        #lista definizione_sito
        search_dict = {
            'nome_tabella': "'" + 'site_table' + "'",
            'tipologia_sigla': "'" + 'definizione sito' + "'"
        }

        d_sito = self.DB_MANAGER.query_bool(search_dict,
                                            'PYARCHINIT_THESAURUS_SIGLE')

        d_sito_vl = []

        for i in range(len(d_sito)):
            d_sito_vl.append(d_sito[i].sigla_estesa)

        d_sito_vl.sort()
        self.comboBox_definizione_sito.addItems(d_sito_vl)

    #buttons functions
    def on_pushButton_pdf_pressed(self):
        pass

    def on_pushButton_sort_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            dlg = SortPanelMain(self)
            dlg.insertItems(self.SORT_ITEMS)
            dlg.exec_()

            items, order_type = dlg.ITEMS, dlg.TYPE_ORDER

            self.SORT_ITEMS_CONVERTED = []
            for i in items:
                self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

            self.SORT_MODE = order_type
            self.empty_fields()

            id_list = []
            for i in self.DATA_LIST:
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            self.DATA_LIST = []

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                self.MAPPER_TABLE_CLASS, self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR

            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.SORT_STATUS = "o"
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.fill_fields()

    def on_pushButton_new_rec_pressed(self):
        if bool(self.DATA_LIST) == True:
            if self.data_error_check() == 1:
                pass
            else:
                if self.BROWSE_STATUS == "b":
                    if bool(self.DATA_LIST) == True:
                        if self.records_equal_check() == 1:
                            msg = self.update_if(
                                QMessageBox.warning(
                                    self, 'Errore',
                                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                                    QMessageBox.Cancel, 1))
        #set the GUI for a new record
        if self.BROWSE_STATUS != "n":
            self.BROWSE_STATUS = "n"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            self.empty_fields()
            self.label_sort.setText(self.SORTED_ITEMS["n"])

            self.setComboBoxEnable(["self.comboBox_sito"], "True")
            self.setComboBoxEditable(["self.comboBox_sito"], 1)
            self.setComboBoxEnable(["self.comboBox_definizione_sito"], "True")
            self.setComboBoxEditable(["self.comboBox_definizione_sito"], 1)

            self.set_rec_counter('', '')
            self.enable_button(0)

    def on_pushButton_save_pressed(self):
        #save record
        if self.BROWSE_STATUS == "b":
            if self.data_error_check() == 0:
                if self.records_equal_check() == 1:
                    self.update_if(
                        QMessageBox.warning(
                            self, 'ATTENZIONE',
                            "Il record e' stato modificato. Vuoi salvare le modifiche?",
                            QMessageBox.Cancel, 1))
                    self.SORT_STATUS = "n"
                    self.label_sort.setText(
                        self.SORTED_ITEMS[self.SORT_STATUS])
                    self.enable_button(1)
                    self.fill_fields(self.REC_CORR)
                else:
                    QMessageBox.warning(
                        self, "ATTENZIONE",
                        "Non è stata realizzata alcuna modifica.",
                        QMessageBox.Ok)
        else:
            if self.data_error_check() == 0:
                test_insert = self.insert_new_rec()
                if test_insert == 1:
                    self.empty_fields()
                    self.label_sort.setText(self.SORTED_ITEMS["n"])
                    self.charge_list()
                    self.charge_records()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.REC_TOT, self.REC_CORR = len(
                        self.DATA_LIST), len(self.DATA_LIST) - 1
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.fill_fields(self.REC_CORR)
                    self.enable_button(1)
                else:
                    pass

    def data_error_check(self):
        test = 0
        EC = Error_check()

        if EC.data_is_empty(str(self.comboBox_sito.currentText())) == 0:
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Campo Sito. \n Il campo non deve essere vuoto",
                QMessageBox.Ok)
            test = 1

        return test

    def insert_new_rec(self):
        try:
            data = self.DB_MANAGER.insert_site_values(
                self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS,
                                           self.ID_TABLE) + 1,
                str(self.comboBox_sito.currentText()),  #1 - Sito
                str(self.comboBox_nazione.currentText()),  #2 - nazione
                str(self.comboBox_regione.currentText()),  #3 - regione
                str(self.comboBox_comune.currentText()),  #4 - comune
                str(self.textEdit_descrizione_site.toPlainText()
                    ),  #5 - descrizione
                str(self.comboBox_provincia.currentText()),  #6 - comune
                str(self.comboBox_definizione_sito.currentText()
                    ),  #7 - definizione sito
                0)  #8 - find check

            try:
                self.DB_MANAGER.insert_data_session(data)
                return 1
            except Exception as e:
                e_str = str(e)
                if e_str.__contains__("Integrity"):
                    msg = self.ID_TABLE + " gia' presente nel database"
                else:
                    msg = e
                QMessageBox.warning(self, "Errore",
                                    "Attenzione 1 ! \n" + str(msg),
                                    QMessageBox.Ok)
                return 0
        except Exception as e:
            QMessageBox.warning(self, "Errore", "Attenzione 2 ! \n" + str(e),
                                QMessageBox.Ok)
            return 0

    def check_record_state(self):
        ec = self.data_error_check()
        if ec == 1:
            return 1  #ci sono errori di immissione
        elif self.records_equal_check() == 1 and ec == 0:
            self.update_if(
                QMessageBox.warning(
                    self, 'Errore',
                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                    QMessageBox.Cancel, 1))
            #self.charge_records() incasina lo stato trova
            return 0  #non ci sono errori di immissione

    def on_pushButton_view_all_pressed(self):

        if self.check_record_state() == 1:
            pass
        else:
            self.empty_fields()
            self.charge_records()
            self.fill_fields()
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.label_sort.setText(self.SORTED_ITEMS["n"])

    #records surf functions
    def on_pushButton_first_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.fill_fields(0)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_last_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(
                    self.DATA_LIST), len(self.DATA_LIST) - 1
                self.fill_fields(self.REC_CORR)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_prev_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR - 1
            if self.REC_CORR == -1:
                self.REC_CORR = 0
                QMessageBox.warning(self, "Errore", "Sei al primo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_next_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR + 1
            if self.REC_CORR >= self.REC_TOT:
                self.REC_CORR = self.REC_CORR - 1
                QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_delete_pressed(self):
        msg = QMessageBox.warning(
            self, "Attenzione!!!",
            "Vuoi veramente eliminare il record? \n L'azione è irreversibile",
            QMessageBox.Cancel, 1)
        if msg != 1:
            QMessageBox.warning(self, "Messagio!!!", "Azione Annullata!")
        else:
            try:
                id_to_delete = ast.literal_eval(
                    "self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
                self.DB_MANAGER.delete_one_record(self.TABLE_NAME,
                                                  self.ID_TABLE, id_to_delete)
                self.charge_records()  #charge records from DB
                QMessageBox.warning(self, "Messaggio!!!", "Record eliminato!")
            except Exception as e:
                QMessageBox.warning(self, "Messaggio!!!",
                                    "Tipo di errore: " + str(e))
            if bool(self.DATA_LIST) == False:
                QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",
                                    QMessageBox.Ok)
                self.DATA_LIST = []
                self.DATA_LIST_REC_CORR = []
                self.DATA_LIST_REC_TEMP = []
                self.REC_CORR = 0
                self.REC_TOT = 0
                self.empty_fields()
                self.set_rec_counter(0, 0)
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]

                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
        self.SORT_STATUS = "n"
        self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

    def on_pushButton_new_search_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.enable_button_search(0)
            #set the GUI for a new search
            if self.BROWSE_STATUS != "f":
                self.BROWSE_STATUS = "f"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                ###
                self.setComboBoxEnable(["self.comboBox_sito"], "True")
                self.setComboBoxEnable(["self.comboBox_definizione_sito"],
                                       "True")
                self.setComboBoxEnable(["self.textEdit_descrizione_site"],
                                       "False")
                ###
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter('', '')
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.charge_list()
                self.empty_fields()

    def on_pushButton_search_go_pressed(self):
        if self.BROWSE_STATUS != "f":
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",
                QMessageBox.Ok)
        else:
            search_dict = {
                'sito':
                "'" + str(self.comboBox_sito.currentText()) + "'",  #1 - Sito
                'nazione':
                "'" + str(self.comboBox_nazione.currentText()) +
                "'",  #2 - Nazione
                'regione':
                "'" + str(self.comboBox_regione.currentText()) +
                "'",  #3 - Regione
                'comune':
                "'" + str(self.comboBox_comune.currentText()) +
                "'",  #4 - Comune
                'descrizione':
                str(self.textEdit_descrizione_site.toPlainText()
                    ),  #5 - Descrizione
                'provincia':
                "'" + str(self.comboBox_provincia.currentText()) +
                "'",  #6 - Provincia
                'definizione_sito':
                "'" + str(self.comboBox_definizione_sito.currentText()) +
                "'"  #67- definizione_sito
            }

            u = Utility()
            search_dict = u.remove_empty_items_fr_dict(search_dict)

            if bool(search_dict) == False:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Non e' stata impostata alcuna ricerca!!!", QMessageBox.Ok)
            else:
                res = self.DB_MANAGER.query_bool(search_dict,
                                                 self.MAPPER_TABLE_CLASS)

                if bool(res) == False:
                    QMessageBox.warning(self, "ATTENZIONE",
                                        "Non e' stato trovato alcun record!",
                                        QMessageBox.Ok)

                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]

                    self.fill_fields(self.REC_CORR)
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])

                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.comboBox_definizione_sito"],
                                           "True")
                    self.setComboBoxEnable(["self.textEdit_descrizione_site"],
                                           "True")
                else:
                    self.DATA_LIST = []
                    for i in res:
                        self.DATA_LIST.append(i)

##					if self.DB_SERVER == 'sqlite':
##						for i in self.DATA_LIST:
##							self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [i.id_sito], ['find_check'], [1])

                    self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]  ####darivedere
                    self.fill_fields()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)

                    if self.REC_TOT == 1:
                        strings = ("E' stato trovato", self.REC_TOT, "record")
                        if self.toolButton_draw_siti.isChecked() == True:
                            sing_layer = [self.DATA_LIST[self.REC_CORR]]
                            self.pyQGIS.charge_sites_from_research(sing_layer)
                    else:
                        strings = ("Sono stati trovati", self.REC_TOT,
                                   "records")
                        self.pyQGIS.charge_sites_from_research(self.DATA_LIST)

                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.comboBox_definizione_sito"],
                                           "True")
                    self.setComboBoxEnable(["self.textEdit_descrizione_site"],
                                           "True")

                    QMessageBox.warning(self, "Messaggio",
                                        "%s %d %s" % strings, QMessageBox.Ok)

        self.enable_button_search(1)

    def on_pushButton_test_pressed(self):

        data = "Sito: " + str(self.comboBox_sito.currentText())

        ##		data = [
        ##		unicode(self.comboBox_sito.currentText()), 								#1 - Sito
        ##		unicode(self.comboBox_nazione.currentText()), 						#2 - Nazione
        ##		unicode(self.comboBox_regione.currentText()), 						#3 - Regione
        ##		unicode(self.comboBox_comune.currentText()), 						#4 - Comune
        ##		unicode(self.textEdit_descrizione_site.toPlainText()),    				#5 - Descrizione
        ##		unicode(self.comboBox_provincia.currentText())]                     	#6 - Provincia

        test = Test_area(data)
        test.run_test()

    def on_pushButton_draw_pressed(self):
        self.pyQGIS.charge_layers_for_draw(
            ["1", "2", "3", "4", "5", "7", "8", "9", "10", "12", "14", "16"])

    def on_pushButton_sites_geometry_pressed(self):
        sito = str(self.comboBox_sito.currentText())
        self.pyQGIS.charge_sites_geometry([
            "1", "2", "3", "4", "5", "7", "8", "9", "10", "11", "12", "13",
            "14", "16"
        ], "sito", sito)

    def on_pushButton_draw_sito_pressed(self):
        sing_layer = [self.DATA_LIST[self.REC_CORR]]
        self.pyQGIS.charge_sites_from_research(sing_layer)

    def on_pushButton_rel_pdf_pressed(self):
        check = QMessageBox.warning(
            self, "Attention",
            "Under testing: this method can contains some bugs. Do you want proceed?",
            QMessageBox.Cancel, 1)
        if check == 1:
            erp = exp_rel_pdf(str(self.comboBox_sito.currentText()))
            erp.export_rel_pdf()

    def on_toolButton_draw_siti_toggled(self):
        if self.toolButton_draw_siti.isChecked() == True:
            QMessageBox.warning(
                self, "Messaggio",
                "Modalita' GIS attiva. Da ora le tue ricerche verranno visualizzate sul GIS",
                QMessageBox.Ok)
        else:
            QMessageBox.warning(
                self, "Messaggio",
                "Modalita' GIS disattivata. Da ora le tue ricerche non verranno piu' visualizzate sul GIS",
                QMessageBox.Ok)

    def on_pushButton_genera_us_pressed(self):
        self.DB_MANAGER.insert_arbitrary_number_of_us_records(
            int(self.lineEdit_us_range.text()),
            str(self.comboBox_sito.currentText()),
            int(self.lineEdit_area.text()), int(self.lineEdit_n_us.text()))

    def update_if(self, msg):
        rec_corr = self.REC_CORR
        self.msg = msg
        if self.msg == 1:
            test = self.update_record()
            if test == 1:
                id_list = []
                for i in self.DATA_LIST:
                    id_list.append(ast.literal_eval("i." + self.ID_TABLE))
                self.DATA_LIST = []
                if self.SORT_STATUS == "n":
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, [self.ID_TABLE], 'asc',
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE
                    )  #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
                else:
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE)
                for i in temp_data_list:
                    self.DATA_LIST.append(i)
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                if type(self.REC_CORR) == "<type 'str'>":
                    corr = 0
                else:
                    corr = self.REC_CORR
                return 1
            elif test == 0:
                return 0

    #custom functions
    def charge_records(self):
        self.DATA_LIST = []

        if self.DB_SERVER == 'sqlite':
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                self.DATA_LIST.append(i)
        else:
            id_list = []
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS,
                self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)

        ##		id_list = []
        ##		for i in self.DB_MANAGER.query(ast.literal_eval(self.MAPPER_TABLE_CLASS)):
        ##			id_list.append(ast.literal_eval("i."+ self.ID_TABLE))
        ##
        ##		temp_data_list = self.DB_MANAGER.query_sort([1], [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS, self.ID_TABLE)

    def datestrfdate(self):
        now = date.today()
        today = now.strftime("%d-%m-%Y")
        return today

    def table2dict(self, n):
        self.tablename = n
        row = ast.literal_eval(self.tablename + ".rowCount()")
        col = ast.literal_eval(self.tablename + ".columnCount()")
        lista = []
        for r in range(row):
            sub_list = []
            for c in range(col):
                value = ast.literal_eval(self.tablename + ".item(r,c)")
                if bool(value) == True:
                    sub_list.append(str(value.text()))
            lista.append(sub_list)
        return lista

    def empty_fields(self):
        self.comboBox_sito.setEditText("")  #1 - Sito
        self.comboBox_nazione.setEditText("")  #2 - Nazione
        self.comboBox_regione.setEditText("")  #3 - Regione
        self.comboBox_comune.setEditText("")  #4 - Comune
        self.textEdit_descrizione_site.clear()  #5 - Descrizione
        self.comboBox_provincia.setEditText("")  #6 - Provincia
        self.comboBox_definizione_sito.setEditText("")  #7 - definizione_sito

    def fill_fields(self, n=0):
        self.rec_num = n

        str(self.comboBox_sito.setEditText(
            self.DATA_LIST[self.rec_num].sito))  #1 - Sito
        str(
            self.comboBox_nazione.setEditText(
                self.DATA_LIST[self.rec_num].nazione))  #2 - Nazione
        str(
            self.comboBox_regione.setEditText(
                self.DATA_LIST[self.rec_num].regione))  #3 - Regione
        str(
            self.comboBox_comune.setEditText(
                self.DATA_LIST[self.rec_num].comune))  #4 - Comune
        str(
            self.textEdit_descrizione_site.setText(
                self.DATA_LIST[self.rec_num].descrizione))  #5 - Descrizione
        str(
            self.comboBox_provincia.setEditText(
                self.DATA_LIST[self.rec_num].provincia))  #6 - Provincia
        str(
            self.comboBox_definizione_sito.setEditText(self.DATA_LIST[
                self.rec_num].definizione_sito))  #7 - definizione_sito

    def set_rec_counter(self, t, c):
        self.rec_tot = t
        self.rec_corr = c
        self.label_rec_tot.setText(str(self.rec_tot))
        self.label_rec_corrente.setText(str(self.rec_corr))

    def set_LIST_REC_TEMP(self):
        #data
        self.DATA_LIST_REC_TEMP = [
            str(self.comboBox_sito.currentText()),  #1 - Sito
            str(self.comboBox_nazione.currentText()),  #2 - Nazione
            str(self.comboBox_regione.currentText()),  #3 - Regione
            str(self.comboBox_comune.currentText()),  #4 - Comune
            str(self.textEdit_descrizione_site.toPlainText()
                ),  #5 - Descrizione
            str(self.comboBox_provincia.currentText()),  #6 - Provincia
            str(self.comboBox_definizione_sito.currentText())
        ]  #7 - Definizione sito

    def set_LIST_REC_CORR(self):
        self.DATA_LIST_REC_CORR = []
        for i in self.TABLE_FIELDS:
            self.DATA_LIST_REC_CORR.append(
                ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i +
                                 ")"))

    def setComboBoxEnable(self, f, v):
        field_names = f
        value = v

        for fn in field_names:
            cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
            ast.literal_eval(cmd)

    def setComboBoxEditable(self, f, n):
        field_names = f
        value = n

        for fn in field_names:
            cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
            ast.literal_eval(cmd)

    def rec_toupdate(self):
        rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)
        return rec_to_update

    def records_equal_check(self):
        self.set_LIST_REC_TEMP()
        self.set_LIST_REC_CORR()

        if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
            return 0
        else:
            return 1

    def update_record(self):
        try:
            self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [
                ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." +
                                 self.ID_TABLE + ")")
            ], self.TABLE_FIELDS, self.rec_toupdate())
            return 1
        except Exception as e:
            QMessageBox.warning(
                self, "Messaggio",
                "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :"
                + str(e), QMessageBox.Ok)
            return 0

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
class pyarchinit_Images_directory_export(QDialog, Ui_Dialog_img_exp):
    UTILITY = Utility()
    OS_UTILITY = Pyarchinit_OS_Utility()
    DB_MANAGER = ""
    HOME = ""

    ##	if os.name == 'posix':
    ##		HOME = os.environ['HOME']
    ##	elif os.name == 'nt':
    ##		HOME = os.environ['HOMEPATH']
    ##
    ##	PARAMS_DICT={'SERVER':'',
    ##				'HOST': '',
    ##				'DATABASE':'',
    ##				'PASSWORD':'',
    ##				'PORT':'',
    ##				'USER':'',
    ##				'THUMB_PATH':''}

    def __init__(self, parent=None, db=None):
        QDialog.__init__(self, parent)
        # Set up the user interface from Designer.
        self.setupUi(self)

        try:
            self.connect()
        except:
            pass
        self.charge_list()
        self.set_home_path()
        #self.load_dict()
        #self.charge_data()

    def connect(self):
        QMessageBox.warning(self, "Alert",
                            "Sistema sperimentale solo per lo sviluppo",
                            QMessageBox.Ok)
        from pyarchinit_conn_strings import *

        conn = Connection()
        conn_str = conn.conn_str()
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> %s. E' NECESSARIO RIAVVIARE QGIS"
                    % (str(e)), QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def charge_list(self):
        #lista sito
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))
        try:
            sito_vl.remove('')
        except:
            pass

        self.comboBox_sito.clear()

        sito_vl.sort()
        self.comboBox_sito.addItems(sito_vl)

    def set_home_path(self):
        if os.name == 'posix':
            self.HOME = os.environ['HOME']
        elif os.name == 'nt':
            self.HOME = os.environ['HOMEPATH']

    def on_pushButton_exp_images_pressed(self):
        sito = str(self.comboBox_sito.currentText())
        if self.checkBox_US.isChecked() == True:
            us_res = self.db_search_DB('US', 'sito', sito)
            sito_path = ('%s%s%s') % (self.HOME, os.sep, 'Esportazione')
            self.OS_UTILITY.create_dir(sito_path)
            if bool(us_res) == True:
                US_path = ('%s%s%s') % (sito_path, os.sep,
                                        'Unita_Stratigrafiche')
                self.OS_UTILITY.create_dir(US_path)
                for sing_us in us_res:
                    sing_us_num = str(sing_us.us)
                    prefix = '0'
                    sing_us_num_len = len(sing_us_num)
                    if sing_us_num_len == 1:
                        prefix = prefix * 4
                    elif sing_us_num_len == 2:
                        prefix = prefix * 3
                    elif sing_us_num_len == 3:
                        prefix = prefix * 2
                    else:
                        pass

                    sing_us_dir = prefix + str(sing_us_num)
                    sing_US_path = ('%s%sUS%s') % (US_path, os.sep,
                                                   sing_us_dir)
                    self.OS_UTILITY.create_dir(sing_US_path)

                    search_dict = {
                        'id_entity': sing_us.id_us,
                        'entity_type': "'" + "US" + "'"
                    }

                    u = Utility()
                    search_dict = u.remove_empty_items_fr_dict(search_dict)
                    search_images_res = self.DB_MANAGER.query_bool(
                        search_dict, 'MEDIATOENTITY')

                    for sing_media in search_images_res:
                        self.OS_UTILITY.copy_file_img(str(sing_media.filepath),
                                                      sing_US_path)


##						QMessageBox.warning(self, "Alert", str(sing_media.filepath),  QMessageBox.Ok)
##						QMessageBox.warning(self, "Alert", str(sing_US_path),  QMessageBox.Ok)

                    search_images_res = ""
                QMessageBox.warning(self, "Alert",
                                    "Creazione directories terminata",
                                    QMessageBox.Ok)

    def db_search_DB(self, table_class, field, value):
        self.table_class = table_class
        self.field = field
        self.value = value

        search_dict = {self.field: "'" + str(self.value) + "'"}

        u = Utility()
        search_dict = u.remove_empty_items_fr_dict(search_dict)

        res = self.DB_MANAGER.query_bool(search_dict, self.table_class)

        return res
class pyarchinit_Periodizzazione(QDialog, Ui_DialogPeriodoFase):
    MSG_BOX_TITLE = "PyArchInit - Scheda Periodizzazione"
    DATA_LIST = []
    DATA_LIST_REC_CORR = []
    DATA_LIST_REC_TEMP = []
    REC_CORR = 0
    REC_TOT = 0
    BROWSE_STATUS = "b"
    STATUS_ITEMS = {"b": "Usa", "f": "Trova", "n": "Nuovo Record"}
    SORT_MODE = 'asc'
    SORTED_ITEMS = {"n": "Non ordinati", "o": "Ordinati"}
    SORT_STATUS = "n"
    UTILITY = Utility()
    DB_MANAGER = ""
    TABLE_NAME = 'periodizzazione_table'
    MAPPER_TABLE_CLASS = "PERIODIZZAZIONE"
    NOME_SCHEDA = "Scheda Periodizzazione"
    ID_TABLE = "id_perfas"
    CONVERSION_DICT = {
        ID_TABLE: ID_TABLE,
        "Sito": "sito",
        "Periodo": "periodo",
        "Fase": "fase",
        "Cronologia iniziale": "cron_iniziale",
        "Cronologia finale": "cron_finale",
        "Descrizione": "descrizione",
        "Datazione estesa": "datazione_estesa",
        "Codice periodo": "cont_per"
    }
    SORT_ITEMS = [
        ID_TABLE, "Sito", "Periodo", "Fase", "Descrizione",
        "Cronologia iniziale", "Cronologia finale", "Codice periodo"
    ]

    TABLE_FIELDS = [
        'sito', 'periodo', 'fase', 'cron_iniziale', 'cron_finale',
        'descrizione', 'datazione_estesa', 'cont_per'
    ]

    DB_SERVER = "not defined"  ####nuovo sistema sort

    def __init__(self, iface):
        self.iface = iface
        self.pyQGIS = Pyarchinit_pyqgis(self.iface)

        QDialog.__init__(self)
        self.setupUi(self)
        self.currentLayerId = None
        try:
            self.on_pushButton_connect_pressed()
        except:
            pass

    def enable_button(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_new_search.setEnabled(n)

        self.pushButton_search_go.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def enable_button_search(self, n):
        self.pushButton_connect.setEnabled(n)

        self.pushButton_new_rec.setEnabled(n)

        self.pushButton_view_all.setEnabled(n)

        self.pushButton_first_rec.setEnabled(n)

        self.pushButton_last_rec.setEnabled(n)

        self.pushButton_prev_rec.setEnabled(n)

        self.pushButton_next_rec.setEnabled(n)

        self.pushButton_delete.setEnabled(n)

        self.pushButton_save.setEnabled(n)

        self.pushButton_sort.setEnabled(n)

    def on_pushButton_connect_pressed(self):
        from pyarchinit_conn_strings import *
        conn = Connection()
        conn_str = conn.conn_str()
        test_conn = conn_str.find('sqlite')

        if test_conn == 0:
            self.DB_SERVER = "sqlite"

        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
            self.charge_records()  #charge records from DB
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.label_sort.setText(self.SORTED_ITEMS["n"])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list_sito()
                self.fill_fields()
            else:
                QMessageBox.warning(
                    self, "BENVENUTO",
                    "Benvenuto in pyArchInit" + self.NOME_SCHEDA +
                    ". Il database e' vuoto. Premi 'Ok' e buon lavoro!",
                    QMessageBox.Ok)
                self.charge_list_sito()
                self.BROWSE_STATUS = 'x'
                self.on_pushButton_new_rec_pressed()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> Tabella non presente. E' NECESSARIO RIAVVIARE QGIS",
                    QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def charge_list(self):
        pass

    def charge_list_sito(self):
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))
        try:
            sito_vl.remove('')
        except:
            pass
        self.comboBox_sito.clear()
        sito_vl.sort()
        self.comboBox_sito.addItems(sito_vl)

    def on_pushButton_pdf_scheda_exp_pressed(self):
        Periodizzazione_pdf_sheet = generate_Periodizzazione_pdf(
        )  #deve essere importata la classe
        data_list = self.generate_list_pdf()  #deve essere aggiunta la funzione
        Periodizzazione_pdf_sheet.build_Periodizzazione_sheets(
            data_list)  #deve essere aggiunto il file per generare i pdf

    def on_pushButton_pdf_lista_exp_pressed(self):
        Periodizzazione_pdf_list = generate_Periodizzazione_pdf(
        )  #deve essere importata la classe
        data_list = self.generate_list_pdf()  #deve essere aggiunta la funzione
        Periodizzazione_pdf_list.build_index_Periodizzazione(
            data_list,
            data_list[0][0])  #deve essere aggiunto il file per generare i pdf

        #codice per l'esportazione sperimentale dei PDF #
        """
		dlg = pyarchinit_PDFAdministrator()
		dlg.set_table_name(self.TABLE_NAME)
		dlg.connect()
		msg = QMessageBox.warning(self,'ATTENZIONE',"Vuoi creare un nuovo layout PFD?", QMessageBox.Cancel,1)
		dlg.connect()
		##		dlg.on_pushButton_connect_pressed()
		if msg == 1:
			dlg.on_pushButton_new_rec_pressed()
			dlg.charge_list()
		
		id_list = []

		for i in self.DATA_LIST:
			id_list.append(ast.literal_eval("i." + self.ID_TABLE))
		dlg.add_id_list(id_list)

		dlg.exec_()
		"""

    def generate_list_pdf(self):
        periodo = ""
        fase = ""
        cron_iniz = ""
        cron_fin = ""

        data_list = []
        for i in range(len(self.DATA_LIST)):

            if self.DATA_LIST[i].periodo == None:
                periodo = ""
            else:
                periodo = str(self.DATA_LIST[i].periodo)

            if self.DATA_LIST[i].fase == None:
                fase = ""
            else:
                fase = str(self.DATA_LIST[i].fase)

            if self.DATA_LIST[i].cron_iniziale == None:
                cron_iniz = ""
            else:
                cron_iniz = str(self.DATA_LIST[i].cron_iniziale)

            if self.DATA_LIST[i].cron_finale == None:
                cron_fin = ""
            else:
                cron_fin = str(self.DATA_LIST[i].cron_finale)

            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                str(periodo),  #2 - periodo
                str(fase),  #3 - fase
                str(cron_iniz),  #4 - cron iniz
                str(cron_fin),  #5 - cron fin
                str(self.DATA_LIST[i].datazione_estesa),  #6 - datazione_estesa
                str(self.DATA_LIST[i].descrizione)  #7 - descrizione
            ])
        return data_list

    #buttons functions
    def on_pushButton_sort_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            dlg = SortPanelMain(self)
            dlg.insertItems(self.SORT_ITEMS)
            dlg.exec_()

            items, order_type = dlg.ITEMS, dlg.TYPE_ORDER

            self.SORT_ITEMS_CONVERTED = []
            for i in items:
                self.SORT_ITEMS_CONVERTED.append(self.CONVERSION_DICT[str(i)])

            self.SORT_MODE = order_type
            self.empty_fields()

            id_list = []
            for i in self.DATA_LIST:
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))
            self.DATA_LIST = []

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                self.MAPPER_TABLE_CLASS, self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR

            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.SORT_STATUS = "o"
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.fill_fields()

    def on_pushButton_new_rec_pressed(self):
        if bool(self.DATA_LIST) == True:
            if self.data_error_check() == 1:
                pass
            else:
                if self.BROWSE_STATUS == "b":
                    if bool(self.DATA_LIST) == True:
                        if self.records_equal_check() == 1:
                            msg = self.update_if(
                                QMessageBox.warning(
                                    self, 'Errore',
                                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                                    QMessageBox.Cancel, 1))

        if self.BROWSE_STATUS != "n":
            self.BROWSE_STATUS = "n"

            ###

            self.setComboBoxEditable(["self.comboBox_sito"], 0)
            self.setComboBoxEditable(["self.comboBox_periodo"], 0)
            self.setComboBoxEditable(["self.comboBox_fase"], 0)
            self.setComboBoxEnable(["self.comboBox_sito"], "True")
            self.setComboBoxEnable(["self.comboBox_periodo"], "True")
            self.setComboBoxEnable(["self.comboBox_fase"], "True")

            ###
            self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            self.set_rec_counter('', '')
            self.label_sort.setText(self.SORTED_ITEMS["n"])
            self.empty_fields()

            self.enable_button(0)

    def on_pushButton_save_pressed(self):
        #save record
        if self.BROWSE_STATUS == "b":
            if self.data_error_check() == 0:
                if self.records_equal_check() == 1:
                    self.update_if(
                        QMessageBox.warning(
                            self, 'ATTENZIONE',
                            "Il record e' stato modificato. Vuoi salvare le modifiche?",
                            QMessageBox.Cancel, 1))
                    self.SORT_STATUS = "n"
                    self.label_sort.setText(
                        self.SORTED_ITEMS[self.SORT_STATUS])
                    self.enable_button(1)
                    self.fill_fields(self.REC_CORR)
                else:
                    QMessageBox.warning(
                        self, "ATTENZIONE",
                        "Non è stata realizzata alcuna modifica.",
                        QMessageBox.Ok)
        else:
            if self.data_error_check() == 0:
                test_insert = self.insert_new_rec()
                if test_insert == 1:
                    self.empty_fields()
                    self.SORT_STATUS = "n"
                    self.label_sort.setText(
                        self.SORTED_ITEMS[self.SORT_STATUS])
                    self.charge_records()
                    self.charge_list()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.REC_TOT, self.REC_CORR = len(
                        self.DATA_LIST), len(self.DATA_LIST) - 1
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                    self.setComboBoxEditable(["self.comboBox_sito"], 1)
                    self.setComboBoxEditable(["self.comboBox_periodo"], 1)
                    self.setComboBoxEditable(["self.comboBox_fase"], 1)
                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.comboBox_periodo"], "False")
                    self.setComboBoxEnable(["self.comboBox_fase"], "False")
                    self.fill_fields(self.REC_CORR)
                    self.enable_button(1)
            else:
                QMessageBox.warning(self, "ATTENZIONE",
                                    "Problema nell'inserimento dati",
                                    QMessageBox.Ok)

    def data_error_check(self):
        test = 0
        EC = Error_check()

        data_estesa = self.lineEdit_per_estesa.text()

        if data_estesa != "":
            if EC.data_lenght(data_estesa, 299) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Datazione estesa. \n non deve superare i 300 caratteri alfanumerici",
                    QMessageBox.Ok)
                test = 1

        periodo = self.comboBox_periodo.currentText()
        cron_iniz = self.lineEdit_cron_iniz.text()
        cron_fin = self.lineEdit_cron_fin.text()
        cod_per = self.lineEdit_codice_periodo.text()

        if periodo != "":
            if EC.data_is_int(periodo) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Periodo. \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if cron_iniz != "":
            if EC.data_is_int(cron_iniz) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Cronologia Iniziale. \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if cron_fin != "":
            if EC.data_is_int(cron_fin) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Cronologia Finale. \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        if cod_per != "":
            if EC.data_is_int(cod_per) == 0:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Campo Codice Periodo \n Il valore deve essere di tipo numerico",
                    QMessageBox.Ok)
                test = 1

        return test

    def insert_new_rec(self):
        cont_per = 0
        try:
            if self.lineEdit_cron_iniz.text() == "":
                cron_iniz = None
            else:
                cron_iniz = int(self.lineEdit_cron_iniz.text())

            if self.lineEdit_cron_fin.text() == "":
                cron_fin = None
            else:
                cron_fin = int(self.lineEdit_cron_fin.text())

            if self.lineEdit_codice_periodo.text() == "":
                cont_per = None
            else:
                cont_per = int(self.lineEdit_codice_periodo.text())

            data = self.DB_MANAGER.insert_periodizzazione_values(
                self.DB_MANAGER.max_num_id(self.MAPPER_TABLE_CLASS,
                                           self.ID_TABLE) + 1,  #0 - max num id
                str(self.comboBox_sito.currentText()),  #1 - Sito
                int(self.comboBox_periodo.currentText()),  #2 - Periodo
                int(self.comboBox_fase.currentText()),  #3 - Fase
                cron_iniz,  #4 - Cron iniziale
                cron_fin,  #5 - Cron finale
                str(self.textEdit_descrizione_per.toPlainText()
                    ),  #6 - Descrizione
                str(self.lineEdit_per_estesa.text()
                    ),  #7 - Periodizzazione estesa
                cont_per)  #8 - Cont_per

            try:
                self.DB_MANAGER.insert_data_session(data)
                return 1
            except Exception as e:
                e_str = str(e)
                if e_str.__contains__("Integrity"):
                    msg = self.ID_TABLE + " gia' presente nel database"
                else:
                    msg = e
                QMessageBox.warning(self, "Errore",
                                    "immisione 1 \n" + str(msg),
                                    QMessageBox.Ok)
                return 0
        except Exception as e:
            QMessageBox.warning(self, "Errore",
                                "Errore di immissione 2 \n" + str(e),
                                QMessageBox.Ok)
            return 0

    def check_record_state(self):
        ec = self.data_error_check()
        if ec == 1:
            return 1  #ci sono errori di immissione
        elif self.records_equal_check() == 1 and ec == 0:
            self.update_if(
                QMessageBox.warning(
                    self, 'Errore',
                    "Il record e' stato modificato. Vuoi salvare le modifiche?",
                    QMessageBox.Cancel, 1))
            #self.charge_records() incasina lo stato trova
            return 0  #non ci sono errori di immissione

    def on_pushButton_view_all_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.empty_fields()
            self.charge_records()
            self.fill_fields()
            self.BROWSE_STATUS = "b"
            self.label_status.setText(self.STATUS_ITEMS[self.BROWSE_STATUS])
            if type(self.REC_CORR) == "<type 'str'>":
                corr = 0
            else:
                corr = self.REC_CORR
            self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
            self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
            self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                0]
            self.label_sort.setText(self.SORTED_ITEMS["n"])

    #records surf functions
    def on_pushButton_first_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.fill_fields(0)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_last_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            try:
                self.empty_fields()
                self.REC_TOT, self.REC_CORR = len(
                    self.DATA_LIST), len(self.DATA_LIST) - 1
                self.fill_fields(self.REC_CORR)
                self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
            except Exception as e:
                QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_prev_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR - 1
            if self.REC_CORR == -1:
                self.REC_CORR = 0
                QMessageBox.warning(self, "Errore", "Sei al primo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_next_rec_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.REC_CORR = self.REC_CORR + 1
            if self.REC_CORR >= self.REC_TOT:
                self.REC_CORR = self.REC_CORR - 1
                QMessageBox.warning(self, "Errore", "Sei all'ultimo record!",
                                    QMessageBox.Ok)
            else:
                try:
                    self.empty_fields()
                    self.fill_fields(self.REC_CORR)
                    self.set_rec_counter(self.REC_TOT, self.REC_CORR + 1)
                except Exception as e:
                    QMessageBox.warning(self, "Errore", str(e), QMessageBox.Ok)

    def on_pushButton_delete_pressed(self):
        msg = QMessageBox.warning(
            self, "Attenzione!!!",
            "Vuoi veramente eliminare il record? \n L'azione è irreversibile",
            QMessageBox.Cancel, 1)
        if msg != 1:
            QMessageBox.warning(self, "Messagio!!!", "Azione Annullata!")
        else:
            try:
                id_to_delete = ast.literal_eval(
                    "self.DATA_LIST[self.REC_CORR]." + self.ID_TABLE)
                self.DB_MANAGER.delete_one_record(self.TABLE_NAME,
                                                  self.ID_TABLE, id_to_delete)
                self.charge_records()  #charge records from DB
                QMessageBox.warning(self, "Messaggio!!!", "Record eliminato!")
            except Exception as e:
                QMessageBox.warning(self, "Messaggio!!!",
                                    "Tipo di errore: " + str(e))
            if bool(self.DATA_LIST) == False:
                QMessageBox.warning(self, "Attenzione", "Il database è vuoto!",
                                    QMessageBox.Ok)
                self.DATA_LIST = []
                self.DATA_LIST_REC_CORR = []
                self.DATA_LIST_REC_TEMP = []
                self.REC_CORR = 0
                self.REC_TOT = 0
                self.empty_fields()
                self.set_rec_counter(0, 0)
            #check if DB is empty
            if bool(self.DATA_LIST) == True:
                self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                    0]

                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.set_rec_counter(len(self.DATA_LIST), self.REC_CORR + 1)
                self.charge_list()
                self.fill_fields()
        self.SORT_STATUS = "n"
        self.label_sort.setText(self.SORTED_ITEMS[self.SORT_STATUS])

    def on_pushButton_new_search_pressed(self):
        if self.check_record_state() == 1:
            pass
        else:
            self.enable_button_search(0)

            self.setComboBoxEditable(["self.comboBox_sito"], 1)

            #set the GUI for a new search

            if self.BROWSE_STATUS != "f":
                self.BROWSE_STATUS = "f"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                self.empty_fields()
                self.set_rec_counter('', '')
                self.label_sort.setText(self.SORTED_ITEMS["n"])

                self.setComboBoxEditable(["self.comboBox_sito"], 1)
                self.setComboBoxEditable(["self.comboBox_periodo"], 1)
                self.setComboBoxEditable(["self.comboBox_fase"], 1)
                self.setComboBoxEnable(["self.comboBox_sito"], "True")
                self.setComboBoxEnable(["self.comboBox_periodo"], "True")
                self.setComboBoxEnable(["self.comboBox_fase"], "True")
                self.setComboBoxEnable(["self.textEdit_descrizione_per"],
                                       "False")

    def on_pushButton_search_go_pressed(self):
        if self.BROWSE_STATUS != "f":
            QMessageBox.warning(
                self, "ATTENZIONE",
                "Per eseguire una nuova ricerca clicca sul pulsante 'new search' ",
                QMessageBox.Ok)
        else:
            if self.lineEdit_cron_iniz.text() != "":
                cron_iniziale = "'" + str(self.lineEdit_cron_iniz.text()) + "'"
            else:
                cron_iniziale = ""

            if self.lineEdit_cron_fin.text() != "":
                cron_finale = "'" + str(self.lineEdit_cron_fin.text()) + "'"
            else:
                cron_finale = ""

            if self.comboBox_periodo.currentText() != "":
                periodo = "'" + str(self.comboBox_periodo.currentText()) + "'"
            else:
                periodo = ""

            if self.comboBox_fase.currentText() != "":
                fase = "'" + str(self.comboBox_fase.currentText()) + "'"
            else:
                fase = ""

            search_dict = {
                'sito':
                "'" + str(self.comboBox_sito.currentText()) + "'",  #1 - Sito
                'periodo': periodo,  #2 - Periodo
                'fase': fase,  #3 - Fase
                'cron_iniziale': cron_iniziale,  #4 - Cron iniziale
                'cron_finale': cron_finale,  #5 - Crion finale
                'descrizione': str(self.textEdit_descrizione_per.toPlainText()
                                   ),  #6 - Descrizione
                'datazione_estesa':
                "'" + str(self.lineEdit_per_estesa.text()) +
                "'",  #7 - Periodizzazione estesa
                'cont_per': "'" + str(self.lineEdit_codice_periodo.text()) +
                "'"  #8 - Codice periodo
            }

            u = Utility()
            search_dict = u.remove_empty_items_fr_dict(search_dict)

            if bool(search_dict) == False:
                QMessageBox.warning(
                    self, "ATTENZIONE",
                    "Non e' stata impostata alcuna ricerca!!!", QMessageBox.Ok)
            else:
                res = self.DB_MANAGER.query_bool(search_dict,
                                                 self.MAPPER_TABLE_CLASS)
                if bool(res) == False:
                    QMessageBox.warning(self, "ATTENZIONE",
                                        "Non e' stato trovato alcun record!",
                                        QMessageBox.Ok)

                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]

                    self.fill_fields(self.REC_CORR)
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])

                    self.setComboBoxEditable(["self.comboBox_sito"], 1)
                    self.setComboBoxEditable(["self.comboBox_periodo"], 1)
                    self.setComboBoxEditable(["self.comboBox_fase"], 1)

                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.comboBox_periodo"], "False")
                    self.setComboBoxEnable(["self.comboBox_fase"], "False")

                    self.setComboBoxEnable(["self.textEdit_descrizione_per"],
                                           "True")

                else:
                    self.DATA_LIST = []
                    for i in res:
                        self.DATA_LIST.append(i)
                    self.REC_TOT, self.REC_CORR = len(self.DATA_LIST), 0
                    self.DATA_LIST_REC_TEMP = self.DATA_LIST_REC_CORR = self.DATA_LIST[
                        0]
                    self.fill_fields()
                    self.BROWSE_STATUS = "b"
                    self.label_status.setText(
                        self.STATUS_ITEMS[self.BROWSE_STATUS])
                    self.set_rec_counter(len(self.DATA_LIST),
                                         self.REC_CORR + 1)

                    if self.REC_TOT == 1:
                        strings = ("E' stato trovato", self.REC_TOT, "record")
                    else:
                        strings = ("Sono stati trovati", self.REC_TOT,
                                   "records")

                    self.setComboBoxEditable(["self.comboBox_sito"], 1)
                    self.setComboBoxEditable(["self.comboBox_periodo"], 1)
                    self.setComboBoxEditable(["self.comboBox_fase"], 1)
                    self.setComboBoxEnable(["self.comboBox_sito"], "False")
                    self.setComboBoxEnable(["self.comboBox_periodo"], "False")
                    self.setComboBoxEnable(["self.comboBox_fase"], "False")
                    self.setComboBoxEnable(["self.textEdit_descrizione_per"],
                                           "True")

                    QMessageBox.warning(self, "Messaggio",
                                        "%s %d %s" % strings, QMessageBox.Ok)

        self.enable_button_search(1)

    def on_pushButton_show_periodo_pressed(self):
        if self.lineEdit_codice_periodo.text() == "":
            QMessageBox.warning(self, "Messaggio",
                                "Codice periodo non assegnato", QMessageBox.Ok)
        else:
            sito_p = self.comboBox_sito.currentText()
            cont_per = self.lineEdit_codice_periodo.text()
            per_label = self.comboBox_periodo.currentText()
            fas_label = self.comboBox_fase.currentText()
            self.pyQGIS.charge_vector_layers_periodo(sito_p, int(cont_per),
                                                     per_label, fas_label)

    def update_if(self, msg):
        rec_corr = self.REC_CORR
        self.msg = msg
        if self.msg == 1:
            test = self.update_record()
            if test == 1:
                id_list = []
                for i in self.DATA_LIST:
                    id_list.append(ast.literal_eval("i." + self.ID_TABLE))
                self.DATA_LIST = []
                if self.SORT_STATUS == "n":
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, [self.ID_TABLE], 'asc',
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE
                    )  #self.DB_MANAGER.query_bool(self.SEARCH_DICT_TEMP, self.MAPPER_TABLE_CLASS) #
                else:
                    temp_data_list = self.DB_MANAGER.query_sort(
                        id_list, self.SORT_ITEMS_CONVERTED, self.SORT_MODE,
                        self.MAPPER_TABLE_CLASS, self.ID_TABLE)
                for i in temp_data_list:
                    self.DATA_LIST.append(i)
                self.BROWSE_STATUS = "b"
                self.label_status.setText(
                    self.STATUS_ITEMS[self.BROWSE_STATUS])
                if type(self.REC_CORR) == "<type 'str'>":
                    corr = 0
                else:
                    corr = self.REC_CORR
                return 1
            elif test == 0:
                return 0

    #custom functions
    def charge_records(self):
        self.DATA_LIST = []

        if self.DB_SERVER == 'sqlite':
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                self.DATA_LIST.append(i)
        else:
            id_list = []
            for i in self.DB_MANAGER.query(
                    ast.literal_eval(self.MAPPER_TABLE_CLASS)):
                id_list.append(ast.literal_eval("i." + self.ID_TABLE))

            temp_data_list = self.DB_MANAGER.query_sort(
                id_list, [self.ID_TABLE], 'asc', self.MAPPER_TABLE_CLASS,
                self.ID_TABLE)

            for i in temp_data_list:
                self.DATA_LIST.append(i)

    def setComboBoxEditable(self, f, n):
        field_names = f
        value = n

        for fn in field_names:
            cmd = ('%s%s%d%s') % (fn, '.setEditable(', n, ')')
            ast.literal_eval(cmd)

    def setComboBoxEnable(self, f, v):
        field_names = f
        value = v

        for fn in field_names:
            cmd = ('%s%s%s%s') % (fn, '.setEnabled(', v, ')')
            ast.literal_eval(cmd)

    def datestrfdate(self):
        now = date.today()
        today = now.strftime("%d-%m-%Y")
        return today

    def table2dict(self, n):
        self.tablename = n
        row = ast.literal_eval(self.tablename + ".rowCount()")
        col = ast.literal_eval(self.tablename + ".columnCount()")
        lista = []
        for r in range(row):
            sub_list = []
            for c in range(col):
                value = ast.literal_eval(self.tablename + ".item(r,c)")
                if bool(value) == True:
                    sub_list.append(str(value.text()))
            lista.append(sub_list)
        return lista

    def empty_fields(self):
        self.comboBox_sito.setEditText("")  #1 - Sito
        self.comboBox_periodo.setEditText("")  #2 - Periodo
        self.comboBox_fase.setEditText("")  #3 - Fase
        self.lineEdit_cron_iniz.clear()  #4 - Cronologia iniziale
        self.lineEdit_cron_fin.clear()  #5 - Cronologia finale
        self.lineEdit_per_estesa.clear()  #6 - Datazione estesa
        self.textEdit_descrizione_per.clear()  #7 - Descrizione
        self.lineEdit_codice_periodo.clear()  #8 - Codice periodo

    def fill_fields(self, n=0):
        self.rec_num = n
        try:
            str(
                self.comboBox_sito.setEditText(
                    self.DATA_LIST[self.rec_num].sito))  #1 - Sito

            self.comboBox_periodo.setEditText(
                str(self.DATA_LIST[self.rec_num].periodo))  #2 - Periodo
            self.comboBox_fase.setEditText(
                str(self.DATA_LIST[self.rec_num].fase))  #3 - Fase

            if self.DATA_LIST[
                    self.
                    rec_num].cron_iniziale == None:  #4 - Cronologia iniziale
                self.lineEdit_cron_iniz.setText("")
            else:
                self.lineEdit_cron_iniz.setText(
                    str(self.DATA_LIST[self.rec_num].cron_iniziale))

            if self.DATA_LIST[
                    self.rec_num].cron_finale == None:  #5 - Cronologia finale
                self.lineEdit_cron_fin.setText("")
            else:
                self.lineEdit_cron_fin.setText(
                    str(self.DATA_LIST[self.rec_num].cron_finale))

            str(
                self.lineEdit_per_estesa.setText(self.DATA_LIST[
                    self.rec_num].datazione_estesa))  #6 - Datazione estesa
            str(
                self.textEdit_descrizione_per.setText(self.DATA_LIST[
                    self.rec_num].descrizione))  #7 - Descrizione

            if self.DATA_LIST[
                    self.rec_num].cont_per == None:  #8 - Codice periodo
                self.lineEdit_codice_periodo.setText("")
            else:
                self.lineEdit_codice_periodo.setText(
                    str(self.DATA_LIST[self.rec_num].cont_per))

        except Exception as e:
            QMessageBox.warning(self, "Errore Fill Fields", str(e),
                                QMessageBox.Ok)

    def set_rec_counter(self, t, c):
        self.rec_tot = t
        self.rec_corr = c
        self.label_rec_tot.setText(str(self.rec_tot))
        self.label_rec_corrente.setText(str(self.rec_corr))

    def set_LIST_REC_TEMP(self):
        #data
        if self.lineEdit_cron_iniz.text() == "":
            cron_iniz = None
        else:
            cron_iniz = str(self.lineEdit_cron_iniz.text())

        if self.lineEdit_cron_fin.text() == "":
            cron_fin = None
        else:
            cron_fin = str(self.lineEdit_cron_fin.text())

        if self.lineEdit_codice_periodo.text() == "":
            cont_per = None
        else:
            cont_per = str(self.lineEdit_codice_periodo.text())

        self.DATA_LIST_REC_TEMP = [
            str(self.comboBox_sito.currentText()),  #1 - Sito
            str(self.comboBox_periodo.currentText()),  #2 - Periodo
            str(self.comboBox_fase.currentText()),  #3 - Fase
            str(cron_iniz),  #4 - Cron iniziale
            str(cron_fin),  #5 - Cron finale
            str(self.textEdit_descrizione_per.toPlainText()
                ),  #6 - Descrizioene
            str(self.lineEdit_per_estesa.text()),  #7 - Cron estesa
            str(cont_per)
        ]  #8 - Cont_per

    def set_LIST_REC_CORR(self):
        self.DATA_LIST_REC_CORR = []
        for i in self.TABLE_FIELDS:
            self.DATA_LIST_REC_CORR.append(
                ast.literal_eval("unicode(self.DATA_LIST[self.REC_CORR]." + i +
                                 ")"))

    def records_equal_check(self):
        self.set_LIST_REC_TEMP()
        self.set_LIST_REC_CORR()

        if self.DATA_LIST_REC_CORR == self.DATA_LIST_REC_TEMP:
            return 0
        else:
            return 1

    def update_record(self):
        try:
            self.DB_MANAGER.update(self.MAPPER_TABLE_CLASS, self.ID_TABLE, [
                ast.literal_eval("int(self.DATA_LIST[self.REC_CORR]." +
                                 self.ID_TABLE + ")")
            ], self.TABLE_FIELDS, self.rec_toupdate())
            return 1
        except Exception as e:
            QMessageBox.warning(
                self, "Messaggio",
                "Problema di encoding: sono stati inseriti accenti o caratteri non accettati dal database. Se chiudete ora la scheda senza correggere gli errori perderete i dati. Fare una copia di tutto su un foglio word a parte. Errore :"
                + str(e), QMessageBox.Ok)
            return 0

    def rec_toupdate(self):
        rec_to_update = self.UTILITY.pos_none_in_list(self.DATA_LIST_REC_TEMP)
        return rec_to_update

    def testing(self, name_file, message):
        f = open(str(name_file), 'w')
        f.write(str(message))
        f.close()
예제 #11
0
class pyarchinit_pdf_export(QDialog, Ui_Dialog_pdf_exp):
    UTILITY = Utility()
    OS_UTILITY = Pyarchinit_OS_Utility()
    DB_MANAGER = ""
    HOME = ""
    DATA_LIST = []

    ##	if os.name == 'posix':
    ##		HOME = os.environ['HOME']
    ##	elif os.name == 'nt':
    ##		HOME = os.environ['HOMEPATH']
    ##
    ##	PARAMS_DICT={'SERVER':'',
    ##				'HOST': '',
    ##				'DATABASE':'',
    ##				'PASSWORD':'',
    ##				'PORT':'',
    ##				'USER':'',
    ##				'THUMB_PATH':''}

    def __init__(self, parent=None, db=None):
        QDialog.__init__(self, parent)
        # Set up the user interface from Designer.
        self.setupUi(self)

        try:
            self.connect()
        except:
            pass
        self.charge_list()
        self.set_home_path()
        #self.load_dict()
        #self.charge_data()

    def connect(self):
        QMessageBox.warning(
            self, "Alert",
            "Sistema sperimentale. Esporta le schede PDF in /vostro_utente/pyarchinit_DB_folder. Sostituisce i documenti gia' presenti. Se volete conservarli fatene una copia o rinominateli.",
            QMessageBox.Ok)
        from pyarchinit_conn_strings import *

        conn = Connection()
        conn_str = conn.conn_str()
        try:
            self.DB_MANAGER = Pyarchinit_db_management(conn_str)
            self.DB_MANAGER.connection()
        except Exception as e:
            e = str(e)
            if e.find("no such table"):
                QMessageBox.warning(
                    self, "Alert",
                    "La connessione e' fallita <br><br> %s. E' NECESSARIO RIAVVIARE QGIS"
                    % (str(e)), QMessageBox.Ok)
            else:
                QMessageBox.warning(
                    self, "Alert",
                    "Attenzione rilevato bug! Segnalarlo allo sviluppatore<br> Errore: <br>"
                    + str(e), QMessageBox.Ok)

    def charge_list(self):
        #lista sito
        sito_vl = self.UTILITY.tup_2_list_III(
            self.DB_MANAGER.group_by('site_table', 'sito', 'SITE'))
        try:
            sito_vl.remove('')
        except:
            pass

        self.comboBox_sito.clear()

        sito_vl.sort()
        self.comboBox_sito.addItems(sito_vl)

    def set_home_path(self):
        if os.name == 'posix':
            self.HOME = os.environ['HOME']
        elif os.name == 'nt':
            self.HOME = os.environ['HOMEPATH']

    def on_pushButton_open_dir_pressed(self):
        path = ('%s%s%s') % (self.HOME, os.sep, "pyarchinit_PDF_folder")

        if platform.system() == "Windows":
            os.startfile(path)
        elif platform.system() == "Darwin":
            subprocess.Popen(["open", path])
        else:
            subprocess.Popen(["xdg-open", path])

    def on_pushButton_exp_pdf_pressed(self):
        sito = str(self.comboBox_sito.currentText())

        ####Esportazione della Scheda e indice US
        if self.checkBox_US.isChecked() == True:

            us_res = self.db_search_DB('US', 'sito', sito)

            if bool(us_res) == True:
                id_list = []
                for i in range(len(us_res)):
                    id_list.append(us_res[i].id_us)

                temp_data_list = self.DB_MANAGER.query_sort(
                    id_list, ['area', 'us'], 'asc', 'US', 'id_us')
                for i in temp_data_list:
                    self.DATA_LIST.append(i)

                if len(self.DATA_LIST) < 1:
                    QMessageBox.warning(
                        self, "Alert",
                        "Attenzione non vi sono schede da stampare",
                        QMessageBox.Ok)
                else:
                    US_pdf_sheet = generate_US_pdf()
                    data_list = self.generate_list_US_pdf()
                    US_pdf_sheet.build_US_sheets(self.DATA_LIST)  #export sheet
                    US_pdf_sheet.build_index_US(
                        self.DATA_LIST, self.DATA_LIST[0][0])  #export list

            self.DATA_LIST = []

        ####Esportazione della Scheda e indice Periodizzazione
        if self.checkBox_periodo.isChecked() == True:

            periodizzazione_res = self.db_search_DB('PERIODIZZAZIONE', 'sito',
                                                    sito)

            if bool(periodizzazione_res) == True:
                id_list = []
                for i in range(len(periodizzazione_res)):
                    id_list.append(periodizzazione_res[i].id_perfas)

                temp_data_list = self.DB_MANAGER.query_sort(
                    id_list, ['cont_per'], 'asc', 'PERIODIZZAZIONE',
                    'id_perfas')

                for i in temp_data_list:
                    self.DATA_LIST.append(i)

                Periodizzazione_pdf_sheet = generate_Periodizzazione_pdf(
                )  #deve essere importata la classe
                data_list = self.generate_list_periodizzazione_pdf(
                )  #deve essere aggiunta la funzione
                Periodizzazione_pdf_sheet.build_Periodizzazione_sheets(
                    self.DATA_LIST
                )  #deve essere aggiunto il file per generare i pdf
                Periodizzazione_pdf_sheet.build_index_Periodizzazione(
                    self.DATA_LIST, self.DATA_LIST[0]
                    [0])  #deve essere aggiunto il file per generare i pdf

            self.DATA_LIST = []

        ####Esportazione della Scheda e indice Struttura
        if self.checkBox_struttura.isChecked() == True:
            struttura_res = self.db_search_DB('STRUTTURA', 'sito', sito)

            if bool(struttura_res) == True:
                id_list = []
                for i in range(len(struttura_res)):
                    id_list.append(struttura_res[i].id_struttura)

                temp_data_list = self.DB_MANAGER.query_sort(
                    id_list, ['sigla_struttura', 'numero_struttura'], 'asc',
                    'STRUTTURA', 'id_struttura')

                for i in temp_data_list:
                    self.DATA_LIST.append(i)

                Struttura_pdf_sheet = generate_struttura_pdf(
                )  #deve essere importata la classe
                data_list = self.generate_list_struttura_pdf(
                )  #deve essere aggiunta la funzione
                Struttura_pdf_sheet.build_Struttura_sheets(
                    self.DATA_LIST
                )  #deve essere aggiunto il file per generare i pdf
                Struttura_pdf_sheet.build_index_Struttura(
                    self.DATA_LIST, self.DATA_LIST[0][0])

            self.DATA_LIST = []

        if self.checkBox_reperti.isChecked() == True:
            reperti_res = self.db_search_DB('INVENTARIO_MATERIALI', 'sito',
                                            sito)

            if bool(reperti_res) == True:
                id_list = []
                for i in range(len(reperti_res)):
                    id_list.append(reperti_res[i].id_invmat)

                temp_data_list = self.DB_MANAGER.query_sort(
                    id_list, ['numero_inventario'], 'asc',
                    'INVENTARIO_MATERIALI', 'id_invmat')

                for i in temp_data_list:
                    self.DATA_LIST.append(i)

                Finds_pdf_sheet = generate_reperti_pdf()
                data_list = self.generate_list_reperti_pdf()
                Finds_pdf_sheet.build_Finds_sheets(self.DATA_LIST)
                Finds_pdf_sheet.build_index_Finds(self.DATA_LIST,
                                                  self.DATA_LIST[0][1])

            self.DATA_LIST = []

        if self.checkBox_tafonomia.isChecked() == True:
            tafonomia_res = self.db_search_DB('TAFONOMIA', 'sito', sito)

            if bool(tafonomia_res) == True:
                id_list = []
                for i in range(len(tafonomia_res)):
                    id_list.append(tafonomia_res[i].id_tafonomia)

                temp_data_list = self.DB_MANAGER.query_sort(
                    id_list, ['nr_scheda_taf'], 'asc', 'TAFONOMIA',
                    'id_tafonomia')

                for i in temp_data_list:
                    self.DATA_LIST.append(i)

                Tafonomia_pdf_sheet = generate_tafonomia_pdf()
                data_list = self.generate_list_pdf()
                Tafonomia_pdf_sheet.build_Tafonomia_sheets(self.DATA_LIST)
                Tafonomia_pdf_sheet.build_index_Tafonomia(
                    self.DATA_LIST, self.DATA_LIST[0][0])

            self.DATA_LIST = []


##		if self.checkBox_individui.isChecked() == True:
##			individui_res = self.db_search_DB('SCHEDAIND','sito', sito)
##
##			if bool(individui_res) == True:
##				id_list = []
##				for i in range(len(individui_res)):
##					id_list.append(individui_res[i].id_scheda_ind)
##
##				temp_data_list = self.DB_MANAGER.query_sort(id_list, ['nr_individuo'], 'asc', 'SCHEDAIND', 'id_scheda_ind')
##
##				for i in temp_data_list:
##					self.DATA_LIST.append(i)
##
##				Individui_pdf_sheet = generate_pdf()
##				data_list = self.generate_list_individui_pdf()
##				Individui_pdf_sheet.build_Individui_sheets(self.DATA_LIST)
##				Individui_pdf_sheet.build_index_individui(self.DATA_LIST, self.DATA_LIST[0][0])
##
##			self.DATA_LIST = []

    def db_search_DB(self, table_class, field, value):
        self.table_class = table_class
        self.field = field
        self.value = value

        search_dict = {self.field: "'" + str(self.value) + "'"}

        u = Utility()
        search_dict = u.remove_empty_items_fr_dict(search_dict)

        res = self.DB_MANAGER.query_bool(search_dict, self.table_class)

        return res

    def generate_list_US_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):
            #assegnazione valori di quota mn e max
            sito = str(self.DATA_LIST[i].sito)
            area = str(self.DATA_LIST[i].area)
            us = str(self.DATA_LIST[i].us)

            res = self.DB_MANAGER.select_quote_from_db_sql(sito, area, us)
            quote = []

            for sing_us in res:
                sing_quota_value = str(sing_us[5])
                if sing_quota_value[0] == '-':
                    sing_quota_value = sing_quota_value[:7]
                else:
                    sing_quota_value = sing_quota_value[:6]

                sing_quota = [sing_quota_value, sing_us[4]]
                quote.append(sing_quota)
            quote.sort()

            if bool(quote) == True:
                quota_min = '%s %s' % (quote[0][0], quote[0][1])
                quota_max = '%s %s' % (quote[-1][0], quote[-1][1])
            else:
                quota_min = "Non inserita su GIS"
                quota_max = "Non inserita su GIS"

            #assegnazione numero di pianta
            resus = self.DB_MANAGER.select_us_from_db_sql(sito, area, us, "2")
            elenco_record = []
            for us in resus:
                elenco_record.append(us)

            if bool(elenco_record) == True:
                sing_rec = elenco_record[0]
                elenco_piante = sing_rec[7]
                if elenco_piante != None:
                    piante = elenco_piante
                else:
                    piante = "US disegnata su base GIS"
            else:
                piante = "US disegnata su base GIS"

            d_str = str(self.DATA_LIST[i].d_stratigrafica)
            QMessageBox.warning(self, "Alert", str(self.DATA_LIST[i]),
                                QMessageBox.Ok)
            sito = str(self.DATA_LIST[i].sito)

            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                str(self.DATA_LIST[i].area),  #2 - Area
                int(self.DATA_LIST[i].us),  #3 - US
                str(self.DATA_LIST[i].d_stratigrafica
                    ),  #4 - definizione stratigrafica
                str(self.DATA_LIST[i].d_interpretativa
                    ),  #5 - definizione intepretata
                str(self.DATA_LIST[i].descrizione),  #6 - descrizione
                str(self.DATA_LIST[i].interpretazione),  #7 - interpretazione
                str(self.DATA_LIST[i].periodo_iniziale),  #8 - periodo iniziale
                str(self.DATA_LIST[i].fase_iniziale),  #9 - fase iniziale
                str(self.DATA_LIST[i].periodo_finale
                    ),  #10 - periodo finale iniziale
                str(self.DATA_LIST[i].fase_finale),  #11 - fase finale
                str(self.DATA_LIST[i].scavato),  #12 - scavato
                str(self.DATA_LIST[i].attivita),  #13 - attivita
                str(self.DATA_LIST[i].anno_scavo),  #14 - anno scavo
                str(self.DATA_LIST[i].metodo_di_scavo),  #15 - metodo
                str(self.DATA_LIST[i].inclusi),  #16 - inclusi
                str(self.DATA_LIST[i].campioni),  #17 - campioni
                str(self.DATA_LIST[i].rapporti),  #18 - rapporti
                str(self.DATA_LIST[i].data_schedatura),  #19 - data schedatura
                str(self.DATA_LIST[i].schedatore),  #20 - schedatore
                str(self.DATA_LIST[i].formazione),  #21 - formazione
                str(self.DATA_LIST[i].stato_di_conservazione
                    ),  #22 - conservazione
                str(self.DATA_LIST[i].colore),  #23 - colore
                str(self.DATA_LIST[i].consistenza),  #24 - consistenza
                str(self.DATA_LIST[i].struttura),  #25 - struttura
                str(quota_min),  #26 - quota_min
                str(quota_max),  #27 - quota_max
                str(piante),  #28 - piante
                str(self.DATA_LIST[i].documentazione)  #29 - documentazione
            ])

        return data_list

    def generate_list_periodizzazione_pdf(self):
        periodo = ""
        fase = ""
        cron_iniz = ""
        cron_fin = ""

        data_list = []
        for i in range(len(self.DATA_LIST)):

            if self.DATA_LIST[i].periodo == None:
                periodo = ""
            else:
                periodo = str(self.DATA_LIST[i].periodo)

            if self.DATA_LIST[i].fase == None:
                fase = ""
            else:
                fase = str(self.DATA_LIST[i].fase)

            if self.DATA_LIST[i].cron_iniziale == None:
                cron_iniz = ""
            else:
                cron_iniz = str(self.DATA_LIST[i].cron_iniziale)

            if self.DATA_LIST[i].cron_finale == None:
                cron_fin = ""
            else:
                cron_fin = str(self.DATA_LIST[i].cron_finale)

            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                str(periodo),  #2 - Area
                str(fase),  #3 - US
                str(cron_iniz),  #4 - definizione stratigrafica
                str(cron_fin),  #5 - definizione intepretata
                str(self.DATA_LIST[i].datazione_estesa),  #6 - descrizione
                str(self.DATA_LIST[i].descrizione)  #7 - interpretazione
            ])
        return data_list

    def generate_list_struttura_pdf(self):
        data_list = []

        for i in range(len(self.DATA_LIST)):
            sito = str(self.DATA_LIST[i].sito)
            sigla_struttura = ('%s%s') % (
                str(self.DATA_LIST[i].sigla_struttura),
                str(self.DATA_LIST[i].numero_struttura))

            res_strutt = self.DB_MANAGER.query_bool(
                {
                    "sito": "'" + str(sito) + "'",
                    "struttura": "'" + str(sigla_struttura) + "'"
                }, "US")
            us_strutt_list = []
            if bool(res_strutt) == True:
                for rs in res_strutt:
                    us_strutt_list.append(
                        [str(rs.sito),
                         str(rs.area),
                         str(rs.area)])

            quote_strutt = []
            if bool(us_strutt_list) == True:
                for sing_us in us_strutt_list:
                    res_quote_strutt = self.DB_MANAGER.select_quote_from_db_sql(
                        sing_us[0], sing_us[1], sing_us[2])
                    if bool(res_quote_strutt) == True:
                        for sing_us in res_quote_strutt:
                            sing_quota_value = str(sing_us[5])
                            if sing_quota_value[0] == '-':
                                sing_quota_value = sing_quota_value[:7]
                            else:
                                sing_quota_value = sing_quota_value[:6]

                            sing_quota = [sing_quota_value, sing_us[4]]
                            quote_strutt.append(sing_quota)
                        quote_strutt.sort()

            if bool(quote_strutt) == True:
                quota_min_strutt = '%s %s' % (quote_strutt[0][0],
                                              quote_strutt[0][1])
                quota_max_strutt = '%s %s' % (quote_strutt[-1][0],
                                              quote_strutt[-1][1])
            else:
                quota_min_strutt = "Non inserita su GIS"
                quota_max_strutt = "Non inserita su GIS"

            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                str(self.DATA_LIST[i].sigla_struttura),  #2 -  sigla struttura
                int(self.DATA_LIST[i].numero_struttura),  #3 - numero struttura
                str(self.DATA_LIST[i].categoria_struttura),  #4 - categoria
                str(self.DATA_LIST[i].tipologia_struttura),  #5 - tipologia
                str(self.DATA_LIST[i].definizione_struttura),  #6 - definizione
                str(self.DATA_LIST[i].descrizione),  #7 - descrizione
                str(self.DATA_LIST[i].interpretazione),  #7 - iintepretazione
                str(self.DATA_LIST[i].periodo_iniziale),  #8 - periodo iniziale
                str(self.DATA_LIST[i].fase_iniziale),  #9 - fase iniziale
                str(self.DATA_LIST[i].periodo_finale),  #10 - periodo finale
                str(self.DATA_LIST[i].fase_finale),  #11 - fase finale
                str(self.DATA_LIST[i].datazione_estesa
                    ),  #12 - datazione estesa
                str(self.DATA_LIST[i].materiali_impiegati
                    ),  #13 - materiali impiegati
                str(self.DATA_LIST[i].elementi_strutturali
                    ),  #14 - elementi strutturali
                str(self.DATA_LIST[i].rapporti_struttura
                    ),  #15 - rapporti struttura
                str(self.DATA_LIST[i].misure_struttura),  #16 - misure
                quota_min_strutt,  #17 - quota min
                quota_max_strutt  #18 - quota max
            ])
        return data_list

    def generate_list_reperti_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):
            data_list.append([
                str(self.DATA_LIST[i].id_invmat),  #1 - id_invmat
                str(self.DATA_LIST[i].sito),  #2 - sito
                int(self.DATA_LIST[i].numero_inventario
                    ),  #3 - numero_inventario
                str(self.DATA_LIST[i].tipo_reperto),  #4 - tipo_reperto
                str(self.DATA_LIST[i].criterio_schedatura
                    ),  #5 - criterio_schedatura
                str(self.DATA_LIST[i].definizione),  #6 - definizione
                str(self.DATA_LIST[i].descrizione),  #7 - descrizione
                str(self.DATA_LIST[i].area),  #8 - area
                str(self.DATA_LIST[i].us),  #9 - us
                str(self.DATA_LIST[i].lavato),  #10 - lavato
                str(self.DATA_LIST[i].nr_cassa),  #11 - nr_cassa
                str(self.DATA_LIST[i].luogo_conservazione
                    ),  #12 - luogo_conservazione
                str(self.DATA_LIST[i].stato_conservazione
                    ),  #13 - stato_conservazione
                str(self.DATA_LIST[i].datazione_reperto
                    ),  #14 - datazione_reperto
                str(self.DATA_LIST[i].elementi_reperto
                    ),  #15 - elementi_reperto
                str(self.DATA_LIST[i].misurazioni),  #16 - misurazioni
                str(self.DATA_LIST[i].rif_biblio),  #17 - rif_biblio
                str(self.DATA_LIST[i].tecnologie),  #18 - misurazioni
                str(self.DATA_LIST[i].tipo),  #19 - tipo
                str(self.DATA_LIST[i].corpo_ceramico),  #20 - corpo_ceramico
                str(self.DATA_LIST[i].rivestimento)  #21- rivestimento
            ])
        return data_list

    def generate_list_individui_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):
            data_list.append([
                str(self.DATA_LIST[i].sito),  #1 - Sito
                int(self.DATA_LIST[i].area),  #2 - Area
                int(self.DATA_LIST[i].us),  #3 - us
                int(self.DATA_LIST[i].nr_individuo),  #4 -  nr individuo
                str(self.DATA_LIST[i].data_schedatura),  #5 - data schedatura
                str(self.DATA_LIST[i].schedatore),  #6 - schedatore
                str(self.DATA_LIST[i].sesso),  #7 - sesso
                str(self.DATA_LIST[i].eta_min),  #8 - eta' minima
                str(self.DATA_LIST[i].eta_max),  #9- eta massima
                str(self.DATA_LIST[i].classi_eta),  #10 - classi di eta'
                str(self.DATA_LIST[i].osservazioni)  #11 - osservazioni
            ])
        return data_list

    def generate_list_tafonomia_pdf(self):
        data_list = []
        for i in range(len(self.DATA_LIST)):
            sito = str(self.DATA_LIST[i].sito)
            nr_individuo = str(self.DATA_LIST[i].nr_individuo)
            sigla_struttura = ('%s%s') % (str(
                self.DATA_LIST[i].sigla_struttura),
                                          str(self.DATA_LIST[i].nr_struttura))

            res_ind = self.DB_MANAGER.query_bool(
                {
                    "sito": "'" + str(sito) + "'",
                    "nr_individuo": "'" + str(nr_individuo) + "'"
                }, "SCHEDAIND")
            #res = db.query_distinct('INVENTARIO_MATERIALI',[['sito','"Sito archeologico"']], ['area', 'us'])
            us_ind_list = []
            if bool(res_ind) == True:
                for ri in res_ind:
                    us_ind_list.append(
                        [str(ri.sito), str(ri.area),
                         str(ri.us)])

            quote_ind = []
            if bool(us_ind_list) == True:
                res_quote_ind = self.DB_MANAGER.select_quote_from_db_sql(
                    us_ind_list[0][0], us_ind_list[0][1], us_ind_list[0][2])

                for sing_us in res_quote_ind:
                    sing_quota_value = str(sing_us[5])
                    if sing_quota_value[0] == '-':
                        sing_quota_value = sing_quota_value[:7]
                    else:
                        sing_quota_value = sing_quota_value[:6]

                    sing_quota = [sing_quota_value, sing_us[4]]
                    quote_ind.append(sing_quota)
                quote_ind.sort()

            if bool(quote_ind) == True:
                quota_min_ind = '%s %s' % (quote_ind[0][0], quote_ind[0][1])
                quota_max_ind = '%s %s' % (quote_ind[-1][0], quote_ind[-1][1])
            else:
                quota_min_ind = "Non inserita su GIS"
                quota_max_ind = "Non inserita su GIS"

            ##########################################################################

            res_strutt = self.DB_MANAGER.query_bool(
                {
                    "sito": "'" + str(sito) + "'",
                    "struttura": "'" + str(sigla_struttura) + "'"
                }, "US")
            #res = db.query_distinct('INVENTARIO_MATERIALI',[['sito','"Sito archeologico"']], ['area', 'us'])
            us_strutt_list = []
            if bool(res_strutt) == True:
                for rs in res_strutt:
                    us_strutt_list.append(
                        [str(rs.sito),
                         str(rs.area),
                         str(rs.area)])

            quote_strutt = []
            if bool(us_strutt_list) == True:
                for sing_us in us_strutt_list:
                    res_quote_strutt = self.DB_MANAGER.select_quote_from_db_sql(
                        sing_us[0], sing_us[1], sing_us[2])
                    if bool(res_quote_strutt) == True:
                        for sing_us in res_quote_strutt:
                            sing_quota_value = str(sing_us[5])
                            if sing_quota_value[0] == '-':
                                sing_quota_value = sing_quota_value[:7]
                            else:
                                sing_quota_value = sing_quota_value[:6]

                            sing_quota = [sing_quota_value, sing_us[4]]
                            quote_strutt.append(sing_quota)
                        quote_strutt.sort()

            if bool(quote_strutt) == True:
                quota_min_strutt = '%s %s' % (quote_strutt[0][0],
                                              quote_strutt[0][1])
                quota_max_strutt = '%s %s' % (quote_strutt[-1][0],
                                              quote_strutt[-1][1])
            else:
                quota_min_strutt = "Non inserita su GIS"
                quota_max_strutt = "Non inserita su GIS"

            data_list.append([
                str(self.DATA_LIST[i].sito),  #0 - Sito
                str(self.DATA_LIST[i].nr_scheda_taf),  #1 - numero scheda taf
                str(self.DATA_LIST[i].sigla_struttura),  #2 - sigla struttura
                str(self.DATA_LIST[i].nr_struttura),  #3 - nr struttura
                str(self.DATA_LIST[i].nr_individuo),  #4 - nr individuo
                str(self.DATA_LIST[i].rito),  #5 - rito
                str(self.DATA_LIST[i].descrizione_taf),  #6 - descrizione
                str(self.DATA_LIST[i].interpretazione_taf
                    ),  #7 - interpretazione
                str(self.DATA_LIST[i].segnacoli),  #8 - segnacoli
                str(self.DATA_LIST[i].canale_libatorio_si_no
                    ),  #9- canale libatorio l
                str(self.DATA_LIST[i].oggetti_rinvenuti_esterno
                    ),  #10- oggetti rinvenuti esterno
                str(self.DATA_LIST[i].stato_di_conservazione
                    ),  #11 - stato_di_conservazione
                str(self.DATA_LIST[i].copertura_tipo),  #12 - copertura tipo
                str(self.DATA_LIST[i].tipo_contenitore_resti
                    ),  #13 - tipo contenitore resti
                str(self.DATA_LIST[i].orientamento_asse
                    ),  #14 - orientamento asse
                self.DATA_LIST[i].orientamento_azimut,  #15 orientamento azimut
                str(self.DATA_LIST[i].corredo_presenza
                    ),  #16-  corredo presenza
                str(self.DATA_LIST[i].corredo_tipo),  #17 - corredo tipo
                str(self.DATA_LIST[i].corredo_descrizione
                    ),  #18 - corredo descrizione
                self.DATA_LIST[i].
                lunghezza_scheletro,  #19 - lunghezza scheletro
                str(self.DATA_LIST[i].posizione_cranio
                    ),  #20 - posizione cranio
                str(self.DATA_LIST[i].posizione_scheletro
                    ),  #21 - posizione cranio
                str(self.DATA_LIST[i].posizione_arti_superiori
                    ),  #22 - posizione arti superiori
                str(self.DATA_LIST[i].posizione_arti_inferiori
                    ),  #23 - posizione arti inferiori
                str(self.DATA_LIST[i].completo_si_no),  #24 - completo
                str(self.DATA_LIST[i].disturbato_si_no),  #25- disturbato
                str(self.DATA_LIST[i].in_connessione_si_no
                    ),  #26 - in connessione
                str(self.DATA_LIST[i].caratteristiche),  #27 - caratteristiche
                str(self.DATA_LIST[i].periodo_iniziale
                    ),  #28 - periodo iniziale
                str(self.DATA_LIST[i].fase_iniziale),  #29 - fase iniziale
                str(self.DATA_LIST[i].periodo_finale),  #30 - periodo finale
                str(self.DATA_LIST[i].fase_finale),  #31 - fase finale
                str(self.DATA_LIST[i].datazione_estesa
                    ),  #32 - datazione estesa
                str(self.DATA_LIST[i].misure_tafonomia
                    ),  #33 - misure tafonomia
                quota_min_ind,  #34 - quota min individuo
                quota_max_ind,  #35 - quota max individuo
                quota_min_strutt,  #36 - quota min struttura
                quota_max_strutt  #37 - quota max struttura
            ])

        return data_list