source: main/waeup.kofa/trunk/src/waeup/kofa/students/viewlets.py @ 13480

Last change on this file since 13480 was 13457, checked in by Henrik Bettermann, 9 years ago

Add option which allows students to select a desired hostel before booking accommodation.

  • Property svn:keywords set to Id
File size: 24.8 KB
Line 
1## $Id: viewlets.py 13457 2015-11-16 09:05:30Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18import grok
19from zope.component import getUtility
20from zope.interface import Interface
21from zope.i18n import translate
22from waeup.kofa.interfaces import IExtFileStore, IKofaObject
23from waeup.kofa.interfaces import MessageFactory as _
24from waeup.kofa.browser.viewlets import (
25    PrimaryNavTab, ManageActionButton, AddActionButton)
26from waeup.kofa.browser.layout import default_primary_nav_template
27from waeup.kofa.students.workflow import (
28    ADMITTED, PAID, REQUESTED, RETURNING, CLEARED, REGISTERED,
29    VALIDATED, GRADUATED, TRANSCRIPT)
30from waeup.kofa.students.browser import (
31    StudentsContainerPage,
32    StudentsContainerManagePage, StudentBaseDisplayFormPage,
33    StudentClearanceDisplayFormPage, StudentPersonalDisplayFormPage,
34    StudyCourseDisplayFormPage, StudyLevelDisplayFormPage,
35    CourseTicketDisplayFormPage, OnlinePaymentDisplayFormPage,
36    AccommodationManageFormPage, BedTicketDisplayFormPage,
37    StudentClearanceEditFormPage, StudentPersonalEditFormPage,
38    PaymentsManageFormPage, StudyCourseTranscriptPage)
39from waeup.kofa.students.interfaces import (
40    IStudentsContainer, IStudent, IStudentStudyCourse, IStudentAccommodation,
41    IStudentStudyLevel, ICourseTicket, IStudentOnlinePayment, IBedTicket,
42    IStudentPaymentsContainer, IStudentsUtils
43    )
44
45grok.context(IKofaObject) # Make IKofaObject the default context
46grok.templatedir('browser_templates')
47
48
49class StudentManageSidebar(grok.ViewletManager):
50    grok.name('left_studentmanage')
51
52class StudentManageLink(grok.Viewlet):
53    """A link displayed in the student box which shows up for StudentNavigation
54    objects.
55
56    """
57    grok.baseclass()
58    grok.viewletmanager(StudentManageSidebar)
59    grok.context(IKofaObject)
60    grok.view(Interface)
61    grok.order(5)
62    grok.require('waeup.viewStudent')
63
64    link = 'index'
65    text = _(u'Base Data')
66
67    def render(self):
68        url = self.view.url(self.context.student, self.link)
69        # Here we know that the cookie has been set
70        lang = self.request.cookies.get('kofa.language')
71        text = translate(self.text, 'waeup.kofa',
72            target_language=lang)
73        if not self.link:
74            return ''
75        return u'<li><a href="%s">%s</a></li>' % (
76                url, text)
77
78class StudentManageApplicationLink(StudentManageLink):
79    grok.order(1)
80    link = 'application_slip'
81    text = _(u'Application Slip')
82
83    def render(self):
84        slip = getUtility(IExtFileStore).getFileByContext(
85            self.context.student, attr=self.link)
86        if slip:
87            lang = self.request.cookies.get('kofa.language')
88            text = translate(self.text, 'waeup.kofa',
89                target_language=lang)
90            url = self.view.url(self.context.student,self.link)
91            return u'<li><a href="%s">%s</a></li>' % (
92                    url, text)
93        return ''
94
95class StudentManageBaseLink(StudentManageLink):
96    grok.order(2)
97    link = 'index'
98    text = _(u'Base Data')
99
100class StudentManageClearanceLink(StudentManageLink):
101    grok.order(3)
102    grok.name('studentmanageclearancelink')
103    link = 'view_clearance'
104    text = _(u'Clearance Data')
105
106class StudentManagePersonalLink(StudentManageLink):
107    grok.order(4)
108    grok.name('studentmanagepersonallink')
109    link = 'view_personal'
110    text = _(u'Personal Data')
111
112class StudentManageStudyCourseLink(StudentManageLink):
113    grok.order(5)
114    link = 'studycourse'
115    text = _(u'Study Course')
116
117class StudentManagePaymentsLink(StudentManageLink):
118    grok.order(6)
119    grok.require('waeup.viewStudent')
120    link = 'payments'
121    text = _(u'Payments')
122
123class StudentManageAccommodationLink(StudentManageLink):
124    grok.order(7)
125    grok.name('studentmanageaccommodationlink')
126    grok.require('waeup.handleAccommodation')
127    link = 'accommodation'
128    text = _(u'Accommodation')
129
130class StudentManageHistoryLink(StudentManageLink):
131    grok.order(8)
132    link = 'history'
133    text = _(u'History')
134
135
136class StudentsContainerManageActionButton(ManageActionButton):
137    grok.order(1)
138    grok.context(IStudentsContainer)
139    grok.view(StudentsContainerPage)
140    grok.require('waeup.manageStudent')
141    text = _('Manage students section')
142
143class StudentsContainerAddActionButton(AddActionButton):
144    grok.order(1)
145    grok.context(IStudentsContainer)
146    grok.view(StudentsContainerManagePage)
147    grok.require('waeup.manageStudent')
148    text = _('Add student')
149    target = 'addstudent'
150
151class ContactActionButton(ManageActionButton):
152    grok.order(5)
153    grok.context(IStudent)
154    grok.view(StudentBaseDisplayFormPage)
155    grok.require('waeup.manageStudent')
156    icon = 'actionicon_mail.png'
157    text = _('Send email')
158    target = 'contactstudent'
159
160class StudentBaseManageActionButton(ManageActionButton):
161    grok.order(1)
162    grok.context(IStudent)
163    grok.view(StudentBaseDisplayFormPage)
164    grok.require('waeup.manageStudent')
165    text = _('Manage')
166    target = 'manage_base'
167
168class StudentTrigTransActionButton(ManageActionButton):
169    grok.order(2)
170    grok.context(IStudent)
171    grok.view(StudentBaseDisplayFormPage)
172    grok.require('waeup.triggerTransition')
173    icon = 'actionicon_trigtrans.png'
174    text = _(u'Trigger transition')
175    target = 'trigtrans'
176
177class StudentLoginAsActionButton(ManageActionButton):
178    grok.order(3)
179    grok.context(IStudent)
180    grok.view(StudentBaseDisplayFormPage)
181    grok.require('waeup.loginAsStudent')
182    icon = 'actionicon_mask.png'
183    text = _(u'Login as student')
184    target = 'loginasstep1'
185
186class AdmissionSlipActionButton(ManageActionButton):
187    grok.order(4)
188    grok.context(IStudent)
189    grok.view(StudentBaseDisplayFormPage)
190    grok.require('waeup.viewStudent')
191    icon = 'actionicon_pdf.png'
192    text = _('Download admission letter')
193    target = 'admission_slip.pdf'
194
195class StudentTransferButton(ManageActionButton):
196    grok.order(6)
197    grok.context(IStudent)
198    grok.view(StudentBaseDisplayFormPage)
199    grok.require('waeup.manageStudent')
200    text = _('Transfer student')
201    target = 'transfer'
202    icon = 'actionicon_redo.png'
203
204class StudentDeactivateActionButton(ManageActionButton):
205    grok.order(7)
206    grok.context(IStudent)
207    grok.view(StudentBaseDisplayFormPage)
208    grok.require('waeup.manageStudent')
209    text = _('Deactivate account')
210    target = 'deactivate'
211    icon = 'actionicon_traffic_lights_red.png'
212
213    @property
214    def target_url(self):
215        if self.context.suspended:
216            return ''
217        return self.view.url(self.view.context, self.target)
218
219    @property
220    def onclick(self):
221        return "return window.confirm(%s);" % _(
222            "'A history message will be added. Are you sure?'")
223
224class StudentActivateActionButton(ManageActionButton):
225    grok.order(7)
226    grok.context(IStudent)
227    grok.view(StudentBaseDisplayFormPage)
228    grok.require('waeup.manageStudent')
229    text = _('Activate account')
230    target = 'activate'
231    icon = 'actionicon_traffic_lights_green.png'
232
233    @property
234    def target_url(self):
235        if not self.context.suspended:
236            return ''
237        return self.view.url(self.view.context, self.target)
238
239    @property
240    def onclick(self):
241        return "return window.confirm(%s);" % _(
242            "'A history message will be added. Are you sure?'")
243
244class StudentClearanceManageActionButton(ManageActionButton):
245    grok.order(1)
246    grok.context(IStudent)
247    grok.view(StudentClearanceDisplayFormPage)
248    grok.require('waeup.manageStudent')
249    text = _('Manage')
250    target = 'manage_clearance'
251
252class StudentClearActionButton(ManageActionButton):
253    grok.order(2)
254    grok.context(IStudent)
255    grok.view(StudentClearanceDisplayFormPage)
256    grok.require('waeup.clearStudent')
257    text = _('Clear student')
258    target = 'clear'
259    icon = 'actionicon_accept.png'
260
261    @property
262    def target_url(self):
263        cdm = getUtility(IStudentsUtils).clearance_disabled_message(self.context)
264        if cdm:
265            return ''
266        if self.context.state != REQUESTED:
267            return ''
268        return self.view.url(self.view.context, self.target)
269
270class StudentRejectClearanceActionButton(ManageActionButton):
271    grok.order(3)
272    grok.context(IStudent)
273    grok.view(StudentClearanceDisplayFormPage)
274    grok.require('waeup.clearStudent')
275    text = _('Reject clearance')
276    target = 'reject_clearance'
277    icon = 'actionicon_reject.png'
278
279    @property
280    def target_url(self):
281        cdm = getUtility(IStudentsUtils).clearance_disabled_message(self.context)
282        if cdm:
283            return ''
284        if self.context.state not in (REQUESTED, CLEARED):
285            return ''
286        return self.view.url(self.view.context, self.target)
287
288class ClearanceSlipActionButton(ManageActionButton):
289    grok.order(4)
290    grok.context(IStudent)
291    grok.view(StudentClearanceDisplayFormPage)
292    grok.require('waeup.viewStudent')
293    icon = 'actionicon_pdf.png'
294    text = _('Download clearance slip')
295    target = 'clearance_slip.pdf'
296
297class ClearanceViewActionButton(ManageActionButton):
298    grok.order(1)
299    grok.context(IStudent)
300    grok.view(StudentClearanceEditFormPage)
301    grok.require('waeup.viewStudent')
302    icon = 'actionicon_view.png'
303    text = _('View')
304    target = 'view_clearance'
305
306class PersonalViewActionButton(ManageActionButton):
307    grok.order(1)
308    grok.context(IStudent)
309    grok.view(StudentPersonalEditFormPage)
310    grok.require('waeup.viewStudent')
311    icon = 'actionicon_view.png'
312    text = _('View')
313    target = 'view_personal'
314
315class StudentPersonalManageActionButton(ManageActionButton):
316    grok.order(1)
317    grok.context(IStudent)
318    grok.view(StudentPersonalDisplayFormPage)
319    grok.require('waeup.manageStudent')
320    text = _('Manage')
321    target = 'manage_personal'
322
323class StudentPersonalEditActionButton(ManageActionButton):
324    grok.order(2)
325    grok.context(IStudent)
326    grok.view(StudentPersonalDisplayFormPage)
327    grok.require('waeup.handleStudent')
328    text = _('Edit')
329    target = 'edit_personal'
330
331class StudyCourseManageActionButton(ManageActionButton):
332    grok.order(1)
333    grok.context(IStudentStudyCourse)
334    grok.view(StudyCourseDisplayFormPage)
335    grok.require('waeup.manageStudent')
336    text = _('Manage')
337    target = 'manage'
338
339    @property
340    def target_url(self):
341        if self.context.is_current:
342            return self.view.url(self.view.context, self.target)
343        return False
344
345class StudyCourseTranscriptActionButton(ManageActionButton):
346    grok.order(2)
347    grok.context(IStudentStudyCourse)
348    grok.view(StudyCourseDisplayFormPage)
349    grok.require('waeup.viewTranscript')
350    text = _('Transcript')
351    target = 'transcript'
352    icon = 'actionicon_transcript.png'
353
354    @property
355    def target_url(self):
356        if self.context.student.transcript_enabled:
357            return self.view.url(self.view.context, self.target)
358        return False
359
360class TranscriptSlipActionButton(ManageActionButton):
361    grok.order(1)
362    grok.context(IStudentStudyCourse)
363    grok.view(StudyCourseTranscriptPage)
364    grok.require('waeup.viewTranscript')
365    text = _('Academic Transcript')
366    target = 'transcript.pdf'
367    icon = 'actionicon_pdf.png'
368
369    @property
370    def target_url(self):
371        if self.context.student.transcript_enabled:
372            return self.view.url(self.view.context, self.target)
373        return False
374
375class RevertTransferActionButton(ManageActionButton):
376    grok.order(1)
377    grok.context(IStudentStudyCourse)
378    grok.view(StudyCourseDisplayFormPage)
379    grok.require('waeup.manageStudent')
380    icon = 'actionicon_undo.png'
381    text = _('Reactivate this study course (revert previous transfer)')
382    target = 'revert_transfer'
383
384    @property
385    def target_url(self):
386        if self.context.is_previous:
387            return self.view.url(self.view.context.__parent__, self.target)
388        return False
389
390class StudyLevelManageActionButton(ManageActionButton):
391    grok.order(1)
392    grok.context(IStudentStudyLevel)
393    grok.view(StudyLevelDisplayFormPage)
394    grok.require('waeup.manageStudent')
395    text = _('Manage')
396    target = 'manage'
397
398    @property
399    def target_url(self):
400        is_current = self.context.__parent__.is_current
401        if not is_current:
402            return ''
403        return self.view.url(self.view.context, self.target)
404
405class StudentValidateCoursesActionButton(ManageActionButton):
406    grok.order(3)
407    grok.context(IStudentStudyLevel)
408    grok.view(StudyLevelDisplayFormPage)
409    grok.require('waeup.validateStudent')
410    text = _('Validate courses')
411    target = 'validate_courses'
412    icon = 'actionicon_accept.png'
413
414    @property
415    def target_url(self):
416        is_current = self.context.__parent__.is_current
417        if self.context.student.state != REGISTERED or \
418            str(self.context.__parent__.current_level) != self.context.__name__ or\
419            not is_current:
420            return ''
421        return self.view.url(self.view.context, self.target)
422
423class StudentRejectCoursesActionButton(ManageActionButton):
424    grok.order(4)
425    grok.context(IStudentStudyLevel)
426    grok.view(StudyLevelDisplayFormPage)
427    grok.require('waeup.validateStudent')
428    text = _('Reject courses')
429    target = 'reject_courses'
430    icon = 'actionicon_reject.png'
431
432    @property
433    def target_url(self):
434        is_current = self.context.__parent__.is_current
435        if self.context.student.state not in (VALIDATED, REGISTERED) or \
436            str(self.context.__parent__.current_level) != self.context.__name__ or\
437            not is_current:
438            return ''
439        return self.view.url(self.view.context, self.target)
440
441class CourseRegistrationSlipActionButton(ManageActionButton):
442    grok.order(5)
443    grok.context(IStudentStudyLevel)
444    grok.view(StudyLevelDisplayFormPage)
445    grok.require('waeup.viewStudent')
446    icon = 'actionicon_pdf.png'
447    text = _('Download course registration slip')
448    target = 'course_registration_slip.pdf'
449
450    @property
451    def target_url(self):
452        is_current = self.context.__parent__.is_current
453        if not is_current:
454            return ''
455        return self.view.url(self.view.context, self.target)
456
457class CourseTicketManageActionButton(ManageActionButton):
458    grok.order(1)
459    grok.context(ICourseTicket)
460    grok.view(CourseTicketDisplayFormPage)
461    grok.require('waeup.manageStudent')
462    text = _('Manage')
463    target = 'manage'
464
465#class OnlinePaymentManageActionButton(ManageActionButton):
466#    grok.order(1)
467#    grok.context(IStudentPaymentsContainer)
468#    grok.view(PaymentsDisplayFormPage)
469#    grok.require('waeup.manageStudent')
470#    text = 'Manage payments'
471#    target = 'manage'
472
473class PaymentReceiptActionButton(ManageActionButton):
474    grok.order(9) # This button should always be the last one.
475    grok.context(IStudentOnlinePayment)
476    grok.view(OnlinePaymentDisplayFormPage)
477    grok.require('waeup.viewStudent')
478    icon = 'actionicon_pdf.png'
479    text = _('Download payment slip')
480    target = 'payment_slip.pdf'
481
482    @property
483    def target_url(self):
484        #if self.context.p_state != 'paid':
485        #    return ''
486        return self.view.url(self.view.context, self.target)
487
488class ApprovePaymentActionButton(ManageActionButton):
489    grok.order(8)
490    grok.context(IStudentOnlinePayment)
491    grok.view(OnlinePaymentDisplayFormPage)
492    grok.require('waeup.managePortal')
493    icon = 'actionicon_accept.png'
494    text = _('Approve payment')
495    target = 'approve'
496
497    @property
498    def target_url(self):
499        if self.context.p_state == 'paid':
500            return ''
501        return self.view.url(self.view.context, self.target)
502
503class BedTicketSlipActionButton(ManageActionButton):
504    grok.order(1)
505    grok.context(IBedTicket)
506    grok.view(BedTicketDisplayFormPage)
507    grok.require('waeup.handleAccommodation')
508    icon = 'actionicon_pdf.png'
509    text = _('Download bed allocation slip')
510    target = 'bed_allocation_slip.pdf'
511
512class RelocateStudentActionButton(ManageActionButton):
513    grok.order(2)
514    grok.context(IBedTicket)
515    grok.view(BedTicketDisplayFormPage)
516    grok.require('waeup.manageHostels')
517    icon = 'actionicon_reload.png'
518    text = _('Relocate student')
519    target = 'relocate'
520
521class StudentBaseActionButton(ManageActionButton):
522    grok.order(1)
523    grok.context(IStudent)
524    grok.view(StudentBaseDisplayFormPage)
525    grok.require('waeup.handleStudent')
526    text = _('Edit')
527    target = 'edit_base'
528
529class StudentPasswordActionButton(ManageActionButton):
530    grok.order(2)
531    grok.context(IStudent)
532    grok.view(StudentBaseDisplayFormPage)
533    grok.require('waeup.handleStudent')
534    icon = 'actionicon_key.png'
535    text = _('Change password')
536    target = 'change_password'
537
538class StudentPassportActionButton(ManageActionButton):
539    grok.order(3)
540    grok.context(IStudent)
541    grok.view(StudentBaseDisplayFormPage)
542    grok.require('waeup.handleStudent')
543    icon = 'actionicon_portrait.png'
544    text = _('Change portrait')
545    target = 'change_portrait'
546
547    @property
548    def target_url(self):
549        PORTRAIT_CHANGE_STATES = getUtility(IStudentsUtils).PORTRAIT_CHANGE_STATES
550        if self.context.state not in PORTRAIT_CHANGE_STATES:
551            return ''
552        return self.view.url(self.view.context, self.target)
553
554class StudentClearanceStartActionButton(ManageActionButton):
555    grok.order(1)
556    grok.context(IStudent)
557    grok.view(StudentClearanceDisplayFormPage)
558    grok.require('waeup.handleStudent')
559    icon = 'actionicon_start.gif'
560    text = _('Start clearance')
561    target = 'start_clearance'
562
563    @property
564    def target_url(self):
565        if self.context.state != ADMITTED:
566            return ''
567        return self.view.url(self.view.context, self.target)
568
569class StudentClearanceEditActionButton(ManageActionButton):
570    grok.order(1)
571    grok.context(IStudent)
572    grok.view(StudentClearanceDisplayFormPage)
573    grok.require('waeup.handleStudent')
574    text = _('Edit')
575    target = 'cedit'
576
577    @property
578    def target_url(self):
579        if self.context.clearance_locked:
580            return ''
581        return self.view.url(self.view.context, self.target)
582
583class StartSessionActionButton(ManageActionButton):
584    grok.order(1)
585    grok.context(IStudentStudyCourse)
586    grok.view(StudyCourseDisplayFormPage)
587    grok.require('waeup.handleStudent')
588    icon = 'actionicon_start.gif'
589    text = _('Start new session')
590    target = 'start_session'
591
592    @property
593    def target_url(self):
594        if self.context.next_session_allowed and self.context.is_current:
595            return self.view.url(self.view.context, self.target)
596        return False
597
598class AddStudyLevelActionButton(AddActionButton):
599    grok.order(1)
600    grok.context(IStudentStudyCourse)
601    grok.view(StudyCourseDisplayFormPage)
602    grok.require('waeup.handleStudent')
603    text = _('Add course list')
604    target = 'add'
605
606    @property
607    def target_url(self):
608        student = self.view.context.student
609        condition1 = student.state != PAID
610        condition2 = str(student['studycourse'].current_level) in \
611            self.view.context.keys()
612        condition3 = not self.context.is_current
613        if condition1 or condition2 or condition3:
614            return ''
615        return self.view.url(self.view.context, self.target)
616
617class StudyLevelEditActionButton(ManageActionButton):
618    grok.order(2)
619    grok.context(IStudentStudyLevel)
620    grok.view(StudyLevelDisplayFormPage)
621    grok.require('waeup.editStudyLevel')
622    text = _('Edit course list')
623    target = 'edit'
624
625    @property
626    def target_url(self):
627        student = self.view.context.student
628        condition1 = student.state == PAID
629        condition2 = self.view.context.is_current_level
630        is_current = self.context.__parent__.is_current
631        if condition1 and condition2 and is_current:
632            return self.view.url(self.view.context, self.target)
633        return ''
634
635class AddPaymentActionButton(AddActionButton):
636    grok.order(1)
637    grok.context(IStudentPaymentsContainer)
638    grok.view(PaymentsManageFormPage)
639    grok.require('waeup.payStudent')
640    text = _('Add current session payment ticket')
641    target = 'addop'
642
643class AddPreviousPaymentActionButton(AddActionButton):
644    grok.order(2)
645    grok.context(IStudentPaymentsContainer)
646    grok.view(PaymentsManageFormPage)
647    grok.require('waeup.payStudent')
648    grok.name('addpreviouspaymentactionbutton')
649    text = _('Add previous session payment ticket')
650    target = 'addpp'
651
652    @property
653    def target_url(self):
654        student = self.view.context.student
655        if student.before_payment or not self.target:
656            return ''
657        return self.view.url(self.view.context, self.target)
658
659class AddBalancePaymentActionButton(AddActionButton):
660    grok.order(3)
661    grok.context(IStudentPaymentsContainer)
662    grok.view(PaymentsManageFormPage)
663    grok.require('waeup.manageStudent')
664    grok.name('addbalancepaymentactionbutton')
665    text = _('Add balance payment ticket')
666    target = 'addbp'
667
668    @property
669    def target_url(self):
670        if not self.target:
671            return ''
672        return self.view.url(self.view.context, self.target)
673
674class RequestTranscriptActionButton(ManageActionButton):
675    grok.order(8)
676    grok.context(IStudent)
677    grok.view(StudentBaseDisplayFormPage)
678    grok.require('waeup.handleStudent')
679    text = _('Request transcript')
680    target = 'request_transcript'
681    icon = 'actionicon_transcript.png'
682
683    @property
684    def target_url(self):
685        if self.context.state != GRADUATED:
686            return ''
687        return self.view.url(self.view.context, self.target)
688
689class ProcessTranscriptRequestActionButton(ManageActionButton):
690    grok.order(9)
691    grok.context(IStudent)
692    grok.view(StudentBaseDisplayFormPage)
693    grok.require('waeup.viewTranscript')
694    text = _('Manage transcript request')
695    target = 'process_transcript_request'
696    icon = 'actionicon_transcript.png'
697
698    @property
699    def target_url(self):
700        if self.context.state != TRANSCRIPT:
701            return ''
702        return self.view.url(self.view.context, self.target)
703
704class StudentsTab(PrimaryNavTab):
705    """Students tab in primary navigation.
706    """
707
708    grok.context(IKofaObject)
709    grok.order(4)
710    grok.require('waeup.viewStudentsContainer')
711    grok.name('studentstab')
712
713    pnav = 4
714    tab_title = _(u'Students')
715
716    @property
717    def link_target(self):
718        return self.view.application_url('students')
719
720class PrimaryStudentNavManager(grok.ViewletManager):
721    """Viewlet manager for the primary navigation tab.
722    """
723    grok.name('primary_nav_student')
724
725class PrimaryStudentNavTab(grok.Viewlet):
726    """Base for primary student nav tabs.
727    """
728    grok.baseclass()
729    grok.context(IKofaObject)
730    grok.viewletmanager(PrimaryStudentNavManager)
731    template = default_primary_nav_template
732    grok.order(1)
733    grok.require('waeup.Authenticated')
734    pnav = 0
735    tab_title = u'Some Text'
736
737    @property
738    def link_target(self):
739        return self.view.application_url()
740
741    @property
742    def active(self):
743        view_pnav = getattr(self.view, 'pnav', 0)
744        if view_pnav == self.pnav:
745            return 'active'
746        return ''
747
748class MyStudentDataTab(PrimaryStudentNavTab):
749    """MyData dropdown tab in primary navigation.
750    """
751    grok.order(3)
752    grok.require('waeup.viewMyStudentDataTab')
753    grok.template('mydatadropdowntabs')
754    grok.name('mystudentdatatab')
755    pnav = 4
756    tab_title = _(u'My Data')
757
758    @property
759    def active(self):
760        view_pnav = getattr(self.view, 'pnav', 0)
761        if view_pnav == self.pnav:
762            return 'active dropdown'
763        return 'dropdown'
764
765    @property
766    def targets(self):
767        student = grok.getSite()['students'][self.request.principal.id]
768        student_url = self.view.url(student)
769        app_slip = getUtility(IExtFileStore).getFileByContext(
770            student, 'application_slip')
771        targets = []
772        if app_slip:
773            targets = [{'url':student_url + '/application_slip',
774                        'title':_('Application Slip')},]
775        targets += [
776            {'url':student_url, 'title':'Base Data'},
777            {'url':student_url + '/view_clearance',
778             'title':_('Clearance Data')},
779            {'url':student_url + '/view_personal', 'title':_('Personal Data')},
780            {'url':student_url + '/studycourse', 'title':_('Study Course')},
781            {'url':student_url + '/payments', 'title':_('Payments')},
782            {'url':student_url + '/accommodation',
783             'title':_('Accommodation Data')},
784            {'url':student_url + '/history', 'title':_('History')},
785            ]
786        return targets
Note: See TracBrowser for help on using the repository browser.