source: main/waeup.kofa/trunk/src/waeup/kofa/university/course.py @ 9209

Last change on this file since 9209 was 9170, checked in by Henrik Bettermann, 12 years ago

Add former_course attribute. Logic will follow.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
RevLine 
[7195]1## $Id: course.py 9170 2012-09-11 09:13:41Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
[4789]18"""Courses.
19"""
20import grok
[7207]21from zope.catalog.interfaces import ICatalog
[4789]22from zope.interface import implementedBy
[9170]23from zope.schema import getFields
24from zope.intid.interfaces import IIntIds
[7207]25from zope.component import getUtility
26from zope.component.interfaces import IFactory, ComponentLookupError
[9170]27from waeup.kofa.interfaces import IKofaPluggable
[7811]28from waeup.kofa.university.interfaces import ICourse, ICourseAdd
[4789]29
30class Course(grok.Model):
31    """A university course.
32    """
[5953]33    grok.implements(ICourse, ICourseAdd)
[4789]34
[9002]35    local_roles = ['waeup.local.Lecturer']
[8996]36
[4789]37    def __init__(self,
38                 title=u'Unnamed Course',
39                 code=u'NA',
40                 credits=0,
41                 passmark=40,
[9170]42                 semester=1,
43                 former_course=False,
44                 **kw):
[4789]45        super(Course, self).__init__(**kw)
46        self.title = title
47        self.code = code
48        self.credits = credits
49        self.passmark = passmark
50        self.semester = semester
[9170]51        self.former_course = former_course
[6566]52
[6008]53    def longtitle(self):
[6566]54        return "%s (%s)" % (self.title,self.code)
55
[4789]56class CourseFactory(grok.GlobalUtility):
57    """A factory for courses.
58    """
59    grok.implements(IFactory)
60    grok.name(u'waeup.Course')
61    title = u"Create a new course.",
62    description = u"This factory instantiates new course instances."
63
64    def __call__(self, *args, **kw):
65        return Course(*args, **kw)
66
67    def getInterfaces(self):
68        return implementedBy(Course)
[7207]69
70@grok.subscribe(ICourse, grok.IObjectRemovedEvent)
71def handle_course_removed(course, event):
72    """If a course is deleted, we make sure that also referrers in a
[7333]73       certificatescontainer are removed.
[7207]74    """
75    code = course.code
76
77    # Find all certificatecourses that refer to given course...
78    try:
79        cat = getUtility(ICatalog, name='certcourses_catalog')
80    except ComponentLookupError:
81        # catalog not available. This might happen during tests.
82        return
83
84    results = cat.searchResults(course_code=(code, code))
85    for certcourse in results:
86        # Remove that referrer...
87        cert = certcourse.__parent__
[8920]88        cert.delCertCourse(code)
[7207]89        cert._p_changed = True
[7811]90    return
[9170]91
92class CoursesPlugin(grok.GlobalUtility):
93    """A plugin that updates courses.
94    """
95
96    grok.implements(IKofaPluggable)
97    grok.name('courses')
98
99    deprecated_attributes = []
100
101    def setup(self, site, name, logger):
102        return
103
104    def update(self, site, name, logger):
105        cat = getUtility(ICatalog, name='courses_catalog')
106        results = cat.apply({'code':(None,None)})
107        uidutil = getUtility(IIntIds, context=cat)
108        items = getFields(ICourse).items()
109        for r in results:
110            o = uidutil.getObject(r)
111            # Add new attributes
112            for i in items:
113                if not hasattr(o,i[0]):
114                    setattr(o,i[0],i[1].missing_value)
115                    logger.info(
116                        'CoursesPlugin: %s attribute %s added.' % (
117                        o.code,i[0]))
118            # Remove deprecated attributes
119            for i in self.deprecated_attributes:
120                try:
121                    delattr(o,i)
122                    logger.info(
123                        'CoursesPlugin: %s attribute %s deleted.' % (
124                        o.code,i))
125                except AttributeError:
126                    pass
127        return
Note: See TracBrowser for help on using the repository browser.