Sto cercando di portare la quickgrid che mi avevate aiutare a fare sulle
baggrid, praticamente devo scegliere una sede, un anno ed un mese e
visualizzare le presenze o le assenze del mese, in un altra statistica
devo scegliere un periodo e poi visualizzare una pivot table con i
totali dei movimenti efettuati dagli utenti nel periodo.
Nella prima procedura vorrei visualizzare oltre al numero del giorno
anche il nome del giorno;
Nella seconda procedura ho messo nelle colonne tutti i tipi di
movimenti, ma per ottimizzare le query vorrei mettere solo i movimenti
realmente effettuati nel periodo, perche altrimenti dovrei fare una
query con il distinct di tutto l'archivio senza nessun where visto che
costruisco la struttura prima delle scelte.
Allego le due procedure e l'inizio della nuova con la baggrid.
Grazie Luigi
# -*- coding: UTF-8 -*-
from gnr.core.gnrbag import Bag
from gnr.core.gnrdecorator import public_method
import os
import uuid
import xlwt
import pandas as pd
class GnrCustomWebPage(object):
py_requires = 'th/th:TableHandler'
def main(self, root, **kwargs):
bc = root.borderContainer(datapath='stat_mese')
self.datiInserimento(bc.borderContainer(region='top'))
tc = bc.tabContainer(region='center', margin='2px')
self.datiPresenze(tc.contentPane(title='Presenze', region='center',
width='100%'))
def datiInserimento(self, pane):
box = pane.div(border='1px solid silver', rounded=10, margin='5px')
box.div('Statistica periodo', color='white', text_align='center',
background='silver',
rounded_top=10, font_size='14px')
fb = box.formbuilder(cols=2, border_spacing='10px',
colswidth='auto', fld_width='100%', width='100%')
fb.dateTextbox('^.data_ini', lbl='Data iniziale', period_to='.data_fin')
fb.dateTextbox('^.data_fin', lbl='Data finale',
validate_call="""if(value < GET .data_ini){return
false;}""",
validate_call_message='!!Data errata')
fb.Button('Elabora', fire=".elabora")
#fb.dataRpc('.griddata', self.getDati, data_ini='=.data_ini',
data_fin='=.data_fin',
# _fired="^.elabora", _lockScreen=True, _if='data_ini &&
data_fin')
fb.dataRpc('.griddata', self.getDati, data_ini='=.data_ini',
data_fin='=.data_fin',
_fired="^.elabora", _if='data_ini && data_fin')
fb.br()
def datiPresenze(self, pane):
grid = pane.quickGrid(value='^.griddata')
grid.column('nominativo', name='Nominativo', width='20%', edit=False)
tbl_causale = self.db.table('presenze.causale')
record_causali = tbl_causale.query(columns='descrizione',
order_by='descrizione',
group_by='descrizione',
addPkeyColumn=False).fetch()
for record in record_causali:
colonna = record['descrizione'].replace(" ", "_")
nomecolonna = record['descrizione']
grid.column(colonna, name=nomecolonna, label='nomecolonna',
width='10%', text_align='center')
grid.tools('export')
@public_method
def getDati(self, data_ini=None, data_fin=None):
tbl_presenze = self.db.table('presenze.presenza')
record_presenze = tbl_presenze.query(columns='$nominativo,
@causale_id.descrizione AS descrizione, COUNT(*) AS giorni',
addPkeyColumn=False,
order_by='nominativo,descrizione',
group_by='nominativo,descrizione',
where="$data_presenza BETWEEN
:d_ini AND :d_fin",
d_ini=data_ini,
d_fin=data_fin).fetch()
if record_presenze:
filetmp = self.site.getStaticPath('user:temp') + '\\' +
str(uuid.uuid4()) + '.xls'
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("Foglio 1")
sheet.write(0, 0, 'Nominativo')
sheet.write(0, 1, 'Causale')
sheet.write(0, 2, 'Giorni')
riga = 1
for i in record_presenze:
sheet.write(riga, 0, i['nominativo'])
sheet.write(riga, 1, i['descrizione'])
sheet.write(riga, 2, i['giorni'])
riga = riga + 1
workbook.save(filetmp)
df = pd.read_excel(filetmp)
df = pd.pivot_table(df, index=["Nominativo"], columns="Causale",
fill_value=0)
df = df['Giorni']
os.remove(filetmp)
colonne = list(df)
result = Bag()
conta = 0
for index, row in df.iterrows():
riga = Bag()
riga['nominativo'] = index
for i in range(df.shape[1]):
riga.setItem(colonne[i].replace(" ", "_"), row[i])
conta = conta + 1
result['r_%i' % conta] = riga
return result
# -*- coding: UTF-8 -*-
from gnr.core.gnrbag import Bag
from gnr.core.gnrdecorator import public_method
from calendar import monthrange
import datetime
class GnrCustomWebPage(object):
py_requires = 'th/th:TableHandler'
def main(self, root, **kwargs):
bc = root.borderContainer(datapath='stat_mese')
self.datiInserimento(bc.borderContainer(region='top'))
#tc = bc.tabContainer(region='center', margin='2px')
#self.datiPresenze(tc.contentPane(title='Presenze', region='center',
width='100%'))
def datiInserimento(self, pane):
box = pane.div(border='1px solid silver', rounded=10, margin='5px')
box.div('Statistica periodo', color='white', text_align='center',
background='silver',
rounded_top=10, font_size='14px')
fb = box.formbuilder(cols=3, border_spacing='10px',
colswidth='auto', fld_width='100%', width='100%')
anno = '2016,2017,2018'
mese =
'1:Gennaio,2:Febbraio,3:Marzo,4:Aprile,5:Maggio,6:Giugno,7:Luglio,8:Agosto,9:Settembre,10:Ottobre,11:Novembre,12:Dicembre'
fb.dbselect(value='^.sede', dbtable='presenze.sede', lbl='Sede',
hasDownArrow=True, rowcaption='$descrizione')
fb.filteringSelect('^.anno', lbl='Anno', values=anno)
fb.filteringSelect('^.mese', lbl='Mese', values=mese)
fb.Button('Elabora', fire=".elabora")
fb.dataRpc('.griddata', self.getDati, pksede='=.sede', pkanno='=.anno',
pkmese='=.mese',
_fired="^.elabora", _if='pkanno && pkmese')
fb.br()
@public_method
def getDati(self, pksede=None, pkanno=None, pkmese=None):
dd.data('struttura', self.gridstruct(pkanno, pkmese))
tbl_presenza = self.db.table('presenze.presenza')
presenze = tbl_presenza.presenzeMeseSede(pksede=pksede, pkanno=pkanno,
pkmese=pkmese)
print x
result = Bag()
conta = 0
gg = monthrange(int(pkanno), int(pkmese))[1]
for nome, giorni in presenze.items():
riga = Bag()
riga['nominativo'] = nome
for giorno in giorni:
riga.setItem('gg_%02i' % giorno['giorno'], giorno['causale'])
for giorno in range(1, gg + 1):
if datetime.date(int(pkanno), int(pkmese), giorno).weekday() ==
5 or datetime.date(int(pkanno), int(pkmese), giorno).weekday() == 6:
riga.setItem('gg_%02i' % giorno, '--')
conta = conta + 1
result['r_%i' % conta] = riga
return result
@public_method
def gridstruct(self, pkanno=None, pkmese=None):
struct = self.newGridStruct()
r = struct.view().rows()
r.fieldcell('nominativo', edit=False)
for giorni in range(1, 31 + 1):
colonna = 'gg_%02i' % giorni
nomecolonna = str(giorni) # + ' ' + gio[datetime.date(2016, 12,
giorni).weekday()]
r.cell(colonna, name=nomecolonna, edit=False)
return struct
# -*- coding: UTF-8 -*-
from gnr.core.gnrbag import Bag
from gnr.core.gnrdecorator import public_method
from calendar import monthrange
import datetime
class GnrCustomWebPage(object):
py_requires = 'th/th:TableHandler'
def main(self, root, **kwargs):
bc = root.borderContainer(datapath='stat_mese')
self.datiInserimento(bc.borderContainer(region='top'))
tc = bc.tabContainer(region='center', margin='2px')
self.datiPresenze(tc.contentPane(title='Presenze', region='center',
width='100%'))
def datiInserimento(self, pane):
box = pane.div(border='1px solid silver', rounded=10, margin='5px')
box.div('Statistica periodo', color='white', text_align='center',
background='silver',
rounded_top=10, font_size='14px')
fb = box.formbuilder(cols=3, border_spacing='10px',
colswidth='auto', fld_width='100%', width='100%')
anno = '2016,2017,2018'
mese =
'1:Gennaio,2:Febbraio,3:Marzo,4:Aprile,5:Maggio,6:Giugno,7:Luglio,8:Agosto,9:Settembre,10:Ottobre,11:Novembre,12:Dicembre'
fb.dbselect(value='^.sede', dbtable='presenze.sede', lbl='Sede',
hasDownArrow=True, rowcaption='$descrizione')
fb.filteringSelect('^.anno', lbl='Anno', values=anno)
fb.filteringSelect('^.mese', lbl='Mese', values=mese)
fb.Button('Elabora', fire=".elabora")
fb.dataRpc('.griddata', self.getDati, pksede='=.sede', pkanno='=.anno',
pkmese='=.mese',
_fired="^.elabora", _lockScreen=True, _if='pkanno && pkmese')
fb.br()
def datiPresenze(self, pane):
grid = pane.quickGrid(value='^.griddata')
grid.column('nominativo', name='Nominativo', width='55%', edit=False)
#grid.column('description',name='Description',width='30em',edit=dict(tag='quickEditor'))
#gg = monthrange(2016, 2)[1]
gio = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom']
for giorni in range(1, 31 + 1):
colonna = 'gg_%02i' % giorni
nomecolonna = str(giorni) # + ' ' + gio[datetime.date(2016, 12,
giorni).weekday()]
grid.column(colonna, name=nomecolonna, width='10%',
range_assente="value!='PR' && value!='--'",
range_assente_color='red', edit=False,
text_align='center')
grid.tools('export')
@public_method
def getDati(self, pksede=None, pkanno=None, pkmese=None):
tbl_presenza = self.db.table('presenze.presenza')
presenze = tbl_presenza.presenzeMeseSede(pksede=pksede, pkanno=pkanno,
pkmese=pkmese)
result = Bag()
conta = 0
gg = monthrange(int(pkanno), int(pkmese))[1]
for nome, giorni in presenze.items():
riga = Bag()
riga['nominativo'] = nome
for giorno in giorni:
riga.setItem('gg_%02i' % giorno['giorno'], giorno['causale'])
for giorno in range(1, gg + 1):
if datetime.date(int(pkanno), int(pkmese), giorno).weekday() ==
5 or datetime.date(int(pkanno), int(pkmese), giorno).weekday() == 6:
riga.setItem('gg_%02i' % giorno, '--')
conta = conta + 1
result['r_%i' % conta] = riga
return result