diff --git a/dm.py b/dm.py index 548366f..f8c71b2 100644 --- a/dm.py +++ b/dm.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -import json, os, configparser, shutil +import json, os, configparser, shutil, re +from datetime import datetime, date, time def firstInit(): # Инициализация переменныхб создание конфигруационного файла, копирование шаблонов @@ -83,6 +84,7 @@ def dbConnect(): exit() #print(conn) c = conn.cursor() + return c def createTables(tbl_list): @@ -118,8 +120,9 @@ def createTables(tbl_list): tbl_list[i]["fieldList"][x]["fType"] + auto_increment if tbl_list[i]["fieldList"][x]["index"] == "PRIMARY KEY": index = "PRIMARY KEY(" + tbl_list[i]["fieldList"][x]["fName"] + ")" - field_names_list.append(tbl_list[i]["fieldList"][x]["fDescription"]) - struct_fields_list.append(tbl_list[i]["fieldList"][x]["fName"]) + field_names_list.append([tbl_list[i]["fieldList"][x]["fName"], tbl_list[i]["fieldList"][x]["fDescription"]]) + #struct_fields_list.append(tbl_list[i]["fieldList"][x]["fName"]) + struct_fields_list.append([tbl_list[i]["fieldList"][x]["fName"], fieldTypeConvert(tbl_list[i]["fieldList"][x]["fType"]), ]) if tbl_list[i]["fieldList"][x]["relation"]: relation_list=[tbl_list[i]["fieldList"][x]["fName"]] relation_list.append(tbl_list[i]["fieldList"][x]["relation"]) @@ -156,6 +159,7 @@ def selectData(tbl): for item in tbl_struct_list: if item[0] == tbl: for field in item[1]: + field = field[0] qwery = qwery + field + "," for rel in item[2]: field = rel[0] @@ -182,16 +186,104 @@ def selectData(tbl): qwery = qwery.rstrip(',') + " FROM " + tbl + " LIMIT 10000" #print(qwery) c.execute(qwery) - return c.fetchall() # получаем на вход имя таблицы и возвращаем список заголовков полей def getTableStructure(tbl): - global tbl_descr_list + global tbl_descr_list, tbl_struct_list + #print(tbl_descr_list) + #print(tbl_struct_list) for item in tbl_descr_list: if item[0] == tbl: return item[1] +# Получаем список названий полей и типов для заданной таблицы +def getFields(tbl): + global tbl_descr_list, tbl_struct_list + #print(tbl_descr_list) + #print(tbl_struct_list) + for item in tbl_struct_list: + if item[0] == tbl: + #print(item[1]) + return item[1] +# Ищем описание поля по его названию и возвращаем. +def getFieldDescription(tbl, field): + global tbl_descr_list, tbl_struct_list + for item in tbl_descr_list: + if item[0] == tbl: + for i in item[1]: + if i[0] == field: + fName = i[1] + return fName + return "null" + +def fieldTypeConvert(ftype): + # разбираем строку на тип и длину + ftype = str.lower(ftype) + line = re.search("(.+?)\(([0-9]+)\)", ftype) + if line: + fType = line.groups()[0] + fLength = line.groups()[1] + if fType == 'int' or fType == 'integer': + fType = 'integer' + elif fType == 'char' or fType == 'varchar': + fType = 'character' + else: + fType = ftype + return fType + +def getFieldType(tbl, field): + global tbl_descr_list, tbl_struct_list + #print(tbl_descr_list) + #print(tbl_struct_list) + for item in tbl_struct_list: + if item[0] == tbl: + for i in item[1]: + if i[0] == field: + fType = i[1] + return fType + #print(item[1]) + #return item[1] + +# добавление записи в БД на вход принимает список вида: +# [table [['field_1', 'значение'], ['field_2', 'значение'],....., ['field_n', 'значение']]] +def insertDataIntoBD(dataList): + global c + dbConnect() + tableName = dataList[0] + + #datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M") + + qwery = 'INSERT INTO ' + tableName + ' (' + qweryData = '' + qweryField = '' + for item in dataList[1]: + fType = getFieldType(tableName, item[0]) + #print(fType) + qweryField = qweryField + item[0] + ',' + if fType == 'integer': + qweryData = qweryData + '' + item[1] + ',' + elif fType == 'datetime': + #преобразуем дату всяко разно + dt = datetime.strptime(item[1], "%d.%m.%Y %H:%M") + item[1] = str(dt) + qweryData = qweryData + '\'' + item[1] + '\',' + elif fType == 'date': + d = item[1].split('.') + myDate = d[2] + '-' + d[1] + '-' + d[1] + item[1] = str(myDate) + qweryData = qweryData + '\'' + item[1] + '\',' + else: + qweryData = qweryData + '\'' + item[1] + '\',' + + qwery = qwery + qweryField.rstrip(',') + ')' + ' VALUES (' + qweryData.rstrip(',') + ');' + + print(qwery) + c.execute(qwery) + #c.close() + return + + #initDBstructure() firstInit() -dbConnect() \ No newline at end of file +dbConnect() diff --git a/gui.py b/gui.py index 16ba303..070fd1e 100644 --- a/gui.py +++ b/gui.py @@ -20,7 +20,7 @@ class MyTable(QTableWidget): #self.horizontalHeader().setSectionResizeMode(1) # изменение ширины столбцов по размеру текста #self.horizontalHeader().setSectionResizeMode(3) - self.horizontalHeader().setStyleSheet("color: blue;") + self.horizontalHeader().setStyleSheet("color: black; font-weight:bold; background-color: lightblue;") self.setWordWrap(True) self.setSortingEnabled(True) @@ -52,71 +52,138 @@ class MyTable(QTableWidget): print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) # Форма для добавления и редактирования -class EditForm_(QWidget): - def __init__(self, tblName, tblDescr): - super().__init__() - #scrollArea = QScrollArea() - l = QVBoxLayout() - headBox = QHBoxLayout() - lblHeader = QLabel('Таблица:' + tblDescr) - l.addLayout(headBox) - headBox.addWidget(lblHeader) - hboxBtn = QHBoxLayout() - btnOk = QPushButton('Записать') - btnOk.clicked.connect(lambda: self.function1()) - btnCancel = QPushButton('Закрыть') - btnCancel.clicked.connect(lambda: self.close()) - i=0 - while i < 30: - hboxEdit1 = QHBoxLayout() - lbl1 = QLabel(str(i)) - edit1 = QLineEdit() - #edit1.setMaxLength(30) - hboxEdit1.addWidget(lbl1) - hboxEdit1.addWidget(edit1) - l.addLayout(hboxEdit1) - i = i+1 - - hboxBtn.addWidget(btnOk) - hboxBtn.addWidget(btnCancel) - l.addLayout(hboxBtn) - - self.setWindowTitle("Добавление записи") - self.setLayout(l) - self.setFixedSize(640, 480) - #scrollArea.setWidget(self) - #self.setCentralWidget(scrollArea) - - self.show() - - class EditForm(QMainWindow): + lblList = [] + editList = [] def __init__(self, tblName, tblDescr): super().__init__() + self.tblName = tblName + self.setWindowTitle("Добавление записи") scroll_widget = QWidget() self.general_layout = QVBoxLayout() scroll_area = QScrollArea() l = QVBoxLayout() headBox = QHBoxLayout() - lblHeader = QLabel('Таблица: ' + tblDescr) + lblHeader = QLabel("Таблица: " + tblDescr) l.addLayout(headBox) + #palet = QPalette(lblHeader.palette()) + #lblHeader.setPalette(palet) headBox.addWidget(lblHeader) hboxBtn = QHBoxLayout() btnOk = QPushButton('Записать') - btnOk.clicked.connect(lambda: self.function1()) + btnOk.clicked.connect(lambda: self.save()) btnCancel = QPushButton('Закрыть') btnCancel.clicked.connect(lambda: self.close()) + # цифровой валидатор, для проверки ввода + integerRegex = QRegExp("^[0-9]+$") + integerValidator = QRegExpValidator(integerRegex, self) + # список соответствия полей и QEdit + self.widgetsList = [] + # добавляем динамически поля на форму в зависимости от типов данных + for item in dm.getFields(tblName): + #print(item) + fName = item[0] + fType = item[1] + fDescr = dm.getFieldDescription(tblName, fName) + hboxEdit = QHBoxLayout() + lbl = QLabel(fDescr) + # создаем поле ввода соответсвующее типу данных + if fType == 'datetime': + edit = QDateTimeEdit() + edit.setCalendarPopup(True) + edit.setFrame(False) + now = QDateTime.currentDateTime() + edit.setDateTime(now) + elif fType == 'date': + edit = QDateEdit() + edit.setCalendarPopup(True) + edit.setFrame(False) + now = QDate.currentDate() + edit.setDate(now) + elif fType == 'time': + edit = QTimeEdit() + edit.setCalendarPopup(True) + edit.setFrame(False) + now = QTime.currentTime() + edit.setTime(now) + elif fType == 'integer': + edit = QLineEdit() + # проверка на ввод цифр + edit.setValidator(integerValidator) + else: + edit = QLineEdit() + # создаём список полей и соответсвующих им QEdit + self.widgetsList.append([fName, edit]) + + hboxEdit.addWidget(lbl) + hboxEdit.addWidget(edit) + l.addLayout(hboxEdit) + print(self.widgetsList) + hboxBtn.addWidget(btnOk) + hboxBtn.addWidget(btnCancel) + l.addLayout(hboxBtn) + + self.general_layout.addLayout(l) + + scroll_widget.setLayout(self.general_layout) + scroll_area.setWidget(scroll_widget) + self.setCentralWidget(scroll_area) + + def save(self): + listData = [self.tblName] + listFieldData = [] + for item in self.widgetsList: + #print(item[0] + ' ' + item[1].text()) + listFieldData.append([item[0], item[1].text()]) + listData.append(listFieldData) + #print(listData) + dm.insertDataIntoBD(listData) + self.close() + + + +class EditForm_(QMainWindow): + def __init__(self, tblName, tblDescr): + super().__init__() + self.setWindowTitle("Добавление записи") + scroll_widget = QWidget() + self.general_layout = QVBoxLayout() + scroll_area = QScrollArea() + + l = QVBoxLayout() + headBox = QHBoxLayout() + lblHeader = QLabel("Таблица: " + tblDescr) + l.addLayout(headBox) + #palet = QPalette(lblHeader.palette()) + #lblHeader.setPalette(palet) + headBox.addWidget(lblHeader) + hboxBtn = QHBoxLayout() + btnOk = QPushButton('Записать') + btnOk.clicked.connect(lambda: self.save()) + btnCancel = QPushButton('Закрыть') + btnCancel.clicked.connect(lambda: self.close()) + + # ПРОВЕРКА ВВОДА, добавить в цикл генерации формы в зависимости от типа поля + # grid_layout.addWidget(QLabel("Введите IP-адрес", self), 0, 0) + # + # ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])" # Часть регулярного выржение + # # Само регулярное выражение + # ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange + "\\." + ipRange + "$") + # ipValidator = QRegExpValidator(ipRegex, self) # Валидатор для QLineEdit + # + # lineEdit = QLineEdit() + # lineEdit.setValidator(ipValidator) # Устанавливаем валидатор + i=0 for item in dm.getTableStructure(tblName): - print(item) - hboxEdit1 = QHBoxLayout() - lbl1 = QLabel(item) - edit1 = QLineEdit() - #edit1.setMaxLength(30) - hboxEdit1.addWidget(lbl1) - hboxEdit1.addWidget(edit1) - l.addLayout(hboxEdit1) + #print(item) + hboxEdit = QHBoxLayout() + lbl = QLabel(item) + edit = QLineEdit() + hboxEdit.addWidget(lbl) + hboxEdit.addWidget(edit) + l.addLayout(hboxEdit) i = i+1 hboxBtn.addWidget(btnOk) @@ -129,14 +196,8 @@ class EditForm(QMainWindow): scroll_area.setWidget(scroll_widget) self.setCentralWidget(scroll_area) - self.setWindowTitle("Добавление записи") - #self.setFixedSize(640, 480) - #scrollArea.setWidget(self) - #self.setCentralWidget(scrollArea) - - #self.show() - - + def save(self): + print(self.children()) def addDataIntoTable(tbl_descr, tblDataWidget): global tblList @@ -148,6 +209,7 @@ def addDataIntoTable(tbl_descr, tblDataWidget): data = dm.selectData(tbl_name) #print(data) fieldNames = dm.getTableStructure(tbl_name) + print(fieldNames) # проверка на наличие записей в таблице if data: # количество строк @@ -161,9 +223,12 @@ def addDataIntoTable(tbl_descr, tblDataWidget): tblDataWidget.setRowCount(rows) tblDataWidget.setColumnCount(cols) for item in fieldNames: - fieldNames = item + ',' + fName = item[0] + fDescr = item[1] + #fieldNames = item + ',' # установка заголовков столбцов таблицы - tblDataWidget.setHorizontalHeaderItem(n, QTableWidgetItem(item)) + #item = '' + item + '' + tblDataWidget.setHorizontalHeaderItem(n, QTableWidgetItem(fDescr)) n = n + 1 n = 0