source: waeup/branches/ulif-rewrite/src/waeup/university/certificate.py @ 4516

Last change on this file since 4516 was 4516, checked in by uli, 15 years ago

Add some viewlets for certificate to

  • display containing faculty/dept.,
  • display contained cert courses.
  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1"""WAeUP portal certificates
2"""
3import grok
4from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
5from zope.app.catalog.interfaces import ICatalog
6from zope.component import getUtility
7from zope.component.interfaces import IFactory, ComponentLookupError
8from zope.interface import implementedBy
9from waeup.interfaces import (ICertificate, ICertificateContainer,
10                              ICertificateCourse, ICourse, IDepartment)
11from waeup.viewlets import FormWrapMixin, Index, Manage, MainArea
12from waeup.utils.helpers import getName
13
14class Certificate(grok.Container):
15    """A certificate.
16    """
17    grok.implements(ICertificate)
18
19    def __init__(self, code=u'NA', title=u'Unnamed Certificate',
20                 category=None, study_mode=None, start_level=None,
21                 end_level=None, application_category=None, m_prefix=u'',
22                 max_pass = u''):
23        super(Certificate, self).__init__()
24        self.code = code
25        self.title = title
26        self.category = category
27        self.study_mode = study_mode
28        self.start_level = start_level
29        self.end_level = end_level
30        self.application_category = application_category
31        self.m_prefix = m_prefix
32        self.max_pass = max_pass
33        # Initialize workflow state...
34        self.setReviewState('init')
35
36    def check(self):
37        """Set Review State to ``checked``.
38        """
39        self.setReviewState('check')
40
41    def getReviewState(self):
42        return IWorkflowState(self).getState()
43
44    def setReviewState(self, transition_id='check'):
45        info = IWorkflowInfo(self)
46        info.fireTransition(transition_id)
47        return
48
49    def addCourseRef(self, course, level=100, core_or_elective=True):
50        """Add a course reference.
51        """
52        code = "%s_%s" % (course.code, level)
53        self[code] = CertificateCourse(course, level, core_or_elective)
54
55    def delCourseRef(self, code):
56        """Delete a course denoted by its code.
57        """
58        for key in self.keys():
59            if self[key].getCourseCode() != code:
60                continue
61            del self[key]
62            self._p_changed = True
63        return
64
65    review_state = property(getReviewState, setReviewState)
66
67
68class CertificateFactory(grok.GlobalUtility):
69    """A factory for certificates.
70    """
71    grok.implements(IFactory)
72    grok.name(u'waeup.Certificate')
73    title = u"Create a new certificate.",
74    description = u"This factory instantiates new certificate instances."
75
76    def __call__(self, *args, **kw):
77        return Certificate(*args, **kw)
78
79    def getInterfaces(self):
80        return implementedBy(Certificate)
81
82class CertificateCourse(grok.Model):
83    grok.implements(ICertificateCourse)
84
85    def __init__(self, course=None, level=100, core_or_elective=True):
86        self.course = course
87        self.level = level
88        self.core_or_elective = core_or_elective
89
90    def getCourseCode(self):
91        return self.course.code
92   
93class CertificateCourseFactory(grok.GlobalUtility):
94    """A factory for certificate courses.
95    """
96    grok.implements(IFactory)
97    grok.name(u'waeup.CertificateCourse')
98    title = u"Create a new certificate course.",
99    description = u"This factory instantiates new certificate courses."
100
101    def __call__(self, *args, **kw):
102        return CertificateCourse(*args, **kw)
103
104    def getInterfaces(self):
105        return implementedBy(CertificateCourse)
106
107class ContentHeader(grok.Viewlet):
108    """A viewlet that renders the faculty, department and course title.
109    """
110    grok.viewletmanager(MainArea)
111    grok.context(ICertificate)
112    grok.view(Index)
113    grok.order(2)
114
115    def render(self):
116        return '''<h5>%s</h5><h4>%s</h4><h3>%s</h3>''' % (
117            getName(self.context.__parent__.__parent__.__parent__),
118            getName(self.context.__parent__.__parent__),
119            self.context.title)
120
121class DisplayForm(grok.DisplayForm):
122    grok.context(ICertificate)
123    form_fields = grok.AutoFields(ICertificate)
124 
125class Content(FormWrapMixin, grok.Viewlet):
126    """A viewlet that wraps the `DisplayForm`.
127    """
128    grok.viewletmanager(MainArea)
129    grok.context(ICertificate)
130    grok.view(Index)
131    grok.order(2)
132    formview_name = 'displayform' # The name of the formview we want
133                                  # to be rendered in this viewlet.
134
135
136class ManageForm(grok.EditForm):
137    """Manage the basic properties of a `Department` instance.
138    """
139    grok.context(ICertificate)
140    form_fields = grok.AutoFields(ICertificate)
141
142    @property
143    def label(self):
144        # Set certificate name as form label
145        return self.form_fields['title'].field.get(self.context)
146   
147    @grok.action('Save')
148    def save(self, **data):
149        self.applyData(self.context, **data)
150        return
151   
152    @grok.action('Save and return')
153    def saveAndReturn(self, **data):
154        self.applyData(self.context, **data)
155        self.redirect(self.url(self.context))
156        return
157
158    @grok.action('Cancel')
159    def cancel(self, **data):
160        self.redirect(self.url(self.context))
161        return
162
163class ManageCertificate(FormWrapMixin, grok.Viewlet):
164    """A viewlet that renders the `ManageForm`.
165    """
166    grok.viewletmanager(MainArea)
167    grok.context(ICertificate)
168    grok.view(Manage)
169    grok.require('waeup.manageUniversity')
170   
171    formview_name = 'manageform' # The name of the formview we want to
172                                 # be rendered in this viewlet.
173
174class CourseList(grok.Viewlet):
175    grok.viewletmanager(MainArea)
176    grok.context(ICertificate)
177    grok.view(Index)
178    grok.order(2)
179
180    def render(self):
181        result = '<h3>Courses</h4>\n'
182        for key, course in self.context.items():
183            certcourse = self.context[key]
184            course = certcourse.course
185            result += '<div><a href="%s">%s</a>%s (%s / %s)</div>' % (
186                self.view.url(course), course.code, course.title,
187                certcourse.level, certcourse.core_or_elective)
188        return result
189   
190@grok.subscribe(ICourse, grok.IObjectRemovedEvent)
191def removedCourseHandler(course, event):
192    """If a course is deleted, we make sure that also references in a
193       certificatecontainer are removed.
194    """
195    code = course.code
196
197    # Find all certcourses that reference the given course...
198    try:
199        cat = getUtility(ICatalog, name='certcourses_catalog')
200    except ComponentLookupError:
201        # catalog not available. This might happen during tests.
202        return
203       
204    results = cat.searchResults(course_code=(code, code))
205    for certcourse in results:
206        # Remove that reference...
207        cert = certcourse.__parent__
208        cert.delCourseRef(code)
209        cert._p_changed = True
210    return
Note: See TracBrowser for help on using the repository browser.