annotate roundup/rest.py @ 5558:1bef1076ad12 REST-rebased

Recognize both GET element uri and collection uri committer: Ralf Schlatterbeck <rsc@runtux.com>
author Chau Nguyen <dangchau1991@yahoo.com>
date Tue, 29 Jan 2019 15:27:37 +0100
parents 213a56c91471
children 3d80e7752783
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
1 """
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
2 Restful API for Roundup
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
3
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
4 This module is free software, you may redistribute it
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
5 and/or modify under the same terms as Python.
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
6 """
5556
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
7
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
8 import json
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
9 import pprint
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
10 from roundup import hyperdb
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
11 from roundup.cgi.templating import Unauthorised
5556
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
12
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
13
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
14 class RestfulInstance(object):
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
15 """Dummy Handler for REST
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
16 """
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
17
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
18 def __init__(self, db):
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
19 # TODO: database, translator and instance.actions
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
20 self.db = db
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
21
5558
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
22 def action_get(self, resource_uri, input):
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
23 # TODO: split this into collection URI and resource URI
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
24 class_name = resource_uri
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
25 try:
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
26 class_obj = self.db.getclass(class_name)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
27 """prop_name = class_obj.labelprop()
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
28 result = [class_obj.get(item_id, prop_name)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
29 for item_id in class_obj.list()
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
30 if self.db.security.hasPermission('View', self.db.getuid(),
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
31 class_name, prop_name, item_id)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
32 ]
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
33 result = json.JSONEncoder().encode(result)"""
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
34 result = [{'id': item_id}
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
35 for item_id in class_obj.list()
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
36 if self.db.security.hasPermission('View', self.db.getuid(),
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
37 class_name, None, item_id)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
38 ]
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
39 result = json.JSONEncoder().encode(result)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
40 #result = `len(dict(result))` + ' ' + `len(result)`
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
41 except KeyError:
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
42 pass
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
43
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
44 try:
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
45 class_name, item_id = hyperdb.splitDesignator(resource_uri)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
46 class_obj = self.db.getclass(class_name)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
47 props = class_obj.properties.keys()
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
48 props.sort()
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
49 result = [(prop_name, class_obj.get(item_id, prop_name))
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
50 for prop_name in props
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
51 if self.db.security.hasPermission('View', self.db.getuid(),
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
52 class_name, prop_name, item_id)
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
53 ]
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
54 # Note: is this a bug by having an extra indent in xmlrpc ?
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
55 result = json.JSONEncoder().encode(dict(result))
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
56 except hyperdb.DesignatorError:
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
57 pass
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
58
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
59 # print type(result)
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
60 # print type(dict(result))
5558
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
61 return result
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
62 # return json.dumps(dict(result))
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
63 # return dict(result)
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
64
5556
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
65 def dispatch(self, method, uri, input):
5558
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
66 print "METHOD: " + method + " URI: " + uri
5556
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
67 print type(input)
d75aa88c2a99 Added RestInstance and calling rest from client.py
Chau Nguyen <dangchau1991@yahoo.com>
parents:
diff changeset
68 pprint.pprint(input)
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
69
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
70 # PATH is split to multiple pieces
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
71 # 0 - rest
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
72 # 1 - resource
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
73 #
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
74 # Example: rest/issue - collection uri
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
75 # Example: rest/issue573 - element uri
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
76 uri_path = uri.split("/")
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
77 # TODO: use named function for this instead
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
78 # TODO: check roundup/actions.py
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
79 # TODO: if uri_path has more than 2 child, return 404
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
80 output = "METHOD is not supported"
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
81 if method == "GET":
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
82 output = self.action_get(uri_path[1], input)
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
83 elif method == "POST":
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
84 pass
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
85 elif method == "PUT":
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
86 pass
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
87 elif method == "DELETE":
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
88 pass
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
89 elif method == "PATCH":
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
90 pass
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
91 else:
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
92 pass
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
93
5558
1bef1076ad12 Recognize both GET element uri and collection uri
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5557
diff changeset
94 print "Response Length: " + `len(output)` + " - Response Content (First 50 char): " + output[:50]
5557
213a56c91471 Implement getting resource from database
Chau Nguyen <dangchau1991@yahoo.com>
parents: 5556
diff changeset
95 return output

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