source: WAeUP_SRP/trunk/skins/cps_custom/logged_in.py @ 8060

Last change on this file since 8060 was 7977, checked in by Henrik Bettermann, 13 years ago

Passport picture names in pictures_admitted_latest now contain student_id instead of matric number.

File size: 13.1 KB
RevLine 
[2217]1## Script (Python) "logged_in"
2##bind container=container
3##bind context=context
4##bind namespace=
5##bind script=script
6##bind subpath=traverse_subpath
7##parameters=
8##title=
9##
10"""Prepare user login
11modified from cps_default/logged_in.py
12
13$Id: logged_in.py 1933 2007-06-19 05:05:29Z henrik $
14"""
15try:
16    from Products.zdb import set_trace
17except:
18    def set_trace():
19        pass
20import DateTime
[7957]21import os
[2217]22current = DateTime.DateTime()
23import logging
24logger = logging.getLogger('Skins.logged_in')
25
26
27from urllib import unquote
28
29request = context.REQUEST
30response = request.RESPONSE
31utool = context.portal_url
32mtool = context.portal_membership
33wftool = context.portal_workflow
34portal = utool.getPortalObject()
35
36redirect_to_portal = False
37is_anon = mtool.isAnonymousUser()
38member = mtool.getAuthenticatedMember()
[5655]39member_id = str(member)
[2710]40
[5784]41try:
42    cred = context.waeup_tool.getCredentialFromAuthHeader(request)
43except:
44    cred = "no authentication header"
[5656]45
[2710]46if context.isStaff():
[5655]47    is_unsecure = context.waeup_tool.checkGenericPassword(member_id)
[2710]48    if is_unsecure:
49        response.expireCookie('__ac', path='/')
50        return response.redirect("%s/user_logged_in_disabled" % context.portal_url())
51
[2217]52#load_passport = hasattr(context.waeup_tool,'loadStudentFoto')
53
54if not is_anon:
55    if "Student" in member.getRoles():
56        students = context.portal_url.getPortalObject().campus.students
[5655]57        student = getattr(students,member_id)
[2217]58        student_app = getattr(student,'application',None)
59        student_per = getattr(student,'personal',None)
[2412]60
[7957]61
[2407]62        #########################################################
[2412]63
[2407]64        # perform makeStudentData for returning students who login for the first time
65        # the returning key comes from set_access_data
[2412]66
[3115]67        if request.has_key('returning') and  student_per is None:
[2217]68            email=request.get("email")
69            phone=request.get("phone_nr")
[5655]70            context.waeup_tool.makeStudentData(member_id,
[2217]71                                                   email=email,
72                                                   phone_nr=phone,
73                                                   )
74            #d = {}
[5655]75            #d['id'] = member_id
[2217]76            #d['email'] = email
77            #d['phone'] = phone
78            #context.students_catalog.modifyRecord(**d)
[3115]79        elif student_per is None:
[5655]80            context.waeup_tool.makeStudentData(member_id)
[2447]81
[2412]82        #########################################################
83
84        # add missing payments folder
85
[2217]86        if 'payments' not in student.objectIds():
87            student.invokeFactory('PaymentsFolder','payments')
88            payments = getattr(student,'payments')
89            wftool.doActionFor(payments,'open')
90            d = {}
91            d['Title'] = 'Online Payments'
92            payments.getContent().edit(mapping=d)
[2412]93
94        #########################################################
95
[2407]96        #student_pume = getattr(student,'pume',None)
[2217]97        s_review_state = context.getStudentReviewState(student.id)
98        a_review_state = wftool.getInfoFor(student_app,'review_state',None)
99        student_per = getattr(student,'personal',None)
100        p_review_state = wftool.getInfoFor(student_per,'review_state',None)
101        logger.info('%s logged in, review_state %s' % (member,s_review_state))
[2480]102        if student_app is None:
103            logger.info('%s logged in, without application object' % (member))
104        else:
105            app_doc = student_app.getContent()
[7957]106
[5655]107        res = context.students_catalog(id = member_id)
108        matric_no = res[0].matric_no
109        jamb_reg_no = res[0].jamb_reg_no
110        entry_mode = res[0].entry_mode
111        verdict = res[0].verdict
112        level = res[0].level
113        has_level = level
[7957]114        has_verdict = verdict and not verdict == 'N/A'
[2217]115
[2407]116        #########################################################
[2412]117
[2407]118        # save email and phone of returning students after all objects have been created
119
[2480]120        if request.has_key('returning') and student_app:
[2217]121            email=request.get("email")
122            phone=request.get("phone_nr")
123            # should be always closed, however ...
[5506]124            #if a_review_state != 'opened':
125            #    wftool.doActionFor(student_app,'open')
[2217]126            # should be always opened after import, however ...
127            if p_review_state != 'opened':
128                wftool.doActionFor(student_per,'open')
129            per_doc = student_per.getContent()
[5506]130            #app_doc.edit(mapping = {'app_email' : email})
[2217]131            per_doc.edit(mapping = {'email' : email, 'phone' : phone})
[5506]132            #wftool.doActionFor(student_app,'close')
[2412]133
134        #########################################################
135
[2407]136        # look for passport pictures of returning students
[2217]137
[2420]138        if s_review_state == 'returning' and\
[5655]139           not context.waeup_tool.picturesExist(('passport',), member_id):
[2217]140            folder = 'pictures_returning'
[5655]141            #res = context.students_catalog(id = member_id)
[2217]142            filename = res[0].matric_no.upper()
143            msg = context.waeup_tool.loadStudentFoto(student,filename,folder)
144            logger.info('%s (%s), %s' % (member,s_review_state,msg))
[2407]145
146        #########################################################
[7957]147
[5655]148        # look for passport pictures of transfer students
[2412]149
[5655]150        if entry_mode == 'transfer' and\
151           s_review_state in ('returning','school_fee_paid',) and\
152           not context.waeup_tool.picturesExist(('passport',), member_id):
153            res_both = context.students_catalog(jamb_reg_no = jamb_reg_no)
154            #set_trace()
155            if len(res_both) == 2:
156                for ts in res_both:
157                    if ts.id != member_id:
158                        msg = context.waeup_tool.loadTransferStudentFoto(ts.id,member_id)
159                        logger.info('%s (%s on transfer), %s' % (member,s_review_state,msg))
160
[7957]161        #########################################################
[5655]162
[2407]163        # look for passport pictures of new students
164
[2447]165        if s_review_state in ('admitted',
[5501]166                              'student_created',
[2447]167                              'clearance_pin_entered',
[2420]168                              'clearance_requested'
169                             )  and not context.waeup_tool.picturesExist(('passport',),
[5655]170                                                                         member_id):
[2217]171            folder = 'pictures_admitted_latest'
[7977]172            #filename = app_doc.jamb_reg_no.replace('/','_')
173            filename = member_id
[2217]174            msg = context.waeup_tool.loadStudentFoto(student,filename,folder)
175            logger.info('%s (%s), %s' % (member,s_review_state,msg))
[5496]176            if 'passport picture not found' in msg:
[5501]177                filename = app_doc.app_reg_pin.replace('-','')
[5496]178                msg = context.waeup_tool.loadStudentFoto(student,filename,folder)
179                logger.info('%s (%s), %s' % (member,s_review_state,msg))
[2407]180
181        #########################################################
[2412]182
[2407]183        # perform necessary updates for new students
184
185        # 1. add pin and application date to app_doc
[2412]186
[2579]187        if s_review_state == "student_created":
188            wftool.doActionFor(student,'admit')
[2710]189            s_review_state = 'admitted'
[2579]190
191        if s_review_state == "admitted" and a_review_state == 'created':
[2217]192            wftool.doActionFor(student_app,'open')
[2407]193            #if student_pume is not None:
194            #  wftool.doActionFor(student_pume,'close')
[2217]195            da = {}
196            pin = request.get('pin')
[2412]197
198            # if the student comes directly, add missing pin or pin with wrong syntax (fix)
[2217]199            if not pin:
200                jamb_reg_no = app_doc.jamb_reg_no
201                for reg_no in (jamb_reg_no,jamb_reg_no.lower(),jamb_reg_no.upper()):
202                    res = context.portal_pins(student=reg_no)
203                    if len(res) > 0:
204                        break
205                if len(res) > 0:
206                    p = res[0].pin
207                    if len(p) > 10:
[3998]208                        if p.startswith('IPTP'):
209                            pin = "%s-%s-%s" % (p[:4],p[4:5],p[5:])
210                        else:
[5517]211                            pin = "%s-%s-%s" % (p[:3],p[3:-10],p[-10:])
[2217]212                    else:
213                        pin = p
214            da['app_ac_pin'] = pin
215            da['app_ac_date'] = current
216            app_doc.edit(mapping = da)
[2412]217
218        # 2. same as 1 but without opening app_doc, assuming that the student already logged in
219        #    but the pin is missing in app_doc (fix)
220
[2217]221        elif s_review_state in ("admitted") and a_review_state == 'opened' and\
[3998]222                                            (not app_doc.app_ac_pin or app_doc.app_ac_pin.startswith('IPT-P')):
[2217]223            jamb_reg_no = app_doc.jamb_reg_no
224            for reg_no in (jamb_reg_no,jamb_reg_no.lower(),jamb_reg_no.upper()):
225                res = context.portal_pins(student=reg_no)
226                if len(res) > 0:
227                    break
228            if len(res) > 0:
229                p = res[0].pin
230                if len(p) > 10:
[3998]231                    if p.startswith('IPTP'):
232                        pin = "%s-%s-%s" % (p[:4],p[4:5],p[5:])
233                    else:
[7957]234                        pin = "%s-%s-%s" % (p[:3],p[3:-10],p[-10:])
[2217]235                else:
236                    pin = p
237                da = {}
238                da['app_ac_pin'] = pin
239                app_doc.edit(mapping = da)
[2412]240
241        # 3. open personal object (fix). This should be done in clearance_edit.
242
[2217]243        elif s_review_state in ("cleared_and_validated",) and\
244                             p_review_state == 'created' :
245            wftool.doActionFor(student_per,'open')
[2412]246
[7957]247        # 4. open clearance object and close application object in state clearance_pin_entered
[2412]248
[7957]249        elif s_review_state == "clearance_pin_entered":
250            student_clr = getattr(student,'clearance',None)
251            clr_review_state = wftool.getInfoFor(student_clr,'review_state',None)
252            if a_review_state != 'closed':
253                wftool.doActionFor(student_app,'close')
254            if clr_review_state != 'opened':
255                wftool.doActionFor(student_clr,'open')
256
[2407]257        #########################################################
[2412]258
[5022]259        #if matric_no:
260        #    has_results = context.results_import(matric_no = matric_no)
261        #else:
262        #    has_results = ''
[2407]263
[2447]264        #########################################################
[2456]265
[2447]266        # fetch current verdict via getVerdict and level via getLevelFromResultsCosCode
267
[5022]268        #if s_review_state in ('returning','school_fee_paid') and not (has_verdict and has_level):
269        #    if has_results:
270        #        study_course = getattr(student,'study_course')
271        #        sc_review_state = wftool.getInfoFor(study_course,'review_state',None)
272        #        dsc = {}
273        #        if not has_verdict and s_review_state == 'returning':
274        #            dsc['current_verdict'] = context.getVerdict(has_results[0].Verdict)[0]
275        #        if not has_level and s_review_state == 'returning':
276        #            lnr = context.getLevelFromResultsCosCode(has_results)
277        #            dsc['current_level'] = "%d00" % lnr
278        #        elif not has_level and s_review_state == 'school_fee_paid':
279        #            lnr = context.getLevelFromResultsCosCode(has_results)
280        #            cv = context.getVerdict(has_results[0].Verdict)[0]
281        #            if cv in ('A','B',):
282        #                lnr += 1
283        #            dsc['current_level'] = "%d00" % lnr
284        #            dsc['previous_verdict'] = cv
285        #        if sc_review_state != 'opened':
286        #            wftool.doActionFor(study_course,'open')
287        #        study_course_doc =study_course.getContent()
288        #        study_course_doc.edit(mapping = dsc)
289        #        wftool.doActionFor(study_course,'close_for_edit')
[2412]290
[2407]291        #########################################################
[2412]292
[2407]293
294        # determine appropriate redirect url
295
[2217]296        if s_review_state == "application_pin_entered":
297            redirect_url = "%s/application_edit_form" % student.absolute_url()
298        elif s_review_state in ('admitted', 'objection_raised',):
299            redirect_url = "%s/admission_form" % student.absolute_url()
300        elif s_review_state == "clearance_pin_entered":
301            redirect_url = "%s/clearance_edit_form" % student.absolute_url()
302        elif s_review_state == "cleared_and_validated":
303            redirect_url = "%s/personal_edit_form" % student.absolute_url()
[3972]304        #elif s_review_state == "returning" and has_results:
305        #    redirect_url = "%s/session_results_view" % student.absolute_url()
[2217]306        elif s_review_state in ('school_fee_paid','courses_registered'):
307            redirect_url = "%s/study_course/study_course_view" % student.absolute_url()
308        else:
309            redirect_url = "%s/student_index" % student.absolute_url()
[2407]310
311
[2217]312    else:
313        logger.info('%s logged in' % (member))
314        redirect_url = portal.absolute_url()
315#Anonymous
316else:
[5656]317    logger.info('failed login with %s' % cred)
[2217]318    response.expireCookie('__ac', path='/')
319    return context.user_logged_in_failed()
320
321# Setup skins
322if (getattr(utool, 'updateSkinCookie', False) and
323    utool.updateSkinCookie()):
324    context.setupCurrentSkin()
325
326response.redirect(redirect_url)
Note: See TracBrowser for help on using the repository browser.