Home > Fantacalcio, pylons, python > Pylons: Fantamanager parte 4 – update giocatori

Pylons: Fantamanager parte 4 – update giocatori

26 Ottobre 2011

<part_3
Vorrei inserire nella pagina “Squadre”, la possibilità di fare l’update del database,
in modo da avere il giocatori e le squadre di appartenenza, sempre aggiornati.

Per prima cosa creo il controller che si occuperà di leggere il file di ingresso per
poi passarlo all’action che aggiornerà il database:

paster controller upload

Inserisco un form nella template ..FantaManagerfantamanagertemplatesderivedseriea.mako:

&lt;%inherit file=&quot;/base/base.mako&quot; /&gt;

&lt;%def name=&quot;title()&quot;&gt;Teams&lt;/%def&gt;
&lt;%def name=&quot;heading()&quot;&gt;&lt;/%def&gt;
&lt;%def name=&quot;head_tags()&quot;&gt;&lt;/%def&gt;

&lt;p&gt;Squadre Serie A&lt;/p&gt;

&lt;ul&gt;
% for squadra in c.squadre:
	&lt;li&gt;&lt;a href=&quot;/team/${squadra}&quot;&gt;${squadra}&lt;/a&gt;&lt;/li&gt;
% endfor
&lt;/ul&gt;

&lt;%def name=&quot;footer()&quot;&gt;
	&lt;h1&gt;Upgrade Players&lt;/h1&gt;

	${h.form(h.url(controller='upload', action='upload'), multipart=True)}
			MCC file: ${h.file('mccfile')} &lt;br /&gt;
	${h.submit('submit', 'Upgrade')}
	${h.end_form()}

&lt;/%def&gt;

la parte che mi interessa è:

${h.form(h.url(controller='upload', action='upload'), multipart=True)}
			MCC file: ${h.file('mccfile')} &lt;br /&gt;
	${h.submit('submit', 'Upgrade')}
	${h.end_form()}

e sopratutto il context_object h.file(‘mccfile’), che richiamerò nel controller al
momento del “submit”.
Utilizzando parecchi helpers (h.) all’interno del template, è necessario fare le
dovute importazioni, nel modulo FantaManagerfantamanagerlibhelpers:

from webhelpers.html.tags import file

from webhelpers.html.tags import stylesheet_link
from webhelpers.html.tags import link_to
from webhelpers.html import escape, HTML, literal, url_escape
from webhelpers.html.tags import *
from pylons import url

Ora occupiamoci del controller FantaManagerfantamanagercontrollersupload.py

import logging

import fantamanager.lib.helpers as h


from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect
from fantamanager.model.models import Giocatore
from fantamanager.lib.base import BaseController, render
from fantamanager.extra.FileBrowser import FileBrowser
import fantamanager.model.meta as meta

from repoze.what.predicates import not_anonymous, has_permission
from repoze.what.plugins.pylonshq import ActionProtector


log = logging.getLogger(__name__)

class UploadController(BaseController):

    @ActionProtector(has_permission('admin'))
    def upload(self):
        def get_flag_role(idg):
            &quot;&quot;&quot;get the role, by idgaz&quot;&quot;&quot;
            if idg &lt; 200:
                role = 'portiere'
            elif idg &gt; 200 and idg &lt; 500:
                role = 'difensore'
            elif idg &gt; 500 and idg &lt; 800:
                role = 'ccampista'
            else:
                role = 'attaccante'
            return role
        mccfile = request.POST['mccfile']
        file_in = mccfile.file
        if file_in != None:
            file_in.seek(0)
            for line in file_in.readlines():
                val = line.split('|')
                try:
                    idr = int(val[0])
                except ValueError:
                    idr = int(val[0].replace('xefxbbxbf', ''))
                
                role = get_flag_role(idr)
                nomev = val[2].decode('utf-8').replace('&quot;', '')
                squadrav = val[3].replace('&quot;', '')
                play_in = meta.Session.query(Giocatore).filter(
                                                Giocatore.idgaz == idr).first()
                if play_in == None:
                    log.info(&quot; &lt;&lt;&lt;&lt; assente giocatore con idgaz = %s&quot; % idr)
                    valore = int(val[27].rstrip())
                    player = Giocatore()
                    player.idgaz = idr
                    player.nome = nomev
                    player.squadra = squadrav
                    player.valore = valore
                    player.ruolo = role
                    meta.Session.add(player)
                else:
                    log.info(&quot; ++++ aggiorno giocatore con idgaz = %s&quot; % idr)
                    player = meta.Session.query(Giocatore).filter(
                                                Giocatore.idgaz == idr).first()
                    player.idgaz = idr
                    player.nome = nomev
                    player.squadra = squadrav
                    player.valore = int(val[27])
                    player.ruolo = role
            meta.Session.commit()
            file_in.close()
            log.info(&quot;core&gt; dati inseriti con successo&quot;)
            session['flash'] = 'Players successfully updated.'
            session.save()
        else:
            log.info(&quot;core&gt; Nessun dato da salvare&quot;)
        redirect(url(controller = 'seriea', action = 'squadre'))

Il context_object (catturata dalla pagina con il codice della template) lo utilizziamo qui:

        mccfile = request.POST['mccfile']

poco prima del redirect, abbiamo salvato nella session (un dizionario), alla chiave ‘flash’, il messaggio
che desideriamo far apparire ad update avvenuto (come descritto nel pylons book).
Poi abbiamo salvato la session con il metodo save().

            session['flash'] = 'Players successfully updated.'
            session.save()

Perchè il flash-message funzioni, bisogna innanzitutto importare la session all’interno del controller:

from pylons import session

Poi editiamo la template base, dal quale ereditano tutte le altre template, e modifichiamo il codice:

## -*- coding: utf-8 -*-
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot;
&quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;

&lt;html&gt;
	&lt;head&gt;
	  &lt;title&gt;${self.title()}&lt;/title&gt;
	  ${self.head()}
	&lt;/head&gt;
&lt;h1&gt;Fantacalcio Manager&lt;/h1&gt;
	&lt;body&gt;
		${self.header()}
		${self.tabs()}
		${self.menu()}
		${self.heading()}
		${self.breadcrumbs()}
		${self.flash()}
		${next.body()}
		${self.footer()}
	&lt;/body&gt;
&lt;/html&gt;

&lt;%def name=&quot;title()&quot;&gt;Fantacalcio Manager&lt;/%def&gt;
&lt;%def name=&quot;head()&quot;&gt;${h.stylesheet_link(h.url('/css/main.css'))}&lt;/%def&gt;

&lt;%def name=&quot;header()&quot;&gt;&lt;a name=&quot;top&quot;&gt;&lt;/a&gt;&lt;/%def&gt;
&lt;%def name=&quot;tabs()&quot;&gt;&lt;/%def&gt;
&lt;%def name=&quot;menu()&quot;&gt;&lt;/%def&gt;
&lt;%def name=&quot;heading()&quot;&gt;&lt;h1&gt;${c.heading or 'No Title'}&lt;/h1&gt;&lt;/%def&gt;
&lt;%def name=&quot;breadcrumbs()&quot;&gt;&lt;/%def&gt;
&lt;%def name=&quot;footer()&quot;&gt;&lt;p&gt;&lt;a href=&quot;#top&quot;&gt;Top ^&lt;/a&gt;&lt;/p&gt;&lt;/%def&gt;

&lt;%def name=&quot;flash()&quot;&gt;
	% if session.has_key('flash'):
	&lt;div id=&quot;flash&quot;&gt;&lt;p&gt;${session.get('flash')}&lt;/p&gt;&lt;/div&gt;
	&lt;%
	del session['flash']
	session.save()
	%&gt;
	% endif
&lt;/%def&gt;

definiamo la funzione flash all’interno della template

		${self.flash()}

, subito prima del body, con il seguente codice:

&lt;%def name=&quot;flash()&quot;&gt;
	% if session.has_key('flash'):
	&lt;div id=&quot;flash&quot;&gt;&lt;p&gt;${session.get('flash')}&lt;/p&gt;&lt;/div&gt;
	&lt;%
	del session['flash']
	session.save()
	%&gt;
	% endif
&lt;/%def&gt;

e inseriamo nel file FantaManagerfantamanagerpubliccssmain.css, lo
stile desiderato per l’evidenziazione del nostro flash-message:

#flash {
background: #ffc;
padding: 5px;
border: 1px dotted #000;
margin-bottom: 20px;
}
#flash p { margin: 0px; padding: 0px; }

Ora, quando la action upload (del controller upload), viene chiamata (premendo il pulsante upgrade),
dopo tutte le operazioni effettuate sul file, compreso l’aggiornamento del database,
il messaggio ‘Players successfully updated.’ viene salvato nella session e avviene il redirect alla
template squadre.mako

redirect(url(controller = 'seriea', action = 'squadre'))

Siccome la template squadre.mako eredita da base.mako, prima del viene eseguita la funzione flash.
Tale funzione flash, controlla che nella session sia presente la chiave flash (sì!), ne memorizza il
valore associato alla chiave (in nostro messaggio), cancella la chiave ‘flash’ e salva la
session (per pulirla).
Il messaggio viene quindi visualizzato dalla template figlia (squadre.mako).
Se effettuiamo inoltre un refresh della pagina, il flash-message sparisce, poichè la session
viene ripulita come ultima operazione.

Categorie:Fantacalcio, pylons, python Tag:
I commenti sono chiusi.