[genropy] Re: BagGrid

  • From: Luigi Renna <luigi@xxxxxxxxxxxxx>
  • To: genropy@xxxxxxxxxxxxx
  • Date: Tue, 10 Jan 2017 21:37:37 +0100

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

Other related posts: