Code refactoring

This commit is contained in:
Sergey Kalinin 2017-03-22 17:17:46 +03:00
parent bf02a7f567
commit 2c34632dd1
2 changed files with 222 additions and 65 deletions

102
dm.py
View File

@ -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()

183
gui.py
View File

@ -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("<B>Таблица: " + 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("<B>Таблица: " + 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 = '<b>' + item + '</b>'
tblDataWidget.setHorizontalHeaderItem(n, QTableWidgetItem(fDescr))
n = n + 1
n = 0