source: main/waeup.sirp/trunk/src/waeup/sirp/students/viewlets.py @ 7097

Last change on this file since 7097 was 7097, checked in by Henrik Bettermann, 13 years ago

Implement StudentFileNameChooser? and StudentFileStoreHandler?.

Define viewlet manager FileManager? in viewlets.py and define display and upload viewlets for the StudentClearanceDisplayFormPage?.

Also define image views. Since these views are part of the viewlets they are defined also in the viewlets module. In browser.py we only add an empty files_changed list attribute to the StudentClearanceManageFormPage?. This will be needed for logging (to be done).

  • Property svn:keywords set to Id
File size: 8.2 KB
Line 
1import grok
2from zope.component import getUtility
3from zope.interface import Interface
4from waeup.sirp.interfaces import (
5    IWAeUPObject, IExtFileStore, IFileStoreNameChooser)
6from waeup.sirp.utils.helpers import string_from_bytes, file_size
7from waeup.sirp.browser import DEFAULT_IMAGE_PATH
8from waeup.sirp.students.browser import (
9    StudentClearanceDisplayFormPage, StudentClearanceManageFormPage)
10
11grok.context(IWAeUPObject) # Make IWAeUPObject the default context
12grok.templatedir('browser_templates')
13
14class StudentManageSidebar(grok.ViewletManager):
15    grok.name('left_studentmanage')
16
17class StudentManageLink(grok.Viewlet):
18    """A link displayed in the student box which shows up for StudentNavigation
19    objects.
20
21    """
22    grok.baseclass()
23    grok.viewletmanager(StudentManageSidebar)
24    grok.context(IWAeUPObject)
25    grok.view(Interface)
26    grok.order(5)
27    grok.require('waeup.viewStudent')
28
29    link = 'index'
30    text = u'Base Data'
31
32    def render(self):
33        url = self.view.url(self.context.getStudent(), self.link)
34        return u'<div class="portlet"><a href="%s">%s</a></div>' % (
35                url, self.text)
36
37class StudentManageBaseLink(StudentManageLink):
38    grok.order(1)
39    link = 'index'
40    text = u'Base Data'
41
42class StudentManageClearanceLink(StudentManageLink):
43    grok.order(2)
44    link = 'view_clearance'
45    text = u'Clearance Data'
46
47class StudentManagePersonalLink(StudentManageLink):
48    grok.order(2)
49    link = 'view_personal'
50    text = u'Personal Data'
51
52class StudentManageStudyCourseLink(StudentManageLink):
53    grok.order(3)
54    link = 'studycourse'
55    text = u'Study Course'
56
57class StudentManagePaymentsLink(StudentManageLink):
58    grok.order(4)
59    link = 'payments'
60    text = u'Payments'
61
62class StudentManageAccommodationLink(StudentManageLink):
63    grok.order(5)
64    link = 'accommodation'
65    text = u'Accommodation Data'
66
67class StudentManageHistoryLink(StudentManageLink):
68    grok.order(6)
69    link = 'history'
70    text = u'History'
71
72
73class StudentMenu(grok.ViewletManager):
74    grok.name('top_student')
75
76class StudentLink(grok.Viewlet):
77    """A link displayed in the student box which shows up for StudentNavigation
78    objects.
79
80    """
81    grok.baseclass()
82    grok.viewletmanager(StudentMenu)
83    grok.context(IWAeUPObject)
84    grok.view(Interface)
85    grok.order(5)
86    grok.require('waeup.viewStudent')
87    template = grok.PageTemplateFile('browser_templates/plainactionbutton.pt')
88
89    link = 'index'
90    text = u'Base Data'
91
92    @property
93    def alt(self):
94        """Alternative text for icon.
95        """
96        return self.text
97
98    @property
99    def target_url(self):
100        """Get a URL to the target...
101        """
102        return self.view.url(self.context.getStudent(), self.link)
103
104class StudentBaseLink(StudentLink):
105    grok.order(1)
106    link = 'index'
107    text = u'Base Data'
108
109class StudentClearanceLink(StudentLink):
110    grok.order(2)
111    link = 'view_clearance'
112    text = u'Clearance Data'
113
114class StudentPersonalLink(StudentLink):
115    grok.order(2)
116    link = 'view_personal'
117    text = u'Personal Data'
118
119class StudentStudyCourseLink(StudentLink):
120    grok.order(3)
121    link = 'studycourse'
122    text = u'Study Course'
123
124class StudentPaymentsLink(StudentLink):
125    grok.order(4)
126    link = 'payments'
127    text = u'Payments'
128
129class StudentAccommodationLink(StudentLink):
130    grok.order(5)
131    link = 'accommodation'
132    text = u'Accommodation'
133
134class StudentHistoryLink(StudentLink):
135    grok.order(6)
136    link = 'history'
137    text = u'History'
138
139class PrimaryStudentNavManager(grok.ViewletManager):
140    """Viewlet manager for the primary navigation tab.
141    """
142    grok.name('primary_nav_student')
143
144class PrimaryStudentNavTab(grok.Viewlet):
145    """Base for primary student nav tabs.
146    """
147    grok.baseclass()
148    grok.viewletmanager(PrimaryStudentNavManager)
149    grok.template('primarynavtab')
150    grok.order(1)
151    grok.require('waeup.View')
152    pnav = 0
153    tab_title = u'Some Text'
154
155    @property
156    def link_target(self):
157        return self.view.application_url()
158
159    @property
160    def active(self):
161        view_pnav = getattr(self.view, 'pnav', 0)
162        if view_pnav == self.pnav:
163            return 'active'
164        return ''
165
166class HomeTab(PrimaryStudentNavTab):
167    """Home-tab in primary navigation.
168    """
169    grok.order(1)
170    grok.require('waeup.Public')
171    pnav = 0
172    tab_title = u'Home'
173
174class ProspectusTab(PrimaryStudentNavTab):
175    """Faculties-tab in primary navigation.
176    """
177    grok.order(2)
178    grok.require('waeup.View')
179    pnav = 1
180    tab_title = u'Prospectus'
181
182    @property
183    def link_target(self):
184        return self.view.application_url('faculties')
185
186class MyDataTab(PrimaryStudentNavTab):
187    """MyData-tab in primary navigation.
188    """
189    grok.order(3)
190    grok.require('waeup.Public')
191    pnav = 4
192    tab_title = u'My Data'
193
194    @property
195    def link_target(self):
196        rel_link = '/students/%s' % self.request.principal.id
197        return self.view.application_url() + rel_link
198
199def handle_img_upload(upload, context, view, max_size, attr=None):
200    """Handle upload of applicant image.
201
202    Returns `True` in case of success or `False`.
203
204    Please note that file pointer passed in (`upload`) most probably
205    points to end of file when leaving this function.
206    """
207    size = file_size(upload)
208    if size > max_size:
209        view.flash('Uploaded image is too big!')
210        return False
211    upload.seek(0) # file pointer moved when determining size
212    store = getUtility(IExtFileStore)
213    file_id = IFileStoreNameChooser(context).chooseName(attr=attr)
214    store.createFile(file_id, upload)
215    return True
216
217class FileManager(grok.ViewletManager):
218    """Viewlet manager for uploading files, preferably scanned images.
219    """
220    grok.name('files')
221
222class FileDisplay(grok.Viewlet):
223    """Base file display viewlet.
224    """
225    grok.baseclass()
226    grok.viewletmanager(FileManager)
227    grok.view(StudentClearanceDisplayFormPage)
228    grok.template('filedisplay')
229    grok.order(1)
230    grok.require('waeup.viewStudent')
231    label = u'Some Text:'
232    img_src = u'filename.jpg'
233    attr = None
234
235class FileUpload(FileDisplay):
236    """Base upload viewlet.
237    """
238    grok.baseclass()
239    grok.viewletmanager(FileManager)
240    grok.view(StudentClearanceManageFormPage)
241    grok.template('fileupload')
242    grok.require('waeup.manageStudents')
243    mus = 1024 * 150
244    input_name = u'form.filename'
245
246    def update(self):
247        self.max_upload_size = string_from_bytes(self.mus)
248        upload = self.request.form.get(self.input_name, None)
249        if upload:
250            # We got a fresh upload
251            file_changed = handle_img_upload(
252                upload, self.context, self.view, self.mus, self.attr)
253            if file_changed is False:  # False is not None!
254                self.redirect(self.view.url(self.context))
255                return # error during image upload. Ignore other values
256            else:
257                self.view.files_changed += self.img_src
258        return
259
260class BirthCertificateDisplay(FileDisplay):
261    """Birth Certificate upload viewlet.
262    """
263    grok.order(1)
264    label = u'Birth Certificate:'
265    img_src = u'birth_certificate.jpg'
266    attr = u'birth_certificate'
267
268class BirthCertificateUpload(FileUpload):
269    """Birth Certificate upload viewlet.
270    """
271    grok.order(1)
272    label = u'Birth Certificate:'
273    mus = 1024 * 150
274    img_src = u'birth_certificate.jpg'
275    input_name = u'form.birth_certificate'
276    attr = u'birth_certificate'
277
278class Image(grok.View):
279    """Renders image for students.
280    """
281    grok.name('none.jpg')
282    grok.view(StudentClearanceManageFormPage)
283    grok.require('waeup.viewStudent')
284    grok.baseclass()
285    attr = None
286
287    def render(self):
288        # A filename chooser turns a context into a filename suitable
289        # for file storage.
290        image = getUtility(IExtFileStore).getFileByContext(
291            self.context, attr=self.attr)
292        self.response.setHeader(
293            'Content-Type', 'image/jpeg')
294        if image is None:
295            # show placeholder image
296            return open(DEFAULT_IMAGE_PATH, 'rb').read()
297        return image
298
299class BirthCertificateImage(Image):
300    """Renders birth certificate.
301    """
302    grok.name('birth_certificate.jpg')
303    attr = u'birth_certificate'
Note: See TracBrowser for help on using the repository browser.