## $Id: browser.py 13996 2016-06-28 11:25:21Z henrik $
##
## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
"""UI components for basic applicants and related components.
"""
import grok
import os
from zope.component import getUtility, getAdapter
from zope.i18n import translate
from waeup.kofa.interfaces import (
IExtFileStore, IFileStoreNameChooser, IKofaUtils)
from zope.formlib.textwidgets import BytesDisplayWidget
from waeup.kofa.utils.helpers import string_from_bytes, file_size
from waeup.kofa.applicants.browser import (
ApplicantCheckStatusPage, ApplicantBaseDisplayFormPage)
from waeup.kofa.applicants.viewlets import PDFActionButton
from waeup.kofa.browser.layout import UtilityView
from waeup.kofa.students.interfaces import IStudentsUtils
from waeup.kofa.interfaces import IPDF
from waeup.kofa.applicants.interfaces import IApplicant
from waeup.aaue.interfaces import MessageFactory as _
from kofacustom.nigeria.applicants.browser import (
NigeriaApplicantDisplayFormPage,
NigeriaApplicantManageFormPage,
NigeriaApplicantEditFormPage,
NigeriaPDFApplicationSlip,
NigeriaApplicantRegistrationPage,
NigeriaExportPDFPaymentSlipPage,
)
from kofacustom.nigeria.applicants.interfaces import OMIT_DISPLAY_FIELDS
from waeup.aaue.applicants.interfaces import (
ICustomUGApplicant,
ICustomUGApplicantEdit,
ITranscriptApplicant,
ICustomApplicant
)
UG_OMIT_FIELDS = (
'hq_type', 'hq_fname', 'hq_matric_no',
'hq_degree', 'hq_school', 'hq_session', 'hq_disc',
'hq_type2', 'hq_fname2', 'hq_matric_no2',
'hq_degree2', 'hq_school2', 'hq_session2', 'hq_disc2',
'hq_type3', 'hq_fname3', 'hq_matric_no3',
'hq_degree3', 'hq_school3', 'hq_session3', 'hq_disc3',
'nysc_year',
'nysc_location',
'nysc_lga',
'employer',
'emp_position',
'emp_start',
'emp_end',
'emp_reason',
'employer2',
'emp2_position',
'emp2_start',
'emp2_end',
'emp2_reason',
'former_matric',
)
UG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + (
'jamb_subjects_list', 'master_sheet_number') + UG_OMIT_FIELDS
UG_OMIT_PDF_FIELDS = UG_OMIT_DISPLAY_FIELDS + UG_OMIT_FIELDS + (
'reg_number','alr_fname', 'alr_no', 'alr_date',
'alr_results', 'notice')
UG_OMIT_MANAGE_FIELDS = (
'special_application','jamb_subjects_list',) + UG_OMIT_FIELDS
UG_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
'student_id',
'notice',
'jamb_age',
'jamb_subjects',
'jamb_score',
'jamb_reg_number',
'aggregate',
'firstname',
'middlename',
'lastname',
'sex',
'lga',
'course1',
'master_sheet_number',
'screening_venue',
'screening_score',
'screening_date'
)
#UG_OMIT_PDF_FIELDS = tuple([
# element for element in UG_OMIT_PDF_FIELDS if not element == 'phone'])
#UG_OMIT_PDF_FIELDS += (
# 'reg_number','alr_fname', 'alr_no', 'alr_date',
# 'alr_results', 'notice'
# )
PG_OMIT_FIELDS = (
'fst_sit_fname',
'fst_sit_no',
'fst_sit_date',
'fst_sit_type',
'fst_sit_results',
'scd_sit_fname',
'scd_sit_no',
'scd_sit_date',
'scd_sit_type',
'scd_sit_results',
#'programme_type',
'jamb_age',
'jamb_subjects',
'jamb_score',
'jamb_reg_number',
'aggregate'
)
PG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + (
'jamb_subjects_list',) + PG_OMIT_FIELDS
PG_OMIT_PDF_FIELDS = PG_OMIT_DISPLAY_FIELDS + PG_OMIT_FIELDS + (
'reg_number','alr_fname', 'alr_no', 'alr_date',
'alr_results', 'notice',
'nysc_year',
'nysc_location',
'nysc_lga',
'former_matric',
)
PG_OMIT_MANAGE_FIELDS = (
'special_application','jamb_subjects_list',) + PG_OMIT_FIELDS
PG_OMIT_EDIT_FIELDS = PG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
'student_id',
'notice',
)
PTEE_OMIT_FIELDS = (
'jamb_age',
'jamb_subjects',
'jamb_score',
'jamb_reg_number',
'aggregate'
)
PTEE_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + (
'jamb_subjects_list',) + PTEE_OMIT_FIELDS
PTEE_OMIT_PDF_FIELDS = PTEE_OMIT_DISPLAY_FIELDS + PTEE_OMIT_FIELDS + (
'reg_number','alr_fname', 'alr_no', 'alr_date',
'alr_results', 'notice',
'nysc_year',
'nysc_location',
'nysc_lga',
'employer',
'emp_position',
'emp_start',
'emp_end',
'emp_reason',
'employer2',
'emp2_position',
'emp2_start',
'emp2_end',
'emp2_reason',
'former_matric',
)
PTEE_OMIT_MANAGE_FIELDS = (
'special_application','jamb_subjects_list',) + PTEE_OMIT_FIELDS
PTEE_OMIT_EDIT_FIELDS = PTEE_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
'student_id',
'notice',
)
class CustomApplicantDisplayFormPage(NigeriaApplicantDisplayFormPage):
"""A display view for applicant data.
"""
@property
def form_fields(self):
if self.target is not None and self.target == 'trans':
form_fields = grok.AutoFields(ITranscriptApplicant).omit(
'locked', 'suspended')
form_fields['dispatch_address'].custom_widget = BytesDisplayWidget
form_fields['perm_address'].custom_widget = BytesDisplayWidget
return form_fields
# AAUE is using the same interface for all regular applications.
form_fields = grok.AutoFields(ICustomUGApplicant)
if self.target is not None and self.target.startswith('pg'):
for field in PG_OMIT_DISPLAY_FIELDS:
form_fields = form_fields.omit(field)
elif self.target is not None and self.target in ('ptee', 'ude'):
for field in PTEE_OMIT_DISPLAY_FIELDS:
form_fields = form_fields.omit(field)
else:
for field in UG_OMIT_DISPLAY_FIELDS:
form_fields = form_fields.omit(field)
form_fields['perm_address'].custom_widget = BytesDisplayWidget
form_fields['notice'].custom_widget = BytesDisplayWidget
if not getattr(self.context, 'student_id'):
form_fields = form_fields.omit('student_id')
if not getattr(self.context, 'screening_score'):
form_fields = form_fields.omit('screening_score')
if not getattr(self.context, 'screening_venue'):
form_fields = form_fields.omit('screening_venue')
if not getattr(self.context, 'screening_date'):
form_fields = form_fields.omit('screening_date')
return form_fields
class CustomPDFActionButton(PDFActionButton):
@property
def target_url(self):
if self.context.state in ('initialized', 'started', 'paid') \
or self.context.special or self.view.target == 'trans':
return
return self.view.url(self.view.context, self.target)
class CustomPDFApplicationSlip(NigeriaPDFApplicationSlip):
column_two_fields = ('applicant_id', 'reg_number',
'firstname', 'middlename', 'lastname', 'sex', 'date_of_birth')
#two_columns_design_fields = [
# 'fst_sit_fname', 'fst_sit_no', 'fst_sit_date',
# 'fst_sit_type', 'fst_sit_results',
# 'scd_sit_fname', 'scd_sit_no', 'scd_sit_date',
# 'scd_sit_type', 'scd_sit_results']
@property
def note(self):
if self.context.sex == 'm':
pronoun = 'he'
else:
pronoun = 'she'
return '''
The applicant has acknowledged that, if discovered at any time that %s does not possess
any of the qualifications which %s claims %s has obtained, %s will be expelled from the
University not be re-admitted for the same or any other programme, even if %s has
upgraded previous and shall qualifications or possess additional qualifications.
''' % (
pronoun, pronoun, pronoun, pronoun, pronoun)
@property
def form_fields(self):
# AAUE is using the same interface for all regular applications.
form_fields = grok.AutoFields(ICustomUGApplicant)
if self.target is not None and self.target.startswith('pg'):
for field in PG_OMIT_PDF_FIELDS:
form_fields = form_fields.omit(field)
elif self.target is not None and self.target in ('ptee', 'ude'):
for field in PTEE_OMIT_PDF_FIELDS:
form_fields = form_fields.omit(field)
else:
for field in UG_OMIT_PDF_FIELDS:
form_fields = form_fields.omit(field)
if not getattr(self.context, 'student_id'):
form_fields = form_fields.omit('student_id')
if not getattr(self.context, 'screening_score'):
form_fields = form_fields.omit('screening_score')
if not getattr(self.context, 'screening_venue'):
form_fields = form_fields.omit('screening_venue')
if not getattr(self.context, 'screening_date'):
form_fields = form_fields.omit('screening_date')
return form_fields
class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
"""A full edit view for applicant data.
"""
@property
def form_fields(self):
if self.target is not None and self.target == 'trans':
form_fields = grok.AutoFields(ITranscriptApplicant)
form_fields['applicant_id'].for_display = True
return form_fields
# AAUE is using the same interface for all regular applications.
form_fields = grok.AutoFields(ICustomUGApplicant)
if self.target is not None and self.target.startswith('pg'):
for field in PG_OMIT_MANAGE_FIELDS:
form_fields = form_fields.omit(field)
elif self.target is not None and self.target in ('ptee', 'ude'):
for field in PTEE_OMIT_MANAGE_FIELDS:
form_fields = form_fields.omit(field)
else:
for field in UG_OMIT_MANAGE_FIELDS:
form_fields = form_fields.omit(field)
form_fields['student_id'].for_display = True
form_fields['applicant_id'].for_display = True
return form_fields
class CustomApplicantEditFormPage(NigeriaApplicantEditFormPage):
"""An applicant-centered edit view for applicant data.
"""
grok.template('applicanteditpage')
@property
def form_fields(self):
if self.target is not None and self.target == 'trans':
form_fields = grok.AutoFields(ITranscriptApplicant).omit(
'locked', 'suspended')
form_fields['applicant_id'].for_display = True
return form_fields
# AAUE is using the same interface for all regular applications.
form_fields = grok.AutoFields(ICustomUGApplicantEdit)
if self.target is not None and self.target.startswith('pg'):
for field in PG_OMIT_EDIT_FIELDS:
form_fields = form_fields.omit(field)
elif self.target is not None and self.target in ('ptee', 'ude'):
for field in PTEE_OMIT_EDIT_FIELDS:
form_fields = form_fields.omit(field)
else:
for field in UG_OMIT_EDIT_FIELDS:
form_fields = form_fields.omit(field)
form_fields['applicant_id'].for_display = True
form_fields['reg_number'].for_display = True
return form_fields
class CustomApplicantRegistrationPage(NigeriaApplicantRegistrationPage):
"""Captcha'd registration page for applicants.
"""
def _redirect(self, email, password, applicant_id):
# Forward email and credentials to landing page.
self.redirect(self.url(self.context, 'registration_complete',
data = dict(email=email, password=password,
applicant_id=applicant_id)))
return
class CustomExportPDFPaymentSlipPage(NigeriaExportPDFPaymentSlipPage):
@property
def payment_slip_download_warning(self):
return ''
class CustomApplicantCheckStatusPage(ApplicantCheckStatusPage):
"""Captcha'd status checking page for applicants.
"""
grok.template('applicantcheckstatus')
class ExportScreeningInvitationLetter(UtilityView, grok.View):
"""Deliver a slip with only screening data.
This form page is available only in AAUE.
"""
grok.context(IApplicant)
grok.name('screening_invitation.pdf')
grok.require('waeup.viewApplication')
prefix = 'form'
label = u'Screening Invitation Letter'
form_fields = []
@property
def note(self):
if self.context.screening_date:
return """
Dear %s,
You are invited for your screening exercise on:
%s.
Please bring along this letter of invitation to the %s
on your screening date.
Signed,
xyz
""" % (self.context.display_fullname,
self.context.screening_date,
self.context.screening_venue)
return
@property
def title(self):
return None
def update(self):
if not self.context.screening_date:
self.flash(_('Forbidden'), type="warning")
self.redirect(self.url(self.context))
def render(self):
applicantview = ApplicantBaseDisplayFormPage(self.context, self.request)
students_utils = getUtility(IStudentsUtils)
return students_utils.renderPDF(self,'screening_data.pdf',
self.context, applicantview, note=self.note)