annotate roundup/cgi/client.py @ 1731:778056dc420f

Fixed editing properties on FileClass nodes. Previously, if there was no 'content' property in the form when editing properties, other changes wold be discarded silently. Now, an exception is raised when there is a empty content property. Also, when there is no content property, other attributes can be edited.
author Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
date Sun, 10 Aug 2003 13:38:43 +0000
parents 2dd6b4c825e9
children 2c26b6cec950
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1731
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1 # $Id: client.py,v 1.128 2003-08-10 13:38:43 jlgijsbers 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
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
8 import binascii, Cookie, time, random, MimeWriter, smtplib, socket, quopri
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
9 import stat, rfc822, string
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10
1634
e5e00d3a3fe2 better string splitting
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
11 from roundup import roundupdb, date, hyperdb, password, token
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 from roundup.i18n import _
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
1078
344bad728d10 more tweakage of help display and style issues
Richard Jones <richard@users.sourceforge.net>
parents: 1076
diff changeset
15 from roundup.cgi.PageTemplates import PageTemplate
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
16 from roundup.rfc2822 import encode_header
1612
e109d59f232d SMTP login and TLS support added ([SF#710853] with extras ;)
Richard Jones <richard@users.sourceforge.net>
parents: 1583
diff changeset
17 from roundup.mailgw import uidFromAddress, openSMTPConnection
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18
1456
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
19 class HTTPException(Exception):
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
20 pass
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
21 class Unauthorised(HTTPException):
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
22 pass
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
23 class NotFound(HTTPException):
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
24 pass
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
25 class Redirect(HTTPException):
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
26 pass
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
27 class NotModified(HTTPException):
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
28 pass
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
30 # set to indicate to roundup not to actually _send_ email
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
31 # this var must contain a file to write the mail to
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
32 SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '')
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
33
1583
caae7d8934dc set new email rego user password to random string
Richard Jones <richard@users.sourceforge.net>
parents: 1579
diff changeset
34 # used by a couple of routines
caae7d8934dc set new email rego user password to random string
Richard Jones <richard@users.sourceforge.net>
parents: 1579
diff changeset
35 chars = string.letters+string.digits
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
36
1456
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
37 # XXX actually _use_ FormError
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
38 class FormError(ValueError):
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
39 ''' An "expected" exception occurred during form parsing.
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
40 - ie. something we know can go wrong, and don't want to alarm the
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
41 user with
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42
1456
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
43 We trap this at the user interface level and feed back a nice error
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
44 to the user.
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
45 '''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 pass
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 class SendFile(Exception):
1456
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
49 ''' Send a file from the database '''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 class SendStaticFile(Exception):
1456
745ceee35ca2 beginnings of nicer web error handling
Richard Jones <richard@users.sourceforge.net>
parents: 1447
diff changeset
52 ''' Send a static file from the instance html directory '''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 def initialiseSecurity(security):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 ''' Create some Permissions and Roles on the security object
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 This function is directly invoked by security.Security.__init__()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 as a part of the Security object instantiation.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 security.addPermission(name="Web Registration",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 description="User may register through the web")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 p = security.addPermission(name="Web Access",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 description="User may access the web interface")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 security.addPermissionToRole('Admin', p)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 # doing Role stuff through the web - make sure Admin can
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 p = security.addPermission(name="Web Roles",
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 description="User may manipulate user Roles through the web")
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 security.addPermissionToRole('Admin', p)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70
1684
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
71 # used to clean messages passed through CGI variables - HTML-escape any tag
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
72 # that isn't <a href="">, <i>, <b> and <br> (including XHTML variants) so
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
73 # that people can't pass through nasties like <script>, <iframe>, ...
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
74 CLEAN_MESSAGE_RE = r'(<(/?(.*?)(\s*href="[^"]")?\s*/?)>)'
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
75 def clean_message(message, mc=re.compile(CLEAN_MESSAGE_RE, re.I)):
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
76 return mc.sub(clean_message_callback, message)
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
77 def clean_message_callback(match, ok={'a':1,'i':1,'b':1,'br':1}):
1656
ee730d990989 fix cross-site-scripting bug
Richard Jones <richard@users.sourceforge.net>
parents: 1654
diff changeset
78 ''' Strip all non <a>,<i>,<b> and <br> tags from a string
ee730d990989 fix cross-site-scripting bug
Richard Jones <richard@users.sourceforge.net>
parents: 1654
diff changeset
79 '''
1684
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
80 if ok.has_key(match.group(3).lower()):
1656
ee730d990989 fix cross-site-scripting bug
Richard Jones <richard@users.sourceforge.net>
parents: 1654
diff changeset
81 return match.group(1)
ee730d990989 fix cross-site-scripting bug
Richard Jones <richard@users.sourceforge.net>
parents: 1654
diff changeset
82 return '&lt;%s&gt;'%match.group(2)
ee730d990989 fix cross-site-scripting bug
Richard Jones <richard@users.sourceforge.net>
parents: 1654
diff changeset
83
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 class Client:
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
85 ''' Instantiate to handle one CGI request.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
87 See inner_main for request processing.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
89 Client attributes at instantiation:
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
90 "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
91 "base" is the base URL for the instance
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
92 "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
93 cgi module
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
94 "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
95 should be sent to the client
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
96 "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
97
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
98 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
99 "error_message" holds a list of error messages
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
100 "ok_message" holds a list of OK messages
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
101 "session" is the current user session id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
102 "user" is the current user's name
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
103 "userid" is the current user's id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
104 "template" is the current :template context
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
105 "classname" is the current class context name
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
106 "nodeid" is the current context item id
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
107
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
108 User Identification:
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
109 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
110 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
111 Anonymous Role.
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
112
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
113 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
114 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
115
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
116
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
117 Special form variables:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
118 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
119 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
120 actually be one of either ":" or "@".
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
123 #
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
124 # special form variables
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
125 #
1436
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
126 FV_TEMPLATE = re.compile(r'[@:]template')
2f6647cf5345 bugger, dropping support for "+" special char
Richard Jones <richard@users.sourceforge.net>
parents: 1435
diff changeset
127 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
128 FV_ERROR_MESSAGE = re.compile(r'[@:]error_message')
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
129
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
130 FV_QUERYNAME = re.compile(r'[@:]queryname')
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
131
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
132 # 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
133 FV_LABELS = r'''
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
134 ^(
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
135 (?P<note>[@:]note)|
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
136 (?P<file>[@:]file)|
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
137 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
138 ((?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
139 ((?P<required>[@:]required$)| # :required
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
140 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
141 (
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
142 (?P<add>[@:]add[@:])| # :add:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
143 (?P<remove>[@:]remove[@:])| # :remove:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
144 (?P<confirm>[@:]confirm[@:])| # :confirm:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
145 (?P<link>[@:]link[@:])| # :link:<prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
146 ([@:]) # just a separator
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
147 )?
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
148 (?P<propname>[^@:]+) # <prop>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
149 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
150 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
151 )
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
152 )$'''
1421
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
153
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
154 # Note: index page stuff doesn't appear here:
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
155 # columns, sort, sortdir, filter, group, groupdir, search_text,
90bb11eb40dc oops, forgot the templating :)
Richard Jones <richard@users.sourceforge.net>
parents: 1420
diff changeset
156 # pagesize, startwith
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
157
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 def __init__(self, instance, request, env, form=None):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 hyperdb.traceMark()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 self.instance = instance
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 self.request = request
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 self.env = env
1004
5f12d3259f31 logout works better now
Richard Jones <richard@users.sourceforge.net>
parents: 1003
diff changeset
163
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
164 # save off the path
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 self.path = env['PATH_INFO']
1004
5f12d3259f31 logout works better now
Richard Jones <richard@users.sourceforge.net>
parents: 1003
diff changeset
166
1398
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
167 # 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
168 self.base = self.instance.config.TRACKER_WEB
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169
1398
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
170 # 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
171 # the "base" url)
b3e1e9ab0500 fixed cookie path to use TRACKER_WEB [SF#667020]
Richard Jones <richard@users.sourceforge.net>
parents: 1393
diff changeset
172 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
173 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
174 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
175
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
176 # 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
177 if form is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 self.form = cgi.FieldStorage(environ=env)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 self.form = form
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
181
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
182 # turn debugging on/off
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 self.debug = int(env.get("ROUNDUP_DEBUG", 0))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 except ValueError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 # 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
187 self.debug = 0
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
189 # 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
190 self.headers_done = 0
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
191
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
192 # 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
193 # 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
194 self.additional_headers = {}
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
195 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
196
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
197
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 def main(self):
1133
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
199 ''' 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
200 '''
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
201 try:
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
202 self.inner_main()
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
203 finally:
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
204 if hasattr(self, 'db'):
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
205 self.db.close()
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
206
36ec30d286ea Cleaned up CHANGES/TODO
Richard Jones <richard@users.sourceforge.net>
parents: 1130
diff changeset
207 def inner_main(self):
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
208 ''' Process a request.
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
209
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
210 The most common requests are handled like so:
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
211 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
212 see determine_user
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
213 2. figure out what the request is for - the context
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
214 see determine_context
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
215 3. handle any requested action (item edit, search, ...)
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
216 see handle_action
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
217 4. render a template, resulting in HTML output
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
218
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
219 In some situations, exceptions occur:
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
220 - HTTP Redirect (generally raised by an action)
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
221 - SendFile (generally raised by determine_context)
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
222 serve up a FileClass "content" property
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
223 - SendStaticFile (generally raised by determine_context)
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
224 serve up a file from the tracker "html" directory
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
225 - Unauthorised (generally raised by an action)
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
226 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
227 message is displayed indicating that permission was not
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
228 granted for the action to take place
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
229 - NotFound (raised wherever it needs to be)
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
230 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
231 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 self.ok_message = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 self.error_message = []
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 try:
1697
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
235 # figure out the context and desired content template
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
236 # do this first so we don't authenticate for static files
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
237 # Note: this method opens the database as "admin" in order to
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
238 # perform context checks
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
239 self.determine_context()
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
240
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 # make sure we're identified (even anonymously)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 self.determine_user()
1697
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
243
1054
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
244 # possibly handle a form submit action (may change self.classname
3d8ea16347aa more explanatory docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1053
diff changeset
245 # 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
246 self.handle_action()
1579
07a6b8587bc2 removed Pragma: no-cache...
Richard Jones <richard@users.sourceforge.net>
parents: 1562
diff changeset
247
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 # 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
249 # 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
250 self.additional_headers['Cache-Control'] = 'no-cache'
1579
07a6b8587bc2 removed Pragma: no-cache...
Richard Jones <richard@users.sourceforge.net>
parents: 1562
diff changeset
251 # Pragma: no-cache makes Mozilla and its ilk double-load all pages!!
07a6b8587bc2 removed Pragma: no-cache...
Richard Jones <richard@users.sourceforge.net>
parents: 1562
diff changeset
252 # self.additional_headers['Pragma'] = 'no-cache'
1552
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
253
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
254 # expire this page 5 seconds from now
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
255 date = rfc822.formatdate(time.time() + 5)
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
256 self.additional_headers['Expires'] = date
1130
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
257
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
258 # render the content
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
259 self.write(self.renderContext())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 except Redirect, url:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 # 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
262 # the headers, otherwise the headers have been set before the
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 # exception was raised
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 if url:
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
265 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
266 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
267 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
268 except SendFile, designator:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 self.serve_file(designator)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 except SendStaticFile, file:
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
271 try:
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
272 self.serve_static_file(str(file))
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
273 except NotModified:
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
274 # send the 304 response
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
275 self.request.send_response(304)
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
276 self.request.end_headers()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 except Unauthorised, message:
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
278 self.classname = None
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
279 self.template = ''
1244
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
280 self.error_message.append(message)
8dd4f736370b merge from maintenance branch
Richard Jones <richard@users.sourceforge.net>
parents: 1236
diff changeset
281 self.write(self.renderContext())
1210
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
282 except NotFound:
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
283 # pass through
619ab5de5af0 [SF#613310] traceback on onexistant items
Richard Jones <richard@users.sourceforge.net>
parents: 1204
diff changeset
284 raise
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 except:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 # everything else
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 self.write(cgitb.html())
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288
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
289 def clean_sessions(self):
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
290 ''' Age sessions, remove when they haven't been used for a week.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
291
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
292 Do it only once an hour.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
293
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
294 Note: also cleans One Time Keys, and other "session" based
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
295 stuff.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
296 '''
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
297 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
298 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
299
3931614b1cce cleaning old unused sessions only once per hour, not on every cgi request
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1358
diff changeset
300 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
301 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
302 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
303 if now - last_clean > hour:
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
304 # remove aged sessions
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
305 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
306 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
307 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
308 sessions.destroy(sessid)
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
309 # remove aged otks
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
310 otks = self.db.otks
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
311 for sessid in otks.list():
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
312 interval = now - otks.get(sessid, '__time')
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
313 if interval > week:
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
314 otks.destroy(sessid)
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
315 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
316
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317 def determine_user(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318 ''' Determine who the user is
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 '''
1724
bc4f0aec594e oops, we really do need a database
Richard Jones <richard@users.sourceforge.net>
parents: 1719
diff changeset
320 # open the database as admin
bc4f0aec594e oops, we really do need a database
Richard Jones <richard@users.sourceforge.net>
parents: 1719
diff changeset
321 self.opendb('admin')
bc4f0aec594e oops, we really do need a database
Richard Jones <richard@users.sourceforge.net>
parents: 1719
diff changeset
322
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
323 # 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
324 self.clean_sessions()
1719
eeb167fb8faf *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1697
diff changeset
325
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326 # make sure we have the session Class
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 sessions = self.db.sessions
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 # look up the user session cookie
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
330 cookie = Cookie.SimpleCookie(self.env.get('HTTP_COOKIE', ''))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332
1018
b0527d9c8e11 call the cookie something else since it changed
Richard Jones <richard@users.sourceforge.net>
parents: 1016
diff changeset
333 # 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
334 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
335 cookie[self.cookie_name].value != 'deleted'):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 # 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
338 self.session = cookie[self.cookie_name].value
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 # get the user from the session
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 # update the lifetime datestamp
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 sessions.set(self.session, last_use=time.time())
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 sessions.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 user = sessions.get(self.session, 'user')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 except KeyError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 # 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
349 # at the same time
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 self.userid = self.db.user.lookup(user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 except (KeyError, TypeError):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353 user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 # 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
356 if user == 'anonymous':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 self.user = user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
361 # reopen the database as the correct user
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
362 self.opendb(self.user)
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
363
1684
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
364 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
365 ''' Determine the context of this page from the URL:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
367 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
368 is generally only one entry long.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
370 - 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
371 * if the path is "_file", then the additional path entry
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
372 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
373 from the instance "html" directory. Raises a SendStaticFile
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
374 exception.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
375 - 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
376 the tracker class we're to display.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
377 - 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
378 to display a specific item.
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
379 * 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
380 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
381 FileClass, and the extra path information gives the filename
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
382 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
383 "file123/image.png" is nicer to download than "file123"). This
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
384 raises a SendFile exception.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
386 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
387 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
388 don't actually use templates.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
389
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390 The template used is specified by the :template CGI variable,
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391 which defaults to:
1053
b28393def972 more explanatory docsting
Richard Jones <richard@users.sourceforge.net>
parents: 1051
diff changeset
392
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393 only classname suplied: "index"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
394 full item designator supplied: "item"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396 We set:
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
397 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
398 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
399 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
400 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 # default the optional variables
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 self.classname = None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 self.nodeid = None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
405 # see if a template or messages are specified
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
406 template_override = ok_message = error_message = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
407 for key in self.form.keys():
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
408 if self.FV_TEMPLATE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
409 template_override = self.form[key].value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
410 elif self.FV_OK_MESSAGE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
411 ok_message = self.form[key].value
1684
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
412 ok_message = clean_message(ok_message)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
413 elif self.FV_ERROR_MESSAGE.match(key):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
414 error_message = self.form[key].value
1684
b87c40d1b8fb fix hackish message escaping [SF#757128]
Richard Jones <richard@users.sourceforge.net>
parents: 1656
diff changeset
415 error_message = clean_message(error_message)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
416
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
417 # determine the classname and possibly nodeid
1157
26c8cb2162d7 fixed various URL / base URL issues
Richard Jones <richard@users.sourceforge.net>
parents: 1153
diff changeset
418 path = self.path.split('/')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
419 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
420 if template_override is not None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
421 self.template = template_override
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
422 else:
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
423 self.template = ''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
424 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
425 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
426 raise SendStaticFile, os.path.join(*path[1:])
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
427 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
428 self.classname = path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
429 if len(path) > 1:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
430 # send the file identified by the designator in path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
431 raise SendFile, path[0]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
432
1697
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
433 # we need the db for further context stuff - open it as admin
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
434 self.opendb('admin')
c9f67f2f7ba7 don't open the database for static files
Richard Jones <richard@users.sourceforge.net>
parents: 1692
diff changeset
435
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 # see if we got a designator
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 m = dre.match(self.classname)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
438 if m:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439 self.classname = m.group(1)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
440 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
441 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
442 raise NotFound, '%s/%s'%(self.classname, self.nodeid)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
443 # 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
444 self.template = 'item'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
445 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
446 # 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
447 self.template = 'index'
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
448
1288
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
449 # 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
450 try:
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
451 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
452 except KeyError:
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
453 raise NotFound, self.classname
ad8de51d7cd5 handle "classname" URL path errors cleaner (generate a 404)
Richard Jones <richard@users.sourceforge.net>
parents: 1277
diff changeset
454
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 # see if we have a template override
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
456 if template_override is not None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
457 self.template = template_override
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
458
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
459 # 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
460 if ok_message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
461 self.ok_message.append(ok_message)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
462 if error_message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
463 self.error_message.append(error_message)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
465 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
466 ''' 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
467 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
468 m = dre.match(str(designator))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469 if not m:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
470 raise NotFound, str(designator)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
471 classname, nodeid = m.group(1), m.group(2)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472 if classname != 'file':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
473 raise NotFound, designator
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
475 # we just want to serve up the file named
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
476 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
477 self.additional_headers['Content-Type'] = file.get(nodeid, 'type')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
478 self.write(file.get(nodeid, 'content'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
479
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
480 def serve_static_file(self, file):
1498
203f6a154b30 even better if-modified-since handling for cgi-bin
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1497
diff changeset
481 ims = None
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
482 # see if there's an if-modified-since...
1497
2704d8438823 better if-modified-since handling for cgi-bin
Richard Jones <richard@users.sourceforge.net>
parents: 1477
diff changeset
483 if hasattr(self.request, 'headers'):
2704d8438823 better if-modified-since handling for cgi-bin
Richard Jones <richard@users.sourceforge.net>
parents: 1477
diff changeset
484 ims = self.request.headers.getheader('if-modified-since')
2704d8438823 better if-modified-since handling for cgi-bin
Richard Jones <richard@users.sourceforge.net>
parents: 1477
diff changeset
485 elif self.env.has_key('HTTP_IF_MODIFIED_SINCE'):
2704d8438823 better if-modified-since handling for cgi-bin
Richard Jones <richard@users.sourceforge.net>
parents: 1477
diff changeset
486 # cgi will put the header in the env var
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
487 ims = self.env['HTTP_IF_MODIFIED_SINCE']
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
488 filename = os.path.join(self.instance.config.TEMPLATES, file)
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
489 lmt = os.stat(filename)[stat.ST_MTIME]
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
490 if ims:
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
491 ims = rfc822.parsedate(ims)[:6]
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
492 lmtt = time.gmtime(lmt)[:6]
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
493 if lmtt <= ims:
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
494 raise NotModified
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
495
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496 # we just want to serve up the file named
1552
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
497 file = str(file)
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
498 mt = mimetypes.guess_type(file)[0]
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
499 if not mt:
1552
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
500 if file.endswith('.css'):
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
501 mt = 'text/css'
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
502 else:
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
503 mt = 'text/plain'
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
504 self.additional_headers['Content-Type'] = mt
1469
79d8956de3f5 implemented last-modified and if-modified-since support
Richard Jones <richard@users.sourceforge.net>
parents: 1468
diff changeset
505 self.additional_headers['Last-Modifed'] = rfc822.formatdate(lmt)
1472
77942e0a12fe open static files using binary mode [SF#693208]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
506 self.write(open(filename, 'rb').read())
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
507
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
508 def renderContext(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
509 ''' Return a PageTemplate for the named page
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
510 '''
1204
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
511 name = self.classname
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
512 extension = self.template
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
513 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
514
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1096
diff changeset
515 # 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
516 args = {
b862bbf2067a Replaced the content() callback ickiness with Page Template macro usage
Richard Jones <richard@users.sourceforge.net>
parents: 1196
diff changeset
517 '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
518 '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
519 }
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
520 try:
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
521 # 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
522 return pt.render(self, None, None, **args)
1068
665730c27d29 nicer template absence error
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
523 except NoTemplate, message:
665730c27d29 nicer template absence error
Richard Jones <richard@users.sourceforge.net>
parents: 1065
diff changeset
524 return '<strong>%s</strong>'%message
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
525 except:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
526 # everything else
1065
0f9aa62917bd much nicer error messages when there's a templating error
Richard Jones <richard@users.sourceforge.net>
parents: 1064
diff changeset
527 return cgitb.pt_html()
985
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 # 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
530 actions = (
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
531 ('edit', 'editItemAction'),
1468
f57759a5ee1a Better form name mangling, doesn't confuse other things like generic editing.
Richard Jones <richard@users.sourceforge.net>
parents: 1467
diff changeset
532 ('editcsv', 'editCSVAction'),
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
533 ('new', 'newItemAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
534 ('register', 'registerAction'),
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
535 ('confrego', 'confRegoAction'),
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
536 ('passrst', 'passResetAction'),
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
537 ('login', 'loginAction'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
538 ('logout', 'logout_action'),
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
539 ('search', 'searchAction'),
1277
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
540 ('retire', 'retireAction'),
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
541 ('show', 'showAction'),
1151
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
542 )
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
543 def handle_action(self):
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
544 ''' Determine whether there should be an Action called.
985
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 The action is defined by the form variable :action which
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
547 identifies the method on this object to call. The actions
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
548 are defined in the "actions" sequence on this class.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
549 '''
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
550 if self.form.has_key(':action'):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
551 action = self.form[':action'].value.lower()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
552 elif self.form.has_key('@action'):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
553 action = self.form['@action'].value.lower()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
554 else:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
555 return None
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
556 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
557 # get the action, validate it
1152
4cc99267bd23 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1151
diff changeset
558 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
559 if name == action:
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
560 break
7e0024954954 making it easier to add new actions, and more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1144
diff changeset
561 else:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
562 raise ValueError, 'No such action "%s"'%action
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 # 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
564 getattr(self, method)()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
565 except Redirect:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
566 raise
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
567 except Unauthorised:
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
568 raise
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 def write(self, content):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571 if not self.headers_done:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572 self.header()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 self.request.wfile.write(content)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
575 def header(self, headers=None, response=None):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
576 '''Put up the appropriate header.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
577 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
578 if headers is None:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
579 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
580 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
581 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
582
89bd02ffe4af tell clients/caches not to cache our dynamic bits
Richard Jones <richard@users.sourceforge.net>
parents: 1129
diff changeset
583 # 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
584 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
585
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
586 if not headers.has_key('Content-Type'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
587 headers['Content-Type'] = 'text/html'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
588 self.request.send_response(response)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
589 for entry in headers.items():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
590 self.request.send_header(*entry)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 self.request.end_headers()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
592 self.headers_done = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
593 if self.debug:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
594 self.headers_sent = headers
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
595
1235
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
596 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
597 ''' 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
598 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
599 '''
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
600 # TODO generate a much, much stronger session key ;)
1076
72d622b9bffd *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 1073
diff changeset
601 self.session = binascii.b2a_base64(repr(random.random())).strip()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
602
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
603 # clean up the base64
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
604 if self.session[-1] == '=':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
605 if self.session[-2] == '=':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
606 self.session = self.session[:-2]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
607 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
608 self.session = self.session[:-1]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
609
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
610 # insert the session in the sessiondb
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
611 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
612
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
613 # and commit immediately
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
614 self.db.sessions.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
615
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
616 # expire us in a long, long time
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
617 expire = Cookie._getdate(86400*365)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
618
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
619 # 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
620 self.additional_headers['Set-Cookie'] = \
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
621 '%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
622 expire, self.cookie_path)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
623
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
624 def make_user_anonymous(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
625 ''' Make us anonymous
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
626
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
627 This method used to handle non-existence of the 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
628 user, but that user is mandatory now.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
629 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
630 self.userid = self.db.user.lookup('anonymous')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
631 self.user = 'anonymous'
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
632
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633 def opendb(self, user):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
634 ''' Open the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
635 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
636 # open the db if the user has changed
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
637 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
638 if hasattr(self, 'db'):
75e5f2055ca9 missed a db close
Richard Jones <richard@users.sourceforge.net>
parents: 1161
diff changeset
639 self.db.close()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
640 self.db = self.instance.open(user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
641
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
642 #
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
643 # Actions
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 #
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
645 def loginAction(self):
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
646 ''' Attempt to log a user in.
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
647
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
648 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
649 credentials.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
650 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
651 # we need the username at a minimum
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
652 if not self.form.has_key('__login_name'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
653 self.error_message.append(_('Username required'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
654 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
655
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
656 # get the login info
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
657 self.user = self.form['__login_name'].value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
658 if self.form.has_key('__login_password'):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
659 password = self.form['__login_password'].value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
660 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
661 password = ''
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
662
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
663 # make sure the user exists
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
664 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
665 self.userid = self.db.user.lookup(self.user)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
666 except KeyError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
667 name = self.user
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
668 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
669 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
670 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
671
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
672 # 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
673 if not self.verifyPassword(self.userid, password):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
674 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
675 self.error_message.append(_('Incorrect password'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
676 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
677
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
678 # 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
679 if not self.loginPermission():
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
680 self.make_user_anonymous()
1252
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
681 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
682 return
1058
a55ef5a98fd3 more docco... and we need to check for web access Permission!
Richard Jones <richard@users.sourceforge.net>
parents: 1056
diff changeset
683
1236
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
684 # 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
685 self.opendb(self.user)
dd52bf10f934 Bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 1235
diff changeset
686
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
687 # 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
688 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
689
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
690 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
691 ''' 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
692 '''
1252
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
693 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
694 if password == stored:
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
695 return 1
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
696 if not password and not stored:
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
697 return 1
209a47ede743 allow blank passwords again [SF#619714]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
698 return 0
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
699
1064
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
700 def loginPermission(self):
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
701 ''' 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
702
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
703 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
704 '''
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
705 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
706 return 0
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
707 return 1
fca22f820f87 enforce login permission, fix to :required checking
Richard Jones <richard@users.sourceforge.net>
parents: 1058
diff changeset
708
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
709 def logout_action(self):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 ''' Make us really anonymous - nuke the cookie too
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
711 '''
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
712 # log us out
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 self.make_user_anonymous()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
714
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
715 # construct the logout cookie
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
716 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
717 self.additional_headers['Set-Cookie'] = \
1414
b4630d078c08 another attempt to fix cookie misbehaviour
Richard Jones <richard@users.sourceforge.net>
parents: 1409
diff changeset
718 '%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
719 now, self.cookie_path)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
720
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
721 # Let the user know what's going on
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
722 self.ok_message.append(_('You are logged out'))
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
723
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
724 def registerAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
725 '''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
726 and then set the cookie.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
727
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
728 return 1 on successful login
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
729 '''
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
730 # 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
731 try:
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
732 props = self.parsePropsFromForm()[0][('user', None)]
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
733 except (ValueError, KeyError), message:
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
734 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
735 return
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
736
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
737 # 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
738 if not self.registerPermission(props):
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
739 raise Unauthorised, _("You do not have permission to register")
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
740
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
741 try:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
742 self.db.user.lookup(props['username'])
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
743 self.error_message.append('Error: A user with the username "%s" '
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
744 'already exists'%props['username'])
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
745 return
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
746 except KeyError:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
747 pass
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
748
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
749 # generate the one-time-key and store the props for later
1583
caae7d8934dc set new email rego user password to random string
Richard Jones <richard@users.sourceforge.net>
parents: 1579
diff changeset
750 otk = ''.join([random.choice(chars) for x in range(32)])
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
751 for propname, proptype in self.db.user.getprops().items():
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
752 value = props.get(propname, None)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
753 if value is None:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
754 pass
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
755 elif isinstance(proptype, hyperdb.Date):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
756 props[propname] = str(value)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
757 elif isinstance(proptype, hyperdb.Interval):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
758 props[propname] = str(value)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
759 elif isinstance(proptype, hyperdb.Password):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
760 props[propname] = str(value)
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
761 props['__time'] = time.time()
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
762 self.db.otks.set(otk, **props)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
763
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
764 # send the email
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
765 tracker_name = self.db.config.TRACKER_NAME
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
766 subject = 'Complete your registration to %s'%tracker_name
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
767 body = '''
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
768 To complete your registration of the user "%(name)s" with %(tracker)s,
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
769 please visit the following URL:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
770
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
771 %(url)s?@action=confrego&otk=%(otk)s
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
772 '''%{'name': props['username'], 'tracker': tracker_name, 'url': self.base,
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
773 'otk': otk}
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
774 if not self.sendEmail(props['address'], subject, body):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
775 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
776
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
777 # commit changes to the database
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
778 self.db.commit()
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
779
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
780 # redirect to the "you're almost there" page
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
781 raise Redirect, '%suser?@template=rego_progress'%self.base
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
782
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
783 def sendEmail(self, to, subject, content):
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
784 # send email to the user's email address
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
785 message = StringIO.StringIO()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
786 writer = MimeWriter.MimeWriter(message)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
787 tracker_name = self.db.config.TRACKER_NAME
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
788 writer.addheader('Subject', encode_header(subject))
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
789 writer.addheader('To', to)
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
790 writer.addheader('From', roundupdb.straddr((tracker_name,
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
791 self.db.config.ADMIN_EMAIL)))
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
792 writer.addheader('Date', time.strftime("%a, %d %b %Y %H:%M:%S +0000",
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
793 time.gmtime()))
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
794 # add a uniquely Roundup header to help filtering
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
795 writer.addheader('X-Roundup-Name', tracker_name)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
796 # avoid email loops
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
797 writer.addheader('X-Roundup-Loop', 'hello')
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
798 writer.addheader('Content-Transfer-Encoding', 'quoted-printable')
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
799 body = writer.startbody('text/plain; charset=utf-8')
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
800
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
801 # message body, encoded quoted-printable
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
802 content = StringIO.StringIO(content)
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
803 quopri.encode(content, body, 0)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
804
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
805 if SENDMAILDEBUG:
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
806 # don't send - just write to a file
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
807 open(SENDMAILDEBUG, 'a').write('FROM: %s\nTO: %s\n%s\n'%(
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
808 self.db.config.ADMIN_EMAIL,
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
809 ', '.join(to),message.getvalue()))
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
810 else:
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
811 # now try to send the message
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
812 try:
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
813 # send the message as admin so bounces are sent there
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
814 # instead of to roundup
1612
e109d59f232d SMTP login and TLS support added ([SF#710853] with extras ;)
Richard Jones <richard@users.sourceforge.net>
parents: 1583
diff changeset
815 smtp = openSMTPConnection(self.db.config)
1524
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
816 smtp.sendmail(self.db.config.ADMIN_EMAIL, [to],
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
817 message.getvalue())
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
818 except socket.error, value:
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
819 self.error_message.append("Error: couldn't send email: "
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
820 "mailhost %s"%value)
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
821 return 0
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
822 except smtplib.SMTPException, msg:
1bb5e4dd12f3 fixed rego email bugs [SF#699809]
Richard Jones <richard@users.sourceforge.net>
parents: 1521
diff changeset
823 self.error_message.append("Error: couldn't send email: %s"%msg)
1538
3fb2872f9b7d bugfixes to rego/password reset
Richard Jones <richard@users.sourceforge.net>
parents: 1534
diff changeset
824 return 0
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
825 return 1
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
826
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
827 def registerPermission(self, props):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
828 ''' Determine whether the user has permission to register
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
829
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
830 Base behaviour is to check the user has "Web Registration".
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
831 '''
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
832 # registration isn't allowed to supply roles
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
833 if props.has_key('roles'):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
834 return 0
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
835 if self.db.security.hasPermission('Web Registration', self.userid):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
836 return 1
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
837 return 0
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
838
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
839 def confRegoAction(self):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
840 ''' Grab the OTK, use it to load up the new user details
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
841 '''
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
842 # pull the rego information out of the otk database
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
843 otk = self.form['otk'].value
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
844 props = self.db.otks.getall(otk)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
845 for propname, proptype in self.db.user.getprops().items():
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
846 value = props.get(propname, None)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
847 if value is None:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
848 pass
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
849 elif isinstance(proptype, hyperdb.Date):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
850 props[propname] = date.Date(value)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
851 elif isinstance(proptype, hyperdb.Interval):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
852 props[propname] = date.Interval(value)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
853 elif isinstance(proptype, hyperdb.Password):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
854 props[propname] = password.Password()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
855 props[propname].unpack(value)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
856
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
857 # re-open the database as "admin"
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
858 if self.user != 'admin':
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
859 self.opendb('admin')
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
860
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
861 # create the new user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
862 cl = self.db.user
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
863 # XXX we need to make the "default" page be able to display errors!
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
864 try:
1085
04a6b3bfbf23 instance_config -> config, and other related cleanups
Richard Jones <richard@users.sourceforge.net>
parents: 1084
diff changeset
865 props['roles'] = self.instance.config.NEW_WEB_USER_ROLES
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
866 del props['__time']
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
867 self.userid = cl.create(**props)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
868 # clear the props from the otk database
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
869 self.db.otks.destroy(otk)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
870 self.db.commit()
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
871 except (ValueError, KeyError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
872 self.error_message.append(str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
873 return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
874
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
875 # 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
876 self.user = cl.get(self.userid, 'username')
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
877 # re-open the database for real, using the user
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
878 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
879
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
880 # if we have a session, update it
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1244
diff changeset
881 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
882 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
883 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
884 else:
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
885 # new session cookie
7441653e5330 added hook for external password validation, and some more docco
Richard Jones <richard@users.sourceforge.net>
parents: 1225
diff changeset
886 self.set_cookie(self.user)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
887
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
888 # nice message
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1103
diff changeset
889 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
890
1521
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
891 # redirect to the user's page
1538
3fb2872f9b7d bugfixes to rego/password reset
Richard Jones <richard@users.sourceforge.net>
parents: 1534
diff changeset
892 raise Redirect, '%suser%s?@ok_message=%s'%(self.base,
3fb2872f9b7d bugfixes to rego/password reset
Richard Jones <richard@users.sourceforge.net>
parents: 1534
diff changeset
893 self.userid, urllib.quote(message))
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
894
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
895 def passResetAction(self):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
896 ''' Handle password reset requests.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
897
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
898 Presence of either "name" or "address" generate email.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
899 Presense of "otk" performs the reset.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
900 '''
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
901 if self.form.has_key('otk'):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
902 # pull the rego information out of the otk database
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
903 otk = self.form['otk'].value
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
904 uid = self.db.otks.get(otk, 'uid')
1552
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
905 if uid is None:
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
906 self.error_message.append('Invalid One Time Key!')
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
907 return
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
908
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
909 # re-open the database as "admin"
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
910 if self.user != 'admin':
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
911 self.opendb('admin')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
912
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
913 # change the password
1583
caae7d8934dc set new email rego user password to random string
Richard Jones <richard@users.sourceforge.net>
parents: 1579
diff changeset
914 newpw = password.generatePassword()
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
915
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
916 cl = self.db.user
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
917 # XXX we need to make the "default" page be able to display errors!
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
918 try:
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
919 # set the password
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
920 cl.set(uid, password=password.Password(newpw))
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
921 # clear the props from the otk database
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
922 self.db.otks.destroy(otk)
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
923 self.db.commit()
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
924 except (ValueError, KeyError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
925 self.error_message.append(str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
926 return
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
927
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
928 # user info
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
929 address = self.db.user.get(uid, 'address')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
930 name = self.db.user.get(uid, 'username')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
931
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
932 # send the email
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
933 tracker_name = self.db.config.TRACKER_NAME
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
934 subject = 'Password reset for %s'%tracker_name
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
935 body = '''
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
936 The password has been reset for username "%(name)s".
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
937
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
938 Your password is now: %(password)s
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
939 '''%{'name': name, 'password': newpw}
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
940 if not self.sendEmail(address, subject, body):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
941 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
942
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
943 self.ok_message.append('Password reset and email sent to %s'%address)
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
944 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
945
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
946 # no OTK, so now figure the user
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
947 if self.form.has_key('username'):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
948 name = self.form['username'].value
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
949 try:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
950 uid = self.db.user.lookup(name)
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
951 except KeyError:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
952 self.error_message.append('Unknown username')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
953 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
954 address = self.db.user.get(uid, 'address')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
955 elif self.form.has_key('address'):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
956 address = self.form['address'].value
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
957 uid = uidFromAddress(self.db, ('', address), create=0)
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
958 if not uid:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
959 self.error_message.append('Unknown email address')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
960 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
961 name = self.db.user.get(uid, 'username')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
962 else:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
963 self.error_message.append('You need to specify a username '
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
964 'or address')
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
965 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
966
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
967 # generate the one-time-key and store the props for later
1583
caae7d8934dc set new email rego user password to random string
Richard Jones <richard@users.sourceforge.net>
parents: 1579
diff changeset
968 otk = ''.join([random.choice(chars) for x in range(32)])
1477
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
969 self.db.otks.set(otk, uid=uid, __time=time.time())
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
970
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
971 # send the email
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
972 tracker_name = self.db.config.TRACKER_NAME
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
973 subject = 'Confirm reset of password for %s'%tracker_name
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
974 body = '''
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
975 Someone, perhaps you, has requested that the password be changed for your
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
976 username, "%(name)s". If you wish to proceed with the change, please follow
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
977 the link below:
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
978
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
979 %(url)suser?@template=forgotten&@action=passrst&otk=%(otk)s
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
980
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
981 You should then receive another email with the new password.
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
982 '''%{'name': name, 'tracker': tracker_name, 'url': self.base, 'otk': otk}
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
983 if not self.sendEmail(address, subject, body):
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
984 return
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
985
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
986 self.ok_message.append('Email sent to %s'%address)
ed725179953d Added password reset facility for forgotten passwords.
Richard Jones <richard@users.sourceforge.net>
parents: 1472
diff changeset
987
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
988 def editItemAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
989 ''' Perform an edit of an item in the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
990
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
991 See parsePropsFromForm and _editnodes for special variables
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
992 '''
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
993 # parse the props from the form
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
994 try:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
995 props, links = self.parsePropsFromForm()
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
996 except (ValueError, KeyError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
997 self.error_message.append(_('Error: ') + str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
998 return
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
999
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1000 # handle the props
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1001 try:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1002 message = self._editnodes(props, links)
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1003 except (ValueError, KeyError, IndexError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1004 self.error_message.append(_('Error: ') + str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1005 return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1006
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1007 # commit now that all the tricky stuff is done
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1008 self.db.commit()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1009
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1010 # redirect to the item's edit page
1521
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1011 raise Redirect, '%s%s%s?@ok_message=%s&@template=%s'%(self.base,
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1012 self.classname, self.nodeid, urllib.quote(message),
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1013 urllib.quote(self.template))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1014
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1015 def editItemPermission(self, props):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1016 ''' Determine whether the user has permission to edit this item.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1017
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1018 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
1019 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
1020 details. Unless it's the "roles" property, which requires the
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1021 special Permission "Web Roles".
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1022 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1023 # 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
1024 # we're OK
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1025 has = self.db.security.hasPermission
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1026 if self.classname == 'user':
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1027 # 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
1028 # right permission.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1029 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
1030 'user'):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1031 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1032 # 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
1033 if self.nodeid == self.userid:
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1034 return 1
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
1035 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
1036 return 1
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
1037 return 0
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1038
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1039 def newItemAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1040 ''' Add a new item to the database.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1041
1055
cf72eae57a2c Fixed instance installation
Richard Jones <richard@users.sourceforge.net>
parents: 1054
diff changeset
1042 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
1043 special form values.
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1044 '''
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1045 # parse the props from the form
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1046 try:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1047 props, links = self.parsePropsFromForm()
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1048 except (ValueError, KeyError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1049 self.error_message.append(_('Error: ') + str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1050 return
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1051
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1052 # handle the props - edit or create
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1053 try:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1054 # when it hits the None element, it'll set self.nodeid
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1055 messages = self._editnodes(props, links)
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1056
1520
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1057 except (ValueError, KeyError, IndexError), message:
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1058 # these errors might just be indicative of user dumbness
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1059 self.error_message.append(_('Error: ') + str(message))
9728e5c55633 re-enabled "expected" exception handlers
Richard Jones <richard@users.sourceforge.net>
parents: 1502
diff changeset
1060 return
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1061
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1062 # commit now that all the tricky stuff is done
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1063 self.db.commit()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1064
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1065 # redirect to the new item's page
1521
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1066 raise Redirect, '%s%s%s?@ok_message=%s&@template=%s'%(self.base,
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1067 self.classname, self.nodeid, urllib.quote(messages),
709bb731e96e remember the display template specified during edit [SF#701815]
Richard Jones <richard@users.sourceforge.net>
parents: 1520
diff changeset
1068 urllib.quote(self.template))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1069
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1070 def newItemPermission(self, props):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1071 ''' Determine whether the user has permission to create (edit) this
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1072 item.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1073
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1074 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
1075 additional property checks are made. Additionally, new user items
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1076 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
1077 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1078 has = self.db.security.hasPermission
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1079 if self.classname == 'user' and has('Web Registration', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1080 'user'):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1081 return 1
1005
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
1082 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
1083 return 1
efa19bdad6c3 reinstated registration, cleaned up PT compile error reporting
Richard Jones <richard@users.sourceforge.net>
parents: 1004
diff changeset
1084 return 0
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1085
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1086
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1087 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1088 # Utility methods for editing
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1089 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1090 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
1091 ''' 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
1092 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
1093 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1094 # 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
1095 deps = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1096 links = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1097 for cn, nodeid, propname, vlist in all_links:
1445
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1098 if not all_props.has_key((cn, nodeid)):
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1099 # link item to link to doesn't (and won't) exist
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1100 continue
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1101 for value in vlist:
1445
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1102 if not all_props.has_key(value):
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1103 # link item to link to doesn't (and won't) exist
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1104 continue
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1105 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
1106 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
1107
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1108 # figure chained dependencies ordering
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1109 order = []
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1110 done = {}
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1111 # loop detection
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1112 change = 0
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1113 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
1114 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
1115 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
1116 continue
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1117 tlist = deps.get(needed, [])
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1118 for target in tlist:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1119 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
1120 break
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1121 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1122 done[needed] = 1
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1123 order.append(needed)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1124 change = 1
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1125 if not change:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1126 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
1127
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1128 # now, edit / create
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1129 m = []
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1130 for needed in order:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1131 props = all_props[needed]
1446
8ce33ce262a4 fix property type check, and dont create items that have no properties
Richard Jones <richard@users.sourceforge.net>
parents: 1445
diff changeset
1132 if not props:
8ce33ce262a4 fix property type check, and dont create items that have no properties
Richard Jones <richard@users.sourceforge.net>
parents: 1445
diff changeset
1133 # nothing to do
8ce33ce262a4 fix property type check, and dont create items that have no properties
Richard Jones <richard@users.sourceforge.net>
parents: 1445
diff changeset
1134 continue
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1135 cn, nodeid = needed
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1136
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1137 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
1138 # 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
1139 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
1140
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1141 # 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
1142 if props:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1143 info = ', '.join(props.keys())
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1144 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
1145 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1146 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
1147 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1148 assert props
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1149
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1150 # make a new node
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1151 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
1152 if nodeid is None:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1153 self.nodeid = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1154 nodeid = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1155
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1156 # 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
1157 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
1158
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1159 # 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
1160 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
1161 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
1162 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
1163 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
1164 propdef = cl.getprops()[linkprop]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1165 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
1166 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
1167 # 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
1168 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
1169 props[linkprop] = [newid]
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1170 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1171 props[linkprop] = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1172 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1173 # 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
1174 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
1175 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
1176 existing.append(nodeid)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1177 props[linkprop] = existing
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1178 else:
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1179 props[linkprop] = newid
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1180
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1181 return '<br>'.join(m)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1182
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1183 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
1184 ''' 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
1185 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1186 # check for permission
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1187 if not self.editItemPermission(props):
1502
4013ef6690e9 fix [SF#700483]
Richard Jones <richard@users.sourceforge.net>
parents: 1498
diff changeset
1188 raise Unauthorised, 'You do not have permission to edit %s'%cn
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1189
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1190 # make the changes
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1191 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
1192 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
1193
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1194 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
1195 ''' 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
1196 '''
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1197 # check for permission
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1198 if not self.newItemPermission(props):
1502
4013ef6690e9 fix [SF#700483]
Richard Jones <richard@users.sourceforge.net>
parents: 1498
diff changeset
1199 raise Unauthorised, 'You do not have permission to create %s'%cn
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1200
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1201 # 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
1202 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
1203 return cl.create(**props)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1204
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1205 #
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1206 # More actions
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1207 #
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1208 def editCSVAction(self):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1209 ''' 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
1210
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1211 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
1212 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
1213 non-existent ID) and removed lines are retired.
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1214 '''
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1215 # this is per-class only
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1216 if not self.editCSVPermission():
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1217 self.error_message.append(
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1218 _('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
1219
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1220 # get the CSV module
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1221 try:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1222 import csv
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1223 except ImportError:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1224 self.error_message.append(_(
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1225 '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
1226 '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
1227 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1228
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1229 cl = self.db.classes[self.classname]
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1230 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
1231 idlessprops.sort()
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1232 props = ['id'] + idlessprops
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1233
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1234 # do the edit
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1235 rows = self.form['rows'].value.splitlines()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1236 p = csv.parser()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1237 found = {}
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1238 line = 0
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1239 for row in rows[1:]:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1240 line += 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1241 values = p.parse(row)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1242 # not a complete row, keep going
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1243 if not values: continue
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1244
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1245 # skip property names header
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1246 if values == props:
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1247 continue
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1248
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1249 # extract the nodeid
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1250 nodeid, values = values[0], values[1:]
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1251 found[nodeid] = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1252
1534
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1253 # see if the node exists
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1254 if cl.hasnode(nodeid):
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1255 exists = 1
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1256 else:
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1257 exists = 0
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1258
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1259 # confirm correct weight
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1260 if len(idlessprops) != len(values):
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1261 self.error_message.append(
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1262 _('Not enough values on line %(line)s')%{'line':line})
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1263 return
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1264
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1265 # extract the new values
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1266 d = {}
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1267 for name, value in zip(idlessprops, values):
1534
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1268 prop = cl.properties[name]
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1269 value = value.strip()
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1270 # only add the property if it has a value
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1271 if value:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1272 # if it's a multilink, split it
1534
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1273 if isinstance(prop, hyperdb.Multilink):
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1274 value = value.split(':')
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1275 d[name] = value
1534
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1276 elif exists:
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1277 # nuke the existing value
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1278 if isinstance(prop, hyperdb.Multilink):
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1279 d[name] = []
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1280 else:
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1281 d[name] = None
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1282
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1283 # perform the edit
1534
f0208e139234 can now unset values in CSV editing [SF#704788]
Richard Jones <richard@users.sourceforge.net>
parents: 1524
diff changeset
1284 if exists:
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1285 # edit existing
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1286 cl.set(nodeid, **d)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1287 else:
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1288 # new node
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1289 found[cl.create(**d)] = 1
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1290
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1291 # retire the removed entries
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1292 for nodeid in cl.list():
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1293 if not found.has_key(nodeid):
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1294 cl.retire(nodeid)
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1295
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1296 # all OK
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1297 self.db.commit()
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1298
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1299 self.ok_message.append(_('Items edited OK'))
985
55ab0c5b49f9 New CGI interface support
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1300
1041
c28603c9f831 Class help and generic class editing done.
Richard Jones <richard@users.sourceforge.net>
parents: 1029
diff changeset
1301 def editCSVPermission(self):
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1302 ''' Determine whether the user has permission to edit this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1303
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1304 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
1305 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1306 if not self.db.security.hasPermission('Edit', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1307 self.classname):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1308 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1309 return 1
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1310
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1311 def searchAction(self, wcre=re.compile(r'[\s,]+')):
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1312 ''' Mangle some of the form variables.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1313
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1314 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
1315 filter variables - if they're set to anything other than
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1316 "dontcare" then add them to :filter.
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1317
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1318 Handle the ":queryname" variable and save off the query to
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1319 the user's query list.
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1320
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1321 Split any String query values on whitespace and comma.
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1322 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1323 # generic edit is per-class only
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1324 if not self.searchPermission():
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1325 self.error_message.append(
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1326 _('You do not have permission to search %s' %self.classname))
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1327
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1328 # add a faked :filter form variable for each filtering prop
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1329 props = self.db.classes[self.classname].getprops()
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1330 queryname = ''
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1331 for key in self.form.keys():
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1332 # special vars
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1333 if self.FV_QUERYNAME.match(key):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1334 queryname = self.form[key].value.strip()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1335 continue
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1336
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1337 if not props.has_key(key):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1338 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
1339 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
1340 # 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
1341 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
1342 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
1343 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
1344 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
1345 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
1346 else:
1552
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
1347 if not self.form[key].value:
68ef6deefcf1 cgi fixes
Richard Jones <richard@users.sourceforge.net>
parents: 1538
diff changeset
1348 continue
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1349 if isinstance(props[key], hyperdb.String):
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1350 v = self.form[key].value
1634
e5e00d3a3fe2 better string splitting
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
1351 l = token.token_split(v)
e5e00d3a3fe2 better string splitting
Richard Jones <richard@users.sourceforge.net>
parents: 1631
diff changeset
1352 if len(l) > 1 or l[0] != v:
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1353 self.form.value.remove(self.form[key])
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1354 # replace the single value with the split list
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1355 for v in l:
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1356 self.form.value.append(cgi.MiniFieldStorage(key, v))
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1357
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1358 self.form.value.append(cgi.MiniFieldStorage('@filter', key))
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1359
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1360 # handle saving the query params
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1361 if queryname:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1362 # parse the environment and figure what the query _is_
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1363 req = HTMLRequest(self)
1730
2dd6b4c825e9 Final touches to fix query editing. It should work now.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1724
diff changeset
1364
2dd6b4c825e9 Final touches to fix query editing. It should work now.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1724
diff changeset
1365 # The [1:] strips off the '?' character, it isn't part of the
2dd6b4c825e9 Final touches to fix query editing. It should work now.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1724
diff changeset
1366 # query string.
2dd6b4c825e9 Final touches to fix query editing. It should work now.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1724
diff changeset
1367 url = req.indexargs_href('', {})[1:]
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1368
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1369 # handle editing an existing query
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1370 try:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1371 qid = self.db.query.lookup(queryname)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1372 self.db.query.set(qid, klass=self.classname, url=url)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1373 except KeyError:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1374 # create a query
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1375 qid = self.db.query.create(name=queryname,
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1376 klass=self.classname, url=url)
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1377
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1378 # and add it to the user's query multilink
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1379 queries = self.db.user.get(self.userid, 'queries')
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1380 queries.append(qid)
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1381 self.db.user.set(self.userid, queries=queries)
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1382
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1383 # commit the query change to the database
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1384 self.db.commit()
1016
d6c13142e7b9 Keep a cache of compiled PageTemplates.
Richard Jones <richard@users.sourceforge.net>
parents: 1008
diff changeset
1385
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1386 def searchPermission(self):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1387 ''' Determine whether the user has permission to search this class.
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1388
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1389 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
1390 '''
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1391 if not self.db.security.hasPermission('View', self.userid,
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1392 self.classname):
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1393 return 0
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1394 return 1
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1395
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1396
1277
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1397 def retireAction(self):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1398 ''' 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
1399 '''
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1400 # 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
1401 # 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
1402 nodeid = self.nodeid
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1403 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
1404 self.nodeid = None
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1405
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1406 # 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
1407 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
1408 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
1409 _('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
1410 return
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1411
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1412 # 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
1413 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
1414 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
1415 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
1416 _('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
1417 return
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1418
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1419 # do the retire
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1420 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
1421 self.db.commit()
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1422
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1423 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
1424 _('%(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
1425 '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
1426
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1427 def retirePermission(self):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1428 ''' 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
1429
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1430 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
1431 '''
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1432 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
1433 self.classname):
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1434 return 0
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1435 return 1
a9a3c378acc2 implemented "retire" cgi action, added to user index [SF#618612]
Richard Jones <richard@users.sourceforge.net>
parents: 1254
diff changeset
1436
1003
f89b8d32291b Hack hack hack...
Richard Jones <richard@users.sourceforge.net>
parents: 1002
diff changeset
1437
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1438 def showAction(self, typere=re.compile('[@:]type'),
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1439 numre=re.compile('[@:]number')):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1440 ''' Show a node of a particular class/id
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1441 '''
1467
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1442 t = n = ''
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1443 for key in self.form.keys():
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1444 if typere.match(key):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1445 t = self.form[key].value.strip()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1446 elif numre.match(key):
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1447 n = self.form[key].value.strip()
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1448 if not t:
378081f066cc registration is now a two-step process with confirmation from the
Richard Jones <richard@users.sourceforge.net>
parents: 1456
diff changeset
1449 raise ValueError, 'Invalid %s number'%t
1407
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1450 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
1451 raise Redirect, url
f7c24fd93dfe added a form to show a specific issue
Richard Jones <richard@users.sourceforge.net>
parents: 1402
diff changeset
1452
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1453 def parsePropsFromForm(self, num_re=re.compile('^\d+$')):
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1454 ''' Item properties and their values are edited with html FORM
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1455 variables and their values. You can:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1456
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1457 - Change the value of some property of the current item.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1458 - Create a new item of any class, and edit the new item's
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1459 properties,
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1460 - Attach newly created items to a multilink property of the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1461 current item.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1462 - Remove items from a multilink property of the current item.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1463 - Specify that some properties are required for the edit
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1464 operation to be successful.
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1465
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1466 In the following, <bracketed> values are variable, "@" may be
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1467 either ":" or "@", and other text "required" is fixed.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1468
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1469 Most properties are specified as form variables:
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1470
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1471 <propname>
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1472 - property on the current context item
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1473
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1474 <designator>"@"<propname>
1638
4a47eb555e51 more doc
Richard Jones <richard@users.sourceforge.net>
parents: 1634
diff changeset
1475 - property on the indicated item (for editing related
4a47eb555e51 more doc
Richard Jones <richard@users.sourceforge.net>
parents: 1634
diff changeset
1476 information)
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1477
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1478 Designators name a specific item of a class.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1479
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1480 <classname><N>
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1481
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1482 Name an existing item of class <classname>.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1483
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1484 <classname>"-"<N>
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1485
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1486 Name the <N>th new item of class <classname>. If the form
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1487 submission is successful, a new item of <classname> is
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1488 created. Within the submitted form, a particular
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1489 designator of this form always refers to the same new
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1490 item.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1491
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1492 Once we have determined the "propname", we look at it to see
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1493 if it's special:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1494
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1495 @required
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1496 The associated form value is a comma-separated list of
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1497 property names that must be specified when the form is
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1498 submitted for the edit operation to succeed.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1499
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1500 When the <designator> is missing, the properties are
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1501 for the current context item. When <designator> is
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1502 present, they are for the item specified by
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1503 <designator>.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1504
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1505 The "@required" specifier must come before any of the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1506 properties it refers to are assigned in the form.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1507
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1508 @remove@<propname>=id(s) or @add@<propname>=id(s)
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1509 The "@add@" and "@remove@" edit actions apply only to
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1510 Multilink properties. The form value must be a
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1511 comma-separate list of keys for the class specified by
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1512 the simple form variable. The listed items are added
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1513 to (respectively, removed from) the specified
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1514 property.
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1515
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1516 @link@<propname>=<designator>
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1517 If the edit action is "@link@", the simple form
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1518 variable must specify a Link or Multilink property.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1519 The form value is a comma-separated list of
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1520 designators. The item corresponding to each
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1521 designator is linked to the property given by simple
1689
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1522 form variable. These are collected up and returned in
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1523 all_links.
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1524
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1525 None of the above (ie. just a simple form value)
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1526 The value of the form variable is converted
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1527 appropriately, depending on the type of the property.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1528
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1529 For a Link('klass') property, the form value is a
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1530 single key for 'klass', where the key field is
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1531 specified in dbinit.py.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1532
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1533 For a Multilink('klass') property, the form value is a
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1534 comma-separated list of keys for 'klass', where the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1535 key field is specified in dbinit.py.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1536
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1537 Note that for simple-form-variables specifiying Link
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1538 and Multilink properties, the linked-to class must
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1539 have a key field.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1540
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1541 For a String() property specifying a filename, the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1542 file named by the form value is uploaded. This means we
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1543 try to set additional properties "filename" and "type" (if
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1544 they are valid for the class). Otherwise, the property
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1545 is set to the form value.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1546
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1547 For Date(), Interval(), Boolean(), and Number()
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1548 properties, the form value is converted to the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1549 appropriate
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1550
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1551 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
1552 designator.
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1553
1654
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1554 Two special form values are supported for backwards
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1555 compatibility:
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1556
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1557 @note
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1558 This is equivalent to::
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1559
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1560 @link@messages=msg-1
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1561 @msg-1@content=value
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1562
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1563 except that in addition, the "author" and "date"
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1564 properties of "msg-1" are set to the userid of the
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1565 submitter, and the current time, respectively.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1566
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1567 @file
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1568 This is equivalent to::
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1569
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1570 @link@files=file-1
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1571 @file-1@content=value
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1572
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1573 The String content value is handled as described above for
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1574 file uploads.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1575
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1576 If both the "@note" and "@file" form variables are
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1577 specified, the action::
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1578
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1579 @link@msg-1@files=file-1
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1580
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1581 is also performed.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1582
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1583 We also check that FileClass items have a "content" property with
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1584 actual content, otherwise we remove them from all_props before
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1585 returning.
284c26c1ef19 aargh, b2 was b0rken
Richard Jones <richard@users.sourceforge.net>
parents: 1638
diff changeset
1586
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1587 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
1588 (classname, id): properties
1422
5599f1990325 more info in docstring
Richard Jones <richard@users.sourceforge.net>
parents: 1421
diff changeset
1589 ... 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
1590 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
1591 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
1592 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
1593 created.
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1594 '''
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1595 # some very useful variables
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1596 db = self.db
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1597 form = self.form
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1598
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1599 if not hasattr(self, 'FV_SPECIAL'):
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1600 # 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
1601 classes = '|'.join(db.classes.keys())
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1602 # specials for parsePropsFromForm
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1603 # 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
1604 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
1605 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
1606
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1607 # these indicate the default class / item
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1608 default_cn = self.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1609 default_cl = self.db.classes[default_cn]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1610 default_nodeid = self.nodeid
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1611
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1612 # we'll store info about the individual class/item edit in these
1689
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1613 all_required = {} # required props per class/item
1692
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1614 all_props = {} # props to set per class/item
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1615 got_props = {} # props received per class/item
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1616 all_propdef = {} # note - only one entry per class
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1617 all_links = [] # as many as are required
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1618
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1619 # 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
1620 all_props[(default_cn, default_nodeid)] = {}
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1621
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1622 keys = form.keys()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1623 timezone = db.getUserTimezone()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1624
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1625 # 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
1626 have_note = have_file = 0
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1627
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1628 # 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
1629 matches = []
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1630 for key in keys:
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1631 m = self.FV_SPECIAL.match(key)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1632 if m:
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1633 matches.append((key, m.groupdict()))
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1634
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1635 # now handle the matches
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1636 for key, d in matches:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1637 if d['classname']:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1638 # we got a designator
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1639 cn = d['classname']
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1640 cl = self.db.classes[cn]
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1641 nodeid = d['id']
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1642 propname = d['propname']
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1643 elif d['note']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1644 # the special note field
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1645 cn = 'msg'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1646 cl = self.db.classes[cn]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1647 nodeid = '-1'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1648 propname = 'content'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1649 all_links.append((default_cn, default_nodeid, 'messages',
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1650 [('msg', '-1')]))
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1651 have_note = 1
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1652 elif d['file']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1653 # the special file field
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1654 cn = 'file'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1655 cl = self.db.classes[cn]
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1656 nodeid = '-1'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1657 propname = 'content'
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1658 all_links.append((default_cn, default_nodeid, 'files',
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1659 [('file', '-1')]))
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1660 have_file = 1
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1661 else:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1662 # default
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1663 cn = default_cn
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1664 cl = default_cl
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1665 nodeid = default_nodeid
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1666 propname = d['propname']
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1667
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1668 # the thing this value relates to is...
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1669 this = (cn, nodeid)
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1670
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1671 # 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
1672 # form props for it
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1673 if not all_propdef.has_key(cn):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1674 all_propdef[cn] = cl.getprops()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1675 propdef = all_propdef[cn]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1676 if not all_props.has_key(this):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1677 all_props[this] = {}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1678 props = all_props[this]
1692
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1679 if not got_props.has_key(this):
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1680 got_props[this] = {}
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1681
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1682 # is this a link command?
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1683 if d['link']:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1684 value = []
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1685 for entry in extractFormList(form[key]):
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1686 m = self.FV_DESIGNATOR.match(entry)
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1687 if not m:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1688 raise ValueError, \
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1689 '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
1690 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
1691
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1692 # make sure the link property is valid
1446
8ce33ce262a4 fix property type check, and dont create items that have no properties
Richard Jones <richard@users.sourceforge.net>
parents: 1445
diff changeset
1693 if (not isinstance(propdef[propname], hyperdb.Multilink) and
8ce33ce262a4 fix property type check, and dont create items that have no properties
Richard Jones <richard@users.sourceforge.net>
parents: 1445
diff changeset
1694 not isinstance(propdef[propname], hyperdb.Link)):
1444
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1695 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
1696 'multilink property'%(cn, propname)
8c5a513e52c9 Form handling now performs all actions in one go.
Richard Jones <richard@users.sourceforge.net>
parents: 1443
diff changeset
1697
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1698 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
1699 continue
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1700
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1701 # detect the special ":required" variable
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1702 if d['required']:
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1703 all_required[this] = extractFormList(form[key])
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1704 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1705
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1706 # 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
1707 mlaction = 'set'
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1708 if d['remove']:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1709 mlaction = 'remove'
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1710 elif d['add']:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1711 mlaction = 'add'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1712
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1713 # does the property exist?
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1714 if not propdef.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1715 if mlaction != 'set':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1716 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
1717 ' the property "%s" which doesn\'t exist'%(mlaction,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1718 propname)
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1719 # 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
1720 # about - ignore it
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1721 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1722 proptype = propdef[propname]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1723
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1724 # 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
1725 # of MiniFieldStorages.
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1726 value = form[key]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1727
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1728 # handle unpacking of the MiniFieldStorage / list form value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1729 if isinstance(proptype, hyperdb.Multilink):
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1730 value = extractFormList(value)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1731 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1732 # multiple values are not OK
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1733 if isinstance(value, type([])):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1734 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
1735 ' for the %s property'%propname
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1736 # value might be a file upload...
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1737 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
1738 # nope, pull out the value and strip it
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1739 value = value.value.strip()
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1740
1426
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1741 # 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
1742 # 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
1743 if d['note'] and value:
1426
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1744 props['author'] = self.db.getuid()
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1745 props['date'] = date.Date()
b79b1823af7b more fixes for backward-compatibility form entries
Richard Jones <richard@users.sourceforge.net>
parents: 1425
diff changeset
1746
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1747 # handle by type now
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1748 if isinstance(proptype, hyperdb.Password):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1749 if not value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1750 # ignore empty password values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1751 continue
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1752 for key, d in matches:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1753 if d['confirm'] and d['propname'] == propname:
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1754 confirm = form[key]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1755 break
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1756 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1757 raise ValueError, 'Password and confirmation text do '\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1758 'not match'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1759 if isinstance(confirm, type([])):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1760 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
1761 ' for the %s property'%propname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1762 if value != confirm.value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1763 raise ValueError, 'Password and confirmation text do '\
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1764 'not match'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1765 value = password.Password(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1766
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1767 elif isinstance(proptype, hyperdb.Link):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1768 # see if it's the "no selection" choice
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1769 if value == '-1' or not value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1770 # 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
1771 if not nodeid or nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1772 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1773 value = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1774 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1775 # handle key values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1776 link = proptype.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1777 if not num_re.match(value):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1778 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1779 value = db.classes[link].lookup(value)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1780 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1781 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1782 '%(value)s not a %(classname)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1783 'propname': propname, 'value': value,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1784 'classname': link}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1785 except TypeError, message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1786 raise ValueError, _('you may only enter ID values '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1787 'for property "%(propname)s": %(message)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1788 'propname': propname, 'message': message}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1789 elif isinstance(proptype, hyperdb.Multilink):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1790 # perform link class key value lookup if necessary
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1791 link = proptype.classname
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1792 link_cl = db.classes[link]
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1793 l = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1794 for entry in value:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1795 if not entry: continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1796 if not num_re.match(entry):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1797 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1798 entry = link_cl.lookup(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1799 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1800 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1801 '"%(value)s" not an entry of %(classname)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1802 'propname': propname, 'value': entry,
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1803 'classname': link}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1804 except TypeError, message:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1805 raise ValueError, _('you may only enter ID values '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1806 'for property "%(propname)s": %(message)s')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1807 'propname': propname, 'message': message}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1808 l.append(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1809 l.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1810
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1811 # 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
1812 if mlaction == 'set':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1813 value = l
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1814 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1815 # 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
1816 if props.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1817 existing = props[propname]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1818 elif nodeid and not nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1819 existing = cl.get(nodeid, propname, [])
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1820 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1821 existing = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1822
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1823 # now either remove or add
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1824 if mlaction == 'remove':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1825 # 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
1826 # the list
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1827 for entry in l:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1828 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1829 existing.remove(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1830 except ValueError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1831 raise ValueError, _('property "%(propname)s": '
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1832 '"%(value)s" not currently in list')%{
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1833 'propname': propname, 'value': entry}
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1834 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1835 # add - easy, just don't dupe
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1836 for entry in l:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1837 if entry not in existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1838 existing.append(entry)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1839 value = existing
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1840 value.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1841
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1842 elif value == '':
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1843 # 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
1844 if not nodeid or nodeid.startswith('-'):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1845 continue
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1846 # 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
1847 value = None
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1848 else:
1562
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1849 # handle ValueErrors for all these in a similar fashion
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1850 try:
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1851 if isinstance(proptype, hyperdb.String):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1852 if (hasattr(value, 'filename') and
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1853 value.filename is not None):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1854 # skip if the upload is empty
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1855 if not value.filename:
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1856 continue
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1857 # this String is actually a _file_
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1858 # try to determine the file content-type
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1859 fn = value.filename.split('\\')[-1]
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1860 if propdef.has_key('name'):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1861 props['name'] = fn
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1862 # use this info as the type/filename properties
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1863 if propdef.has_key('type'):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1864 props['type'] = mimetypes.guess_type(fn)[0]
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1865 if not props['type']:
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1866 props['type'] = "application/octet-stream"
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1867 # finally, read the content
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1868 value = value.value
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1869 else:
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1870 # normal String fix the CRLF/CR -> LF stuff
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1871 value = fixNewlines(value)
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1872
1562
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1873 elif isinstance(proptype, hyperdb.Date):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1874 value = date.Date(value, offset=timezone)
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1875 elif isinstance(proptype, hyperdb.Interval):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1876 value = date.Interval(value)
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1877 elif isinstance(proptype, hyperdb.Boolean):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1878 value = value.lower() in ('yes', 'true', 'on', '1')
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1879 elif isinstance(proptype, hyperdb.Number):
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1880 value = float(value)
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1881 except ValueError, msg:
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1882 raise ValueError, _('Error with %s property: %s')%(
b975da59cd11 handle invalid data input in forms better
Richard Jones <richard@users.sourceforge.net>
parents: 1552
diff changeset
1883 propname, msg)
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1884
1692
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1885 # register that we got this property
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1886 if value:
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1887 got_props[this][propname] = 1
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1888
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1889 # get the old value
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1890 if nodeid and not nodeid.startswith('-'):
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1891 try:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1892 existing = cl.get(nodeid, propname)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1893 except KeyError:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1894 # 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
1895 # no existing value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1896 if not propdef.has_key(propname):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1897 raise
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1898
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1899 # make sure the existing multilink is sorted
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1900 if isinstance(proptype, hyperdb.Multilink):
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1901 existing.sort()
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1902
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1903 # "missing" existing values may not be None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1904 if not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1905 if isinstance(proptype, hyperdb.String) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1906 # some backends store "missing" Strings as empty strings
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1907 existing = None
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1908 elif isinstance(proptype, hyperdb.Number) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1909 # some backends store "missing" Numbers as 0 :(
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1910 existing = 0
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1911 elif isinstance(proptype, hyperdb.Boolean) and not existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1912 # likewise Booleans
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1913 existing = 0
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1914
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1915 # if changed, set it
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1916 if value != existing:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1917 props[propname] = value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1918 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1919 # don't bother setting empty/unset values
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1920 if value is None:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1921 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1922 elif isinstance(proptype, hyperdb.Multilink) and value == []:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1923 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1924 elif isinstance(proptype, hyperdb.String) and value == '':
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1925 continue
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1926
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1927 props[propname] = value
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1928
1438
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1929 # 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
1930 if have_note and have_file:
13c42b803101 Better handling of the form variable labels.
Richard Jones <richard@users.sourceforge.net>
parents: 1437
diff changeset
1931 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
1932
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1933 # 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
1934 s = []
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1935 for thing, required in all_required.items():
1689
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1936 # register the values we got
1692
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1937 got = got_props.get(thing, {})
1690
Richard Jones <richard@users.sourceforge.net>
parents: 1689
diff changeset
1938 for entry in required[:]:
1692
64f448ff07f2 audit some user properties for valid values (roles, address)
Richard Jones <richard@users.sourceforge.net>
parents: 1690
diff changeset
1939 if got.has_key(entry):
1689
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1940 required.remove(entry)
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1941
aca6de3e5eac fix :required ordering problem [SF#740214]
Richard Jones <richard@users.sourceforge.net>
parents: 1684
diff changeset
1942 # any required values not present?
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1943 if not required:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1944 continue
1690
Richard Jones <richard@users.sourceforge.net>
parents: 1689
diff changeset
1945
Richard Jones <richard@users.sourceforge.net>
parents: 1689
diff changeset
1946 # tell the user to entry the values required
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1947 if len(required) > 1:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1948 p = 'properties'
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1949 else:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1950 p = 'property'
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1951 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
1952 ', '.join(required)))
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1953 if s:
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1954 raise ValueError, '\n'.join(s)
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1955
1731
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1956 # When creating a FileClass node, it should have a non-empty content
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1957 # property to be created. When editing a FileClass node, it should
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1958 # either have a non-empty content property or no property at all. In
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1959 # the latter case, nothing will change.
1442
b42fa71754c9 don't attempt to create FileClass items if no content is supplied
Richard Jones <richard@users.sourceforge.net>
parents: 1438
diff changeset
1960 for (cn, id), props in all_props.items():
1731
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1961 if isinstance(self.db.classes[cn], hyperdb.FileClass):
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1962 if id == '-1':
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1963 if not props.get('content', ''):
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1964 del all_props[(cn, id)]
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1965 elif props.has_key('content') and not props['content']:
778056dc420f Fixed editing properties on FileClass nodes.
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1730
diff changeset
1966 raise ValueError, _('File is empty')
1445
0bbc8be96592 handle links to nonexisting items better
Richard Jones <richard@users.sourceforge.net>
parents: 1444
diff changeset
1967 return all_props, all_links
1420
3ac43c62a250 implemented extension to form parsing...
Richard Jones <richard@users.sourceforge.net>
parents: 1417
diff changeset
1968
1254
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1969 def fixNewlines(text):
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1970 ''' Homogenise line endings.
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1971
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1972 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
1973 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
1974 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
1975 '''
77920c42aeb9 Expose the tracker config as a variable for templating
Richard Jones <richard@users.sourceforge.net>
parents: 1252
diff changeset
1976 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
1977 return text.replace('\r', '\n')
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1978
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1979 def extractFormList(value):
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1980 ''' Extract a list of values from the form value.
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1981
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1982 It may be one of:
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1983 [MiniFieldStorage('value'), MiniFieldStorage('value','value',...), ...]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1984 MiniFieldStorage('value,value,...')
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1985 MiniFieldStorage('value')
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1986 '''
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1987 # multiple values are OK
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1988 if isinstance(value, type([])):
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1989 # it's a list of MiniFieldStorages - join then into
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1990 values = ','.join([i.value.strip() for i in value])
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1991 else:
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1992 # 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
1993 # of values
1631
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1994 values = value.value
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1995
8a908bbad1ef A couple of form value handling changes:
Richard Jones <richard@users.sourceforge.net>
parents: 1612
diff changeset
1996 value = [i.strip() for i in values.split(',')]
1425
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1997
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1998 # filter out the empty bits
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
1999 return filter(None, value)
58ce2c1614cd new form handling complete
Richard Jones <richard@users.sourceforge.net>
parents: 1422
diff changeset
2000

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