## $Id: browser.py 13059 2015-06-16 13:31:37Z henrik $
##
## Copyright (C) 2012 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
##
import grok
from zope.i18n import translate
from zope.component import getUtility
from waeup.kofa.browser.layout import UtilityView
from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
from waeup.kofa.interfaces import IKofaUtils
from waeup.kofa.students.interfaces import IStudentsUtils, IStudent
from waeup.kofa.students.workflow import PAID, REGISTERED
from waeup.kofa.students.browser import (
    StartClearancePage,
    StudentBasePDFFormPage,
    CourseTicketAddFormPage,
    StudyLevelDisplayFormPage,
    ExportPDFTranscriptSlip,
    ExportPDFAdmissionSlip,
    )
from kofacustom.nigeria.students.browser import (
    NigeriaOnlinePaymentDisplayFormPage,
    NigeriaOnlinePaymentAddFormPage,
    NigeriaExportPDFPaymentSlip,
    NigeriaExportPDFCourseRegistrationSlip,
    NigeriaExportPDFClearanceSlip,
    )
from waeup.aaue.students.interfaces import (
    ICustomStudentOnlinePayment,
    ICustomStudentStudyLevel,
    ICustomStudent)
from waeup.aaue.interfaces import MessageFactory as _

class CustomStartClearancePage(StartClearancePage):
    with_ac = False

class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
    """ Page to view an online payment ticket
    """
    grok.context(ICustomStudentOnlinePayment)
    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
    form_fields[
        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
    form_fields[
        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')

class CustomOnlinePaymentAddFormPage(NigeriaOnlinePaymentAddFormPage):
    """ Page to add an online payment ticket
    """
    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).select(
        'p_category')

class CustomExportPDFPaymentSlip(NigeriaExportPDFPaymentSlip):
    """Deliver a PDF slip of the context.
    """
    grok.context(ICustomStudentOnlinePayment)
    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')

    @property
    def note(self):
        text = ''
        if self.context.p_category == 'schoolfee' and self.context.p_level == 100:
            text += '\n\n Amounts include Naira 250 eTranzact transaction '
            text += 'charge and Naira 2000 cost of matriculation gown.'
        elif self.context.p_category in ('clearance', 'schoolfee'):
            text += '\n\n Amounts include Naira 250 eTranzact transaction charge.'
        return text

class CustomStudyLevelDisplayFormPage(StudyLevelDisplayFormPage):
    """ Page to display student study levels
    """
    grok.context(ICustomStudentStudyLevel)
    form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
        'total_credits', 'gpa', 'level')
    form_fields[
        'validation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')

class CustomExportPDFCourseRegistrationSlip(
    NigeriaExportPDFCourseRegistrationSlip):
    """Deliver a PDF slip of the context.
    """
    grok.context(ICustomStudentStudyLevel)
    form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
        'level_session', 'level_verdict',
        'validated_by', 'validation_date', 'gpa', 'level')

    omit_fields = ('password', 'suspended', 'suspended_comment',
        'phone', 'adm_code', 'sex', 'email', 'date_of_birth',
        'department', 'current_mode', 'current_level')

    def update(self):
        if self.context.student.state != REGISTERED \
            and self.context.student.current_level == self.context.level:
            self.flash(_('Forbidden'), type="warning")
            self.redirect(self.url(self.context))

    @property
    def label(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        lang = self.request.cookies.get('kofa.language', portal_language)
        level_title = translate(self.context.level_title, 'waeup.kofa',
            target_language=lang)
        line0 = ''
        if self.context.student.current_mode.endswith('_pt'):
            line0 = 'DIRECTORATE OF PART-TIME DEGREE PROGRAMMES\n'
        line1 = translate(_('Course Registration Slip'),
            'waeup.kofa', target_language=portal_language) \
            + ' %s' % level_title
        line2 = translate(_('Session'),
            'waeup.kofa', target_language=portal_language) \
            + ' %s' % self.context.getSessionString
        return '%s%s\n%s' % (line0, line1, line2)

    @property
    def title(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        return translate(_('Units Registered'), 'waeup.kofa',
            target_language=portal_language)

    def _signatures(self):
        return (
            [('I have selected the course on the advise of my Head of '
             'Department. <br>', _('Student\'s Signature'), '<br>')],
            [('This student has satisfied the department\'s requirements. '
             'I recommend to approve the course registration. <br>',
             _('Head of Department\'s Signature'), '<br>')],
            [('' , _('Principal Assistant Registrar\'s Signature'), '<br>')],
            [('', _('Director\'s Signature'))]
            )

    def render(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        Sem = translate('Sem.', 'waeup.kofa', target_language=portal_language)
        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
        Cred = translate('Cred.', 'waeup.kofa', target_language=portal_language)
        Score = translate('Score', 'waeup.kofa', target_language=portal_language)
        Grade = translate('Grade', 'waeup.kofa', target_language=portal_language)
        Signature = translate(_('Lecturer\'s Signature'), 'waeup.aaue',
            target_language=portal_language)
        studentview = StudentBasePDFFormPage(self.context.student,
            self.request, self.omit_fields)
        students_utils = getUtility(IStudentsUtils)

        tabledata = []
        tableheader = []
        contenttitle = []
        for i in range(1,7):
            tabledata.append(sorted(
                [value for value in self.context.values() if value.semester == i],
                key=lambda value: str(value.semester) + value.code))
            tableheader.append([(Code,'code', 2.0),
                               (Title,'title', 7),
                               (Cred, 'credits', 1.5),
                               (Score, 'score', 1.4),
                               (Grade, 'grade', 1.4),
                               (Signature, 'dummy', 3),
                               ])
        if len(self.label.split('\n')) == 3:
            topMargin = 1.9
        elif len(self.label.split('\n')) == 2:
            topMargin = 1.7
        else:
            topMargin = 1.5
        return students_utils.renderPDF(
            self, 'course_registration_slip.pdf',
            self.context.student, studentview,
            tableheader=tableheader,
            tabledata=tabledata,
            signatures=self._signatures(),
            topMargin=topMargin,
            omit_fields=self.omit_fields
            )

class CustomExportPDFTranscriptSlip(ExportPDFTranscriptSlip):
    """Deliver a PDF slip of the context.
    """

    def _sigsInFooter(self):
        return []

    def _signatures(self):
        return ([(
            'Akhimien Felicia O. (MANUPA) <br /> Principal Assistant Registrar  <br /> '
            'Exams, Records and Data Processing Division <br /> For: Registrar')],)

class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
    """Deliver a PDF Admission slip.
    """

    @property
    def label(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        return translate(_('e-Admission Slip \n'),
            'waeup.kofa', target_language=portal_language) \
            + ' %s' % self.context.display_fullname

class CustomExportPDFClearanceSlip(NigeriaExportPDFClearanceSlip):
    """Deliver a PDF slip of the context.
    """

    @property
    def label(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        return translate(_('Clearance Slip\n'),
            'waeup.kofa', target_language=portal_language) \
            + ' %s' % self.context.display_fullname

class StudentGetMatricNumberPage(UtilityView, grok.View):
    """ Construct and set the matriculation number.
    """
    grok.context(IStudent)
    grok.name('get_matric_number')
    grok.require('waeup.viewStudent')

    def update(self):
        students_utils = getUtility(IStudentsUtils)
        msg, mnumber = students_utils.setMatricNumber(self.context)
        if msg:
            self.flash(msg, type="danger")
        else:
            self.flash(_('Matriculation number %s assigned.' % mnumber))
            self.context.writeLogMessage(self, '%s assigned' % mnumber)
        self.redirect(self.url(self.context))
        return

    def render(self):
        return

class ExportPDFMatricNumberSlip(UtilityView, grok.View):
    """Deliver a PDF notification slip.
    """
    grok.context(ICustomStudent)
    grok.name('matric_number_slip.pdf')
    grok.require('waeup.viewStudent')
    prefix = 'form'

    form_fields = grok.AutoFields(ICustomStudent).select(
        'student_id', 'matric_number')
    omit_fields = ('date_of_birth', 'current_level')

    @property
    def label(self):
        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
        return translate(_('Matriculation Number Slip\n'),
            'waeup.kofa', target_language=portal_language) \
            + ' %s' % self.context.display_fullname

    def render(self):
        if self.context.state not in (PAID,) or not self.context.is_fresh \
            or not self.context.matric_number:
            self.flash('Not allowed.', type="danger")
            self.redirect(self.url(self.context))
            return
        students_utils = getUtility(IStudentsUtils)
        pre_text = _('Congratulations! Your acceptance fee and school fees ' +
                     'payments have been received and your matriculation ' +
                     'number generated with details as follows.')
        return students_utils.renderPDFAdmissionLetter(self,
            self.context.student, omit_fields=self.omit_fields,
            pre_text=pre_text, post_text='')