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

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

Add manage viewlet/form for certificates.

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