## $Id: utils.py 7836 2012-03-11 15:59:34Z 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 ## """General helper utilities for Kofa. """ import os import grok import string from zope.i18n import translate from zope.interface import implements from random import SystemRandom as r from waeup.kofa.interfaces import IKofaUtils from waeup.kofa.interfaces import MessageFactory as _ from waeup.kofa.smtp import send_mail as send_mail_internally def send_mail(from_name,from_addr,rcpt_name,rcpt_addr,subject,body,config): """Wrapper for the real SMTP functionality in :mod:`waeup.kofa.smtp`. Merely here to stay compatible with lots of calls to this place. """ mail_id = send_mail_internally( from_name, from_addr, rcpt_name, rcpt_addr, subject, body, config) return True class KofaUtils(grok.GlobalUtility): """A collection of parameters and methods subject to customization. """ grok.implements(IKofaUtils) # This the only place where we define the portal language # which is used for the translation of system messages # (e.g. object histories). PORTAL_LANGUAGE = 'en' PREFERRED_LANGUAGES_DICT = { 'en':(1, u'English'), 'fr':(2, u'Français'), 'de':(3, u'Deutsch'), 'ha':(4, u'Hausa'), 'yo':(5, u'Yoruba'), 'ig':(6, u'Igbo'), } def getExamSubjectsDict(self): """Provide a dictionary of exam subjects. """ return { 'accounts': 'Accounts', 'add_general_science': 'Add General Science', 'add_maths': 'Add Maths', 'agricultural_science': 'Agricultural Science', 'applied_electricity': 'Applied Electricity', 'arabi': 'Arabic', 'arithmetics': 'Arithmetics', 'art': 'Art', 'auto_mechanics': 'Auto Mechanics', 'basic_electricity': 'Basic Electricity', 'bible_knowledge': 'Bible Knowledge', 'biology': 'Biology', 'biology_alt_syl': 'Biology (Alt.Syl)', 'book_keeping': 'Book Keeping', 'building_construction': 'Building Construction', 'business_management': 'Business Management', 'business_construction_management': 'Business/Construction Management (Adv)', 'chemistry': 'Chemistry', 'chemistry_alt_syl': 'Chemistry (Alt.Syl)', 'christian_religious_studies': 'Christian Religious Studies', 'clerical_office_duties': 'Clerical Office Duties', 'clothing_and_textiles': 'Clothing and Textiles', 'commerce': 'Commerce', 'economics': 'Economics', 'education': 'Education', 'efik': 'Efik', 'electronics': 'Electronics', 'elementary_surveying': 'Elementary Surveying', 'english_language': 'English Language', 'engineering_science': 'Engineering Science', 'financial_accounting': 'Financial Accounting', 'food_and_nutrition': 'Food and Nutrition', 'french': 'French', 'further_mathematics': 'Further Mathematics', 'general_science': 'General Science', 'geography': 'Geography', 'german': 'German', 'government': 'Government', 'hausa': 'Hausa', 'hausa_literature': 'Hausa Literature', 'health_science': 'Health Science', 'history': 'History', 'home_management': 'Home Management', 'industrial_electrical_installation': 'Industrial Elect Installation (Adv)', 'intergrated_science': 'Intergrated Science', 'islamic_studies': 'Islamic Studies', 'literature_in_english': 'Literature in English', 'literature_in_nigerian_languages': 'Literature in Nigerian Languages', 'igbo': 'Igbo', 'igbo_literature': 'Igbo Literature', 'yoruba': 'Yoruba', 'yoruba_literature': 'Yoruba Literature', 'management_in_living': 'Management in Living', 'mathematics': 'Mathematics', 'metalwork': 'Metalwork', 'music': 'Music', 'nigerian_language': 'Nigerian Language', 'office_practice': 'Office Practice', 'physical_education': 'Physical Education', 'physical_health_education': 'Physical and Health Education', 'physics': 'Physics', 'physics_alt_syl': 'Physics (Alt.Syl)', 'principles_of_cost_accounting': 'Principles of Cost Accounting', 'rural_science': 'Rural Science', 'science': 'Science', 'secretarial_duties': 'Secretarial Duties', 'shorthand': 'Shorthand', 'sierra_leone_studies': 'Sierra Leone Studies', 'sierra_leone_languages': 'Sierra Leone Languages', 'social_studies': 'Social Studies', 'statistics': 'Statistics', 'teaching_practice': 'Teaching Practice', 'technical_drawing': 'Technical Drawing', 'typewriting': 'Typewriting', 'visual_art': 'Visual Art', 'woodwork': 'Woodwork', 'winding_elect_machines': 'Winding of Elect Machines and Elect Eng Sc' } def getExamGradesDict(self): """Provide a dictionary of exam grades. """ return { 'A1': 'Excellent (A1)', 'A2': 'Very Good (A2)', 'A3': 'Good (A3)', 'B2': 'Very Good (B2)', 'B3': 'Good (B3)', 'C4': 'Credit (C4)', 'C5': 'Credit (C5)', 'C6': 'Credit (C6)', 'D7': 'Pass (D7)', 'E8': 'Pass (E8)', 'F9': 'Fail (F9)', 'Aa': 'A (a)', 'Bb': 'B (b)', 'Cc': 'C (c)', 'Dd': 'D (d)', 'Ee': 'E (e)', 'Ff': 'F (f)', 'Gg': 'G (g)' } def getInstTypeDict(self): """Provide a dictionary of study modes. """ return { 'faculty': 'Faculty of', 'department': 'Department of', 'school': 'School of', 'office': 'Office for', 'centre': 'Centre for', 'institute': 'Institute of', 'school_for': 'School for', } def getStudyModesDict(self): """Provide a dictionary of study modes. """ return { 'rmd_ft': 'Remedial with deficiencies', 'dp_pt': 'Diploma Part Time', 'ct_ft': 'Certificate Full Time', 'dp_ft': 'Diploma Full Time', 'de_pt': 'Direct Entry Part Time', 'pg_ft': 'Postgraduate Full Time', 'pg_pt': 'Postgraduate Part Time', 'jm_ft': 'Joint Matriculation Full Time', 'ume_ft': 'UME Full Time', 'de_ft': 'Direct Entry Full Time', 'ph_ft': 'Post Higher Education Full Time', 'transfer_pt': 'Transfer Part Time', 'ug_pt': 'Undergraduate Part Time', 'transfer_ft': 'Transfer Full Time', 'ct_pt': 'Certificate Part Time', 'ug_ft': 'Undergraduate Full Time', 'rm_ft': 'Remedial' } def getAppCatDict(self): """Provide a dictionary of study modes. """ return { 'basic': 'PUME, PDE, PCE, PRENCE', 'no': 'no application', 'pg': 'Postgraduate', 'sandwich': 'Sandwich', 'cest': 'Part-Time, Diploma, Certificate' } def getSemesterDict(self): """Provide a dictionary of semester or trimester types. """ return { 1: 'First Semester', 2: 'Second Semester', 3: 'Combined', 9: 'N/A' } def sendContactForm(self,from_name,from_addr,rcpt_name,rcpt_addr, from_username,usertype,portal,body,subject): """Send an email with data provided by forms. """ config = grok.getSite()['configuration'] text = _(u"""Fullname: ${a} User Id: ${b} User Type: ${c} Portal: ${d} ${e} """) text = _(text, mapping = { 'a':from_name, 'b':from_username, 'c':usertype, 'd':portal, 'e':body}) body = translate(text, 'waeup.kofa', target_language=self.PORTAL_LANGUAGE) return send_mail( from_name,from_addr,rcpt_name,rcpt_addr,subject,body,config) def fullname(self,firstname,lastname,middlename=None): """Full name constructor. """ # We do not necessarily have the middlename attribute if middlename: return string.capwords( '%s %s %s' % (firstname, middlename, lastname)) else: return string.capwords( '%s %s' % (firstname, lastname)) def genPassword(self, length=8, chars=string.letters + string.digits): """Generate a random password. """ return ''.join([r().choice(chars) for i in range(length)]) def sendCredentials(self, user, password=None, login_url=None, msg=None): """Send credentials as email. Input is the applicant for which credentials are sent and the password. Returns True or False to indicate successful operation. """ subject = 'Your Kofa credentials' text = _(u"""Dear ${a}, ${b} Student Registration and Information Portal of ${c}. Your user name: ${d} Your password: ${e} Login page: ${f} Please remember your user name and keep your password secret! Please also note that passwords are case-sensitive. Regards """) config = grok.getSite()['configuration'] from_name = config.name_admin from_addr = config.email_admin rcpt_name = user.title rcpt_addr = user.email text = _(text, mapping = { 'a':rcpt_name, 'b':msg, 'c':config.name, 'd':user.name, 'e':password, 'f':login_url}) body = translate(text, 'waeup.kofa', target_language=self.PORTAL_LANGUAGE) return send_mail( from_name,from_addr,rcpt_name,rcpt_addr,subject,body,config)