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

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

Add button and view which allow students to unregister their
current course list unless the courses have not been validated.

  • Property svn:keywords set to Id
File size: 25.4 KB
Line 
1## $Id: viewlets.py 13610 2016-01-13 20:59:17Z 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 StudentUnregisterCoursesActionButton(ManageActionButton):
442    grok.order(5)
443    grok.context(IStudentStudyLevel)
444    grok.view(StudyLevelDisplayFormPage)
445    grok.require('waeup.handleStudent')
446    text = _('Unregister courses')
447    target = 'unregister_courses'
448    icon = 'actionicon_reject.png'
449
450    @property
451    def target_url(self):
452        is_current = self.context.__parent__.is_current
453        if self.context.student.state != REGISTERED or \
454            str(self.context.__parent__.current_level) != self.context.__name__ or\
455            not is_current:
456            return ''
457        return self.view.url(self.view.context, self.target)
458
459class CourseRegistrationSlipActionButton(ManageActionButton):
460    grok.order(6)
461    grok.context(IStudentStudyLevel)
462    grok.view(StudyLevelDisplayFormPage)
463    grok.require('waeup.viewStudent')
464    icon = 'actionicon_pdf.png'
465    text = _('Download course registration slip')
466    target = 'course_registration_slip.pdf'
467
468    @property
469    def target_url(self):
470        is_current = self.context.__parent__.is_current
471        if not is_current:
472            return ''
473        return self.view.url(self.view.context, self.target)
474
475class CourseTicketManageActionButton(ManageActionButton):
476    grok.order(1)
477    grok.context(ICourseTicket)
478    grok.view(CourseTicketDisplayFormPage)
479    grok.require('waeup.manageStudent')
480    text = _('Manage')
481    target = 'manage'
482
483#class OnlinePaymentManageActionButton(ManageActionButton):
484#    grok.order(1)
485#    grok.context(IStudentPaymentsContainer)
486#    grok.view(PaymentsDisplayFormPage)
487#    grok.require('waeup.manageStudent')
488#    text = 'Manage payments'
489#    target = 'manage'
490
491class PaymentReceiptActionButton(ManageActionButton):
492    grok.order(9) # This button should always be the last one.
493    grok.context(IStudentOnlinePayment)
494    grok.view(OnlinePaymentDisplayFormPage)
495    grok.require('waeup.viewStudent')
496    icon = 'actionicon_pdf.png'
497    text = _('Download payment slip')
498    target = 'payment_slip.pdf'
499
500    @property
501    def target_url(self):
502        #if self.context.p_state != 'paid':
503        #    return ''
504        return self.view.url(self.view.context, self.target)
505
506class ApprovePaymentActionButton(ManageActionButton):
507    grok.order(8)
508    grok.context(IStudentOnlinePayment)
509    grok.view(OnlinePaymentDisplayFormPage)
510    grok.require('waeup.managePortal')
511    icon = 'actionicon_accept.png'
512    text = _('Approve payment')
513    target = 'approve'
514
515    @property
516    def target_url(self):
517        if self.context.p_state == 'paid':
518            return ''
519        return self.view.url(self.view.context, self.target)
520
521class BedTicketSlipActionButton(ManageActionButton):
522    grok.order(1)
523    grok.context(IBedTicket)
524    grok.view(BedTicketDisplayFormPage)
525    grok.require('waeup.handleAccommodation')
526    icon = 'actionicon_pdf.png'
527    text = _('Download bed allocation slip')
528    target = 'bed_allocation_slip.pdf'
529
530class RelocateStudentActionButton(ManageActionButton):
531    grok.order(2)
532    grok.context(IBedTicket)
533    grok.view(BedTicketDisplayFormPage)
534    grok.require('waeup.manageHostels')
535    icon = 'actionicon_reload.png'
536    text = _('Relocate student')
537    target = 'relocate'
538
539class StudentBaseActionButton(ManageActionButton):
540    grok.order(1)
541    grok.context(IStudent)
542    grok.view(StudentBaseDisplayFormPage)
543    grok.require('waeup.handleStudent')
544    text = _('Edit')
545    target = 'edit_base'
546
547class StudentPasswordActionButton(ManageActionButton):
548    grok.order(2)
549    grok.context(IStudent)
550    grok.view(StudentBaseDisplayFormPage)
551    grok.require('waeup.handleStudent')
552    icon = 'actionicon_key.png'
553    text = _('Change password')
554    target = 'change_password'
555
556class StudentPassportActionButton(ManageActionButton):
557    grok.order(3)
558    grok.context(IStudent)
559    grok.view(StudentBaseDisplayFormPage)
560    grok.require('waeup.handleStudent')
561    icon = 'actionicon_portrait.png'
562    text = _('Change portrait')
563    target = 'change_portrait'
564
565    @property
566    def target_url(self):
567        PORTRAIT_CHANGE_STATES = getUtility(IStudentsUtils).PORTRAIT_CHANGE_STATES
568        if self.context.state not in PORTRAIT_CHANGE_STATES:
569            return ''
570        return self.view.url(self.view.context, self.target)
571
572class StudentClearanceStartActionButton(ManageActionButton):
573    grok.order(1)
574    grok.context(IStudent)
575    grok.view(StudentClearanceDisplayFormPage)
576    grok.require('waeup.handleStudent')
577    icon = 'actionicon_start.gif'
578    text = _('Start clearance')
579    target = 'start_clearance'
580
581    @property
582    def target_url(self):
583        if self.context.state != ADMITTED:
584            return ''
585        return self.view.url(self.view.context, self.target)
586
587class StudentClearanceEditActionButton(ManageActionButton):
588    grok.order(1)
589    grok.context(IStudent)
590    grok.view(StudentClearanceDisplayFormPage)
591    grok.require('waeup.handleStudent')
592    text = _('Edit')
593    target = 'cedit'
594
595    @property
596    def target_url(self):
597        if self.context.clearance_locked:
598            return ''
599        return self.view.url(self.view.context, self.target)
600
601class StartSessionActionButton(ManageActionButton):
602    grok.order(1)
603    grok.context(IStudentStudyCourse)
604    grok.view(StudyCourseDisplayFormPage)
605    grok.require('waeup.handleStudent')
606    icon = 'actionicon_start.gif'
607    text = _('Start new session')
608    target = 'start_session'
609
610    @property
611    def target_url(self):
612        if self.context.next_session_allowed and self.context.is_current:
613            return self.view.url(self.view.context, self.target)
614        return False
615
616class AddStudyLevelActionButton(AddActionButton):
617    grok.order(1)
618    grok.context(IStudentStudyCourse)
619    grok.view(StudyCourseDisplayFormPage)
620    grok.require('waeup.handleStudent')
621    text = _('Add course list')
622    target = 'add'
623
624    @property
625    def target_url(self):
626        student = self.view.context.student
627        condition1 = student.state != PAID
628        condition2 = str(student['studycourse'].current_level) in \
629            self.view.context.keys()
630        condition3 = not self.context.is_current
631        if condition1 or condition2 or condition3:
632            return ''
633        return self.view.url(self.view.context, self.target)
634
635class StudyLevelEditActionButton(ManageActionButton):
636    grok.order(2)
637    grok.context(IStudentStudyLevel)
638    grok.view(StudyLevelDisplayFormPage)
639    grok.require('waeup.editStudyLevel')
640    text = _('Edit course list')
641    target = 'edit'
642
643    @property
644    def target_url(self):
645        student = self.view.context.student
646        condition1 = student.state == PAID
647        condition2 = self.view.context.is_current_level
648        is_current = self.context.__parent__.is_current
649        if condition1 and condition2 and is_current:
650            return self.view.url(self.view.context, self.target)
651        return ''
652
653class AddPaymentActionButton(AddActionButton):
654    grok.order(1)
655    grok.context(IStudentPaymentsContainer)
656    grok.view(PaymentsManageFormPage)
657    grok.require('waeup.payStudent')
658    text = _('Add current session payment ticket')
659    target = 'addop'
660
661class AddPreviousPaymentActionButton(AddActionButton):
662    grok.order(2)
663    grok.context(IStudentPaymentsContainer)
664    grok.view(PaymentsManageFormPage)
665    grok.require('waeup.payStudent')
666    grok.name('addpreviouspaymentactionbutton')
667    text = _('Add previous session payment ticket')
668    target = 'addpp'
669
670    @property
671    def target_url(self):
672        student = self.view.context.student
673        if student.before_payment or not self.target:
674            return ''
675        return self.view.url(self.view.context, self.target)
676
677class AddBalancePaymentActionButton(AddActionButton):
678    grok.order(3)
679    grok.context(IStudentPaymentsContainer)
680    grok.view(PaymentsManageFormPage)
681    grok.require('waeup.manageStudent')
682    grok.name('addbalancepaymentactionbutton')
683    text = _('Add balance payment ticket')
684    target = 'addbp'
685
686    @property
687    def target_url(self):
688        if not self.target:
689            return ''
690        return self.view.url(self.view.context, self.target)
691
692class RequestTranscriptActionButton(ManageActionButton):
693    grok.order(8)
694    grok.context(IStudent)
695    grok.view(StudentBaseDisplayFormPage)
696    grok.require('waeup.handleStudent')
697    text = _('Request transcript')
698    target = 'request_transcript'
699    icon = 'actionicon_transcript.png'
700
701    @property
702    def target_url(self):
703        if self.context.state != GRADUATED:
704            return ''
705        return self.view.url(self.view.context, self.target)
706
707class ProcessTranscriptRequestActionButton(ManageActionButton):
708    grok.order(9)
709    grok.context(IStudent)
710    grok.view(StudentBaseDisplayFormPage)
711    grok.require('waeup.viewTranscript')
712    text = _('Manage transcript request')
713    target = 'process_transcript_request'
714    icon = 'actionicon_transcript.png'
715
716    @property
717    def target_url(self):
718        if self.context.state != TRANSCRIPT:
719            return ''
720        return self.view.url(self.view.context, self.target)
721
722class StudentsTab(PrimaryNavTab):
723    """Students tab in primary navigation.
724    """
725
726    grok.context(IKofaObject)
727    grok.order(4)
728    grok.require('waeup.viewStudentsContainer')
729    grok.name('studentstab')
730
731    pnav = 4
732    tab_title = _(u'Students')
733
734    @property
735    def link_target(self):
736        return self.view.application_url('students')
737
738class PrimaryStudentNavManager(grok.ViewletManager):
739    """Viewlet manager for the primary navigation tab.
740    """
741    grok.name('primary_nav_student')
742
743class PrimaryStudentNavTab(grok.Viewlet):
744    """Base for primary student nav tabs.
745    """
746    grok.baseclass()
747    grok.context(IKofaObject)
748    grok.viewletmanager(PrimaryStudentNavManager)
749    template = default_primary_nav_template
750    grok.order(1)
751    grok.require('waeup.Authenticated')
752    pnav = 0
753    tab_title = u'Some Text'
754
755    @property
756    def link_target(self):
757        return self.view.application_url()
758
759    @property
760    def active(self):
761        view_pnav = getattr(self.view, 'pnav', 0)
762        if view_pnav == self.pnav:
763            return 'active'
764        return ''
765
766class MyStudentDataTab(PrimaryStudentNavTab):
767    """MyData dropdown tab in primary navigation.
768    """
769    grok.order(3)
770    grok.require('waeup.viewMyStudentDataTab')
771    grok.template('mydatadropdowntabs')
772    grok.name('mystudentdatatab')
773    pnav = 4
774    tab_title = _(u'My Data')
775
776    @property
777    def active(self):
778        view_pnav = getattr(self.view, 'pnav', 0)
779        if view_pnav == self.pnav:
780            return 'active dropdown'
781        return 'dropdown'
782
783    @property
784    def targets(self):
785        student = grok.getSite()['students'][self.request.principal.id]
786        student_url = self.view.url(student)
787        app_slip = getUtility(IExtFileStore).getFileByContext(
788            student, 'application_slip')
789        targets = []
790        if app_slip:
791            targets = [{'url':student_url + '/application_slip',
792                        'title':_('Application Slip')},]
793        targets += [
794            {'url':student_url, 'title':'Base Data'},
795            {'url':student_url + '/view_clearance',
796             'title':_('Clearance Data')},
797            {'url':student_url + '/view_personal', 'title':_('Personal Data')},
798            {'url':student_url + '/studycourse', 'title':_('Study Course')},
799            {'url':student_url + '/payments', 'title':_('Payments')},
800            {'url':student_url + '/accommodation',
801             'title':_('Accommodation Data')},
802            {'url':student_url + '/history', 'title':_('History')},
803            ]
804        return targets
Note: See TracBrowser for help on using the repository browser.