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

Last change on this file since 3784 was 3115, checked in by Henrik Bettermann, 17 years ago

temporary solution for the tracebacks seen today

Joachim, we have to discuss

File size: 11.3 KB
Line 
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
21current = DateTime.DateTime()
22import logging
23logger = logging.getLogger('Skins.logged_in')
24
25
26from urllib import unquote
27
28request = context.REQUEST
29response = request.RESPONSE
30utool = context.portal_url
31mtool = context.portal_membership
32wftool = context.portal_workflow
33portal = utool.getPortalObject()
34
35redirect_to_portal = False
36is_anon = mtool.isAnonymousUser()
37member = mtool.getAuthenticatedMember()
38
39if context.isStaff():
40    is_unsecure = context.waeup_tool.checkGenericPassword(str(member))
41    if is_unsecure:
42        response.expireCookie('__ac', path='/')
43        return response.redirect("%s/user_logged_in_disabled" % context.portal_url())
44
45#load_passport = hasattr(context.waeup_tool,'loadStudentFoto')
46
47if not is_anon:
48    if "Student" in member.getRoles():
49        to_waeup_student_home = True
50        students = context.portal_url.getPortalObject().campus.students
51        student = getattr(students,str(member))
52        student_app = getattr(student,'application',None)
53        student_per = getattr(student,'personal',None)
54
55        #########################################################
56
57        # perform makeStudentData for returning students who login for the first time
58        # the returning key comes from set_access_data
59
60        if request.has_key('returning') and  student_per is None:
61            email=request.get("email")
62            phone=request.get("phone_nr")
63            context.waeup_tool.makeStudentData(str(member),
64                                                   email=email,
65                                                   phone_nr=phone,
66                                                   )
67            #d = {}
68            #d['id'] = str(member)
69            #d['email'] = email
70            #d['phone'] = phone
71            #context.students_catalog.modifyRecord(**d)
72        elif student_per is None:
73            context.waeup_tool.makeStudentData(str(member))
74
75        #########################################################
76
77        student_app = getattr(student,'application',None)
78
79        #########################################################
80
81        # add missing payments folder
82
83        if 'payments' not in student.objectIds():
84            student.invokeFactory('PaymentsFolder','payments')
85            payments = getattr(student,'payments')
86            wftool.doActionFor(payments,'open')
87            d = {}
88            d['Title'] = 'Online Payments'
89            payments.getContent().edit(mapping=d)
90
91        #########################################################
92
93        #student_pume = getattr(student,'pume',None)
94        s_review_state = context.getStudentReviewState(student.id)
95        a_review_state = wftool.getInfoFor(student_app,'review_state',None)
96        student_per = getattr(student,'personal',None)
97        p_review_state = wftool.getInfoFor(student_per,'review_state',None)
98        logger.info('%s logged in, review_state %s' % (member,s_review_state))
99        if student_app is None:
100            logger.info('%s logged in, without application object' % (member))
101        else:
102            app_doc = student_app.getContent()
103
104        #########################################################
105
106        # save email and phone of returning students after all objects have been created
107
108        if request.has_key('returning') and student_app:
109            email=request.get("email")
110            phone=request.get("phone_nr")
111            # should be always closed, however ...
112            if a_review_state != 'opened':
113                wftool.doActionFor(student_app,'open')
114            # should be always opened after import, however ...
115            if p_review_state != 'opened':
116                wftool.doActionFor(student_per,'open')
117            per_doc = student_per.getContent()
118            app_doc.edit(mapping = {'app_email' : email})
119            per_doc.edit(mapping = {'email' : email, 'phone' : phone})
120            wftool.doActionFor(student_app,'close')
121
122        #########################################################
123
124        # look for passport pictures of returning students
125
126        #if s_review_state == 'returning' and 'passport' not in app_doc.objectIds():
127        # use new test
128        if s_review_state == 'returning' and\
129           not context.waeup_tool.picturesExist(('passport',), student.getId()):
130            folder = 'pictures_returning'
131            res = context.students_catalog(id = str(member))
132            filename = res[0].matric_no.upper()
133            msg = context.waeup_tool.loadStudentFoto(student,filename,folder)
134            logger.info('%s (%s), %s' % (member,s_review_state,msg))
135
136
137        #########################################################
138
139        # look for passport pictures of new students
140
141        if s_review_state in ('admitted',
142                              'clearance_pin_entered',
143                              'clearance_requested'
144                             )  and not context.waeup_tool.picturesExist(('passport',),
145                                                                         student.getId()):
146            folder = 'pictures_admitted_latest'
147            filename = app_doc.jamb_reg_no.replace('/','_')
148            msg = context.waeup_tool.loadStudentFoto(student,filename,folder)
149            logger.info('%s (%s), %s' % (member,s_review_state,msg))
150
151
152        #########################################################
153
154        # perform necessary updates for new students
155
156        # 1. add pin and application date to app_doc
157
158        if s_review_state == "student_created":
159            wftool.doActionFor(student,'admit')
160            s_review_state = 'admitted'
161
162        if s_review_state == "admitted" and a_review_state == 'created':
163            wftool.doActionFor(student_app,'open')
164            #if student_pume is not None:
165            #  wftool.doActionFor(student_pume,'close')
166            da = {}
167            pin = request.get('pin')
168
169            # if the student comes directly, add missing pin or pin with wrong syntax (fix)
170            if not pin:
171                jamb_reg_no = app_doc.jamb_reg_no
172                for reg_no in (jamb_reg_no,jamb_reg_no.lower(),jamb_reg_no.upper()):
173                    res = context.portal_pins(student=reg_no)
174                    if len(res) > 0:
175                        break
176                if len(res) > 0:
177                    p = res[0].pin
178                    if len(p) > 10:
179                        pin = "%s-%s-%s" % (p[:3],p[3:4],p[4:])
180                    else:
181                        pin = p
182            da['app_ac_pin'] = pin
183            da['app_ac_date'] = current
184            app_doc.edit(mapping = da)
185
186        # 2. same as 1 but without opening app_doc, assuming that the student already logged in
187        #    but the pin is missing in app_doc (fix)
188
189        elif s_review_state in ("admitted") and a_review_state == 'opened' and\
190                                            not app_doc.app_ac_pin:
191            jamb_reg_no = app_doc.jamb_reg_no
192            for reg_no in (jamb_reg_no,jamb_reg_no.lower(),jamb_reg_no.upper()):
193                res = context.portal_pins(student=reg_no)
194                if len(res) > 0:
195                    break
196            if len(res) > 0:
197                p = res[0].pin
198                if len(p) > 10:
199                    pin = "%s-%s-%s" % (p[:3],p[3:4],p[4:])
200                else:
201                    pin = p
202                da = {}
203                da['app_ac_pin'] = pin
204                app_doc.edit(mapping = da)
205
206        # 3. open personal object (fix). This should be done in clearance_edit.
207
208        elif s_review_state in ("cleared_and_validated",) and\
209                             p_review_state == 'created' :
210            wftool.doActionFor(student_per,'open')
211
212        #########################################################
213
214        res = context.students_catalog(id = str(member))
215        matric_no = res[0].matric_no
216        verdict = res[0].verdict
217        level = res[0].level
218        has_level = level
219        has_verdict = verdict and not verdict == 'N/A'
220        #set_trace()
221
222        #########################################################
223
224        if matric_no:
225            has_results = context.results_import(matric_no = matric_no)
226        else:
227            has_results = ''
228
229        #########################################################
230
231        # fetch current verdict via getVerdict and level via getLevelFromResultsCosCode
232
233        if s_review_state in ('returning','school_fee_paid') and not (has_verdict and has_level):
234            if has_results:
235                study_course = getattr(student,'study_course')
236                sc_review_state = wftool.getInfoFor(study_course,'review_state',None)
237                dsc = {}
238                if not has_verdict and s_review_state == 'returning':
239                    dsc['current_verdict'] = context.getVerdict(has_results[0].Verdict)[0]
240                if not has_level and s_review_state == 'returning':
241                    lnr = context.getLevelFromResultsCosCode(has_results)
242                    dsc['current_level'] = "%d00" % lnr
243                elif not has_level and s_review_state == 'school_fee_paid':
244                    lnr = context.getLevelFromResultsCosCode(has_results)
245                    cv = context.getVerdict(has_results[0].Verdict)[0]
246                    if cv in ('A','B',):
247                        lnr += 1
248                    dsc['current_level'] = "%d00" % lnr
249                    dsc['previous_verdict'] = cv
250                if sc_review_state != 'opened':
251                    wftool.doActionFor(study_course,'open')
252                study_course_doc =study_course.getContent()
253                study_course_doc.edit(mapping = dsc)
254                wftool.doActionFor(study_course,'close_for_edit')
255
256        #########################################################
257
258
259        # determine appropriate redirect url
260
261        if s_review_state == "application_pin_entered":
262            redirect_url = "%s/application_edit_form" % student.absolute_url()
263        elif s_review_state in ('admitted', 'objection_raised',):
264            redirect_url = "%s/admission_form" % student.absolute_url()
265        elif s_review_state == "clearance_pin_entered":
266            redirect_url = "%s/clearance_edit_form" % student.absolute_url()
267        elif s_review_state == "cleared_and_validated":
268            redirect_url = "%s/personal_edit_form" % student.absolute_url()
269        elif s_review_state == "returning" and has_results:
270            redirect_url = "%s/session_results_view" % student.absolute_url()
271        elif s_review_state in ('school_fee_paid','courses_registered'):
272            redirect_url = "%s/study_course/study_course_view" % student.absolute_url()
273        else:
274            redirect_url = "%s/student_index" % student.absolute_url()
275
276
277    else:
278        logger.info('%s logged in' % (member))
279        redirect_url = portal.absolute_url()
280#Anonymous
281else:
282    response.expireCookie('__ac', path='/')
283    return context.user_logged_in_failed()
284
285# Setup skins
286if (getattr(utool, 'updateSkinCookie', False) and
287    utool.updateSkinCookie()):
288    context.setupCurrentSkin()
289
290response.redirect(redirect_url)
291
Note: See TracBrowser for help on using the repository browser.