1 | :mod:`waeup.kofa.app` -- central components for KOFA |
---|
2 | **************************************************** |
---|
3 | |
---|
4 | .. :doctest: |
---|
5 | .. :layer: waeup.kofa.testing.KOFAUnitTestLayer |
---|
6 | |
---|
7 | .. module:: waeup.kofa.app |
---|
8 | |
---|
9 | .. class:: University |
---|
10 | |
---|
11 | The main KOFA application object is given with |
---|
12 | :class:`University`. It provides the main containers as faculties, |
---|
13 | hostels, etc. |
---|
14 | |
---|
15 | .. attribute:: name |
---|
16 | |
---|
17 | A string. The name of a university. |
---|
18 | |
---|
19 | .. attribute:: faculties |
---|
20 | |
---|
21 | An arbitrary object containing "faculties". In the case of |
---|
22 | `University` it is a container of type |
---|
23 | `waeup.kofa.interfaces.IFacultiesContainer`. |
---|
24 | |
---|
25 | |
---|
26 | Creating `University` instances |
---|
27 | =============================== |
---|
28 | |
---|
29 | As :class:`University` instances make use of the Zope Component |
---|
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 |
---|
34 | registries (this is done by the testlayer automatically). |
---|
35 | |
---|
36 | Now we can import the :class:`University` class and create an |
---|
37 | instance: |
---|
38 | |
---|
39 | >>> from waeup.kofa.app import University |
---|
40 | >>> myuniversity = University() |
---|
41 | >>> myuniversity |
---|
42 | <waeup.kofa.app.University object at 0x...> |
---|
43 | |
---|
44 | Instances of `University` comply with the interface |
---|
45 | `waeup.kofa.interfaces.IUniversity`: |
---|
46 | |
---|
47 | >>> from zope.interface.verify import verifyClass |
---|
48 | >>> from waeup.kofa.interfaces import IUniversity |
---|
49 | >>> verifyClass(IUniversity, University) |
---|
50 | True |
---|
51 | |
---|
52 | A freshly created instance provides the attributes promised by the |
---|
53 | interface: |
---|
54 | |
---|
55 | >>> from waeup.kofa.app import University |
---|
56 | >>> myuniversity = University() |
---|
57 | >>> myuniversity['configuration'].name |
---|
58 | u'Sample University' |
---|
59 | |
---|
60 | >>> myuniversity['faculties'] |
---|
61 | <waeup.kofa.university.facultiescontainer.FacultiesContainer object at 0x...> |
---|
62 | |
---|
63 | >>> myuniversity['students'] |
---|
64 | <waeup.kofa.students.container.StudentsContainer object at 0x...> |
---|
65 | |
---|
66 | >>> myuniversity['users'] |
---|
67 | <waeup.kofa.userscontainer.UsersContainer object at 0x...> |
---|
68 | |
---|
69 | >>> myuniversity['datacenter'] |
---|
70 | <waeup.kofa.datacenter.DataCenter object at 0x...> |
---|
71 | |
---|
72 | >>> myuniversity['configuration'] |
---|
73 | <waeup.kofa.configuration.ConfigurationContainer object at 0x...> |
---|
74 | |
---|
75 | We can export universities. For this we lookup an appropriate exporter |
---|
76 | first:: |
---|
77 | |
---|
78 | >>> from waeup.kofa.interfaces import IKOFAExporter |
---|
79 | >>> exporter = IKOFAExporter(myuniversity) |
---|
80 | >>> exporter |
---|
81 | <waeup.kofa.utils.importexport.Exporter object at 0x...> |
---|
82 | |
---|
83 | Now we can trigger the export:: |
---|
84 | |
---|
85 | >>> exporter.export() |
---|
86 | <cStringIO.StringO object at 0x...> |
---|
87 | |
---|
88 | We can also get an XML representation as file. If we do not provide a |
---|
89 | filepath, we will get an instance of `cStringIO.StringIO`, i.e. a |
---|
90 | memory file:: |
---|
91 | |
---|
92 | >>> from waeup.kofa.interfaces import IKOFAXMLExporter |
---|
93 | >>> exporter = IKOFAXMLExporter(myuniversity) |
---|
94 | >>> f = exporter.export() |
---|
95 | >>> f |
---|
96 | <cStringIO.StringO object at 0x...> |
---|
97 | |
---|
98 | >>> print f.read() |
---|
99 | <?xml version="1.0" encoding="utf-8" ?> |
---|
100 | <pickle> |
---|
101 | <initialized_object id="..."> |
---|
102 | ... |
---|
103 | </pickle> |
---|
104 | |
---|
105 | KOFA plugins |
---|
106 | ============ |
---|
107 | |
---|
108 | waeup.kofa provides an API to 'plugin' components. Things that should |
---|
109 | be setup at creation time of a KOFA application can indicate |
---|
110 | that by providing a utility providing IKOFAPlugin. |
---|
111 | |
---|
112 | The plugins are looked up by an created app, which then will call the |
---|
113 | ``setup()`` method of each plugin. |
---|
114 | |
---|
115 | >>> from waeup.kofa.interfaces import IKOFAPluggable |
---|
116 | >>> from zope.component import getAdapters, getUtilitiesFor |
---|
117 | >>> sorted(list(getUtilitiesFor(IKOFAPluggable))) |
---|
118 | [(u'accesscodes', <waeup.kofa.accesscodes...AccessCodePlugin ...)] |
---|
119 | |
---|
120 | |
---|
121 | We can provide a new plugin like this: |
---|
122 | |
---|
123 | >>> import grok |
---|
124 | >>> from waeup.kofa.interfaces import IKOFAPluggable |
---|
125 | >>> class MyPlugin(grok.GlobalUtility): |
---|
126 | ... grok.implements(IKOFAPluggable) |
---|
127 | ... def setup(self, site, name, logger): |
---|
128 | ... print "Setup was called for" |
---|
129 | ... print site |
---|
130 | ... def update(self, site, name, logger): |
---|
131 | ... pass |
---|
132 | |
---|
133 | When we register the plugin |
---|
134 | |
---|
135 | >>> grok.testing.grok_component('MyPlugin', MyPlugin) |
---|
136 | True |
---|
137 | |
---|
138 | and setup a new KOFA instance, we will get a message: |
---|
139 | |
---|
140 | >>> from waeup.kofa.app import University |
---|
141 | >>> site = University() |
---|
142 | Setup was called for |
---|
143 | <waeup.kofa.app.University object at 0x...> |
---|
144 | |
---|
145 | Apparently the plugin can do with the University object whatever it |
---|
146 | likes. That's what plugins are for. |
---|