I have a form in a web page and I need to fill it with many sql queries
but only the first time the page is rendered.
The other times, I want to fill it with the data from request.args.
I decided to build a dictionnary that looks like the dictionnary of request.args
to be able to use only one function to validate and fill my form.
My function that fill my forms need to receive the dictionnary, the
document(node that I need to change) and a signature (signature is a list of
the name and the type of each elements from the form that need to be fill).
In my template, I defined a wmfactory in the tag <form> that return
my dictionnary. I’ve also define a
wvfactory that call my function to fill the form.
The problems is that wmfactory return a deferred so in wvfactory I have
to call my function to fill like this: return model.getData(request).addCallback(my
function). But I think that return doesn’t
wait that the addCallback is done.
Is there something I can do to make my returns wait for the addCallback
to return the new node filled with the dictionnary of data.
Here’s a part of my code:
#verify is the function that
fill and verify my form
class handle:
def __init__(self):
pass
def verify(self, dict, doc, signature):
# dict is the dictionnary from the sql
queries of the request.args
# doc is the node <form> and it’s
child
error = 0
for item in signature:
nodeList = domhelpers.locateNodes(doc,
'name', item[0])
#INTEGER, FLOAT and STRING
if item[1] == 'integer' or item[1]
== 'float' or item[1] == 'string':
pass
#CHECKBOX
elif item[1] == 'checkbox':
for node in nodeList:
# dict est None s'il n'est pas cochee
if dict.get(item[0]) != None
and str(node.getAttribute('value')) in dict.get(item[0]):
print 'checked'
node.setAttribute('checked',
'checked')
print node
else:
if item[2] == 'true':
error = 1
l = microdom.lmx(node)
l.span(style='color:
red').text('donnees obligatoires')
return doc
# class that execute the
queries needed
class SummaryEditDB:
def __init__(self, dbpool):
self.dbpool = dbpool
def getSummary(self, plan_id):
sql = "select * from plan where
plan_id = '%s'" %plan_id
return self.dbpool.runQueryDict(sql)
def getCategoriesIdByPlanId(self, plan_id):
sql = """select
to_plan_category_id from plan_categories
where to_plan_id='%s' order by
to_plan_category_id""" % plan_id
return self.dbpool.runQueryDict(sql)
class SummaryEditPage(pages.BasePage):
templateFile = "summary_edit.html"
def initialize(self, dbpool, *args):
self.dbpool = dbpool
self.db = SummaryEditDB(self.dbpool)
self.signature
= (('categories', 'checkbox', 'false', 'valeurs non correctes'))
def executeSQL(self, plan_id):
def createSummaryDict(results, newDict):
for item in results[0]:
for elem in self.signature:
if item == elem[0]:
newDict[item] = results[0][item]
return self.db.getCategoriesIdByPlanId(plan_id).addCallback(createCategoriesDict,
newDict)
def createCategoriesDict(results,
newDict):
newDict['categories'] = []
for item in results:
newDict['categories'].append(str(item.get('to_plan_category_id')))
return newDict
newDict = {}
return self.db.getSummary(plan_id).addCallback(createSummaryDict,
newDict) # first addCallback to fill
the dictionnary
def setUp(self, request, *args):
self.planData = self.executeSQL(plan_id)
#this call the function that return the dictionnary with the data (deferred)
def wmfactory_planData(self, request):
return self.planData # Usually, when I return an SQL
queries, the model is not deferred but in this case, it is
def wvfactory_fillFromSQL(self, request,
node, model):
def format(results):
print results
return handle().verify(results,
node, self.signature) # the function that fill the form (replace attributes in
the node)
return self.planData.addCallback(format) # to be able to see the results of
self.planData, I need to use a addCallback to be able to see the results
and to call the form filler. But
I seems that it doesn’t wait to the addCallback to be done
def wchild_update(self, request):
return self
Here’s a part of my template file:
<form action="/summary/edit/update"
method="post" enctype="multipart/form-data" view="fillFromSQL"
model="planData">
<table
border="0" width="100%" cellspacing="1" cellpadding="2">
<tr>
<td class="label" width="25%"
valign="top">
Catégories
</td>
<td class="area" width="75%">
<input
class="box" type="checkbox" name="categories" value="1000001"
/>1 étage<br />
<input
class="box" type="checkbox" name="categories" value="1000002"
/>1/2 étages<br/>
<input
class="box" type="checkbox" name="categories" value="1000003"
/>2 étages<br/> <input class="box" type="checkbox"
name="categories" value="1000004" />Split-Level<br />
<input
class="box" type="checkbox" name="categories" value="1000005"
/>Chalet 4 saisons<br />
<input
class="box" type="checkbox" name="categories" value="1000006"
/>Bi-Génération<br />
<input
class="box" type="checkbox" name="categories" value="1000007"
/>Semi-Détaché<br />
<input
class="box" type="checkbox" name="categories" value="1000008"
/>Townhouse<br />
<input
class="box" type="checkbox" name="categories" value="1000009"
/>Duplex<br />
<input
class="box" type="checkbox" name="categories" value="1000010"
/>Triplex<br />
<input
class="box" type="checkbox" name="categories" value="1000011"
/>Appartement (4+)<br />
</td>
</tr>
</table>
</form>
I really need help, so if someone
wants to help me, it will be appreciate.
Thx in advance
Vicky