Skip to main content

package to display a fill-percentage for AT based content

Project description

Author:

seletz

Date:
2007-11-14
Revision:
53844

Abstract

This package scratches an itch of mine in providing a very simple viewlet which displays the percentage a content is filled by an user.

setup stuff

>>> class Mock(object):
...    def __init__(self, **kw): self.__sict__.update(kw)

Blurb

First we define an interface to be used to mark bean-countable content:

>>> from zope import interface
>>> class IBeanContable(interface.Interface):
...     """ a content which is bean countable """

The counting itself is very simple and done by an adapter. We simply count which fields in the default schemata are filled. We there count only the writable fields. From that we calculate a percentage.

Lets define a interface for that functionality:

>>> class IBeanCounter(interface.Interface):
...     percentage = interface.Attribute(u"The percentage filled")

Now lets create some content class to test our stuff:

>>> _ = self.folder.invokeFactory("Document", "doc")
>>> doc = self.folder.get(_)

Count the fields which are in the default schemata and are rewd/write:

>>> len([f for f in doc.Schema().fields() if f.schemata=="default" and f.mode =="rw"])
4

Ok, now how many of them are filled?:

>>> l = [f for f in doc.Schema().fields() if f.schemata=="default" and f.mode =="rw"]
>>> [f.getName() for f in l if f.get(doc)]
['id']

Ok, fair enough. Now lets do the opposite:

>>> [f.getName() for f in l if not f.get(doc)]
['title', 'description', 'text']

Ok, thats enough. Lets wrap it up.

Implementation

We have an adapter:

>>> from collective.beancounter.adapter import ATBeanCounter
>>> ct = ATBeanCounter(doc)
>>> print ct.percentage
25.0

Fill out completely:

>>> doc.update( title="muha", text="haha", description="desc")
>>> ct = ATBeanCounter(doc)
>>> print ct.percentage
100.0

Yay.

Field filter

You may provide an adapter to specify a filter to decide which fields you consider to be “countable”:

>>> from collective.beancounter.interfaces import IBeanCounterFieldFilter

We provide adefault adapter for AT objects:

>>> from collective.beancounter.adapter import ATFieldFilter
That adapter provides a filter which filters out fields which:
  • are not user settable

  • are not in the “default” schemata

  • are not in the special plone field blacklist

  • are not boolean fields (these are true or false, i.e. always “filled”)

>>> IBeanCounterFieldFilter(doc)
<collective.beancounter.adapter.ATFieldFilter object at ...>

Lets test that:

>>> from collective.beancounter.adapter import countable_fields
>>> sorted([f.getName() for f in countable_fields(doc)])
['description', 'id', 'text', 'title']

Ok, that filters nothing, which is fine. Now lets provide an adapter which does filter out the “title”,”id” and “description” fields:

>>> from zope import component
>>> from Products.Archetypes.interfaces import IBaseObject
>>> class TestFilter(object):
...     component.adapts(IBaseObject)
...     interface.implements(IBeanCounterFieldFilter)
...     def __init__(self,context): self.context = context
...     def __call__(self, field):
...         return field.getName() not in "title id description".split()
>>> component.provideAdapter(TestFilter)

We should now get our adapter:

>>> IBeanCounterFieldFilter(doc)
<TestFilter object at ...>

We should now get ALL fields but the ones we filtered out:

>>> set("title id description".split()) & set([f.getName() for f in countable_fields(doc)])
set([])
vim: set ft=rst tw=75 nocin nosi ai sw=4 ts=4 expandtab:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

collective.beancounter-0.3.1.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

collective.beancounter-0.3.1-py2.4.egg (13.1 kB view details)

Uploaded Source

File details

Details for the file collective.beancounter-0.3.1.tar.gz.

File metadata

File hashes

Hashes for collective.beancounter-0.3.1.tar.gz
Algorithm Hash digest
SHA256 55385d43d4a69268540739234e890abdae5e96e219bd16375424261e20ec1f98
MD5 dcd815319a8be9ee82ffd8b06f5f4aff
BLAKE2b-256 ae721d6f91a3e53464a3e75366c7e29efb5f2021a6b93ecca3a7f0baaac60fc3

See more details on using hashes here.

File details

Details for the file collective.beancounter-0.3.1-py2.4.egg.

File metadata

File hashes

Hashes for collective.beancounter-0.3.1-py2.4.egg
Algorithm Hash digest
SHA256 e751e86d1d4ca14ba622e7dd287ded1dd1ad84b0c1d464074ee3002e67991fd0
MD5 e94b40053f3dcc89bed2542d4eda6d0f
BLAKE2b-256 e4a03150b16ce52b307c82032e11fd1e7f6ee6b0caba6d6921515bf3a6335735

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page