Skip to content

Commit bf684d6

Browse files
author
Richard Jones
committed
enable editing of public queries [SF#966144]
1 parent dcd48e6 commit bf684d6

File tree

6 files changed

+91
-22
lines changed

6 files changed

+91
-22
lines changed

CHANGES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Fixed:
4444
when editing is not allowed
4545
- fix StructuredText import in cgi.templating
4646
- have "System Messages" be marked as such again (sf bug 1281907)
47+
- enable editing of public queries (sf bug 966144)
4748

4849

4950
2005-10-07 0.9.0b1

doc/upgrading.txt

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,44 @@ steps.
1313

1414
.. contents::
1515

16-
Migrating from 0.8.x to 0.9.0
17-
=============================
16+
Migrating from 0.8.x to 1.0
17+
===========================
18+
19+
1.0 New Query Permissions
20+
-------------------------
1821

19-
No upgrade steps are required.
22+
New permissions are defined for query editing and viewing. To include these
23+
in your tracker, you need to add these lines to your tracker's
24+
``schema.py``::
25+
26+
# Users should be able to edit and view their own queries. They should also
27+
# be able to view any marked as not private. They should not be able to
28+
# edit others' queries, even if they're not private
29+
def view_query(db, userid, itemid):
30+
private_for = db.query.get(itemid, 'private_for')
31+
if not private_for: return True
32+
return userid == private_for
33+
def edit_query(db, userid, itemid):
34+
return userid == db.query.get(itemid, 'creator')
35+
p = db.security.addPermission(name='View', klass='query', check=view_query,
36+
description="User is allowed to view their own and public queries")
37+
db.security.addPermissionToRole('User', p)
38+
p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
39+
description="User is allowed to edit their queries")
40+
db.security.addPermissionToRole('User', p)
41+
p = db.security.addPermission(name='Create', klass='query',
42+
description="User is allowed to create queries")
43+
db.security.addPermissionToRole('User', p)
44+
45+
and then remove 'query' from the line::
46+
47+
# Assign the access and edit Permissions for issue, file and message
48+
# to regular users now
49+
for cl in 'issue', 'file', 'msg', 'query', 'keyword':
50+
51+
so it looks like::
52+
53+
for cl in 'issue', 'file', 'msg', 'keyword':
2054

2155

2256
Migrating from 0.8.0 to 0.8.3

roundup/cgi/actions.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#$Id: actions.py,v 1.55 2006-01-25 03:14:40 richard Exp $
1+
#$Id: actions.py,v 1.56 2006-01-27 03:30:38 richard Exp $
22

33
import re, cgi, StringIO, urllib, Cookie, time, random, csv, codecs
44

@@ -148,6 +148,12 @@ def handle(self):
148148
"""
149149
self.fakeFilterVars()
150150
queryname = self.getQueryName()
151+
152+
# editing existing query name?
153+
old_queryname = ''
154+
for key in ('@old-queryname', ':old-queryname'):
155+
if self.form.has_key(key):
156+
old_queryname = self.form[key].value.strip()
151157

152158
# handle saving the query params
153159
if queryname:
@@ -162,7 +168,7 @@ def handle(self):
162168
if key:
163169
# edit the old way, only one query per name
164170
try:
165-
qid = self.db.query.lookup(queryname)
171+
qid = self.db.query.lookup(old_queryname)
166172
if not self.hasPermission('Edit', 'query', itemid=qid):
167173
raise exceptions.Unauthorised, self._(
168174
"You do not have permission to edit queries")
@@ -178,23 +184,24 @@ def handle(self):
178184
# edit the new way, query name not a key any more
179185
# see if we match an existing private query
180186
uid = self.db.getuid()
181-
qids = self.db.query.filter(None, {'name': queryname,
187+
qids = self.db.query.filter(None, {'name': old_queryname,
182188
'private_for': uid})
183189
if not qids:
184190
# ok, so there's not a private query for the current user
185-
# - see if there's a public one created by them
186-
qids = self.db.query.filter(None, {'name': queryname,
187-
'private_for': -1, 'creator': uid})
191+
# - see if there's one created by them
192+
qids = self.db.query.filter(None, {'name': old_queryname,
193+
'creator': uid})
188194

189195
if qids:
190196
# edit query - make sure we get an exact match on the name
191197
for qid in qids:
192-
if queryname != self.db.query.get(qid, 'name'):
198+
if old_queryname != self.db.query.get(qid, 'name'):
193199
continue
194200
if not self.hasPermission('Edit', 'query', itemid=qid):
195201
raise exceptions.Unauthorised, self._(
196202
"You do not have permission to edit queries")
197-
self.db.query.set(qid, klass=self.classname, url=url)
203+
self.db.query.set(qid, klass=self.classname,
204+
url=url, name=queryname)
198205
else:
199206
# create a query
200207
if not self.hasPermission('Create', 'query'):
@@ -239,10 +246,9 @@ def fakeFilterVars(self):
239246

240247
self.form.value.append(cgi.MiniFieldStorage('@filter', key))
241248

242-
FV_QUERYNAME = re.compile(r'[@:]queryname')
243249
def getQueryName(self):
244-
for key in self.form.keys():
245-
if self.FV_QUERYNAME.match(key):
250+
for key in ('@queryname', ':queryname'):
251+
if self.form.has_key(key):
246252
return self.form[key].value.strip()
247253
return ''
248254

templates/classic/html/issue.search.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,11 @@
189189
</tr>
190190

191191
<tr tal:condition="python:request.user.hasPermission('Edit', 'query')">
192-
<th i18n:translate="">Query name**:</th>
193-
<td><input name="@queryname"
194-
tal:attributes="value request/form/@queryname/value | default"></td>
192+
<th i18n:translate="">Query name**:</th>
193+
<td tal:define="value request/form/@queryname/value | nothing">
194+
<input name="@queryname" tal:attributes="value value">
195+
<input type="hidden" name="@old-queryname" tal:attributes="value value">
196+
</td>
195197
</tr>
196198

197199
<tr>

templates/classic/html/query.edit.html

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,19 @@
8787
tal:content="query/name">query</a></td>
8888

8989
<td metal:use-macro="template/macros/include" />
90-
<td colspan="3" i18n:translate="">[not yours to edit]</td>
90+
91+
<td colspan="3" tal:condition="query/is_edit_ok">
92+
<a tal:attributes="href string:query${query/id}" i18n:translate="">edit</a>
93+
</td>
94+
<td tal:condition="not:query/is_edit_ok" colspan="3"
95+
i18n:translate="">[not yours to edit]</td>
96+
9197
</tr>
9298

9399
<tr><td colspan="5">
94-
<input type="hidden" name="@action" value="edit">
95-
<input type="hidden" name="@template" value="edit">
96-
<input type="submit" value="Save Selection" i18n:attributes="value">
100+
<input type="hidden" name="@action" value="edit">
101+
<input type="hidden" name="@template" value="edit">
102+
<input type="submit" value="Save Selection" i18n:attributes="value">
97103
</td></tr>
98104

99105
</table>

templates/classic/schema.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090

9191
# Assign the access and edit Permissions for issue, file and message
9292
# to regular users now
93-
for cl in 'issue', 'file', 'msg', 'query', 'keyword':
93+
for cl in 'issue', 'file', 'msg', 'keyword':
9494
db.security.addPermissionToRole('User', 'View', cl)
9595
db.security.addPermissionToRole('User', 'Edit', cl)
9696
db.security.addPermissionToRole('User', 'Create', cl)
@@ -113,6 +113,26 @@ def own_record(db, userid, itemid):
113113
description="User is allowed to edit their own user details")
114114
db.security.addPermissionToRole('User', p)
115115

116+
# Users should be able to edit and view their own queries. They should also
117+
# be able to view any marked as not private. They should not be able to
118+
# edit others' queries, even if they're not private
119+
def view_query(db, userid, itemid):
120+
private_for = db.query.get(itemid, 'private_for')
121+
if not private_for: return True
122+
return userid == private_for
123+
def edit_query(db, userid, itemid):
124+
return userid == db.query.get(itemid, 'creator')
125+
p = db.security.addPermission(name='View', klass='query', check=view_query,
126+
description="User is allowed to view their own and public queries")
127+
db.security.addPermissionToRole('User', p)
128+
p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
129+
description="User is allowed to edit their queries")
130+
db.security.addPermissionToRole('User', p)
131+
p = db.security.addPermission(name='Create', klass='query',
132+
description="User is allowed to create queries")
133+
db.security.addPermissionToRole('User', p)
134+
135+
116136
#
117137
# ANONYMOUS USER PERMISSIONS
118138
#

0 commit comments

Comments
 (0)