source: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/students/browser.py @ 16338

Last change on this file since 16338 was 16298, checked in by Henrik Bettermann, 4 years ago

Bio Data form should now be available to all students who have paid at least 200,000.

  • Property svn:keywords set to Id
File size: 23.5 KB
RevLine 
[10765]1## $Id: browser.py 16298 2020-11-04 11:20:31Z henrik $
2##
3## Copyright (C) 2012 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
[16160]19import os
[10765]20from zope.i18n import translate
21from zope.schema.interfaces import ConstraintNotSatisfied
22from zope.component import getUtility
[16249]23from zope.formlib.textwidgets import BytesDisplayWidget
[10765]24from hurry.workflow.interfaces import IWorkflowInfo
[16259]25from waeup.kofa.interfaces import (REQUESTED, ADMITTED, CLEARANCE,
26    IExtFileStore, IKofaUtils, academic_sessions_vocab)
[10765]27from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
[15802]28from waeup.kofa.browser.layout import (
29    action, jsaction, UtilityView, KofaEditFormPage)
[10765]30from waeup.kofa.students.browser import (
31    StudyLevelEditFormPage, StudyLevelDisplayFormPage,
[13062]32    StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
[10765]33    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
[16015]34    StartClearancePage, BalancePaymentAddFormPage,
[16252]35    ExportPDFAdmissionSlip, ExportPDFPersonalDataSlip,
[10765]36    msave, emit_lock_message)
[15802]37from waeup.kofa.students.interfaces import (
38    IStudentsUtils, ICourseTicket, IStudent)
[16127]39from waeup.kofa.students.vocabularies import StudyLevelSource
[10765]40from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS
41from kofacustom.nigeria.students.browser import (
42    NigeriaOnlinePaymentDisplayFormPage,
[15704]43    NigeriaStudentBaseDisplayFormPage,
[10765]44    NigeriaStudentBaseManageFormPage,
45    NigeriaStudentClearanceEditFormPage,
46    NigeriaOnlinePaymentAddFormPage,
[13062]47    NigeriaExportPDFPaymentSlip,
48    NigeriaExportPDFClearanceSlip,
[15696]49    NigeriaExportPDFCourseRegistrationSlip,
[15704]50    NigeriaStudentBaseEditFormPage,
[15722]51    NigeriaBedTicketAddPage,
[15999]52    NigeriaAccommodationManageFormPage,
53    NigeriaAccommodationDisplayFormPage,
[16249]54    NigeriaStudentPersonalManageFormPage,
55    NigeriaStudentPersonalEditFormPage,
56    NigeriaStudentPersonalDisplayFormPage
[10765]57    )
[15563]58from kofacustom.iuokada.students.interfaces import (
[10765]59    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
[16249]60    ICustomStudentStudyLevel, ICustomStudentBase, ICustomStudent,
61    ICustomStudentPersonal, ICustomStudentPersonalEdit)
[15563]62from kofacustom.iuokada.interfaces import MessageFactory as _
[10765]63
[15704]64class CustomStudentBaseDisplayFormPage(NigeriaStudentBaseDisplayFormPage):
65    """ Page to display student base data
66    """
67    form_fields = grok.AutoFields(ICustomStudentBase).omit(
68        'password', 'suspended', 'suspended_comment', 'flash_notice')
69
70class CustomStudentBaseManageFormPage(NigeriaStudentBaseManageFormPage):
71    """ View to manage student base data
72    """
73    form_fields = grok.AutoFields(ICustomStudentBase).omit(
[15870]74        'student_id', 'adm_code', 'suspended',
75        'financially_cleared_by', 'financial_clearance_date')
[15704]76
77class StudentBaseEditFormPage(NigeriaStudentBaseEditFormPage):
78    """ View to edit student base data
79    """
[16259]80    @property
81    def form_fields(self):
82        form_fields = grok.AutoFields(ICustomStudentBase).select(
[16272]83            'email', 'email2', 'parents_email', 'phone',)
[16259]84        if not self.context.state in (ADMITTED, CLEARANCE):
85            form_fields['parents_email'].for_display = True
86        return form_fields
[15704]87
[15696]88class CustomExportPDFCourseRegistrationSlip(
89    NigeriaExportPDFCourseRegistrationSlip):
90    """Deliver a PDF slip of the context.
91    """
92
93    def _signatures(self):
94        return (
95                ['Student Signature'],
96                ['HoD / Course Adviser Signature'],
97                ['College Officer Signature'],
98                ['Dean Signature']
99                )
100
101    #def _sigsInFooter(self):
102    #    return (_('Student'),
103    #            _('HoD / Course Adviser'),
104    #            _('College Officer'),
105    #            _('Dean'),
106    #            )
[15720]107    #    return ()
108
[16249]109class CustomStudentPersonalDisplayFormPage(NigeriaStudentPersonalDisplayFormPage):
110    """ Page to display student personal data
111    """
112    form_fields = grok.AutoFields(ICustomStudentPersonal)
113    form_fields['perm_address'].custom_widget = BytesDisplayWidget
114    form_fields['postal_address'].custom_widget = BytesDisplayWidget
115    form_fields['hostel_address'].custom_widget = BytesDisplayWidget
116    form_fields['father_address'].custom_widget = BytesDisplayWidget
117    form_fields['mother_address'].custom_widget = BytesDisplayWidget
118    form_fields['guardian_address'].custom_widget = BytesDisplayWidget
119    form_fields[
120        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
121
122
123class CustomStudentPersonalEditFormPage(NigeriaStudentPersonalEditFormPage):
124    """ Page to edit personal data
125    """
[16259]126    form_fields = grok.AutoFields(ICustomStudentPersonalEdit).omit(
127        'personal_updated')
[16249]128
[16258]129    def update(self):
[16298]130        #if not self.context.is_fresh:
131        #    self.flash('Not allowed.', type="danger")
132        #    self.redirect(self.url(self.context))
133        #    return
[16264]134        minamount = 200000
[16298]135        if not self.context.minimumStudentPayments(minamount):
[16264]136            self.flash('Please make required payments first '
137                       '(at least in the amount of %s Naira).' % minamount,
138                       type="warning")
139            self.redirect(self.url(self.context, 'view_personal'))
140            return
[16258]141        super(CustomStudentPersonalEditFormPage, self).update()
142        return
143
144
[16249]145class CustomStudentPersonalManageFormPage(NigeriaStudentPersonalManageFormPage):
146    """ Page to edit personal data
147    """
148    form_fields = grok.AutoFields(ICustomStudentPersonal)
149    form_fields['personal_updated'].for_display = True
150    form_fields[
151        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
152
[16252]153class CustomExportPDFPersonalDataSlip(ExportPDFPersonalDataSlip):
154    """Deliver a PDF base and personal data slip.
155    """
[16292]156    grok.name('course_registration_clearance.pdf')
[16252]157    omit_fields = (
158        'phone', 'email',
159        'suspended',
160        'adm_code', 'suspended_comment',
161        'current_level',
162        'flash_notice', 'entry_session',
163        'parents_email')
164
165    form_fields = grok.AutoFields(ICustomStudentPersonal)
166
[16292]167    def _signatures(self):
168        return ([('I certify that the above named student has satisfied the financial requirements for registration.', 'Name and Signature of Bursary Staff', '<br><br>')],
169                [('I certify that the credentials of the student have been screened by me and the student is hereby cleared.', 'Name and Signature of Registry Staff', '<br><br>')],
170                [('I certify that the above named student has registered with the Library.', 'Name and Signature of Library Staff', '<br><br>')],
171                [('I certify that the above named student has been registered with the college. ', 'Name and Signature of College Officer', '<br><br>')],
172                [('I certify that the above named student has completed his/her ICT registration. ', 'Name and Signature of ICT Staff', '<br><br>')],
173                [('Eligibility/Congratulation Station', 'Name and Signature of Registrar', '')],
174                )
175
[16296]176    @property
177    def tabletitle(self):
178        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
179        tabletitle = []
[16297]180        session = self.context.student.current_session
181        tabletitle.append('_PB_Successful %s/%s Session Payments' %(session, session+1))
[16296]182        return tabletitle
183
[16255]184    def render(self):
185        studentview = StudentBasePDFFormPage(self.context.student,
186            self.request, self.omit_fields)
187        students_utils = getUtility(IStudentsUtils)
188
[16296]189        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
190        P_ID = translate(_('Payment Id'), 'waeup.kofa', target_language=portal_language)
191        #CD = translate(_('Creation Date'), 'waeup.kofa', target_language=portal_language)
192        PD = translate(_('Payment Date'), 'waeup.kofa', target_language=portal_language)
193        CAT = translate(_('Payment Category'), 'waeup.kofa', target_language=portal_language)
194        ITEM = translate(_('Payment Item'), 'waeup.kofa', target_language=portal_language)
195        AMT = translate(_('Amount (Naira)'), 'waeup.kofa', target_language=portal_language)
196        SSS = translate(_('Payment Session'), 'waeup.kofa', target_language=portal_language)
197        tabledata = []
198        tableheader = []
199        tabledata.append(sorted(
200            [value for value in self.context['payments'].values()
201             if value.p_state in ('paid', 'waived', 'scholarship')
202             and value.p_session >= value.student.current_session],
203             key=lambda value: value.p_session))
204        tableheader.append([(P_ID,'p_id', 4.2),
205                         #(CD,'creation_date', 3),
206                         (PD,'formatted_p_date', 3),
207                         (CAT,'category', 3),
208                         (ITEM, 'p_item', 3),
209                         (AMT, 'amount_auth', 2),
210                         (SSS, 'p_session', 2),
211                         ])
212
[16292]213        #watermark_path = os.path.join(
214        #    os.path.dirname(__file__), 'static', 'watermark.pdf')
215        #watermark = open(watermark_path, 'rb')
216        #file_path = os.path.join(
217        #    os.path.dirname(__file__), 'static', 'biodataPage2.pdf')
218        #file = open(file_path, 'rb')
219        #mergefiles = [file,]
220
[16255]221        return students_utils.renderPDF(
[16292]222            self, 'course_registration_clearance.pdf',
[16255]223            self.context.student, studentview,
224            omit_fields=self.omit_fields,
[16292]225            signatures=self._signatures(),
[16296]226
227            tableheader=tableheader,
228            tabledata=tabledata,
229
[16292]230            pagebreak=True,
231        #    mergefiles=mergefiles,
232        #    watermark=watermark
233            )
[16255]234
[15999]235class CustomAccommodationDisplayFormPage(NigeriaAccommodationDisplayFormPage):
236    """ Page to view bed tickets.
237    """
238    with_hostel_selection = True
239
[15722]240class CustomAccommodationManageFormPage(NigeriaAccommodationManageFormPage):
241    """ Page to manage bed tickets.
242    This manage form page is for both students and students officers.
243    """
244    with_hostel_selection = True
245
[15720]246class CustomBedTicketAddPage(NigeriaBedTicketAddPage):
247    """ Page to add a bed ticket
248    """
249    with_ac = False
[15802]250    with_bedselection = True
251
252class StudentGetMatricNumberPage(UtilityView, grok.View):
253    """ Construct and set the matriculation number.
254    """
255    grok.context(IStudent)
256    grok.name('get_matric_number')
[15805]257    grok.require('waeup.manageStudent')
[15802]258
259    def update(self):
260        students_utils = getUtility(IStudentsUtils)
261        msg, mnumber = students_utils.setMatricNumber(self.context)
262        if msg:
263            self.flash(msg, type="danger")
264        else:
265            self.flash(_('Matriculation number %s assigned.' % mnumber))
266            self.context.writeLogMessage(self, '%s assigned' % mnumber)
267        self.redirect(self.url(self.context))
268        return
269
270    def render(self):
[15859]271        return
272
273class SwitchLibraryAccessView(UtilityView, grok.View):
274    """ Switch the library attribute
275    """
276    grok.context(ICustomStudent)
277    grok.name('switch_library_access')
278    grok.require('waeup.switchLibraryAccess')
279
280    def update(self):
281        if self.context.library:
282            self.context.library = False
283            self.context.writeLogMessage(self, 'library access disabled')
284            self.flash(_('Library access disabled'))
285        else:
286            self.context.library = True
287            self.context.writeLogMessage(self, 'library access enabled')
288            self.flash(_('Library access enabled'))
289        self.redirect(self.url(self.context))
290        return
291
292    def render(self):
293        return
294
295class ExportLibIdCard(UtilityView, grok.View):
296    """Deliver an id card for the library.
297    """
298    grok.context(ICustomStudent)
299    grok.name('lib_idcard.pdf')
300    grok.require('waeup.viewStudent')
301    prefix = 'form'
302
303    label = u"Library Clearance"
304
305    omit_fields = (
306        'suspended', 'email', 'phone',
307        'adm_code', 'suspended_comment',
308        'date_of_birth',
309        'current_mode', 'certificate',
310        'entry_session',
311        'flash_notice')
312
313    form_fields = []
314
315    def _sigsInFooter(self):
316        isStudent = getattr(
317            self.request.principal, 'user_type', None) == 'student'
318        if isStudent:
319            return ''
320        return (_("Date, Reader's Signature"),
321                _("Date, Circulation Librarian's Signature"),
322                )
323
324    def update(self):
325        if not self.context.library:
326            self.flash(_('Forbidden!'), type="danger")
327            self.redirect(self.url(self.context))
328        return
329
330    @property
331    def note(self):
332        return """
333<br /><br /><br /><br /><font size='12'>
334This is to certify that the bearer whose photograph and other details appear
335 overleaf is a registered user of the <b>University Library</b>.
336 The card is not transferable. A replacement fee is charged for a loss,
337 mutilation or otherwise. If found, please, return to the University Library,
338 Igbinedion University, Okada.
339</font>
340
341"""
342        return
343
344    def render(self):
345        studentview = StudentBasePDFFormPage(self.context.student,
346            self.request, self.omit_fields)
347        students_utils = getUtility(IStudentsUtils)
348        return students_utils.renderPDF(
349            self, 'lib_idcard',
350            self.context.student, studentview,
351            omit_fields=self.omit_fields,
352            sigs_in_footer=self._sigsInFooter(),
[15937]353            note=self.note)
354
355class CustomStartClearancePage(StartClearancePage):
[16015]356    with_ac = False
357
358class CustomBalancePaymentAddFormPage(BalancePaymentAddFormPage):
[16127]359    grok.require('waeup.payStudent')
360
361class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
362    """Deliver a PDF Admission slip.
363    """
364
[16238]365    omit_fields = ('date_of_birth',
366                   #'current_level',
367                   'current_mode',
368                   #'entry_session'
369                   )
[16127]370
371    @property
372    def session(self):
373        return academic_sessions_vocab.getTerm(
374            self.context.entry_session).title
375
376    @property
377    def level(self):
378        studylevelsource = StudyLevelSource()
379        return studylevelsource.factory.getTitle(
380            self.context['studycourse'].certificate, self.context.current_level)
381
382    @property
383    def label(self):
384        return 'OFFER OF PROVISIONAL ADMISSION \nFOR %s SESSION' % self.session
385
386    @property
[16238]387    def pre_text_ug(self):
[16127]388        return (
389            'Following your performance in the screening exercise '
390            'for the %s academic session, I am pleased to inform '
391            'you that you have been offered provisional admission into the '
392            'Igbinedion University, Okada as follows:' % self.session)
393
394    @property
[16238]395    def pre_text_pg(self):
396        return (
397            'I am pleased to inform you that your application for admission'
398            ' into the Igbinedion University, Okada was successful. You have'
399            ' been admitted as follows:')
400
401    @property
402    def post_text_ug(self):
[16127]403        return """
[16241]404Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
[16127]405
[16241]406All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
[16127]407
[16163]408You are required to show evidence of the result / credentials you presented on application for admission.
[16127]409
[16128]410Fees can be paid using any of the following options:
[16127]411
[16163]412Fees can be paid through your portal page. INSTRUCTIONS can be found below "FEES PAYMENT PROCEDURE" for the options you have to make your payment, as well as instructions on how to use your preferred payment option. If you choose to use the bank payment option, you can pay at any branch of the following banks through Etranzact platform only: Access Bank, First Bank, Zenith Bank
[16127]413
414Kindly note the following:
415
[16163]416Fees indicated on the Fee Structure page are valid for the current session only.
417Your Student Id (indicated above) Is your logln to the University portal.
418As an indication of your acceptance of this offer of admission, you should pay a non-refundable Acceptance deposit of 200,000. Further note that the 200,000 deposit is part of the tuition fee for the session. Failure to pay after the expiration of two weeks may lead to forfeiture of admission.
419All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. This is the rule for all students at all levels. Install mental payments of not more than two installments, may be allowed under exceptional circumstances.
420Fees once paid are not refundable.
421It is advisable that you keep the original receipts of fees paid and present them on demand.
[16127]422
[16163]423Accommodation: Accommodation in University hostels is compulsory for every student. No student Is allowed to live outside the hostels. Any student who does so will be expelled from the University.
[16127]424
425Food: Food is available in cafeteria on "pay-as-you-eat" basis.
426
[16288]427Resumption Date: The University opens for fresh students with online registration starting from Monday 28th September, 2020. The date for physical resumption is 14th November, 2020.
[16127]428
[16288]429Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 16th November 2020. Registration ends on 2020-11-30. A late registration fee of N50,000 will be charged after this date. All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
[16127]430
[16163]431Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
[16127]432
433Kindly note that fresh students are not allowed the use of private vehicles.
434
435Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
436
[16241]437We wish you a successful academic career in Igbinedion University.
[16127]438
439Congratulations!
440
[16263]441
442
443<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
444
[16163]445Friday Benji Bakare Esq.
446Registrar
447registrar@iuokada.edu.ng
44808035902949
[16127]449"""
450
[16238]451    @property
452    def post_text_pg(self):
453        return """
4541. Details of your programme will be made available to you by the Head of your Department on your arrival at the Igbinedion University.
455
4562. This offer is conditional upon the confirmation of your qualifications as listed by you in your application form. You will be required to produce the ORIGINAL COPIES of all your certificates for verification during registration. If at any time after admission, it is discovered that you do not possess any of the qualifications upon which this offer of admission was made, you will be required to withdraw from the University.
457
4583. If you accept this offer of admission upon the conditions above, you should please:
459
460(a) Complete the enclosed Acceptance Form of Provisional Offer of Admission in duplicate and send  by registered mail or by hand to the
461
462Secretary
463School of Postgraduate Studies and Research
464Igbinedion University,
465P.M.B. 0006,
466Benin City, Edo State,
467Nigeria
468
469(b)     Forward the following along with the Acceptance Form of Provisional Offer of Admission.
470
471(i) A non-refundable deposit of N100,000.00 (One Hundred Thousand Naira Only) which is part of the School fees: Payable Online.
472
473(ii) Four recent passport-size photograph of yourself with your full-names (surname first in BLOCK LETTERS) written on the reverse side of the photograph and pinned to the Acceptance Form.
474
4754. The following will be required for Registration:
476
477(a) A medical examination to be conducted by an approved medical practitioner. On your arrival at the Igbinedion University, you should submit the enclosed Igbinedion University Medical Examination Form duly completed and signed by an approved medical practitioner together with your chest X-ray film to Director of Health Service at the Igbinedion University, Okada.
478
479(b) The original copies of all credentials listed in your application form (including NYSC discharge/exemption certificate) should be brought for sighting.
480
4815. You are required to pay the necessary fees and register for your degree programme not later than three weeks from the beginning of the Academic Session. Late registration may be allowed during an additional period of five weeks on payment of a late registration fees. Please note that you will be allowed to register after two months have elapsed from the beginning of the sessions.
482
4836. Please find attached:
484
485(a) A copy of School fees Regime
486(b) A copy of Acceptance Forms
487
4887. Note:
489
490(a) All Tuition fees are to be paid online
491(b) Post-graduate dues and other charges are to be paid into ABC Microfinance Bank Okada, Account No: 30125
492
4938.  CONGRATULATIONS!!!
494
495Yours faithfully,
496
497Mr. Olaoke, Olasoji Oluwole
498Secretary, School of Postgraduate Studies & Research
499"""
500
[16127]501    def render(self):
502        students_utils = getUtility(IStudentsUtils)
[16160]503        watermark_path = os.path.join(
504            os.path.dirname(__file__), 'static', 'watermark.pdf')
505        watermark = open(watermark_path, 'rb')
[16238]506        if self.context.is_postgrad:
507            file_path = os.path.join(
508                os.path.dirname(__file__), 'static', 'admission_letter_pg.pdf')
509            file = open(file_path, 'rb')
510            mergefiles = [file,]
511            return students_utils.renderPDFAdmissionLetter(self,
512                self.context.student, omit_fields=self.omit_fields,
513                pre_text=self.pre_text_pg, post_text=self.post_text_pg,
514                mergefiles=mergefiles,
515                watermark=watermark)
[16160]516        file_path = os.path.join(
[16238]517            os.path.dirname(__file__), 'static', 'admission_letter_ug.pdf')
[16160]518        file = open(file_path, 'rb')
519        mergefiles = [file,]
[16127]520        return students_utils.renderPDFAdmissionLetter(self,
521            self.context.student, omit_fields=self.omit_fields,
[16238]522            pre_text=self.pre_text_ug, post_text=self.post_text_ug,
[16180]523            mergefiles=mergefiles,
524            watermark=watermark)
[16233]525
526class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
527    """ Page to view an online payment ticket. We do not omit provider_amt.
528    """
529    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
[16285]530        'gateway_amt', 'thirdparty_amt', 'p_item','p_combi', 'provider_amt')
[16233]531    form_fields[
532        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
533    form_fields[
534        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
535
536class CustomExportPDFPaymentSlip(NigeriaExportPDFPaymentSlip):
537    """Deliver a PDF slip of the context. We do not omit provider_amt.
538    """
539    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
540        'gateway_amt', 'thirdparty_amt', 'p_item',
[16285]541        'p_split_data','p_combi', 'provider_amt')
[16233]542    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
543    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
Note: See TracBrowser for help on using the repository browser.