source: main/waeup.kofa/trunk/src/waeup/kofa/students/webservices.py @ 10042

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

Add two more webservice methods.

  • Property svn:keywords set to Id
File size: 5.6 KB
Line 
1## $Id: webservices.py 10042 2013-03-21 16:12:06Z henrik $
2##
3## Copyright (C) 2012 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
19import grok
20import xmlrpclib
21from zope.component import getUtility, queryUtility
22from zope.catalog.interfaces import ICatalog
23from waeup.kofa.interfaces import IUniversity, IExtFileStore
24   
25
26def get_student(students, identifier):
27    if identifier is None:
28        return None
29    student = students.get(identifier, None)
30    if student is None:
31        cat = queryUtility(ICatalog, name='students_catalog')
32        results = list(
33            cat.searchResults(matric_number=(identifier, identifier)))
34        if len(results) == 1:
35            student = results[0]
36        else:
37            results = list(
38                cat.searchResults(reg_number=(identifier, identifier)))
39            if len(results) == 1:
40                student = results[0]
41    return student
42
43#class XMLRPCPermission(grok.Permission):
44#    """Permission for using XMLRPC functions.
45#    """
46#    grok.name('waeup.xmlrpc')
47
48#class XMLRPCUsers2(grok.Role):
49#    """Usergroup 2
50#    """
51#    grok.name('waeup.xmlrpcusers2')
52#    grok.title('XMLRPC Users Group 2')
53#    grok.permissions('waeup.xmlrpc',)
54
55class StudentsXMLRPC(grok.XMLRPC):
56    """Student related XMLRPC webservices.
57
58    Please note, that XMLRPC does not support real keyword arguments
59    but positional arguments only.
60    """
61
62    grok.context(IUniversity)
63
64    @grok.require('waeup.xmlrpc')
65    def get_student_id(self, reg_number=None):
66        """Get the id of a student with registration number `reg_number`.
67
68        Returns the student id as string if successful, ``None`` else.
69        """
70        if reg_number is not None:
71            cat = getUtility(ICatalog, name='students_catalog')
72            result = list(
73                cat.searchResults(reg_number=(reg_number, reg_number),
74                                  _limit=1))
75            if not len(result):
76                return None
77            return result[0].student_id
78        return None
79
80    @grok.require('waeup.xmlrpc')
81    def get_courses_by_session(self, identifier=None, session=None):
82        """What COURSES are registered by student X in session Y?
83
84        """
85        students = self.context['students']
86        student = get_student(students, identifier)
87        if student is None:
88            return None
89        try:
90            session = int(session)
91        except (TypeError, ValueError):
92            pass
93        sessionsearch = True
94        if session in (None, ''):
95            sessionsearch = False
96        studycourse = student['studycourse']
97        coursetickets = {}
98        for level in studycourse.values():
99            if sessionsearch and level.level_session != session:
100                continue
101            for ct in level.values():
102                coursetickets.update(
103                    {"%s|%s" % (level.level, ct.code): ct.title})
104        if not coursetickets:
105            return None
106        return coursetickets
107
108    @grok.require('waeup.xmlrpc')
109    def get_students_by_course(self, course=None, session=None):
110        """What STUDENTS registered (student id / matric no)
111        for course Z in session Y?
112
113        (a) Authorized by course adviser.
114        (b) Not authorized by course adviser.
115        """
116        try:
117            session = int(session)
118        except (TypeError, ValueError):
119            pass
120        sessionsearch = True
121        if session in (None, ''):
122            sessionsearch = False
123        cat = queryUtility(ICatalog, name='coursetickets_catalog')
124        if sessionsearch:
125            coursetickets = cat.searchResults(
126                session=(session, session),
127                code=(course, course))
128        else:
129            coursetickets = cat.searchResults(
130                code=(course, course))
131        if not coursetickets:
132            return None
133        hitlist = []
134        for ticket in coursetickets:
135            hitlist.append((
136                ticket.student.student_id,
137                ticket.student.matric_number,
138                ticket.__parent__.validated_by))
139        return list(set(hitlist))
140
141    @grok.require('waeup.xmlrpc')
142    def get_student_info(self, identifier=None):
143        """Who is the student with matriculation number / student id?
144
145        """
146        students = self.context['students']
147        student = get_student(students, identifier)
148        if student is None:
149            return None
150        return [student.display_fullname, student.certcode,
151            student.phone, student.email]
152
153    @grok.require('waeup.xmlrpc')
154    def get_student_passport(self, identifier=None):
155        """Get passport picture of student with
156        matriculation number / student id?
157
158        """
159        students = self.context['students']
160        student = get_student(students, identifier)
161        if student is None:
162            return None
163        img = getUtility(IExtFileStore).getFileByContext(
164            student, attr='passport.jpg')
165        return xmlrpclib.Binary(img.read())
Note: See TracBrowser for help on using the repository browser.