source: WAeUP_SRP/trunk/Widgets.py @ 842

Last change on this file since 842 was 841, checked in by joachim, 18 years ago

add vocabularies for subjects and grades according to Kehindes Data
use them in clearance form.

  • Property svn:keywords set to Id
File size: 19.5 KB
Line 
1#-*- mode: python; mode: fold -*-
2
3from cgi import escape
4from types import *
5from Globals import InitializeClass
6##from Products.CPSSchemas.Widget import CPSWidgetType
7from Products.CMFCore.utils import getToolByName
8from Products.CPSSchemas.BasicWidgets import CPSWidget, CPSStringWidget, CPSEmailWidget,CPSImageWidget
9from Products.CPSSchemas.BasicWidgets import renderHtmlTag,CPSSelectWidget, CPSStringWidget
10from Products.CPSSchemas.ExtendedWidgets import CPSDateTimeWidget
11from Products.CPSSchemas.Widget import widgetRegistry
12##from Products.CPSSchemas.WidgetTypesTool import WidgetTypeRegistry
13from DateTime.DateTime import DateTime
14from AccessControl import getSecurityManager
15from Products.WAeUP_SRP.Students import getStudentByRegNo
16from re import compile
17
18from zLOG import LOG, DEBUG
19
20class CPSSelectWidgetForRecord(CPSSelectWidget): ###(
21    """Select widget. with record names"""
22    meta_type = 'Select Widget for Records'
23
24    field_types = ('CPS String Field',)
25    field_inits = ({'is_searchabletext': 1,},)
26
27    _properties = CPSSelectWidget._properties + (
28        {'id': 'record_id', 'type': 'string', 'mode': 'w',
29         'label': 'Record Id', 'is_required' : 1},
30        )
31
32    def render(self, mode, datastructure, **kw):
33        """Render in mode from datastructure."""
34        value = datastructure[self.getWidgetId()]
35        vocabulary = self._getVocabulary(datastructure)
36        portal = getToolByName(self, 'portal_url').getPortalObject()
37        cpsmcat = portal.translation_service
38        if mode == 'view':
39            if self.translated:
40                return escape(cpsmcat(vocabulary.getMsgid(value, value)).encode('ISO-8859-15', 'ignore'))
41            else:
42                return escape(vocabulary.get(value, value))
43        elif mode == 'edit':
44            html_widget_id = self.getHtmlWidgetId()
45            res = renderHtmlTag('select',
46                                name='%s.%s:records' % (self.record_id,html_widget_id),
47                                id=html_widget_id)
48            in_selection = 0
49            for k, v in vocabulary.items():
50                if self.translated:
51                    kw = {'value': k,
52                          'contents': cpsmcat(vocabulary.getMsgid(k, k)).encode('ISO-8859-15', 'ignore')
53                          }
54                else:
55                    kw = {'value': k, 'contents': v}
56                if value == k:
57                    kw['selected'] = 'selected'
58                    in_selection = 1
59                res += renderHtmlTag('option', **kw)
60            if value and not in_selection:
61                kw = {'value': value, 'contents': 'invalid: '+ str(value),
62                      'selected': 'selected'}
63                res += renderHtmlTag('option', **kw)
64            res += '</select>'
65            return res
66        raise RuntimeError('unknown mode %s' % mode)
67
68InitializeClass(CPSSelectWidgetForRecord)
69
70widgetRegistry.register(CPSSelectWidgetForRecord)
71
72###)
73
74class CPSStringWidgetForRecord(CPSStringWidget): ###(
75    """String widget."""
76    meta_type = 'String Widget For Record'
77
78    field_types = ('CPS String Field',)
79    field_inits = ({'is_searchabletext': 1,},)
80    _properties = CPSStringWidget._properties + (
81        {'id': 'record_id', 'type': 'string', 'mode': 'w',
82         'label': 'Record Id', 'is_required' : 1},
83        )
84
85    def render(self, mode, datastructure, **kw):
86        """Render in mode from datastructure."""
87        value = datastructure[self.getWidgetId()]
88        if mode == 'view':
89            return escape(value)
90        elif mode == 'edit':
91            # XXX TODO should use an other name than kw !
92            # XXX change this everywhere
93            html_widget_id = self.getHtmlWidgetId()
94            kw = {'type': 'text',
95                  'id'  : html_widget_id,
96                  'name': '%s.%s:records' % (self.record_id,html_widget_id),
97                  'value': escape(value),
98                  'size': self.display_width,
99                  }
100            if self.size_max:
101                kw['maxlength'] = self.size_max
102            return renderHtmlTag('input', **kw)
103        raise RuntimeError('unknown mode %s' % mode)
104
105InitializeClass(CPSStringWidgetForRecord)
106
107widgetRegistry.register(CPSStringWidgetForRecord)
108
109###)
110
111class CertificateCourseIdWidget(CPSStringWidget): ###(
112    """ CertificateCourseId Widget"""
113    meta_type = "CertificateCourseId Widget"
114
115    def validate(self, datastructure, **kw):
116        """Validate datastructure and update datamodel."""
117
118        valid = CPSStringWidget.validate(self, datastructure, **kw)
119        if not valid:
120            return 0
121        else:
122            widget_id = self.getWidgetId()
123            value = datastructure[widget_id].upper()
124            err = 0
125            c_ids = [c.id for c in self.portal_catalog({'meta_type': "Course"})]
126            if hasattr(self.aq_parent,value):
127                err = 'Course %s already exists' % (value)
128            elif value not in c_ids:
129                err = 'Course %s does not exist' % (value)
130            if err:
131                datastructure.setError(widget_id, err)
132            else:
133                datamodel = datastructure.getDataModel()
134                datamodel[self.fields[0]] = value
135
136            return not err
137
138InitializeClass(CertificateCourseIdWidget)
139
140widgetRegistry.register(CertificateCourseIdWidget)
141###)
142
143
144class CourseIdWidget(CPSStringWidget): ###(
145    """ CourseId Widget"""
146    meta_type = "CourseId Widget"
147
148    def validate(self, datastructure, **kw):
149        """Validate datastructure and update datamodel."""
150
151        valid = CPSStringWidget.validate(self, datastructure, **kw)
152        if not valid:
153            return 0
154        else:
155            widget_id = self.getWidgetId()
156            value = datastructure[widget_id].upper()
157            err = 0
158            res = self.portal_catalog(meta_type= "Course",id = value)
159            if len(res) > 0:
160                err = 'Course %s already exists' % (value)
161            if err:
162                datastructure.setError(widget_id, err)
163            else:
164                datamodel = datastructure.getDataModel()
165                datamodel[self.fields[0]] = value
166
167            return not err
168
169InitializeClass(CourseIdWidget)
170
171widgetRegistry.register(CourseIdWidget)
172
173
174###)
175
176class WAeUPReservedRoomsWidget(CPSStringWidget): ###(
177    """ WAeUPReservedRooms Widget"""
178    meta_type = "WAeUPReservedRooms Widget"
179
180    def validate(self, datastructure, **kw):
181        """Validate datastructure and update datamodel."""
182        import re
183        valid = CPSStringWidget.validate(self, datastructure, **kw)
184        if not valid:
185            return 0
186        else:
187            widget_id = self.getWidgetId()
188            value = datastructure[widget_id]
189            err = 0
190            try:
191                reserved = [(int(r.split('/')[0]),int(r.split('/')[1])) for r in re.split(',|\.| ',value)
192                                     if r]
193            except ValueError,msg:
194                err = str(msg)
195            if err:
196                datastructure.setError(widget_id, err)
197            else:
198                datamodel = datastructure.getDataModel()
199                datamodel[self.fields[0]] = value
200            return not err
201
202InitializeClass(WAeUPReservedRoomsWidget)
203
204widgetRegistry.register(WAeUPReservedRoomsWidget)
205
206
207###)
208
209class WAeUPIdWidget(CPSStringWidget): ###(
210    """ WAeUPId Widget"""
211    meta_type = "WAeUPId Widget"
212
213    def validate(self, datastructure, **kw):
214        """Validate datastructure and update datamodel."""
215
216        valid = CPSStringWidget.validate(self, datastructure, **kw)
217        id_pat_str = r"\S"
218        inv_id_pat = compile(r"^%s$" % id_pat_str)
219        if not valid:
220            return 0
221        else:
222            portal_type_query = {'query':['Faculty',
223                                          'Department',
224                                          'Course',
225                                          'Certificate',
226                                          'CertificateCourse',]}
227            widget_id = self.getWidgetId()
228            value = datastructure[widget_id].upper()
229            err = 0
230            if len(value.split()) > 1:
231                err = 'Invalid Id, Id contains space(s).'
232            elif self.portal_catalog(portal_type=portal_type_query,id=value):
233                err = 'An object with the Id %s already exists in the Academic Section.' % (value)
234            if err:
235                datastructure.setError(widget_id, err)
236            else:
237                datamodel = datastructure.getDataModel()
238                datamodel[self.fields[0]] = value
239
240            return not err
241
242InitializeClass(WAeUPIdWidget)
243
244widgetRegistry.register(WAeUPIdWidget)
245
246
247###)
248
249##class StudentIdWidget(CPSStringWidget): ###(
250##    """ StudentId Widget"""
251##    meta_type = "StudentId Widget"
252##    digits = 8
253##    digits_str = "N"*digits
254##    letters = 2
255##    letters_str = "L"*letters
256##
257##    def validate(self, datastructure, **kw):
258##        """Validate datastructure and update datamodel."""
259##
260##        valid = CPSStringWidget.validate(self, datastructure, **kw)
261##        if not valid:
262##            return 0
263##        else:
264##            widget_id = self.getWidgetId()
265##            value = datastructure[widget_id]
266##            err = 0
267##            if not (len(value) == self.digits + self.letters and value[:self.digits].isdigit() and value[self.digits:].isalpha()):
268##                err = 'Invalid Registration Number in the format: %s%s with N = Number, L = Letter' % (self.digits_str,self.letters_str)
269##            if err:
270##                datastructure.setError(widget_id, err)
271##            else:
272##                datamodel = datastructure.getDataModel()
273##                datamodel[self.fields[0]] = value
274##
275##            return not err
276##
277##InitializeClass(StudentIdWidget)
278##widgetRegistry.register(StudentIdWidget)
279##
280#####)
281
282class JambRegNoWidget(CPSStringWidget): ###(
283    """ JambRegNo Widget"""
284    meta_type = "JambRegNo Widget"
285    digits = 8
286    digits_str = "N"*digits
287    letters = 2
288    letters_str = "L"*letters
289
290    def validate(self, datastructure, **kw):
291        """Validate datastructure and update datamodel."""
292
293        valid = CPSStringWidget.validate(self, datastructure, **kw)
294        #import pdb;pdb.set_trace()
295        if not valid:
296            return 0
297        else:
298            widget_id = self.getWidgetId()
299            value = datastructure[widget_id]
300            err = 0
301            if not (len(value) == self.digits + self.letters and value[:self.digits].isdigit() and value[self.digits:].isalpha()):
302                err = 'Invalid number, the expected format is: %s%s with N = Number, L = Letter' % (self.digits_str,self.letters_str)
303            else:
304                s = getStudentByRegNo(self,value)
305                if s is None:
306                    err = 'No Student with JAMB-Reg-No %s' % (value)
307                else:
308                    s_id = s.getId()
309                    datastructure['s_id'] = s_id
310            if err:
311                datastructure.setError(widget_id, err)
312            else:
313                datamodel = datastructure.getDataModel()
314                datamodel[self.fields[0]] = value
315            return not err
316
317InitializeClass(JambRegNoWidget)
318
319widgetRegistry.register(JambRegNoWidget)
320###)
321
322class WAeUPResultsWidget(CPSStringWidget): ###(
323    """ WAeUPResults Widget"""
324    meta_type = "WAeUp Results Widget"
325
326    def prepare(self, datastructure, **kw): ###(
327        """Prepare datastructure from datamodel."""
328        datamodel = datastructure.getDataModel()
329        v = datamodel[self.fields[0]]
330        #import pdb;pdb.set_trace()
331        widget_id = self.getWidgetId()
332        datastructure[widget_id] = v
333        datastructure[widget_id+'_s'] = ''
334        datastructure[widget_id+'_g'] = ''
335    ###)
336
337    def validate(self, datastructure, **kw): ###(
338        """Validate datastructure and update datamodel."""
339        #import pdb;pdb.set_trace()
340        widget_id = self.getWidgetId()
341        v = datastructure[widget_id]
342        err = 0
343        s = datastructure[widget_id+'_s'].strip()
344        g = datastructure[widget_id+'_g'].strip()
345        while 1:
346            if not s and g:
347                err = "no subject grad for subject %s " % s
348                break
349            i = 0
350            done = False
351            for sv,gv in v:
352                if sv == s:
353                    done = True
354                    if not g:
355                        v.pop(i)
356                        break
357                    v[i] = (s,g)
358                    break
359                i += 1
360            if done:
361                break
362            if s and g:
363                v.append((s,g))
364            break
365        if err:
366            datastructure.setError(widget_id, err)
367        else:
368            datamodel = datastructure.getDataModel()
369            datamodel[self.fields[0]] = v
370            datastructure[widget_id+'_s'] = s
371            datastructure[widget_id+'_g'] = g
372        return not err
373    ###)
374
375    def render(self, mode, datastructure, **kw): ###(
376        """Render in mode from datastructure."""
377        render_method = 'widget_waeup_result_render'
378        meth = getattr(self, render_method, None)
379        if meth is None:
380            raise RuntimeError("Unknown Render Method %s for widget type %s"
381                               % (render_method, self.getId()))
382        #import pdb;pdb.set_trace()
383        datamodel = datastructure.getDataModel()
384        widget_id = self.getWidgetId()
385        v = datamodel[self.fields[0]]
386        datastructure[widget_id] = v
387        datastructure[widget_id+'_s'] = ''
388        datastructure[widget_id+'_g'] = ''
389        return meth(mode=mode,
390                    datastructure=datastructure,
391                    )
392    ###)
393
394
395InitializeClass(WAeUPResultsWidget)
396widgetRegistry.register(WAeUPResultsWidget)
397###)
398
399class ScratchCardPin: ###(
400    """the ScratchCardPin"""
401    def __init__(self,prefix,batch_no,number):
402        self.p = prefix
403        self.b = batch_no
404        self.n = number
405
406    def __str__(self):
407        return "%s-%s-%s" % (self.p,self.b,self.n)
408###)
409
410class ScratchcardPinWidget(CPSStringWidget): ###(
411    """ ScratchcardPin Widget"""
412    meta_type = "Scratchcard Pin Widget"
413    _properties = CPSWidget._properties + (
414        {'id': 'prefix', 'type': 'string', 'mode': 'w',
415         'label': 'Prefix'},
416         {'id': 'reference', 'type': 'string', 'mode': 'w',
417         'label': 'Reference Field'},
418
419        )
420    prefix = ''
421    reference = ''
422    def prepare(self, datastructure, **kw): ###(
423        """Prepare datastructure from datamodel."""
424        datamodel = datastructure.getDataModel()
425        v = datamodel[self.fields[0]]
426        widget_id = self.getWidgetId()
427        #import pdb;pdb.set_trace()
428        if v and type(v) is StringType:
429            p,b,n = v.split('-')
430            v = ScratchCardPin(v,b,n)
431        if v:
432            p = '%s' % v.p
433            b = '%s' % v.b
434            n = '%s' % v.n
435        else:
436            p = self.prefix
437            if p.startswith('@'):
438                p = getattr(self,self.prefix[1:])()
439            b = n = ''
440            v = ScratchCardPin(p,b,n)
441        datastructure[widget_id] = v
442        datastructure[widget_id+'_p'] = p
443        datastructure[widget_id+'_b'] = b
444        datastructure[widget_id+'_n'] = n
445
446###)
447
448    def validate(self, datastructure, **kw):
449        """Validate datastructure and update datamodel."""
450        #import pdb;pdb.set_trace()
451        widget_id = self.getWidgetId()
452        v = datastructure[widget_id]
453        err = 0
454        prefix= self.prefix
455        if prefix.startswith('@'):
456            prefix= getattr(self,self.prefix[1:])()
457        b = datastructure[widget_id+'_b'].strip()
458        n = datastructure[widget_id+'_n'].strip()
459        pins = self.portal_pins
460        pin = "%(prefix)s%(b)s%(n)s" % vars()
461        do = 1
462        if self.reference == "":
463            ref = str(self.portal_membership.getAuthenticatedMember())
464        else:
465            ref = datastructure[self.reference]
466            if datastructure.errors.get(self.reference) is not None:
467                do = 0
468                err = 'Invalid JAMB Number, PIN not used'
469        while do:
470            ok = pins.searchAndSetRecord(pin,ref,prefix)
471            if ok == -2:
472                err = 'Service already activated but with a different PIN.'
473                break
474            elif ok == -1:
475                err = 'Invalid PIN'
476                break
477            if ok == 0:
478                err = 'PIN already used.'
479                break
480            if ok >= 1:
481                #import pdb;pdb.set_trace()
482                if self.isStudent():
483                    student = self.getStudentInfo()['student']
484                    s_id = student.getId()
485                    break
486                else:
487                    student = getStudentByRegNo(self,ref)
488                if student is None:
489                    err = "Student not found."
490                    break
491                s_id = student.getId()
492                if ok == 2:
493                    err = "You are a portal member, please login with your Student Id and Password."
494                    break
495                student.getContent().makeStudentMember(s_id,password=pin[4:])
496            break
497        if err:
498            datastructure.setError(widget_id, err)
499        else:
500            datamodel = datastructure.getDataModel()
501            datamodel[self.fields[0]] = ScratchCardPin(prefix,b,n)
502            datastructure[widget_id] = ScratchCardPin(prefix,b,n)
503            datastructure[widget_id+'_p'] = prefix
504            datastructure[widget_id+'_b'] = b
505            datastructure[widget_id+'_n'] = n
506            datastructure['s_id'] = s_id
507        return not err
508
509    def render(self, mode, datastructure, **kw): ###(
510        """Render in mode from datastructure."""
511        render_method = 'widget_scratch_card_pin_render'
512        meth = getattr(self, render_method, None)
513        if meth is None:
514            raise RuntimeError("Unknown Render Method %s for widget type %s"
515                               % (render_method, self.getId()))
516
517        # XXX AT: datastructure has to be set again here, in case we're in edit
518        # or create mode, because a default value has to be provided.
519        #import pdb;pdb.set_trace()
520        datamodel = datastructure.getDataModel()
521        v = datamodel[self.fields[0]]
522        if v and type(v) is StringType:
523            prefix,b,n = v.split('-')
524            v = ScratchCardPin(prefix,b,n)
525        if v:
526            prefix= '%s' % v.p
527            b = '%s' % v.b
528            n = '%s' % v.n
529        else:
530            prefix= self.prefix
531            if prefix.startswith('@'):
532                prefix= getattr(self,self.prefix[1:])()
533            b = n = ''
534            v = ScratchCardPin(prefix,b,n)
535        widget_id = self.getWidgetId()
536        datastructure[widget_id] = v
537        datastructure[widget_id+'_p'] = prefix
538        datastructure[widget_id+'_b'] = b
539        datastructure[widget_id+'_n'] = n
540        return meth(mode=mode,
541                    datastructure=datastructure,
542                    )
543    ###)
544
545
546InitializeClass(ScratchcardPinWidget)
547widgetRegistry.register(ScratchcardPinWidget)
548
549
550###)
551
552class WAeUPImageWidget(CPSImageWidget):
553    """Photo widget."""
554    meta_type = 'WAeUP Image Widget'
555
556    def render(self, mode, datastructure, **kw):
557        render_method = 'widget_waeup_image_render'
558        meth = getattr(self, render_method, None)
559        if meth is None:
560            raise RuntimeError("Unknown Render Method %s for widget type %s"
561                               % (render_method, self.getId()))
562        img_info = self.getImageInfo(datastructure)
563        return meth(mode=mode, datastructure=datastructure, **img_info)
564
565
566
567InitializeClass(WAeUPImageWidget)
568
569widgetRegistry.register(WAeUPImageWidget)
570
571
572###########
573
Note: See TracBrowser for help on using the repository browser.