Passa ai contenuti principali

Ricerca Rubrica per Plone

Ultimamente mi sono dedicato allo studio di diversi CMS. Una delle prime scelte, attratto dalle potenzialità e dal sistema interno di sicurezza è caduta su Plone [1]. Plone è un prodotto che poggia principalmente sul server Zope[2] ed è scritto interamente in Python. A differenza della maggior parte dei CMS che poggiano sulla piattaforma data dall'accoppiata Apache + MySQL + PHP questo CMS poggia sull'unico blocco Zope.Quello che ho provato a fare e che voglio condividere è la seguente cosa. In una rete intranet abbiamo l'esigenza di condividere e dare una certa versatilità alla rubrica dei numeri interni. Fino adesso si è usato un file excel.L'idea è quindi quella di recuperare i dati dal file xls preventivamente salvato con estensione csv (comma separeted virgola) e andare a cercare con espressioni regolari quello che ci serve.Dobbiamo usare un form in termine html e una pagina per l'elaborazione del risultato. In Plone dobbiamo creare un controller page template con le istruzioni del form e farlo puntare ad un external method scritto in Python. Tutto questo lo facciamo da ZMI, l'interfaccia di controllo di Zope. Non sono molto dettagliato perchè le basi sono tutte contenute nell'ottima guida The Definitive Guide to Plone (in versione online [3]).Quello che mi interessa è mostrare il codice python che potrebbe tornare utile anche a voi.
Notate che dovrete creare un external method per ogni funzione dello script qui sotto che vorrete usare. Ricerca per area e per ufficio è un esempio su come restringere il campo di ricerca.



#/usr/bin/python -w
# v.0.0.4
# Giuseppe Caliendo
#
# script per la ricerca da un file csv i dati relativi ai numeri di telefono di un dipendente
# questo script e' pensato per girare sul server ZOPE e per essere integrato nel CMS Plone
#
# www.plone.org
#

# MODULI IMPORTATI ################################################
import string # gestione stringhe
import re # gestione espressione regolari

# COSTANTI ######################################################
BACK="http://172.24.200.45/centralino" # indirizzo della pagina da dove si proviene
PATH="C:/Programmi/Plone 2/Data/Extensions/rubrica.csv" # path che punta al file csv della rubrica
SEPARATORE = ';' # carattere di separazione per i file csv

# flag di ricerca e del file csv della rubrica
COGNOME = 0
NOME = 1
AREA = 2
UFFICIO = 3
SEDE = 4
NUMERO = 5
CELLULARE = 6

#per la GUI
STILE = # codice stile

# CODICE ##########################################################

# METODI DI RICERCA

# ricerca_libera
# scandisce tutto il file csv e trova tutti i match del file
def cerca(query):
#variabili
result_set = [] # array per contenere i dati della query di ricerca
# apro il file della rubrica
rubrica = open(PATH,"r")
# metto l'intero file riga per riga in un array
righe = rubrica.readlines()
#chiudo il file della rubrica
rubrica.close()

# cerco liberamente nell'arrary scandendolo, se trovo una sottostringa la metto in un array
for i in righe:
 # faccio una ricerca non case-sensitive
 if re.search(query,i,re.I):
  result_set.append(i)
# passo al metodo di formattazione i risultati
return risultato(result_set)

# ricerca per area
def cerca_area(query):
tmp = cerca_dettaglio(query,AREA)
return risultato(tmp)

# ricerca per ufficio
def cerca_ufficio(query):
tmp = cerca_dettaglio(query,UFFICIO)
return risultato(tmp)

# ricerca per dettaglio
def cerca_dettaglio(query,flag):
#variabili
result_set = [] # array con i risultati
# apro il file della rubrica
rubrica = open(PATH,"r")
# metto l'intero file riga per riga in un array
righe = rubrica.readlines()
#chiudo il file della rubrica
rubrica.close()

# analizzo riga per riga
for r in righe:
 # separo il contenuto della riga in campi
 campi = r.rsplit(SEPARATORE)
 # a seconda del flag scelto imposto la ricerca, se trovo nel campo cercato il valore di query allora inserisco l'intera riga in result_set
 if flag == AREA: # caso ricerca per area
  if re.search(query,campi[AREA],re.I):
   result_set.append(r)
 if flag == UFFICIO: # caso ufficio
  if re.search(query,campi[UFFICIO],re.I):
   result_set.append(r)
return result_set

# FORMATTAZIONE RISULTATO

# risultato
# metodo per formattare la pagina
# scandite l'array del risultato e costruite una pagina HTML


[1] http://www.plone.org/
[2] http://www.zope.it/
[3] http://docs.neuroinf.de/PloneBook/

Post popolari in questo blog

Se excel non aggiorna le formule

Oggi in ufficio è capitata una richiesta particolare. In un documento excel dopo aver eseguito un copia-incolla di una formula non si aggiornavano i risultati nelle celle interessate. Dopo attimi di perplessità dal fondo dell'ufficio il capo ci illumina con una funzione ai più sconosciuta e che ha risolto il problema: il tasto F9. Scusate la mia ignoranza in excel ma questo blog è pensato proprio per appuntare esperienze di vita informatica. Tutto sta nel fatto che i "calcolatori d'un tempo" non disponevano di una adeguata potenza di calcolo e nelle operazioni di copia-incolla si verificavano lunghe attese per l'aggiornamento. La soluzione adottata da MS è stata quella di inserire un'opzione per impedire l'aggiornamento automatico e forzarlo con una combinazione di tasti... il tasto F9!
Combinazioni utili per il calcolo delle formule F9 = calcola le formule modificate dall'ultimo calcolo in tutte le cartelle e fogli di lavoro aperte. MAIUSC + F9 = c…

Riflessioni sull'ordinamento

Gli algoritmi di ordinamento sono da sempre i più gettonati e interessanti dal punto di vista didattico (si veda la complessità computazionale) e funzionale (quasi tutti i programmi hanno almeno una funzione di ricerca). Proprio di questi giorni sono alcuni articoli di Programmazione.it dedicati a questo tema (link).Coding Horror in questo articolo presenta una provocazione molto interessante al di là delle opinioni personali:

The default sort functions in almost every programming language are poorly
suited for human consumption.
L'articolo pone l'attenzione sulla differenza tra l'ordinamento alfanumerico e quello ASCII solitamente usato nei metodi nativi dei linguaggi. Il discorso si ampia se poi pensiamo banalmente alla differenza tra Windows e GNU/Linux che è case sensitive.
Spesso i sistemi operativi e i linguaggi di programmazione realizzano ordinamenti rispettando l'ordine della tabella di codifica ASCII e non l'ordinamento naturale della lingua. I commenti a se…

Timeline dei Linguaggi di programmazione

O'Reilly ha reso disponibile per tutti gli appassionati un interessante poster in formato pdf in cui vengono riassunti 50 anni di storia dei linguaggi di programmazione.Il poster mostra una timeline colorata nella quale sono evidenziate le principali derivazioni tra i vari linguaggi... da vedere
http://www.oreilly.com/news/graphics/prog_lang_poster.pdf



fonte programmazione.it