On 07/21/2012 11:20 AM, Dave Kelly wrote:
> Trying to follow the PyCon tutorial, I am attempting to populate a dropdown
> list.  The underlying table for the dropdown list contains only one field
> which is the primary key.  I can't seem to get the list to populate.  The
> steps I took to achieve this were:
>
>
>
> 1. I created a script in the /biz directory called
> PublicdepartmentsBizobj.py which contains:
>
>
>
> #!/usr/bin/env python
>
> # -*- coding: utf-8 -*-
>
>
>
> import dabo
>
>
>
> class PublicdepartmentsBizobj(dabo.biz.dBizobj):
>
>                  def afterinit(self):
>
>                                  self.datasource = "public.departments"
>
>                                  self.keyfield = "department"
>
>                                  self.addfrom("public.departments")
>
>                                  self.addfield("department")
>
>
>
>                  def validateRecord(self):
>
>                                  """Returning anything other than an empty
> string from
>
>                                  this method will prevent the data from being
> saved.
>
>                                  """
>
>                                  ret = ""
>
>                                  # Add your business rules here.
>
>                                  return ret
>
>
>
>                  def getNamesAndKeys(self):
>
>                                  crs = self.getTempCursor()
>
>                                  crs.execute("select department from
> public.departments order by department")
>
>                                  ds = crs.getDataSet()
>
>                                  names = [rec["department"] for rec in ds]
>
>                                  keys = [rec["department"] for rec in ds]
>
>
>
>                                  return(names, keys)
>
>
>
> My createBizobjs() method for the form contains:
>
>
>
> def createBizobjs(self):
>
>                  publicemployeesBizobj =
> self.Application.biz.PublicemployeesBizobj(self.Connection)
>
>                  self.addBizobj(publicemployeesBizobj)
>
>                  publicdepartmentsBizobj =
> self.Application.biz.PublicdepartmentsBizobj(self.Connection)
>
>                  self.addBizobj(publicdepartmentsBizobj)
>
>
>
>
>
> I set the DataSource property of my dropdownlist control to
> "public.departments".  I set the DataField property to "department".  The
> ValueMode is set to "Key" (I also tried "String").  RegID is set to
> "department_list".
>
>
>
> The afterInitAll method is as follows:
>
>
>
> def afterInitAll(self):
>
>                  departmentBiz = self.getBizobj("public.departments")
>
>                  names, keys = departmentBiz.getNamesAndKeys()
>
>                  self.department_list.Choices = names
>
>                  self.department_list.Keys = keys
>
>                  self.department_list.ValueMode = "Key"
>
>                  self.requery()
>
>
>
>
>
> I closed the ClassDesigner and updated my main.py to the following:
>
>
>
> import dabo
>
> dabo.ui.loadUI("wx")
>
>
>
> app = dabo.dApp()
>
>
>
> app.MainFormClass = "time_clock.cdxml"
>
>
>
> app.start()
>
>
>
> The form loads but the dropdown list is empty.  Furthermore, the console has
> the following output.  I am sure I have missed something blatently obvious
> but I wil need it pointed out to me.
>
>
>
> dave@dave-Mint ~/time $ python main.py
>
> /usr/local/lib/python2.7/dist-packages/dabo/lib/SimpleCrypt.py:52:
> UserWarning: WARNING: SimpleCrypt is not secure. Please see
> http://wiki.dabodev.com/SimpleCrypt for more information
>
>    warnings.warn("WARNING: SimpleCrypt is not secure. Please see
> http://wiki.dabodev.com/SimpleCrypt for more information")
>
> Traceback (most recent call last):
>
>    File "/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_core.py",
> line 14636, in<lambda>
>
>      lambda event: event.callable(*event.args, **event.kw) )
>
>    File "/usr/local/lib/python2.7/dist-packages/dabo/ui/uiwx/dPemMixin.py",
> line 348, in _afterInitAll
>
>      self.afterInitAll()
>
>    File "/tmp/tmpQOkWFW.py", line 173, in afterInitAll
>
>      names, keys = departmentBiz.getNamesAndKeys()
>
> AttributeError: 'NoneType' object has no attribute 'getNamesAndKeys'
>
>
>
> Dave Kelly
>
> The Priory Inn
>
> 01666 502 251
>
Sorry on vacation until the 30th.  Also to be honest I can't recall what 
the demo does?

I believe you should change the following:

self.addfrom("public.departments")
self.addfrom("departments")  #that is the normal coding.

publicdepartmentsBizobj =
self.Application.biz.PublicdepartmentsBizobj(self.Connection)

self.publicdepartmentsBizobj = PublicdepartmentsBizobj(self.Connection)
self.addBizobj(self.publicdepartmentsBizobj)

#using "self" allows you access and you can avoid the getBizobj()
# should also fix the error

names, keys = self.publicdepartmentsBizobj.getNamesAndKeys()

                 self.department_list.Choices = names

                 self.department_list.Keys = keys

                 self.department_list.ValueMode = "Key"

                 self.requery()  #watch out here what are you requerying????

Can I assume that you want both the Choices and and Keys to match? Normally, 
you would use some PK (normally an int) with some description text.
                                 names = [rec["department"] for rec in ds]

                                 keys = [rec["department"] for rec in ds]

they are retrieving the same data.  If so why use the keys?


The dropdown list is sort of different - in that it requires that a value 
always exist for the record (even new ones).  So I do something like this.

     def countyChoices(self):
         countyDS = self.escounty.getDataSet()
         county_Choices=['<None>']
         countyKeys=[0]

Now I have a '<None>' choice for key '0' that will match a new record value,

The above said I do not see a data issue.

Johnf















   


_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-users
Searchable Archives: http://leafe.com/archives/search/dabo-users
This message: http://leafe.com/archives/byMID/[email protected]

Reply via email to