source: main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py @ 9220

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

In contrast to the comment of the last revision: We need to store validation_date and validated_by also in Kofa. They have to be set by the workflow transition events. They must not be editable (but importable and exportable).

  • Property svn:keywords set to Id
File size: 5.2 KB
Line 
1## $Id: studylevel.py 9161 2012-09-06 07:43:51Z 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##
18"""
19Container which holds the data of a student study level
20and contains the course tickets.
21"""
22import grok
23from zope.component.interfaces import IFactory
24from zope.interface import implementedBy
25from waeup.kofa.students.interfaces import (
26    IStudentStudyLevel, IStudentNavigation, ICourseTicket)
27from waeup.kofa.utils.helpers import attrs_to_fields
28from waeup.kofa.students.vocabularies import StudyLevelSource
29
30class StudentStudyLevel(grok.Container):
31    """This is a container for course tickets.
32    """
33    grok.implements(IStudentStudyLevel, IStudentNavigation)
34    grok.provides(IStudentStudyLevel)
35
36    def __init__(self):
37        super(StudentStudyLevel, self).__init__()
38        self.level = None
39        return
40
41    @property
42    def student(self):
43        try:
44            return self.__parent__.__parent__
45        except AttributeError:
46            return None
47
48    def writeLogMessage(self, view, message):
49        return self.__parent__.__parent__.writeLogMessage(view, message)
50
51    @property
52    def level_title(self):
53        studylevelsource = StudyLevelSource()
54        return studylevelsource.factory.getTitle(self.__parent__, self.level)
55
56    def addCourseTicket(self, ticket, course):
57        """Add a course ticket object.
58        """
59        if not ICourseTicket.providedBy(ticket):
60            raise TypeError(
61                'StudentStudyLeves contain only ICourseTicket instances')
62        ticket.code = course.code
63        ticket.title = course.title
64        ticket.fcode = course.__parent__.__parent__.__parent__.code
65        ticket.dcode = course.__parent__.__parent__.code
66        ticket.credits = course.credits
67        ticket.passmark = course.passmark
68        ticket.semester = course.semester
69        self[ticket.code] = ticket
70        return
71
72StudentStudyLevel = attrs_to_fields(StudentStudyLevel)
73
74class StudentStudyLevelFactory(grok.GlobalUtility):
75    """A factory for student study levels.
76    """
77    grok.implements(IFactory)
78    grok.name(u'waeup.StudentStudyLevel')
79    title = u"Create a new student study level.",
80    description = u"This factory instantiates new student study level instances."
81
82    def __call__(self, *args, **kw):
83        return StudentStudyLevel()
84
85    def getInterfaces(self):
86        return implementedBy(StudentStudyLevel)
87
88class CourseTicket(grok.Model):
89    """This is a course ticket which allows the
90    student to attend the course. Lecturers will enter scores and more at
91    the end of the term.
92
93    A course ticket contains a copy of the original course and
94    certificate course data. If the courses and/or the referrin certificate
95    courses are removed, the corresponding tickets remain unchanged.
96    So we do not need any event
97    triggered actions on course tickets.
98    """
99    grok.implements(ICourseTicket, IStudentNavigation)
100    grok.provides(ICourseTicket)
101
102    def __init__(self):
103        super(CourseTicket, self).__init__()
104        self.code = None
105        self.title = None
106        self.fcode = None
107        self.dcode = None
108        self.credits = None
109        self.passmark = None
110        self.semester = None
111        return
112
113    @property
114    def student(self):
115        """Get the associated student object.
116        """
117        try:
118            return self.__parent__.__parent__.__parent__
119        except AttributeError:
120            return None
121
122    def writeLogMessage(self, view, message):
123        return self.__parent__.__parent__.__parent__.writeLogMessage(view, message)
124
125    def getLevel(self):
126        """Returns the id of the level the ticket has been added to.
127        """
128        # XXX: shouldn't that be an attribute?
129        try:
130            return self.__parent__.level
131        except AttributeError:
132            return None
133
134    def getLevelSession(self):
135        """Returns the session of the level the ticket has been added to.
136        """
137        # XXX: shouldn't that be an attribute?
138        try:
139            return self.__parent__.level_session
140        except AttributeError:
141            return None
142
143
144CourseTicket = attrs_to_fields(CourseTicket)
145
146class CourseTicketFactory(grok.GlobalUtility):
147    """A factory for student study levels.
148    """
149    grok.implements(IFactory)
150    grok.name(u'waeup.CourseTicket')
151    title = u"Create a new course ticket.",
152    description = u"This factory instantiates new course ticket instances."
153
154    def __call__(self, *args, **kw):
155        return CourseTicket()
156
157    def getInterfaces(self):
158        return implementedBy(CourseTicket)
Note: See TracBrowser for help on using the repository browser.