-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtablebrowse.py
188 lines (154 loc) · 6.97 KB
/
tablebrowse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Part of Dana-Cube Proyect by Werner Llácer (c) 2012-2018
Distributed according to the terms of the GNU LGPL v2.0 license or higher numbered versions.
The text of that particular version is available at https://www.gnu.org/licenses/old-licenses/lgpl-2.0.html
Please see https://github.com/wllacer/dana-cube#license for further particulars about licencing of the Dana-Cube Project
"""
from __future__ import division
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals
'''
Documentation, License etc.
@package estimaciones
# 0.3
'''
from pprint import pprint
import datetime
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QSortFilterProxyModel, QModelIndex, QSize
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QColor, QPalette
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QSplitter, QMenu, QLineEdit, QComboBox, QLabel, QPlainTextEdit
from support.datalayer.query_constructor import *
from support.datalayer.access_layer import getCursor
from support.gui.dialogs import dataEntrySheetDlg
from support.util.numeros import fmtNumber
#from admin.cubemgmt.cubeTypes import LOGICAL_OPERATOR
from base.filterDlg import filterDialog
from support.util.decorators import waiting_effects,model_change_control
from support.util.record_functions import defaultFromContext
from base.datadict import DataDict
from admin.dictmgmt.tableInfo import TableInfo
import base.config as config
from support.datalayer.querywidget import *
class TableBrowse(QueryTab):
"""
overloaded methods
"""
def __init__(self,confName=None,schema=None,table=None,pdataDict=None,iters=0):
super().__init__(None)
print('at init',iters)
if confName is None or confName == '':
return
conn = self.getConnection(pdataDict,confName,schema,table,iters)
if conn:
self.baseModel = CursorItemModel()
self.reconnect(conn)
self.executeNewScript(self.generateSQL(confName,schema,table,iters,pFilter=None))
else:
print('No pude establecer conexion')
exit()
def addContextMenuActions(self,index,fila,columna):
self.menuActions.append(self.menu.addAction("Filter query",self.filterQuery))
if fila != -1:
self.menuActions.append(self.menu.addAction("Filter query (pick this value)",lambda a=index:self.filterQueryPick(a)))
if self.areFiltered:
self.menuActions.append(self.menu.addAction("remove Filter",self.filterRemove))
self.menuActions.append(self.menu.addSeparator())
super().addContextMenuActions(index,fila,columna)
"""
specific methods for DataDict management and SQL generation
"""
def getConnection(self,pdataDict=None,confName=None,schema=None,table=None,iters=0):
if isinstance(pdataDict,DataDict):
dataDict = pdataDict
else:
dataDict=DataDict(conName=confName,schema=schema,table=table) #iters todavia no procesamos
self.localContext = (dataDict,confName,schema,table,iters)
return dataDict.conn[confName]
def generateSQL(self,confName,schema,table,iters,pFilter=None):
print('ITERACIONES',iters)
dataDict = self.localContext[0]
self.tableInfo = TableInfo(dataDict,confName=confName,schemaName=schema,tableName=table,maxlevel=iters)
sqlContext = self.tableInfo.prepareBulkSql(pFilter)
self.sqlEdit.hide()
self.baseModel.recordStructure = []
for idx,fld in enumerate(sqlContext['fields']):
self.baseModel.recordStructure.append({'name':fld,'format':sqlContext['formats'][idx]})
sqls = sqlContext['sqls']
return sqls
@waiting_effects
#@model_change_control()
def loadData(self, pconfName=None,pschema=None,ptable=None,pdataDict=None,piters=1,pFilter=None):
(dataDict,confName,schema,table,iters) = defaultFromContext(self.localContext,*(pdataDict,pconfName,pschema,ptable,piters))
self.executeNewScript(self.generateSQL(confName,schema,table,iters,pFilter=pFilter))
"""
specific context menu actions
"""
def filterRemove(self):
self.filtro = None
self.areFiltered = False
self.loadData()
pass
def filterQuery(self):
#TODO mantener en presentacion el filtro de la ultima ejecución
driver=self.localContext[0].conn[self.localContext[1]].dialect.name
self.areFiltered = True
self.filterDlg = filterDialog(self.baseModel.recordStructure,self.filtro,'Filtre por campos',self,driver=driver)
if self.filterDlg.exec_():
self.loadData(pFilter=self.filterDlg.result)
self.filtro = [ data for data in self.filterDlg.data]
def filterQueryPick(self,index):
"""
index es QModelIndex
El enredo de codigo es cuando tenemos un sort proxy y entonces los indices no
cuadran con los del modelo base y hay que hacer la traduccion esa ...
Eso si, con columnas ocultas funciona
"""
row = index.row()
column = index.column()
value = index.data(Qt.UserRole +2)
field = self.baseModel.recordStructure[column]['name']
formato = self.baseModel.recordStructure[column]['format']
#TODO esto deberia sacarse con lo del dialogo
qfmt = 't'
if formato in ('entero','numerico'):
qfmt = 'n'
elif formato in ('fecha','fechahora','hora'):
field=str(field)
qfmt = 'f'
elif formato in ('booleano'):
qfmt = 'n' #me parece
pfilter = searchConstructor('where',where=((field,'=',value,qfmt),))
self.areFiltered = True
self.loadData(pFilter=pfilter)
pass
def test(self):
return
class TableBrowserWin(QMainWindow):
def __init__(self,confName,schema,table,pdataDict=None,iters=2):
super(TableBrowserWin, self).__init__()
self.view = TableBrowse(confName,schema,table,pdataDict,iters)
if config.DEBUG:
print('inicializacion completa')
##CHANGE here
self.querySplitter = QSplitter(Qt.Horizontal)
self.querySplitter.addWidget(self.view)
#self.querySplitter.addWidget(self.view)
self.setCentralWidget(self.querySplitter)
self.setWindowTitle("Visualizador de base de datos")
if __name__ == '__main__':
# para evitar problemas con utf-8, no lo recomiendan pero me funciona
import sys
#print(sys,version_info)
if sys.version_info[0] < 3:
reload(sys)
sys.setdefaultencoding('utf-8')
app = QApplication(sys.argv)
window = TableBrowserWin('Pagila','public','rental',iters=2)
window.resize(app.primaryScreen().availableSize().width(),app.primaryScreen().availableSize().height())
window.show()
sys.exit(app.exec_())