Entries For: 2011
- June (1)
- May (2)
- March (1)
- February (1)
- January (2)
2011-06-28
Getting the superclasses for a python object
Zope 2 (and Plone) persistent objects usually have an intricate inheritance tree. Finding what classes an object inherits can be a time consuming task, hunting through the various eggs for the relevant source code. Below is a little snippet that shows how to easily get the list of superclasses:
(Pdb) pp type(ff).mro() (<class 'plone.app.blob.subtypes.image.ExtensionBlobField'>, <class 'archetypes.schemaextender.field.TranslatableExtensionField'>, <class 'archetypes.schemaextender.field.BaseExtensionField'>, <class 'plone.app.blob.field.BlobField'>, <class 'Products.Archetypes.Field.ObjectField'>, <class 'Products.Archetypes.Field.Field'>, <class 'Products.Archetypes.Layer.DefaultLayerContainer'>, <class 'plone.app.blob.mixins.ImageFieldMixin'>, <class 'Products.Archetypes.Field.ImageField'>, <class 'Products.Archetypes.Field.FileField'>, <type 'ExtensionClass.Base'>, <type 'object'>)
Credit goes to the original post where I found this.
2011-05-02
Version conflict: zc.buildout's version of madness
I'm not even trying to understand what happens, because it's aggravating to see buildouts fail like this:
While: Installing. Getting section zope2. Initializing section zope2. Installing recipe plone.recipe.zope2install. Error: There is a version conflict. We already have: setuptools 0.6c9
or, worse, this:
While: Installing. Getting section zope2. Initializing section zope2. Installing recipe plone.recipe.zope2install. Error: There is a version conflict. We already have: zc.buildout 1.5.2
Well, technically I know what happens: for example, zc.buildout is latest 2.0a1 now, but I've already installed 1.5.2 in my virtualenv (the bootstrap process failed hard, there are a tons of bugs there, I've had more failures in bootstrap then success, lately) and I had one product in my buildout which depended on zc.buildout, so it tried to pull the latest, only to get a version conflict.
I wish zc.buildout would behave more inteligently. Even specifying
prefer-final = true
didn't do much to solve my problems. The only way to solve the problem was to add the following to the buildout.cfg file:
[buildout] ... versions = versions [versions] zc.buildout =1.5.2 setuptools = 0.6c9
2011-05-01
Building PIL with JPEG support on Ubuntu 11.04
I had problems building PIL with jpeg support on the latest Ubuntu. There are now two libjpeg libraries: one called libjpeg62 and one libjpeg8. Every guide on the net explaining how to compile PIL with jpeg support points to installing libjpeg62-dev. Needless to say, libjpeg8-dev is actually needed to properly build PIL. My reason for initially avoiding libjpeg8 is that it causes libsdlimage-dev to be uninstalled, so it looks like I'll have to juggle packages whenever I want to compile something that requires SDL.
2011-03-09
Export/import users in and out of Plone
A dirty quick method of importing and exporting the users (only usernames and passwords) out of Plone, using 2 external methods. Code below, not much else to say.
import cPickle
def export(self):
pas = self.acl_users
users = pas.source_users
passwords = users._user_passwords
result = dict(passwords)
f = open('/tmp/out.blob', 'w')
cPickle.dump(result, f)
f.close()
return "done"
def import_users(self):
pas = self.acl_users
users = pas.source_users
f = open('/tmp/out.blob')
res = cPickle.load(f)
f.close()
for uid, pwd in res.items():
users.addUser(uid, uid, pwd)
return "done"
2011-02-08
Set product configuration globally in zope.conf
I have a Zope product that needs to write in a centralized location, across multiple instances. The classic Python solution would be to write a variable in a config.py module and read that location from the code, but this feels unelegant in an environment that uses zc.buildout for deployment. The solution I have found is, as follows:
In buildout.cfg, in the instance part definition, add:
zope-conf-additional =
<environment>
mylocation ${buildout:directory}/var/mylocation
</environment>
Next, inside the product code I have:
from App.config import getConfiguration import os conf = getConfiguration() dest = conf.environment['mylocation'] if not os.path.exists(dest): os.mkdir(dest)
There were 2 things that I had to research for this task: reading the global zope configuration (that's done with App.config.getConfiguration()) and the fact that you can't add arbitrary key/values in zope.conf and have to use the <environment> section.
2011-01-04
Running Products.Gloworm on Plone 4
For some reason, the TTW developer tools tend to get neglected in the Plone world. A valuable tools such as Clouseau has fallen out of favour and now Gloworm, the @@manage-viewlets replacement/complement won't run in Plone 4 (at least at version 1.0, which is the latest right now on PyPI).
Fortunately, Gloworm has been updated in svn trunk. To get the latest version you need to add it to sources (in buildout.cfg or develop.cfg):
[buildout] eggs += Products.Gloworm [sources] Products.Gloworm = svn https://weblion.psu.edu/svn/weblion/weblion/Products.Gloworm/trunk/
Next, run in the shell:
#bin/develop co Products.Gloworm #bin/develop rb
2011-01-02
A pattern for programatically creating Plone content
I'm importing content from a legacy system to a new website that I'm doing with Plone 4 (wow! what an improvement, in speed and technology) and was looking at the existing documentation on how to programatically create new Plone content. The issue I'm having with the existing documentation is that it's incomplete. It won't give you automatically created ids, you'll have to manually call mutators if you don't know any better, etc.
This is what I have come up with (this code runs in a browser view):
_id = self.context.generateUniqueId("Document")
_id = self.context.invokeFactory(type_name=type_name, id=_id)
ob = self.context[_id]
ob.edit(
description = "text...",
subject = ('tag1', 'tag2'),
title = "some title...",
)
ob._renameAfterCreation(check_auto_id=True)
_id = ob.getId()
One thing I notice is that Plone 4 starts faster, comes with easily pluggable developer tools, and in general feels a lot more polished then any previous Plone releases. It's a good system to work with.