#!/usr/bin/python
"""
dom utilityes
@since:18-feb-2005
@author:Baruffaldi Paolo
"""
__docformat__ = "epytext it"
ICON_XML_URL="/xml.png"
def dom_etichetta(tag):
if tag.getAttribute("label") >"":
return tag.getAttribute("label")
else:
return tag.getAttribute("name")
def dom_get_element_by_value(tag_list,valore_attributo,nome_attributo="name"):
"""
data una lista, torna gli elementi che hanno
un determinato attributo "name",
NON e' il getElementByTagName
"""
for a in tag_list:
if a.getAttribute(nome_attributo)==valore_attributo:
return a
raise ValueError, "nella lista passata, non esiste alcun elemento con %s='%s'" % (nome_attributo,valore_attributo)
def dom_set_icon_xml(image_url):
"""
defines the xml url
"""
global ICON_XML_URL
ICON_XML_URL = image_url
def dom_info_button(tag):
repr_tag = tag.toxml().replace("<","<").replace(">",">")
repr_tag = repr_tag.replace("=","<span style='color:red;'>=</span>")
repr_tag = repr_tag.replace("<","<span style='color:red;'><</span>")
html="""<input type='image' src='%s' value='XML'
onmouseout='this.nextSibling.style.display="none"' onmouseover='this.nextSibling.style.display="block"'
style='background-color:#880; color:white; text-align:center;'
onclick='x=window.open();x.document.write("<div style=\\"white-space:pre;\\">"+this.nextSibling.innerHTML+"</div>");x.document.close()'><div
style='opacity:0.8; display:block; position:absolute; white-space:pre; display:none;
background-color:#ffc; font-size:14;'>
%s
</div>
""" % (ICON_XML_URL,repr_tag)
return html
def dom_2sql_structure(tag):
"""
deterimina le tabelle sql
sulla base della truttura
@author:Baruffaldi Paolo
@since:14-feb-2005
@bug: trova solo i nomi tabella e i campi, non determina le chiavi
"""
tabelle = {}
for tabella in tag.getElementsByTagName("items"):
nome_tab =tabella.getAttribute("db_table")
tabelle[nome_tab]={}
for campo in tabella.getElementsByTagName("item"):
if dom_parent_by_tag_name(campo,"items") != tabella:
continue
nome_campo = campo.getAttribute("name")
tabelle[nome_tab][nome_campo]=campo
ris_txt=u"""
<html><h2>Tables for $</h2>
<style>
.tabella{margin:10px; border:solid 1px blue;}
.commento {position:absolute; left:50%; color:#080;}
.riga {position:absolute; left:0%; width:55%; border:solid 1px green; opacity:0.5; border-width:0 0 1 0;}
</style>
<span class='commento'>COMMENTO</span> SQL <span class='riga'>riga</span>
""".replace("$",dom_etichetta(tag))
k_ord=tabelle.keys()
k_ord.sort()
for a in k_ord:
ris=[]
k_ord2 =tabelle[a].keys()
k_ord2.sort()
poi = ","
for n,b in enumerate(k_ord2):
singolo = tabelle[a][b]
commento=dom_etichetta(singolo)
riga="%s %s" % (b,singolo.getAttribute("db_kind"))
if singolo.getAttribute("required")=="1":
riga+=" NOT NULL"
if n==(len(k_ord2)-1):
poi=");"
ris.append("\n\t%s%s<span class='commento'>-- %s\t</span><span class='riga'>%02d</span>"% (riga,poi,commento,n))
ris_txt+= ("<div class='tabella'>CREATE TABLE %s (" % a)+"".join(ris)+"\n</div>"
ris_txt+="</html>"
return ris_txt.encode("UTF-8")
def dom_pard_values(dom_tree,pard,tipo_intestazione=None):
"""
combina pard con dom_tree,
ottenendo la lista di tipo (chiave,valore),
se _tipo_intestazione_ == "dom"
ottengo la lista di tipo (<dom Element>,valore)
"""
ris=[]
for a in dom_tree.getElementsByTagName("item"):
nome=a.getAttribute("name")
if pard.has_key(nome):
if tipo_intestazione == "dom":
ris.append([a,pard[nome]])
else:
ris.append([nome,pard[nome]])
return ris
def dom_attr2dict(tag):
return dict(tag.attributes.items())
def dom_parent_by_tag_name(tag,nome,n=0):
"""
ritorna l'avo di tipo nome
(nodeName == _nome_)
@return: <DOM Element>
"""
if tag.parentNode.nodeName == nome:
return tag.parentNode
else:
try:
return dom_parent_by_tag_name(tag.parentNode,nome,n+1)
except:
return False
def dom_voglio_nascosto(tag,azione=None):
"""
torna True se voglio nascondere questo campo,
sulla base di hidden,
che puo' avere valore 1 o lista di stringhe (dovrebbero essere
le azioni)
"""
x=tag.getAttribute("hidden")
if x == "1":
return True
elif x in [None,"0"]:
return False
else:
if x.find(",")>0:
return azione in x.split(",")
else:
return azione == x
def dom_campo_repr(tag,valore):
"""
rappresenta il valore di un tag in html
valore = valore da rappresentare
"""
if valore == None:
return ""
str_kind=tag.getAttribute("kind")
if str_kind.find(".")>-1:
tipo = str_kind.split(".")
else:
tipo = [str_kind]
if tipo[0] == "date":
html=dttools.formatta(valore)
elif tipo[0] == "select":
valori = tag.getElementsByTagName("values")[0]
if valori.getAttribute("kind")=="xml":
html="<span class='errore'>COD. %s</span>" % valore
for op in valori.getElementsByTagName("value"):
if op.getAttribute("v") == valore:
html="<b>%s</b>" % op.getAttribute("label")
break
else:
html= valore
elif tipo[0] == "user":
if tipo[1] == "name":
url = "http://tel.mmfg.it/bin/driver?module=home&program=search&sid=32322641048634"
url+="&search_by_name=Search&nome_like=%s%s%s" % (valore[:4],"%",valore[4:])
url+="&numero=0"
html="<a href=\"%s\" target='_new' title='cerca su tel.mmfg.it'>%s</a>" % (url,valore)
else:
html="%s" % valore
return html
def dom_campo_input(a,valore=None,action=None):
"""
crea il singolo tag di input,
valore = valore da presentare
action = [None,"search","write"]
"""
act_ls=[None,"search","write"]
if not(action in act_ls):
raise ValueError, "action deve appartenere a : %r" % act_ls
tipo = a.getAttribute("kind").split(".")
if tipo[0]=="select":
html= "<select name='%(name)s'>"
valori =a.getElementsByTagName("values")[0]
if action == "search":
ls_ris=["<option value=''></option>"]
else:
ls_ris=[]
if valori.getAttribute("kind")=="xml":
for op in valori.getElementsByTagName("value"):
if op.getAttribute("v") == valore:
selected="SELECTED"
else:
selected=""
ls_ris.append(("<option value='%(v)s' %%s title='%(description)s'>%(label)s</option>" % dom_attr2dict(op)) % selected)
html+="".join(ls_ris)+"</select>"
elif tipo[0]=="date":
html="<input type='text' name='%(name)s' size='10' maxlength='10' value='%(value_is)s' %(computed)s>"
elif tipo[0]=="number":
if tipo[1]=="integer":
html="<input name='%(name)s' value='%(value_is)s' onkeyup='this.value=this.value.match(/[0-9]*/)' %(computed)s>"
elif tipo[1]=="real":
html="<input name='%(name)s' value='%(value_is)s' onkeyup='this.value=this.value.match(/[0-9]+\.?[0-9]*/)' %(computed)s>"
elif tipo[1]=="perc":
html="<input name='%(name)s' value='%(value_is)s' onkeyup='this.value=Math.min(this.value.match(/[0-9]{0,3}/),100)' size='3' %(computed)s>&perc;"
elif tipo[0]=="maxmara":
if tipo[1]== "as":
html= "<input type='text' name='%(name)s' value='%(value_is)s' size='2' onkeyup='this.value=this.value.match(/[0-9]{0,1}[1,2]{0,1}/)' %(computed)s>"
else:
html="ERRORE: implementare"
else:
html= "<input type='text' name='%(name)s' value='%(value_is)s' %(computed)s>"
diz =dom_attr2dict(a)
diz["value_is"]=valore or ""
if action!='search':
if a.getAttribute("computed")=="1":
diz["computed"]="readonly='true' class='noedit'"
else:
diz["computed"]=""
else:
diz["computed"]=""
html%= diz
html+=dom_info_button(a)
return html
|