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

Last change on this file since 7105 was 7105, checked in by Henrik Bettermann, 14 years ago

Undo r7102 and r7103.

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