[Twisted-Python] wvfactory

vicky lupien vlupien at drummonddesigns.com
Thu Nov 20 16:06:18 EST 2003

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
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):
    def verify(self, dict, doc, signature):
        # dict is the dictionnary from the sql queries of the
        # 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] ==
            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
                        if item[2] == 'true':
                            error = 1
                            l = microdom.lmx(node)
                            l.span(style='color: red').text('donnees
        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""" %
        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]
t, newDict)
        def createCategoriesDict(results, newDict):
            newDict['categories'] = []
            for item in results:
            return newDict
        newDict = {}    
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">
                                    <td class="label" width="25%"
                                    <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
I really need help, so if someone wants to help me, it will be
Thx in advance
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-python/attachments/20031120/043719e1/attachment.htm 

More information about the Twisted-Python mailing list