annotate roundup/cgi/client.py @ 1444:8c5a513e52c9

Form handling now performs all actions in one go. (That is, property setting including linking.) We figure out the linking dependencies and create items in an appropriate order.
author Richard Jones <richard@users.sourceforge.net>
date Tue, 18 Feb 2003 03:58:18 +0000
parents 55d16d2b39cc
children 0bbc8be96592
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1 # $Id: client.py,v 1.92 2003-02-18 03:58:18 richard Exp $
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 __doc__ = """
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 WWW request handler (also used in the stand-alone server).
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 """
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
1008
10ed4791f969 Wrote most of the upgrading documentation (please read!)
Richard Jones <richard@users.sourceforge.net>
parents: 1005
diff changeset
7 import os, os.path, cgi, StringIO, urlparse, re, traceback, mimetypes, urllib
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 import binascii, Cookie, time, random
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 from roundup import roundupdb, date, hyperdb, password
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 from roundup.i18n import _
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
13 from roundup.cgi.templating import Templates, HTMLRequest, NoTemplate
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 from roundup.cgi import cgitb
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
15
1078
344bad728d10 more tweakage of help display and style issues
Richard Jones <richard@users.sourceforge.net>
parents: 1076
diff changeset
16 from roundup.cgi.PageTemplates import PageTemplate
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 class Unauthorised(ValueError):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 pass
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 class NotFound(ValueError):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 pass
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 class Redirect(Exception):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 pass
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 class SendFile(Exception):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 ' Sent a file from the database '
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 class SendStaticFile(Exception):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 ' Send a static file from the instance html directory '
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 def initialiseSecurity(security):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 ''' Create some Permissions and Roles on the security object
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 This function is directly invoked by security.Security.__init__()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 as a part of the Security object instantiation.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 security.addPermission(name="Web Registration",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 description="User may register through the web")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 p = security.addPermission(name="Web Access",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 description="User may access the web interface")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 security.addPermissionToRole('Admin', p)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 # doing Role stuff through the web - make sure Admin can
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 p = security.addPermission(name="Web Roles",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 description="User may manipulate user Roles through the web")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 security.addPermissionToRole('Admin', p)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 class Client:
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
51 ''' Instantiate to handle one CGI request.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
53 See inner_main for request processing.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
55 Client attributes at instantiation:
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
56 "path" is the PATH_INFO inside the instance (with no leading '/')
1004
5f12d3259f31 logout works better now
Richard Jones <richard@users.sourceforge.net>
parents: 1003
diff changeset
57 "base" is the base URL for the instance
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
58 "form" is the cgi form, an instance of FieldStorage from the standard
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
59 cgi module
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
60 "additional_headers" is a dictionary of additional HTTP headers that
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
61 should be sent to the client
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
62 "response_code" is the HTTP response code to send to the client
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
63
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
64 During the processing of a request, the following attributes are used:
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
65 "error_message" holds a list of error messages
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
66 "ok_message" holds a list of OK messages
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
67 "session" is the current user session id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
68 "user" is the current user's name
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
69 "userid" is the current user's id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
70 "template" is the current :template context
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
71 "classname" is the current class context name
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
72 "nodeid" is the current context item id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
73
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
74 User Identification:
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
75 If the user has no login cookie, then they are anonymous and are logged
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
76 in as that user. This typically gives them all Permissions assigned to the
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
77 Anonymous Role.
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
78
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
79 Once a user logs in, they are assigned a session. The Client instance
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
80 keeps the nodeid of the session as the "session" attribute.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
81
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
82
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
83 Special form variables:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
84 Note that in various places throughout this code, special form
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
85 variables of the form :<name> are used. The colon (":") part may
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
86 actually be one of either ":" or "@".
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
89 #
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
90 # special form variables
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
91 #
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
92 FV_TEMPLATE = re.compile(r'[@:]template')
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
93 FV_OK_MESSAGE = re.compile(r'[@:]ok_message')
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
94 FV_ERROR_MESSAGE = re.compile(r'[@:]error_message')
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
95
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
96 # edit form variable handling (see unit tests)
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
97 FV_LABELS = r'''
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
98 ^(
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
99 (?P<note>[@:]note)|
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
100 (?P<file>[@:]file)|
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
101 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
102 ((?P<classname>%s)(?P<id>[-\d]+))? # optional leading designator
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
103 ((?P<required>[@:]required$)| # :required
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
104 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
105 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
106 (?P<add>[@:]add[@:])| # :add:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
107 (?P<remove>[@:]remove[@:])| # :remove:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
108 (?P<confirm>[@:]confirm[@:])| # :confirm:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
109 (?P<link>[@:]link[@:])| # :link:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
110 ([@:]) # just a separator
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
111 )?
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
112 (?P<propname>[^@:]+) # <prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
113 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
114 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
115 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
116 )$'''
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
117
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
118 # Note: index page stuff doesn't appear here:
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
119 # columns, sort, sortdir, filter, group, groupdir, search_text,
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
120 # pagesize, startwith
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
121
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 def __init__(self, instance, request, env, form=None):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 hyperdb.traceMark()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 self.instance = instance
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 self.request = request
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 self.env = env
1004
5f12d3259f31 logout works better now
Richard Jones <richard@users.sourceforge.net>
parents: 1003
diff changeset
127
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
128 # save off the path
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 self.path = env['PATH_INFO']
1004
5f12d3259f31 logout works better now
Richard Jones <richard@users.sourceforge.net>
parents: 1003
diff changeset
130
1398
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
131 # this is the base URL for this tracker
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
132 self.base = self.instance.config.TRACKER_WEB
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133
1398
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
134 # this is the "cookie path" for this tracker (ie. the path part of
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
135 # the "base" url)
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
136 self.cookie_path = urlparse.urlparse(self.base)[2]
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
137 self.cookie_name = 'roundup_session_' + re.sub('[^a-zA-Z]', '',
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
138 self.instance.config.TRACKER_NAME)
1398
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
139
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
140 # see if we need to re-parse the environment for the form (eg Zope)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 if form is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 self.form = cgi.FieldStorage(environ=env)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 self.form = form
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
145
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
146 # turn debugging on/off
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 self.debug = int(env.get("ROUNDUP_DEBUG", 0))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 except ValueError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 # someone gave us a non-int debug level, turn it off
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 self.debug = 0
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
153 # flag to indicate that the HTTP headers have been sent
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
154 self.headers_done = 0
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
155
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
156 # additional headers to send with the request - must be registered
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
157 # before the first write
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
158 self.additional_headers = {}
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
159 self.response_code = 200
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
160
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
161
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 def main(self):
1133
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
163 ''' Wrap the real main in a try/finally so we always close off the db.
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
164 '''
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
165 try:
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
166 self.inner_main()
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
167 finally:
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
168 if hasattr(self, 'db'):
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
169 self.db.close()
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
170
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
171 def inner_main(self):
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
172 ''' Process a request.
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
173
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
174 The most common requests are handled like so:
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
175 1. figure out who we are, defaulting to the "anonymous" user
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
176 see determine_user
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
177 2. figure out what the request is for - the context
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
178 see determine_context
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
179 3. handle any requested action (item edit, search, ...)
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
180 see handle_action
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
181 4. render a template, resulting in HTML output
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
182
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
183 In some situations, exceptions occur:
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
184 - HTTP Redirect (generally raised by an action)
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
185 - SendFile (generally raised by determine_context)
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
186 serve up a FileClass "content" property
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
187 - SendStaticFile (generally raised by determine_context)
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
188 serve up a file from the tracker "html" directory
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
189 - Unauthorised (generally raised by an action)
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
190 the action is cancelled, the request is rendered and an error
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
191 message is displayed indicating that permission was not
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
192 granted for the action to take place
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
193 - NotFound (raised wherever it needs to be)
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
194 percolates up to the CGI interface that called the client
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 self.ok_message = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 self.error_message = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 # make sure we're identified (even anonymously)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 self.determine_user()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 # figure out the context and desired content template
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 self.determine_context()
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
203 # possibly handle a form submit action (may change self.classname
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
204 # and self.template, and may also append error/ok_messages)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 self.handle_action()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 # now render the page
1130
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
207
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
208 # we don't want clients caching our dynamic pages
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
209 self.additional_headers['Cache-Control'] = 'no-cache'
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
210 self.additional_headers['Pragma'] = 'no-cache'
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
211 self.additional_headers['Expires'] = 'Thu, 1 Jan 1970 00:00:00 GMT'
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
212
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
213 # render the content
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
214 self.write(self.renderContext())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 except Redirect, url:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 # let's redirect - if the url isn't None, then we need to do
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 # the headers, otherwise the headers have been set before the
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 # exception was raised
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 if url:
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
220 self.additional_headers['Location'] = url
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
221 self.response_code = 302
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
222 self.write('Redirecting to <a href="%s">%s</a>'%(url, url))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 except SendFile, designator:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 self.serve_file(designator)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 except SendStaticFile, file:
1027
9990a635de03 hrm, wonder how that snuck in
Richard Jones <richard@users.sourceforge.net>
parents: 1018
diff changeset
226 self.serve_static_file(str(file))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 except Unauthorised, message:
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
228 self.classname=None
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
229 self.template=''
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
230 self.error_message.append(message)
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
231 self.write(self.renderContext())
1210
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
232 except NotFound:
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
233 # pass through
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
234 raise
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 except:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 # everything else
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 self.write(cgitb.html())
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238
1372
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
239 def clean_sessions(self):
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
240 '''age sessions, remove when they haven't been used for a week.
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
241 Do it only once an hour'''
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
242 sessions = self.db.sessions
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
243 last_clean = sessions.get('last_clean', 'last_use') or 0
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
244
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
245 week = 60*60*24*7
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
246 hour = 60*60
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
247 now = time.time()
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
248 if now - last_clean > hour:
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
249 # remove age sessions
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
250 for sessid in sessions.list():
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
251 interval = now - sessions.get(sessid, 'last_use')
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
252 if interval > week:
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
253 sessions.destroy(sessid)
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
254 sessions.set('last_clean', last_use=time.time())
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
255
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 def determine_user(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 ''' Determine who the user is
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 # determine the uid to use
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 self.opendb('admin')
1372
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
261 # clean age sessions
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
262 self.clean_sessions()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 # make sure we have the session Class
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 sessions = self.db.sessions
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 # look up the user session cookie
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 cookie = Cookie.Cookie(self.env.get('HTTP_COOKIE', ''))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269
1018
b0527d9c8e11 call the cookie something else since it changed
Richard Jones <richard@users.sourceforge.net>
parents: 1016
diff changeset
270 # bump the "revision" of the cookie since the format changed
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
271 if (cookie.has_key(self.cookie_name) and
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
272 cookie[self.cookie_name].value != 'deleted'):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 # get the session key from the cookie
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
275 self.session = cookie[self.cookie_name].value
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 # get the user from the session
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 # update the lifetime datestamp
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 sessions.set(self.session, last_use=time.time())
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 sessions.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 user = sessions.get(self.session, 'user')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 except KeyError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 # sanity check on the user still being valid, getting the userid
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 # at the same time
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 self.userid = self.db.user.lookup(user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 except (KeyError, TypeError):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 # make sure the anonymous user is valid if we're using it
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 if user == 'anonymous':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 self.user = user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
298 # reopen the database as the correct user
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
299 self.opendb(self.user)
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
300
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301 def determine_context(self, dre=re.compile(r'([^\d]+)(\d+)')):
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
302 ''' Determine the context of this page from the URL:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
304 The URL path after the instance identifier is examined. The path
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
305 is generally only one entry long.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
307 - if there is no path, then we are in the "home" context.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
308 * if the path is "_file", then the additional path entry
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
309 specifies the filename of a static file we're to serve up
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
310 from the instance "html" directory. Raises a SendStaticFile
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
311 exception.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
312 - if there is something in the path (eg "issue"), it identifies
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
313 the tracker class we're to display.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
314 - if the path is an item designator (eg "issue123"), then we're
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
315 to display a specific item.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
316 * if the path starts with an item designator and is longer than
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
317 one entry, then we're assumed to be handling an item of a
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
318 FileClass, and the extra path information gives the filename
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
319 that the client is going to label the download with (ie
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
320 "file123/image.png" is nicer to download than "file123"). This
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
321 raises a SendFile exception.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
323 Both of the "*" types of contexts stop before we bother to
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
324 determine the template we're going to use. That's because they
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
325 don't actually use templates.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 The template used is specified by the :template CGI variable,
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 which defaults to:
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
329
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 only classname suplied: "index"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 full item designator supplied: "item"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 We set:
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
334 self.classname - the class to display, can be None
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
335 self.template - the template to render the current context with
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
336 self.nodeid - the nodeid of the class we're displaying
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 # default the optional variables
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 self.classname = None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 self.nodeid = None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
342 # see if a template or messages are specified
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
343 template_override = ok_message = error_message = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
344 for key in self.form.keys():
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
345 if self.FV_TEMPLATE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
346 template_override = self.form[key].value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
347 elif self.FV_OK_MESSAGE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
348 ok_message = self.form[key].value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
349 elif self.FV_ERROR_MESSAGE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
350 error_message = self.form[key].value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
351
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 # determine the classname and possibly nodeid
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
353 path = self.path.split('/')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 if not path or path[0] in ('', 'home', 'index'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
355 if template_override is not None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
356 self.template = template_override
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 else:
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
358 self.template = ''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 elif path[0] == '_file':
1427
37e712e77a99 trackers' templates directory can contain subdirectories with static files
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1426
diff changeset
361 raise SendStaticFile, os.path.join(*path[1:])
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 self.classname = path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 if len(path) > 1:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 # send the file identified by the designator in path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 raise SendFile, path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
368 # see if we got a designator
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369 m = dre.match(self.classname)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
370 if m:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
371 self.classname = m.group(1)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372 self.nodeid = m.group(2)
1153
0455eccad866 raise not found earlier, where it makes more sense to the user
Richard Jones <richard@users.sourceforge.net>
parents: 1152
diff changeset
373 if not self.db.getclass(self.classname).hasnode(self.nodeid):
0455eccad866 raise not found earlier, where it makes more sense to the user
Richard Jones <richard@users.sourceforge.net>
parents: 1152
diff changeset
374 raise NotFound, '%s/%s'%(self.classname, self.nodeid)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
375 # with a designator, we default to item view
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
376 self.template = 'item'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
378 # with only a class, we default to index view
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
379 self.template = 'index'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380
1288
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
381 # make sure the classname is valid
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
382 try:
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
383 self.db.getclass(self.classname)
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
384 except KeyError:
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
385 raise NotFound, self.classname
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
386
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
387 # see if we have a template override
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
388 if template_override is not None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
389 self.template = template_override
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391 # see if we were passed in a message
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
392 if ok_message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
393 self.ok_message.append(ok_message)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
394 if error_message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
395 self.error_message.append(error_message)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
397 def serve_file(self, designator, dre=re.compile(r'([^\d]+)(\d+)')):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 ''' Serve the file from the content property of the designated item.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
399 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400 m = dre.match(str(designator))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 if not m:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 raise NotFound, str(designator)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 classname, nodeid = m.group(1), m.group(2)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404 if classname != 'file':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 raise NotFound, designator
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407 # we just want to serve up the file named
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 file = self.db.file
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
409 self.additional_headers['Content-Type'] = file.get(nodeid, 'type')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
410 self.write(file.get(nodeid, 'content'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
411
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 def serve_static_file(self, file):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413 # we just want to serve up the file named
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414 mt = mimetypes.guess_type(str(file))[0]
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
415 self.additional_headers['Content-Type'] = mt
1085
04a6b3bfbf23 instance_config -> config, and other related cleanups
Richard Jones <richard@users.sourceforge.net>
parents: 1084
diff changeset
416 self.write(open(os.path.join(self.instance.config.TEMPLATES,
04a6b3bfbf23 instance_config -> config, and other related cleanups
Richard Jones <richard@users.sourceforge.net>
parents: 1084
diff changeset
417 file)).read())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
418
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
419 def renderContext(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
420 ''' Return a PageTemplate for the named page
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
421 '''
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
422 name = self.classname
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
423 extension = self.template
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
424 pt = Templates(self.instance.config.TEMPLATES).get(name, extension)
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
425
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
426 # catch errors so we can handle PT rendering errors more nicely
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
427 args = {
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
428 'ok_message': self.ok_message,
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
429 'error_message': self.error_message
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
430 }
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
431 try:
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
432 # let the template render figure stuff out
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
433 return pt.render(self, None, None, **args)
1068
665730c27d29 nicer template absence error
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
434 except NoTemplate, message:
665730c27d29 nicer template absence error
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
435 return '<strong>%s</strong>'%message
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 except:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 # everything else
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 1064
diff changeset
438 return cgitb.pt_html()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
440 # these are the actions that are available
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
441 actions = (
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
442 ('edit', 'editItemAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
443 ('editCSV', 'editCSVAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
444 ('new', 'newItemAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
445 ('register', 'registerAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
446 ('login', 'loginAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
447 ('logout', 'logout_action'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
448 ('search', 'searchAction'),
1277
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
449 ('retire', 'retireAction'),
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
450 ('show', 'showAction'),
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
451 )
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
452 def handle_action(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
453 ''' Determine whether there should be an _action called.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
454
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 The action is defined by the form variable :action which
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
456 identifies the method on this object to call. The four basic
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
457 actions are defined in the "actions" sequence on this class:
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
458 "edit" -> self.editItemAction
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
459 "new" -> self.newItemAction
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
460 "register" -> self.registerAction
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
461 "login" -> self.loginAction
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
462 "logout" -> self.logout_action
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
463 "search" -> self.searchAction
1277
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
464 "retire" -> self.retireAction
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
465 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466 if not self.form.has_key(':action'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467 return None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469 # get the action, validate it
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
470 action = self.form[':action'].value
1152
4cc99267bd23 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1151
diff changeset
471 for name, method in self.actions:
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
472 if name == action:
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
473 break
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
474 else:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
475 raise ValueError, 'No such action "%s"'%action
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
476
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
477 # call the mapped action
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
478 getattr(self, method)()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
479 except Redirect:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
480 raise
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
481 except Unauthorised:
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
482 raise
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
483 except:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
484 self.db.rollback()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
485 s = StringIO.StringIO()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
486 traceback.print_exc(None, s)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
487 self.error_message.append('<pre>%s</pre>'%cgi.escape(s.getvalue()))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 def write(self, content):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
490 if not self.headers_done:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
491 self.header()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
492 self.request.wfile.write(content)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
493
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
494 def header(self, headers=None, response=None):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
495 '''Put up the appropriate header.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
497 if headers is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498 headers = {'Content-Type':'text/html'}
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
499 if response is None:
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
500 response = self.response_code
1130
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
501
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
502 # update with additional info
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
503 headers.update(self.additional_headers)
1130
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
504
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
505 if not headers.has_key('Content-Type'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
506 headers['Content-Type'] = 'text/html'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
507 self.request.send_response(response)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
508 for entry in headers.items():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
509 self.request.send_header(*entry)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
510 self.request.end_headers()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
511 self.headers_done = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
512 if self.debug:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
513 self.headers_sent = headers
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
514
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
515 def set_cookie(self, user):
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
516 ''' Set up a session cookie for the user and store away the user's
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
517 login info against the session.
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
518 '''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
519 # TODO generate a much, much stronger session key ;)
1076
72d622b9bffd *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1073
diff changeset
520 self.session = binascii.b2a_base64(repr(random.random())).strip()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
521
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
522 # clean up the base64
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
523 if self.session[-1] == '=':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
524 if self.session[-2] == '=':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
525 self.session = self.session[:-2]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
526 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
527 self.session = self.session[:-1]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
528
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
529 # insert the session in the sessiondb
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
530 self.db.sessions.set(self.session, user=user, last_use=time.time())
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
531
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
532 # and commit immediately
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
533 self.db.sessions.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
534
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
535 # expire us in a long, long time
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
536 expire = Cookie._getdate(86400*365)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
537
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
538 # generate the cookie path - make sure it has a trailing '/'
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
539 self.additional_headers['Set-Cookie'] = \
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
540 '%s=%s; expires=%s; Path=%s;'%(self.cookie_name, self.session,
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
541 expire, self.cookie_path)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
542
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
543 def make_user_anonymous(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
544 ''' Make us anonymous
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
545
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
546 This method used to handle non-existence of the 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
547 user, but that user is mandatory now.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
548 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
549 self.userid = self.db.user.lookup('anonymous')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
550 self.user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
551
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
552 def opendb(self, user):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
553 ''' Open the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
554 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
555 # open the db if the user has changed
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
556 if not hasattr(self, 'db') or user != self.db.journaltag:
1167
75e5f2055ca9 missed a db close
Richard Jones <richard@users.sourceforge.net>
parents: 1161
diff changeset
557 if hasattr(self, 'db'):
75e5f2055ca9 missed a db close
Richard Jones <richard@users.sourceforge.net>
parents: 1161
diff changeset
558 self.db.close()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 self.db = self.instance.open(user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
561 #
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
562 # Actions
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 #
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
564 def loginAction(self):
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
565 ''' Attempt to log a user in.
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
566
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
567 Sets up a session for the user which contains the login
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
568 credentials.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
569 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
570 # we need the username at a minimum
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571 if not self.form.has_key('__login_name'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572 self.error_message.append(_('Username required'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
575 # get the login info
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
576 self.user = self.form['__login_name'].value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
577 if self.form.has_key('__login_password'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
578 password = self.form['__login_password'].value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
580 password = ''
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
581
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
582 # make sure the user exists
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
583 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
584 self.userid = self.db.user.lookup(self.user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
585 except KeyError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586 name = self.user
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
587 self.error_message.append(_('No such user "%(name)s"')%locals())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
589 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
591 # verify the password
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
592 if not self.verifyPassword(self.userid, password):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 self.error_message.append(_('Incorrect password'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
596
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
597 # make sure we're allowed to be here
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
598 if not self.loginPermission():
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
599 self.make_user_anonymous()
1252
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
600 self.error_message.append(_("You do not have permission to login"))
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
601 return
1058
a55ef5a98fd3 more docco... and we need to check for web access Permission!
Richard Jones <richard@users.sourceforge.net>
parents: 1056
diff changeset
602
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
603 # now we're OK, re-open the database for real, using the user
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
604 self.opendb(self.user)
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
605
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 # set the session cookie
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
607 self.set_cookie(self.user)
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
608
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
609 def verifyPassword(self, userid, password):
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
610 ''' Verify the password that the user has supplied
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
611 '''
1252
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
612 stored = self.db.user.get(self.userid, 'password')
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
613 if password == stored:
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
614 return 1
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
615 if not password and not stored:
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
616 return 1
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
617 return 0
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
618
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
619 def loginPermission(self):
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
620 ''' Determine whether the user has permission to log in.
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
621
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
622 Base behaviour is to check the user has "Web Access".
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
623 '''
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
624 if not self.db.security.hasPermission('Web Access', self.userid):
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
625 return 0
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
626 return 1
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
627
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
628 def logout_action(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
629 ''' Make us really anonymous - nuke the cookie too
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
630 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
631 # log us out
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
632 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634 # construct the logout cookie
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
635 now = Cookie._getdate()
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
636 self.additional_headers['Set-Cookie'] = \
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
637 '%s=deleted; Max-Age=0; expires=%s; Path=%s;'%(self.cookie_name,
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
638 now, self.cookie_path)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
639
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
640 # Let the user know what's going on
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
641 self.ok_message.append(_('You are logged out'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
642
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
643 def registerAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 '''Attempt to create a new user based on the contents of the form
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
645 and then set the cookie.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
646
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
647 return 1 on successful login
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
648 '''
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
649 # create the new user
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
650 cl = self.db.user
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
651
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
652 # parse the props from the form
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
653 try:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
654 props = self.parsePropsFromForm()
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
655 except (ValueError, KeyError), message:
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
656 self.error_message.append(_('Error: ') + str(message))
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
657 return
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
658
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
659 # make sure we're allowed to register
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
660 if not self.registerPermission(props):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
661 raise Unauthorised, _("You do not have permission to register")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
662
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663 # re-open the database as "admin"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 if self.user != 'admin':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
665 self.opendb('admin')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
667 # create the new user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
668 cl = self.db.user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
669 try:
1085
04a6b3bfbf23 instance_config -> config, and other related cleanups
Richard Jones <richard@users.sourceforge.net>
parents: 1084
diff changeset
670 props['roles'] = self.instance.config.NEW_WEB_USER_ROLES
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
671 self.userid = cl.create(**props['user'])
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
672 self.db.commit()
1211
2658b694c3ab [SF#613291] typos in nosy list
Richard Jones <richard@users.sourceforge.net>
parents: 1210
diff changeset
673 except (ValueError, KeyError), message:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 self.error_message.append(message)
1144
db13f46cb5f9 password edit now has a confirmation field
Richard Jones <richard@users.sourceforge.net>
parents: 1133
diff changeset
675 return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
677 # log the new user in
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
678 self.user = cl.get(self.userid, 'username')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
679 # re-open the database for real, using the user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
680 self.opendb(self.user)
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
681
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
682 # if we have a session, update it
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
683 if hasattr(self, 'session'):
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
684 self.db.sessions.set(self.session, user=self.user,
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
685 last_use=time.time())
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
686 else:
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
687 # new session cookie
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
688 self.set_cookie(self.user)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
689
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
690 # nice message
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
691 message = _('You are now registered, welcome!')
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
692
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
693 # redirect to the item's edit page
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
694 raise Redirect, '%s%s%s?+ok_message=%s'%(
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
695 self.base, self.classname, self.userid, urllib.quote(message))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
696
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
697 def registerPermission(self, props):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
698 ''' Determine whether the user has permission to register
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
699
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
700 Base behaviour is to check the user has "Web Registration".
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
701 '''
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
702 # registration isn't allowed to supply roles
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
703 if props.has_key('roles'):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
704 return 0
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
705 if self.db.security.hasPermission('Web Registration', self.userid):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
706 return 1
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
707 return 0
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
708
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
709 def editItemAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 ''' Perform an edit of an item in the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
711
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
712 See parsePropsFromForm and _editnodes for special variables
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 '''
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
714 # parse the props from the form
1437
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
715 if 1:
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
716 # try:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
717 props, links = self.parsePropsFromForm()
1437
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
718 # except (ValueError, KeyError), message:
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
719 # self.error_message.append(_('Error: ') + str(message))
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
720 # return
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
721
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
722 # handle the props
1437
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
723 if 1:
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
724 # try:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
725 message = self._editnodes(props, links)
1437
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
726 # except (ValueError, KeyError, IndexError), message:
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
727 # self.error_message.append(_('Error: ') + str(message))
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
728 # return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
730 # commit now that all the tricky stuff is done
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
731 self.db.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
732
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
733 # redirect to the item's edit page
1437
077235194ac2 oops, missed a +
Richard Jones <richard@users.sourceforge.net>
parents: 1436
diff changeset
734 raise Redirect, '%s%s%s?@ok_message=%s'%(self.base, self.classname,
1002
1798d2fa9fec Hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 985
diff changeset
735 self.nodeid, urllib.quote(message))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
736
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
737 def editItemPermission(self, props):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
738 ''' Determine whether the user has permission to edit this item.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
739
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
740 Base behaviour is to check the user can edit this class. If we're
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
741 editing the "user" class, users are allowed to edit their own
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
742 details. Unless it's the "roles" property, which requires the
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
743 special Permission "Web Roles".
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
744 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
745 # if this is a user node and the user is editing their own node, then
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
746 # we're OK
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
747 has = self.db.security.hasPermission
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
748 if self.classname == 'user':
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
749 # reject if someone's trying to edit "roles" and doesn't have the
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
750 # right permission.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
751 if props.has_key('roles') and not has('Web Roles', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
752 'user'):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
753 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
754 # if the item being edited is the current user, we're ok
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
755 if self.nodeid == self.userid:
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
756 return 1
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
757 if self.db.security.hasPermission('Edit', self.userid, self.classname):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
758 return 1
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
759 return 0
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
760
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
761 def newItemAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
762 ''' Add a new item to the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
763
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
764 This follows the same form as the editItemAction, with the same
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
765 special form values.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
766 '''
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
767 # parse the props from the form
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
768 # XXX reinstate exception handling
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
769 # try:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
770 if 1:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
771 props, links = self.parsePropsFromForm()
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
772 # except (ValueError, KeyError), message:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
773 # self.error_message.append(_('Error: ') + str(message))
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
774 # return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
775
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
776 # handle the props - edit or create
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
777 # XXX reinstate exception handling
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
778 # try:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
779 if 1:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
780 # create the context here
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
781 # cn = self.classname
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
782 # nid = self._createnode(cn, props[(cn, None)])
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
783 # del props[(cn, None)]
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
784
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
785 # when it hits the None element, it'll set self.nodeid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
786 messages = self._editnodes(props, links) #, {(cn, None): nid})
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
787
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
788 # except (ValueError, KeyError, IndexError), message:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
789 # # these errors might just be indicative of user dumbness
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
790 # self.error_message.append(_('Error: ') + str(message))
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
791 # return
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
792
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
793 # commit now that all the tricky stuff is done
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
794 self.db.commit()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
795
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
796 # redirect to the new item's page
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
797 raise Redirect, '%s%s%s?@ok_message=%s'%(self.base, self.classname,
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
798 self.nodeid, urllib.quote(messages))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
799
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
800 def newItemPermission(self, props):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
801 ''' Determine whether the user has permission to create (edit) this
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
802 item.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
803
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
804 Base behaviour is to check the user can edit this class. No
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
805 additional property checks are made. Additionally, new user items
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
806 may be created if the user has the "Web Registration" Permission.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
807 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
808 has = self.db.security.hasPermission
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
809 if self.classname == 'user' and has('Web Registration', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
810 'user'):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
811 return 1
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
812 if has('Edit', self.userid, self.classname):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
813 return 1
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
814 return 0
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
815
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
816
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
817 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
818 # Utility methods for editing
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
819 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
820 def _editnodes(self, all_props, all_links, newids=None):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
821 ''' Use the props in all_props to perform edit and creation, then
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
822 use the link specs in all_links to do linking.
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
823 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
824 # figure dependencies and re-work links
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
825 deps = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
826 links = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
827 for cn, nodeid, propname, vlist in all_links:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
828 for value in vlist:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
829 deps.setdefault((cn, nodeid), []).append(value)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
830 links.setdefault(value, []).append((cn, nodeid, propname))
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
831
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
832 # figure chained dependencies ordering
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
833 order = []
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
834 done = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
835 # loop detection
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
836 change = 0
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
837 while len(all_props) != len(done):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
838 for needed in all_props.keys():
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
839 if done.has_key(needed):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
840 continue
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
841 tlist = deps.get(needed, [])
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
842 for target in tlist:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
843 if not done.has_key(target):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
844 break
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
845 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
846 done[needed] = 1
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
847 order.append(needed)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
848 change = 1
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
849 if not change:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
850 raise ValueError, 'linking must not loop!'
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
851
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
852 # now, edit / create
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
853 m = []
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
854 for needed in order:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
855 props = all_props[needed]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
856 cn, nodeid = needed
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
857
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
858 if nodeid is not None and int(nodeid) > 0:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
859 # make changes to the node
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
860 props = self._changenode(cn, nodeid, props)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
861
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
862 # and some nice feedback for the user
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
863 if props:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
864 info = ', '.join(props.keys())
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
865 m.append('%s %s %s edited ok'%(cn, nodeid, info))
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
866 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
867 m.append('%s %s - nothing changed'%(cn, nodeid))
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
868 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
869 assert props
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
870
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
871 # make a new node
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
872 newid = self._createnode(cn, props)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
873 if nodeid is None:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
874 self.nodeid = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
875 nodeid = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
876
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
877 # and some nice feedback for the user
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
878 m.append('%s %s created'%(cn, newid))
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
879
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
880 # fill in new ids in links
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
881 if links.has_key(needed):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
882 for linkcn, linkid, linkprop in links[needed]:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
883 props = all_props[(linkcn, linkid)]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
884 cl = self.db.classes[linkcn]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
885 propdef = cl.getprops()[linkprop]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
886 if not props.has_key(linkprop):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
887 if linkid is None or linkid.startswith('-'):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
888 # linking to a new item
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
889 if isinstance(propdef, hyperdb.Multilink):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
890 props[linkprop] = [newid]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
891 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
892 props[linkprop] = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
893 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
894 # linking to an existing item
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
895 if isinstance(propdef, hyperdb.Multilink):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
896 existing = cl.get(linkid, linkprop)[:]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
897 existing.append(nodeid)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
898 props[linkprop] = existing
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
899 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
900 props[linkprop] = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
901
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
902 return '<br>'.join(m)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
903
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
904 def _changenode(self, cn, nodeid, props):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
905 ''' change the node based on the contents of the form
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
906 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
907 # check for permission
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
908 if not self.editItemPermission(props):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
909 raise PermissionError, 'You do not have permission to edit %s'%cn
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
910
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
911 # make the changes
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
912 cl = self.db.classes[cn]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
913 return cl.set(nodeid, **props)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
914
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
915 def _createnode(self, cn, props):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
916 ''' create a node based on the contents of the form
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
917 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
918 # check for permission
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
919 if not self.newItemPermission(props):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
920 raise PermissionError, 'You do not have permission to create %s'%cn
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
921
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
922 # create the node and return its id
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
923 cl = self.db.classes[cn]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
924 return cl.create(**props)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
925
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
926 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
927 # More actions
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
928 #
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
929 def editCSVAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
930 ''' Performs an edit of all of a class' items in one go.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
931
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
932 The "rows" CGI var defines the CSV-formatted entries for the
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
933 class. New nodes are identified by the ID 'X' (or any other
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
934 non-existent ID) and removed lines are retired.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
935 '''
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
936 # this is per-class only
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
937 if not self.editCSVPermission():
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
938 self.error_message.append(
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
939 _('You do not have permission to edit %s' %self.classname))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
940
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
941 # get the CSV module
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
942 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
943 import csv
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
944 except ImportError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
945 self.error_message.append(_(
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
946 'Sorry, you need the csv module to use this function.<br>\n'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
947 'Get it from: <a href="http://www.object-craft.com.au/projects/csv/">http://www.object-craft.com.au/projects/csv/'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
948 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
949
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
950 cl = self.db.classes[self.classname]
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
951 idlessprops = cl.getprops(protected=0).keys()
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
952 idlessprops.sort()
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
953 props = ['id'] + idlessprops
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
954
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
955 # do the edit
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
956 rows = self.form['rows'].value.splitlines()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
957 p = csv.parser()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
958 found = {}
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
959 line = 0
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
960 for row in rows[1:]:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
961 line += 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
962 values = p.parse(row)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
963 # not a complete row, keep going
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
964 if not values: continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
965
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
966 # skip property names header
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
967 if values == props:
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
968 continue
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
969
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
970 # extract the nodeid
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
971 nodeid, values = values[0], values[1:]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
972 found[nodeid] = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
973
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
974 # confirm correct weight
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
975 if len(idlessprops) != len(values):
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
976 self.error_message.append(
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
977 _('Not enough values on line %(line)s')%{'line':line})
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
978 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
979
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
980 # extract the new values
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
981 d = {}
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
982 for name, value in zip(idlessprops, values):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
983 value = value.strip()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
984 # only add the property if it has a value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
985 if value:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
986 # if it's a multilink, split it
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
987 if isinstance(cl.properties[name], hyperdb.Multilink):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
988 value = value.split(':')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
989 d[name] = value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
990
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
991 # perform the edit
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
992 if cl.hasnode(nodeid):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
993 # edit existing
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
994 cl.set(nodeid, **d)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
995 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
996 # new node
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
997 found[cl.create(**d)] = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
998
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
999 # retire the removed entries
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1000 for nodeid in cl.list():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1001 if not found.has_key(nodeid):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1002 cl.retire(nodeid)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1003
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1004 # all OK
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1005 self.db.commit()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1006
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1007 self.ok_message.append(_('Items edited OK'))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1008
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1009 def editCSVPermission(self):
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1010 ''' Determine whether the user has permission to edit this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1011
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1012 Base behaviour is to check the user can edit this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1013 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1014 if not self.db.security.hasPermission('Edit', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1015 self.classname):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1016 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1017 return 1
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1018
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1019 def searchAction(self):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1020 ''' Mangle some of the form variables.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1021
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1022 Set the form ":filter" variable based on the values of the
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1023 filter variables - if they're set to anything other than
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1024 "dontcare" then add them to :filter.
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1025
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1026 Also handle the ":queryname" variable and save off the query to
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1027 the user's query list.
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1028 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1029 # generic edit is per-class only
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1030 if not self.searchPermission():
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1031 self.error_message.append(
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1032 _('You do not have permission to search %s' %self.classname))
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1033
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1034 # add a faked :filter form variable for each filtering prop
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
1035 # XXX migrate to new : @ +
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1036 props = self.db.classes[self.classname].getprops()
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1037 for key in self.form.keys():
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1038 if not props.has_key(key): continue
1409
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1039 if isinstance(self.form[key], type([])):
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1040 # search for at least one entry which is not empty
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1041 for minifield in self.form[key]:
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1042 if minifield.value:
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1043 break
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1044 else:
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1045 continue
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1046 else:
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1407
diff changeset
1047 if not self.form[key].value: continue
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1048 self.form.value.append(cgi.MiniFieldStorage(':filter', key))
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1049
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1050 # handle saving the query params
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1051 if self.form.has_key(':queryname'):
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1052 queryname = self.form[':queryname'].value.strip()
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1053 if queryname:
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1054 # parse the environment and figure what the query _is_
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1055 req = HTMLRequest(self)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1056 url = req.indexargs_href('', {})
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1057
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1058 # handle editing an existing query
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1059 try:
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1060 qid = self.db.query.lookup(queryname)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1061 self.db.query.set(qid, klass=self.classname, url=url)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1062 except KeyError:
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1063 # create a query
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1064 qid = self.db.query.create(name=queryname,
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1065 klass=self.classname, url=url)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1066
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1067 # and add it to the user's query multilink
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1068 queries = self.db.user.get(self.userid, 'queries')
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1069 queries.append(qid)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1070 self.db.user.set(self.userid, queries=queries)
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1071
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1072 # commit the query change to the database
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1073 self.db.commit()
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1074
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1075 def searchPermission(self):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1076 ''' Determine whether the user has permission to search this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1077
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1078 Base behaviour is to check the user can view this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1079 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1080 if not self.db.security.hasPermission('View', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1081 self.classname):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1082 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1083 return 1
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1084
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1085
1277
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1086 def retireAction(self):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1087 ''' Retire the context item.
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1088 '''
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1089 # if we want to view the index template now, then unset the nodeid
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1090 # context info (a special-case for retire actions on the index page)
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1091 nodeid = self.nodeid
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1092 if self.template == 'index':
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1093 self.nodeid = None
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1094
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1095 # generic edit is per-class only
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1096 if not self.retirePermission():
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1097 self.error_message.append(
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1098 _('You do not have permission to retire %s' %self.classname))
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1099 return
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1100
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1101 # make sure we don't try to retire admin or anonymous
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1102 if self.classname == 'user' and \
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1103 self.db.user.get(nodeid, 'username') in ('admin', 'anonymous'):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1104 self.error_message.append(
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1105 _('You may not retire the admin or anonymous user'))
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1106 return
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1107
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1108 # do the retire
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1109 self.db.getclass(self.classname).retire(nodeid)
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1110 self.db.commit()
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1111
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1112 self.ok_message.append(
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1113 _('%(classname)s %(itemid)s has been retired')%{
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1114 'classname': self.classname.capitalize(), 'itemid': nodeid})
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1115
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1116 def retirePermission(self):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1117 ''' Determine whether the user has permission to retire this class.
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1118
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1119 Base behaviour is to check the user can edit this class.
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1120 '''
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1121 if not self.db.security.hasPermission('Edit', self.userid,
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1122 self.classname):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1123 return 0
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1124 return 1
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1125
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1126
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1127 def showAction(self):
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1128 ''' Show a node
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1129 '''
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
1130 # XXX allow : @ +
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1131 t = self.form[':type'].value
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1132 n = self.form[':number'].value
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1133 url = '%s%s%s'%(self.db.config.TRACKER_WEB, t, n)
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1134 raise Redirect, url
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1135
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1136 def parsePropsFromForm(self, num_re=re.compile('^\d+$')):
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1137 ''' Pull properties out of the form.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1138
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1139 In the following, <bracketed> values are variable, ":" may be
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
1140 one of ":" or "@", and other text "required" is fixed.
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1141
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1142 Properties are specified as form variables:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1143
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1144 <propname>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1145 - property on the current context item
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1146
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1147 <designator>:<propname>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1148 - property on the indicated item
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1149
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1150 <classname>-<N>:<propname>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1151 - property on the Nth new item of classname
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1152
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1153 Once we have determined the "propname", we check to see if it
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1154 is one of the special form values:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1155
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1156 :required
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1157 The named property values must be supplied or a ValueError
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1158 will be raised.
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1159
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1160 :remove:<propname>=id(s)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1161 The ids will be removed from the multilink property.
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1162
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1163 :add:<propname>=id(s)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1164 The ids will be added to the multilink property.
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1165
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1166 :link:<propname>=<designator>
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1167 Used to add a link to new items created during edit.
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1168 These are collected up and returned in all_links. This will
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1169 result in an additional linking operation (either Link set or
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1170 Multilink append) after the edit/create is done using
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1171 all_props in _editnodes. The <propname> on the current item
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1172 will be set/appended the id of the newly created item of
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1173 class <designator> (where <designator> must be
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1174 <classname>-<N>).
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1175
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1176 Any of the form variables may be prefixed with a classname or
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1177 designator.
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1178
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1179 The return from this method is a dict of
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1180 (classname, id): properties
1422
5599f1990325 more info in docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1421
diff changeset
1181 ... this dict _always_ has an entry for the current context,
5599f1990325 more info in docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1421
diff changeset
1182 even if it's empty (ie. a submission for an existing issue that
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1183 doesn't result in any changes would return {('issue','123'): {}})
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1184 The id may be None, which indicates that an item should be
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1185 created.
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1186
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1187 If a String property's form value is a file upload, then we
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1188 try to set additional properties "filename" and "type" (if
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1189 they are valid for the class).
1435
a866491d04a7 forgot :note/:file docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1190
a866491d04a7 forgot :note/:file docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1191 Two special form values are supported for backwards
a866491d04a7 forgot :note/:file docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1192 compatibility:
a866491d04a7 forgot :note/:file docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1193 :note - create a message (with content, author and date), link
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1194 to the context item. This is ALWAYS desginated "msg-1".
1435
a866491d04a7 forgot :note/:file docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1431
diff changeset
1195 :file - create a file, attach to the current item and any
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1196 message created by :note. This is ALWAYS designated
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1197 "file-1".
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1198
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1199 We also check that FileClass items have a "content" property with
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1200 actual content, otherwise we remove them from all_props before
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1201 returning.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1202 '''
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1203 # some very useful variables
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1204 db = self.db
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1205 form = self.form
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1206
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1207 if not hasattr(self, 'FV_SPECIAL'):
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1208 # generate the regexp for handling special form values
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1209 classes = '|'.join(db.classes.keys())
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1210 # specials for parsePropsFromForm
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1211 # handle the various forms (see unit tests)
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1212 self.FV_SPECIAL = re.compile(self.FV_LABELS%classes, re.VERBOSE)
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1213 self.FV_DESIGNATOR = re.compile(r'(%s)([-\d]+)'%classes)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1214
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1215 # these indicate the default class / item
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1216 default_cn = self.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1217 default_cl = self.db.classes[default_cn]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1218 default_nodeid = self.nodeid
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1219
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1220 # we'll store info about the individual class/item edit in these
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1221 all_required = {} # one entry per class/item
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1222 all_props = {} # one entry per class/item
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1223 all_propdef = {} # note - only one entry per class
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1224 all_links = [] # as many as are required
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1225
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1226 # we should always return something, even empty, for the context
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1227 all_props[(default_cn, default_nodeid)] = {}
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1228
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1229 keys = form.keys()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1230 timezone = db.getUserTimezone()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1231
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1232 # sentinels for the :note and :file props
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1233 have_note = have_file = 0
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1234
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1235 # extract the usable form labels from the form
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1236 matches = []
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1237 for key in keys:
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1238 m = self.FV_SPECIAL.match(key)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1239 if m:
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1240 matches.append((key, m.groupdict()))
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1241
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1242 # now handle the matches
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1243 for key, d in matches:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1244 if d['classname']:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1245 # we got a designator
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1246 cn = d['classname']
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1247 cl = self.db.classes[cn]
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1248 nodeid = d['id']
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1249 propname = d['propname']
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1250 elif d['note']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1251 # the special note field
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1252 cn = 'msg'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1253 cl = self.db.classes[cn]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1254 nodeid = '-1'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1255 propname = 'content'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1256 all_links.append((default_cn, default_nodeid, 'messages',
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1257 [('msg', '-1')]))
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1258 have_note = 1
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1259 elif d['file']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1260 # the special file field
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1261 cn = 'file'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1262 cl = self.db.classes[cn]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1263 nodeid = '-1'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1264 propname = 'content'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1265 all_links.append((default_cn, default_nodeid, 'files',
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1266 [('file', '-1')]))
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1267 have_file = 1
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1268 else:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1269 # default
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1270 cn = default_cn
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1271 cl = default_cl
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1272 nodeid = default_nodeid
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1273 propname = d['propname']
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1274
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1275 # the thing this value relates to is...
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1276 this = (cn, nodeid)
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1277
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1278 # get more info about the class, and the current set of
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1279 # form props for it
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1280 if not all_propdef.has_key(cn):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1281 all_propdef[cn] = cl.getprops()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1282 propdef = all_propdef[cn]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1283 if not all_props.has_key(this):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1284 all_props[this] = {}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1285 props = all_props[this]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1286
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1287 # is this a link command?
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1288 if d['link']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1289 value = []
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1290 for entry in extractFormList(form[key]):
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1291 m = self.FV_DESIGNATOR.match(entry)
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1292 if not m:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1293 raise ValueError, \
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1294 'link "%s" value "%s" not a designator'%(key, entry)
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1295 value.append((m.group(1), m.group(2)))
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1296
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1297 # make sure the link property is valid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1298 if (not isinstance(propdef, hyperdb.Multilink) and
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1299 not isinstance(propdef, hyperdb.Link)):
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1300 raise ValueError, '%s %s is not a link or '\
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1301 'multilink property'%(cn, propname)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1302
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1303 all_links.append((cn, nodeid, propname, value))
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1304 continue
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1305
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1306 # detect the special ":required" variable
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1307 if d['required']:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1308 all_required[this] = extractFormList(form[key])
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1309 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1310
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1311 # get the required values list
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1312 if not all_required.has_key(this):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1313 all_required[this] = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1314 required = all_required[this]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1315
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1316 # see if we're performing a special multilink action
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1317 mlaction = 'set'
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1318 if d['remove']:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1319 mlaction = 'remove'
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1320 elif d['add']:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1321 mlaction = 'add'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1322
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1323 # does the property exist?
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1324 if not propdef.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1325 if mlaction != 'set':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1326 raise ValueError, 'You have submitted a %s action for'\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1327 ' the property "%s" which doesn\'t exist'%(mlaction,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1328 propname)
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1329 # the form element is probably just something we don't care
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1330 # about - ignore it
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1331 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1332 proptype = propdef[propname]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1333
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1334 # Get the form value. This value may be a MiniFieldStorage or a list
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1335 # of MiniFieldStorages.
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1336 value = form[key]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1337
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1338 # handle unpacking of the MiniFieldStorage / list form value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1339 if isinstance(proptype, hyperdb.Multilink):
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1340 value = extractFormList(value)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1341 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1342 # multiple values are not OK
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1343 if isinstance(value, type([])):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1344 raise ValueError, 'You have submitted more than one value'\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1345 ' for the %s property'%propname
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1346 # value might be a file upload...
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1347 if not hasattr(value, 'filename') or value.filename is None:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1348 # nope, pull out the value and strip it
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1349 value = value.value.strip()
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1350
1426
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1351 # now that we have the props field, we need a teensy little
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1352 # extra bit of help for the old :note field...
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1353 if d['note'] and value:
1426
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1354 props['author'] = self.db.getuid()
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1355 props['date'] = date.Date()
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1356
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1357 # handle by type now
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1358 if isinstance(proptype, hyperdb.Password):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1359 if not value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1360 # ignore empty password values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1361 continue
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1362 for key, d in matches:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1363 if d['confirm'] and d['propname'] == propname:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1364 confirm = form[key]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1365 break
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1366 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1367 raise ValueError, 'Password and confirmation text do '\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1368 'not match'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1369 if isinstance(confirm, type([])):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1370 raise ValueError, 'You have submitted more than one value'\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1371 ' for the %s property'%propname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1372 if value != confirm.value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1373 raise ValueError, 'Password and confirmation text do '\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1374 'not match'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1375 value = password.Password(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1376
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1377 elif isinstance(proptype, hyperdb.Link):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1378 # see if it's the "no selection" choice
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1379 if value == '-1' or not value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1380 # if we're creating, just don't include this property
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1381 if not nodeid or nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1382 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1383 value = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1384 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1385 # handle key values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1386 link = proptype.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1387 if not num_re.match(value):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1388 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1389 value = db.classes[link].lookup(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1390 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1391 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1392 '%(value)s not a %(classname)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1393 'propname': propname, 'value': value,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1394 'classname': link}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1395 except TypeError, message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1396 raise ValueError, _('you may only enter ID values '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1397 'for property "%(propname)s": %(message)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1398 'propname': propname, 'message': message}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1399 elif isinstance(proptype, hyperdb.Multilink):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1400 # perform link class key value lookup if necessary
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1401 link = proptype.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1402 link_cl = db.classes[link]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1403 l = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1404 for entry in value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1405 if not entry: continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1406 if not num_re.match(entry):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1407 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1408 entry = link_cl.lookup(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1409 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1410 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1411 '"%(value)s" not an entry of %(classname)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1412 'propname': propname, 'value': entry,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1413 'classname': link}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1414 except TypeError, message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1415 raise ValueError, _('you may only enter ID values '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1416 'for property "%(propname)s": %(message)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1417 'propname': propname, 'message': message}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1418 l.append(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1419 l.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1421 # now use that list of ids to modify the multilink
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1422 if mlaction == 'set':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1423 value = l
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1424 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1425 # we're modifying the list - get the current list of ids
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1426 if props.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1427 existing = props[propname]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1428 elif nodeid and not nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1429 existing = cl.get(nodeid, propname, [])
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1430 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1431 existing = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1432
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1433 # now either remove or add
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1434 if mlaction == 'remove':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1435 # remove - handle situation where the id isn't in
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1436 # the list
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1437 for entry in l:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1438 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1439 existing.remove(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1440 except ValueError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1441 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1442 '"%(value)s" not currently in list')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1443 'propname': propname, 'value': entry}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1444 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1445 # add - easy, just don't dupe
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1446 for entry in l:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1447 if entry not in existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1448 existing.append(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1449 value = existing
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1450 value.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1451
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1452 elif value == '':
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1453 # if we're creating, just don't include this property
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1454 if not nodeid or nodeid.startswith('-'):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1455 continue
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1456 # other types should be None'd if there's no value
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1457 value = None
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1458 else:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1459 if isinstance(proptype, hyperdb.String):
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1460 if (hasattr(value, 'filename') and
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1461 value.filename is not None):
1426
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1462 # skip if the upload is empty
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1463 if not value.filename:
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1464 continue
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1465 # this String is actually a _file_
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1466 # try to determine the file content-type
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1467 filename = value.filename.split('\\')[-1]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1468 if propdef.has_key('name'):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1469 props['name'] = filename
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1470 # use this info as the type/filename properties
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1471 if propdef.has_key('type'):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1472 props['type'] = mimetypes.guess_type(filename)[0]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1473 if not props['type']:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1474 props['type'] = "application/octet-stream"
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1475 # finally, read the content
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1476 value = value.value
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1477 else:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1478 # normal String fix the CRLF/CR -> LF stuff
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1479 value = fixNewlines(value)
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1480
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1481 elif isinstance(proptype, hyperdb.Date):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1482 value = date.Date(value, offset=timezone)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1483 elif isinstance(proptype, hyperdb.Interval):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1484 value = date.Interval(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1485 elif isinstance(proptype, hyperdb.Boolean):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1486 value = value.lower() in ('yes', 'true', 'on', '1')
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1487 elif isinstance(proptype, hyperdb.Number):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1488 value = float(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1489
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1490 # get the old value
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1491 if nodeid and not nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1492 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1493 existing = cl.get(nodeid, propname)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1494 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1495 # this might be a new property for which there is
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1496 # no existing value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1497 if not propdef.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1498 raise
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1499
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1500 # make sure the existing multilink is sorted
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1501 if isinstance(proptype, hyperdb.Multilink):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1502 existing.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1503
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1504 # "missing" existing values may not be None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1505 if not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1506 if isinstance(proptype, hyperdb.String) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1507 # some backends store "missing" Strings as empty strings
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1508 existing = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1509 elif isinstance(proptype, hyperdb.Number) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1510 # some backends store "missing" Numbers as 0 :(
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1511 existing = 0
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1512 elif isinstance(proptype, hyperdb.Boolean) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1513 # likewise Booleans
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1514 existing = 0
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1515
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1516 # if changed, set it
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1517 if value != existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1518 props[propname] = value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1519 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1520 # don't bother setting empty/unset values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1521 if value is None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1522 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1523 elif isinstance(proptype, hyperdb.Multilink) and value == []:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1524 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1525 elif isinstance(proptype, hyperdb.String) and value == '':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1526 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1527
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1528 props[propname] = value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1529
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1530 # register this as received if required?
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1531 if propname in required and value is not None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1532 required.remove(propname)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1533
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1534 # check to see if we need to specially link a file to the note
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1535 if have_note and have_file:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1536 all_links.append(('msg', '-1', 'files', [('file', '-1')]))
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1537
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1538 # see if all the required properties have been supplied
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1539 s = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1540 for thing, required in all_required.items():
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1541 if not required:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1542 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1543 if len(required) > 1:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1544 p = 'properties'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1545 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1546 p = 'property'
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1547 s.append('Required %s %s %s not supplied'%(thing[0], p,
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1548 ', '.join(required)))
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1549 if s:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1550 raise ValueError, '\n'.join(s)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1551
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1552 # check that FileClass entries have a "content" property with
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1553 # content, otherwise remove them
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1554 for (cn, id), props in all_props.items():
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1555 cl = self.db.classes[cn]
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1556 if not isinstance(cl, hyperdb.FileClass):
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1557 continue
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1558 if not props.get('content', ''):
1443
Richard Jones <richard@users.sourceforge.net>
parents: 1442
diff changeset
1559 del all_props[(cn, id)]
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1560
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1561 # clean up the links, removing ones that aren't possible
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1562 l = []
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1563 for entry in all_links:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1564 (cn, nodeid, propname, destlist) = entry
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1565 source = (cn, nodeid)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1566 if not all_props.has_key(source) or not all_props[source]:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1567 # nothing to create - don't try to link
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1568 continue
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1569 # nothing to create - don't try to link
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1570 continue
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1571 for dest in destlist[:]:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1572 if not all_props.has_key(dest) or not all_props[dest]:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1573 destlist.remove(dest)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1574 l.append(entry)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1575
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1576 return all_props, l
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1577
1254
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1578 def fixNewlines(text):
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1579 ''' Homogenise line endings.
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1580
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1581 Different web clients send different line ending values, but
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1582 other systems (eg. email) don't necessarily handle those line
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1583 endings. Our solution is to convert all line endings to LF.
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1584 '''
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1585 text = text.replace('\r\n', '\n')
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1586 return text.replace('\r', '\n')
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1587
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1588 def extractFormList(value):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1589 ''' Extract a list of values from the form value.
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1590
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1591 It may be one of:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1592 [MiniFieldStorage, MiniFieldStorage, ...]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1593 MiniFieldStorage('value,value,...')
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1594 MiniFieldStorage('value')
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1595 '''
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1596 # multiple values are OK
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1597 if isinstance(value, type([])):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1598 # it's a list of MiniFieldStorages
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1599 value = [i.value.strip() for i in value]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1600 else:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1601 # it's a MiniFieldStorage, but may be a comma-separated list
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1602 # of values
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1603 value = [i.strip() for i in value.value.split(',')]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1604
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1605 # filter out the empty bits
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1606 return filter(None, value)
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1607

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