[11949] | 1 | :mod:`waeup.ikoba.app` -- central components for Ikoba |
---|
[11971] | 2 | ****************************************************** |
---|
[3933] | 3 | |
---|
[5140] | 4 | .. :doctest: |
---|
[11949] | 5 | .. :layer: waeup.ikoba.testing.IkobaUnitTestLayer |
---|
[3933] | 6 | |
---|
[11949] | 7 | .. module:: waeup.ikoba.app |
---|
[3933] | 8 | |
---|
[11954] | 9 | .. class:: Company |
---|
[4273] | 10 | |
---|
[11949] | 11 | The main Ikoba application object is given with |
---|
[11954] | 12 | :class:`Company`. It provides the main containers as faculties, |
---|
[4273] | 13 | hostels, etc. |
---|
| 14 | |
---|
| 15 | .. attribute:: name |
---|
| 16 | |
---|
[11954] | 17 | A string. The name of a company. |
---|
[4273] | 18 | |
---|
| 19 | .. attribute:: faculties |
---|
| 20 | |
---|
| 21 | An arbitrary object containing "faculties". In the case of |
---|
[11954] | 22 | `Company` it is a container of type |
---|
[11949] | 23 | `waeup.ikoba.interfaces.IFacultiesContainer`. |
---|
[4273] | 24 | |
---|
| 25 | |
---|
[11954] | 26 | Creating `Company` instances |
---|
[11971] | 27 | ============================ |
---|
[3933] | 28 | |
---|
[11954] | 29 | As :class:`Company` instances make use of the Zope Component |
---|
[4273] | 30 | Architecture (ZCA), we have to setup the basic component registries, |
---|
| 31 | before we can create instances. We do this by simply grokking the |
---|
| 32 | whole :mod:`waeup` package. This way all interfaces, utilities and adapters |
---|
| 33 | defined in the package are looked up and registered with the global |
---|
[5140] | 34 | registries (this is done by the testlayer automatically). |
---|
[3933] | 35 | |
---|
[11954] | 36 | Now we can import the :class:`Company` class and create an |
---|
[4273] | 37 | instance: |
---|
[3933] | 38 | |
---|
[11954] | 39 | >>> from waeup.ikoba.app import Company |
---|
| 40 | >>> mycompany = Company() |
---|
| 41 | >>> mycompany |
---|
| 42 | <waeup.ikoba.app.Company object at 0x...> |
---|
[3933] | 43 | |
---|
[11954] | 44 | Instances of `Company` comply with the interface |
---|
| 45 | `waeup.ikoba.interfaces.ICompany`: |
---|
[3933] | 46 | |
---|
| 47 | >>> from zope.interface.verify import verifyClass |
---|
[11954] | 48 | >>> from waeup.ikoba.interfaces import ICompany |
---|
| 49 | >>> verifyClass(ICompany, Company) |
---|
[3933] | 50 | True |
---|
| 51 | |
---|
[4273] | 52 | A freshly created instance provides the attributes promised by the |
---|
| 53 | interface: |
---|
[3933] | 54 | |
---|
[11954] | 55 | >>> from waeup.ikoba.app import Company |
---|
| 56 | >>> mycompany = Company() |
---|
| 57 | >>> mycompany['configuration'].name |
---|
| 58 | u'Sample Company' |
---|
[3933] | 59 | |
---|
[11954] | 60 | >>> mycompany['users'] |
---|
[11949] | 61 | <waeup.ikoba.userscontainer.UsersContainer object at 0x...> |
---|
[6897] | 62 | |
---|
[11954] | 63 | >>> mycompany['datacenter'] |
---|
[11949] | 64 | <waeup.ikoba.datacenter.DataCenter object at 0x...> |
---|
[6897] | 65 | |
---|
[11954] | 66 | >>> mycompany['configuration'] |
---|
[11949] | 67 | <waeup.ikoba.configuration.ConfigurationContainer object at 0x...> |
---|
[6907] | 68 | |
---|
[6897] | 69 | |
---|
[11949] | 70 | Ikoba plugins |
---|
[11971] | 71 | ============= |
---|
[6897] | 72 | |
---|
[11949] | 73 | waeup.ikoba provides an API to 'plugin' components. Things that should |
---|
| 74 | be setup at creation time of a Ikoba application can indicate |
---|
| 75 | that by providing a utility providing IIkobaPlugin. |
---|
[6897] | 76 | |
---|
| 77 | The plugins are looked up by an created app, which then will call the |
---|
| 78 | ``setup()`` method of each plugin. |
---|
| 79 | |
---|
[11949] | 80 | >>> from waeup.ikoba.interfaces import IIkobaPluggable |
---|
[6897] | 81 | >>> from zope.component import getAdapters, getUtilitiesFor |
---|
[11949] | 82 | >>> sorted(list(getUtilitiesFor(IIkobaPluggable))) |
---|
[12209] | 83 | [(u'documents', <waeup.ikoba.documents.container.DocumentsPlugin ...)] |
---|
[6897] | 84 | |
---|
| 85 | |
---|
| 86 | We can provide a new plugin like this: |
---|
| 87 | |
---|
| 88 | >>> import grok |
---|
[11949] | 89 | >>> from waeup.ikoba.interfaces import IIkobaPluggable |
---|
[6897] | 90 | >>> class MyPlugin(grok.GlobalUtility): |
---|
[11949] | 91 | ... grok.implements(IIkobaPluggable) |
---|
[6897] | 92 | ... def setup(self, site, name, logger): |
---|
| 93 | ... print "Setup was called for" |
---|
| 94 | ... print site |
---|
| 95 | ... def update(self, site, name, logger): |
---|
| 96 | ... pass |
---|
| 97 | |
---|
| 98 | When we register the plugin |
---|
| 99 | |
---|
| 100 | >>> grok.testing.grok_component('MyPlugin', MyPlugin) |
---|
| 101 | True |
---|
| 102 | |
---|
[11949] | 103 | and setup a new Ikoba instance, we will get a message: |
---|
[6897] | 104 | |
---|
[11954] | 105 | >>> from waeup.ikoba.app import Company |
---|
| 106 | >>> site = Company() |
---|
[6897] | 107 | Setup was called for |
---|
[11954] | 108 | <waeup.ikoba.app.Company object at 0x...> |
---|
[6897] | 109 | |
---|
[11954] | 110 | Apparently the plugin can do with the Company object whatever it |
---|
[7811] | 111 | likes. That's what plugins are for. |
---|