annotate roundup/xmlrpc.py @ 8566:e4191aa7b402 default tip

doc: issue2551415 correct doc for change input->input_payload in 2.5 the rest interface changed a variable name from input to input_payload. An earlier commit changed the rest docs. This commit adds an item for it to the upgrading 2.4.0->2.5.0 section. Also cross reference added to the rest docs with the updated examples.
author John Rouillard <rouilj@ieee.org>
date Thu, 09 Apr 2026 00:19:06 -0400
parents f7bd22bdef9d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
1 #
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
2 # Copyright (C) 2007 Stefan Seefeld
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
3 # All rights reserved.
3839
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
4 # For license terms see the file COPYING.txt.
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
5 #
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
6
5326
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
7 import logging
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
8 from roundup import hyperdb
5072
1c792cf0a574 Remove 'import *' statement from xmlrpc.py
John Kristensen <john@jerrykan.com>
parents: 5012
diff changeset
9 from roundup.exceptions import Unauthorised, UsageError
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
10 from roundup.date import Date, Range, Interval
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
11 from roundup import actions
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
12 from roundup.anypy.strings import us2s
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
13 from traceback import format_exc
5408
e46ce04d5bbc Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
14 from roundup.anypy import xmlrpc_
e46ce04d5bbc Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
15 SimpleXMLRPCDispatcher = xmlrpc_.server.SimpleXMLRPCDispatcher
e46ce04d5bbc Python 3 preparation: update xmlrpclib / SimpleXMLRPCServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5395
diff changeset
16 Binary = xmlrpc_.client.Binary
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
17
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
18
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
19 def translate(value):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
20 """Translate value to becomes valid for XMLRPC transmission."""
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
21
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
22 if isinstance(value, (Date, Range, Interval)):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
23 return repr(value)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
24 elif type(value) is list:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
25 return [translate(v) for v in value]
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
26 elif type(value) is tuple:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
27 return tuple([translate(v) for v in value])
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
28 elif type(value) is dict:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
29 return dict([[translate(k), translate(value[k])] for k in value])
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
30 else:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
31 return value
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
32
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
33
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
34 def props_from_args(db, cl, args, itemid=None):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
35 """Construct a list of properties from the given arguments,
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
36 and return them after validation."""
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
37
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
38 props = {}
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
39 for arg in args:
4371
40d7414592ac - fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4369
diff changeset
40 if isinstance(arg, Binary):
40d7414592ac - fix coding style from yesterday
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4369
diff changeset
41 arg = arg.data
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
42 try:
4369
2188c9de5bdd xmlrpc handling of unicode characters, see
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4311
diff changeset
43 key, value = arg.split('=', 1)
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
44 except ValueError:
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
45 raise UsageError('argument "%s" not propname=value' % arg)
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5408
diff changeset
46 key = us2s(key)
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5408
diff changeset
47 value = us2s(value)
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
48 if value:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
49 try:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
50 props[key] = hyperdb.rawToHyperdb(db, cl, itemid,
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
51 key, value)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5072
diff changeset
52 except hyperdb.HyperdbValueError as message:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5326
diff changeset
53 raise UsageError(message)
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
54 else:
5326
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
55 # If we're syncing a file the contents may not be None
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
56 if key == 'content':
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
57 props[key] = ''
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
58 else:
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
59 props[key] = None
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
60
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
61 return props
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
62
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
63
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
64 class RoundupInstance:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
65 """The RoundupInstance provides the interface accessible through
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
66 the Python XMLRPC mapping."""
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
67
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
68 def __init__(self, db, actions, translator):
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
69
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
70 self.db = db
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
71 self.actions = actions
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
72 self.translator = translator
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
73
4140
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
74 def schema(self):
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
75 s = {}
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
76 for c in self.db.classes:
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
77 cls = self.db.classes[c]
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
78 props = [(n, repr(v)) for n, v in sorted(cls.properties.items())]
4140
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
79 s[c] = props
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
80 return s
3c4545f55949 Allow XMLRPC clients to fetch tracker schema.
Stefan Seefeld <stefan@seefeld.name>
parents: 4124
diff changeset
81
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
82 def list(self, classname, propname=None):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
83 cl = self.db.getclass(classname)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
84 if not propname:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
85 propname = cl.labelprop()
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
86 result = [cl.get(itemid, propname)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
87 for itemid in cl.list()
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
88 if self.db.security.hasPermission('View', self.db.getuid(),
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
89 classname, propname,
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
90 itemid)
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
91 ]
3839
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
92 return result
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
93
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
94 def filter(self, classname, search_matches, filterspec,
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
95 sort=[], group=[]):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
96 cl = self.db.getclass(classname)
8126
f7bd22bdef9d Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6015
diff changeset
97 return cl.filter_with_permissions(
f7bd22bdef9d Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6015
diff changeset
98 search_matches, filterspec, sort=sort, group=group
f7bd22bdef9d Move permission check code to hyperdb
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6015
diff changeset
99 )
3985
f7f3068b32a1 Add filter() to XML-RPC interface [SF#966456]
Richard Jones <richard@users.sourceforge.net>
parents: 3973
diff changeset
100
4449
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
101 def lookup(self, classname, key):
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
102 cl = self.db.getclass(classname)
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
103 uid = self.db.getuid()
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
104 prop = cl.getkey()
4670
c9b85ca1f985 Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4449
diff changeset
105 search = self.db.security.hasSearchPermission
c9b85ca1f985 Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4449
diff changeset
106 access = self.db.security.hasPermission
c9b85ca1f985 Fix xmlrpc permissions for lookup method.
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4449
diff changeset
107 if (not search(uid, classname, prop)
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
108 and not access('View', uid, classname, prop)):
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
109 raise Unauthorised('Permission to lookup %s denied' % classname)
4449
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
110 return cl.lookup(key)
3f251efd5f48 Add "lookup" method to xmlrpc interface (Ralf Schlatterbeck)
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4437
diff changeset
111
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
112 def display(self, designator, *properties):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
113 classname, itemid = hyperdb.splitDesignator(designator)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
114 cl = self.db.getclass(classname)
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
115 props = properties and list(properties) or list(cl.properties.keys())
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
116 props.sort()
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
117 for p in props:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
118 if not self.db.security.hasPermission('View', self.db.getuid(),
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
119 classname, p, itemid):
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
120 raise Unauthorised('Permission to view %s of %s denied' %
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
121 (p, designator))
3973
85cbaa50eba1 xml-rpc security checks and tests across all backends [SF#1907211]
Richard Jones <richard@users.sourceforge.net>
parents: 3937
diff changeset
122 result = [(prop, cl.get(itemid, prop)) for prop in props]
3839
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
123 return dict(result)
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
124
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
125 def create(self, classname, *args):
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
126 if not self.db.security.hasPermission('Create', self.db.getuid(),
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
127 classname):
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
128 raise Unauthorised('Permission to create %s denied' % classname)
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
129
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
130 cl = self.db.getclass(classname)
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
131
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
132 # convert types
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
133 props = props_from_args(self.db, cl, args)
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
134
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
135 # check for the key property
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
136 key = cl.getkey()
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
137 if key and key not in props:
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
138 raise UsageError('you must provide the "%s" property.' % key)
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
139
4124
0ad79301f055 Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents: 4083
diff changeset
140 for key in props:
4311
7291130fad82 - fix create permission for xmlrpc, too
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4256
diff changeset
141 if not self.db.security.hasPermission('Create', self.db.getuid(),
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
142 classname, property=key):
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
143 raise Unauthorised('Permission to create %s.%s denied' %
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
144 (classname, key))
4124
0ad79301f055 Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents: 4083
diff changeset
145
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
146 # do the actual create
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
147 try:
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
148 result = cl.create(**props)
4224
3f6cadb98c2f Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents: 4140
diff changeset
149 self.db.commit()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5072
diff changeset
150 except (TypeError, IndexError, ValueError) as message:
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
151 # The exception we get may be a real error, log the traceback
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
152 # if we're debugging
5326
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
153 logger = logging.getLogger('roundup.xmlrpc')
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
154 for l in format_exc().split('\n'):
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
155 logger.debug(l)
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
156 raise UsageError(message)
3839
Stefan Seefeld <stefan@seefeld.name>
parents: 3828
diff changeset
157 return result
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
158
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
159 def set(self, designator, *args):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
160
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
161 classname, itemid = hyperdb.splitDesignator(designator)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
162 cl = self.db.getclass(classname)
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
163 props = props_from_args(self.db, cl, args, itemid) # convert types
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
164 for p in props.keys():
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
165 if not self.db.security.hasPermission('Edit', self.db.getuid(),
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
166 classname, p, itemid):
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
167 raise Unauthorised('Permission to edit %s of %s denied' %
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
168 (p, designator))
3828
ba6ba8d6bcc1 Initial checkin for new xmlrpc frontend.
Stefan Seefeld <stefan@seefeld.name>
parents:
diff changeset
169 try:
4224
3f6cadb98c2f Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents: 4140
diff changeset
170 result = cl.set(itemid, **props)
3f6cadb98c2f Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents: 4140
diff changeset
171 self.db.commit()
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5072
diff changeset
172 except (TypeError, IndexError, ValueError) as message:
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
173 # The exception we get may be a real error, log the
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
174 # traceback if we're debugging
5326
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
175 logger = logging.getLogger('roundup.xmlrpc')
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
176 for l in format_exc().split('\n'):
db8659c4e8eb xmlrpc: logging; content property
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5248
diff changeset
177 logger.debug(l)
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
178 raise UsageError(message)
4224
3f6cadb98c2f Move db.commit() call from handle_xmlrpc() to individual methods...
Stefan Seefeld <stefan@seefeld.name>
parents: 4140
diff changeset
179 return result
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
180
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
181 builtin_actions = dict(retire=actions.Retire, restore=actions.Restore)
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
182
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
183 def action(self, name, *args):
4124
0ad79301f055 Restrict user creation rights in XMLRPC frontend.
Stefan Seefeld <stefan@seefeld.name>
parents: 4083
diff changeset
184 """Execute a named action."""
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
185
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
186 if name in self.actions:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
187 action_type = self.actions[name]
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
188 elif name in self.builtin_actions:
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
189 action_type = self.builtin_actions[name]
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
190 else:
5604
ed02a1e0aa5d Fix actions
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5504
diff changeset
191 raise Exception('action "%s" is not supported %s'
6015
af1067e0f6d9 flake8 changes; move imports before first statements; whitespace
John Rouillard <rouilj@ieee.org>
parents: 5604
diff changeset
192 % (name, ','.join(self.actions.keys())))
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
193 action = action_type(self.db, self.translator)
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
194 return action.execute(*args)
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
195
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
196
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
197 class RoundupDispatcher(SimpleXMLRPCDispatcher):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
198 """RoundupDispatcher bridges from cgi.client to RoundupInstance.
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
199 It expects user authentication to be done."""
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
200
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
201 def __init__(self, db, actions, translator,
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
202 allow_none=False, encoding=None):
5012
6b7f257e5de8 Simplify SimpleXMLRPCDispatcher initialisation
John Kristensen <john@jerrykan.com>
parents: 4793
diff changeset
203 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
4083
bbab97f8ffb2 XMLRPC improvements:
Stefan Seefeld <stefan@seefeld.name>
parents: 4079
diff changeset
204 self.register_instance(RoundupInstance(db, actions, translator))
4793
d9e5539303bd Implement XMLRPC MultiCall (including test), see
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4670
diff changeset
205 self.register_multicall_functions()
4079
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
206
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
207 def dispatch(self, input):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
208 return self._marshaled_dispatch(input)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
209
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
210 def _dispatch(self, method, params):
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
211
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
212 retn = SimpleXMLRPCDispatcher._dispatch(self, method, params)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
213 retn = translate(retn)
edf526c91412 * Refactor XMLRPC interface.
Stefan Seefeld <stefan@seefeld.name>
parents: 3985
diff changeset
214 return retn

Roundup Issue Tracker: http://roundup-tracker.org/