Skip to content

Commit b2fdd86

Browse files
author
Richard Jones
committed
allow hasPermission checks on normal user class iterations
1 parent a2aab19 commit b2fdd86

File tree

1 file changed

+55
-25
lines changed

1 file changed

+55
-25
lines changed

roundup/cgi/templating.py

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def getContext(self, client, classname, request):
158158
}
159159
# add in the item if there is one
160160
if client.nodeid:
161-
c['item'] = HTMLItem(client.db, classname, client.nodeid)
161+
c['item'] = HTMLItem(client, classname, client.nodeid)
162162
c[classname] = c['item']
163163
else:
164164
c[classname] = c['klass']
@@ -219,10 +219,11 @@ def __repr__(self):
219219
return '<HTMLClass(0x%x) %s>'%(id(self), self.classname)
220220

221221
def __getitem__(self, item):
222-
''' return an HTMLItem instance'''
223-
#print 'getitem', (self, attr)
222+
''' return an HTMLProperty instance
223+
'''
224+
#print 'getitem', (self, item)
224225
if item == 'creator':
225-
return HTMLUser(self.client)
226+
return HTMLUser(self.client, 'user', client.userid)
226227

227228
if not self.props.has_key(item):
228229
raise KeyError, item
@@ -235,7 +236,7 @@ def __getitem__(self, item):
235236
else:
236237
value = None
237238
if isinstance(prop, klass):
238-
return htmlklass(self.db, '', prop, item, value)
239+
return htmlklass(self.client, '', prop, item, value)
239240

240241
# no good
241242
raise KeyError, item
@@ -258,11 +259,15 @@ def properties(self):
258259
else:
259260
value = None
260261
if isinstance(prop, klass):
261-
l.append(htmlklass(self.db, '', prop, name, value))
262+
l.append(htmlklass(self.client, '', prop, name, value))
262263
return l
263264

264265
def list(self):
265-
l = [HTMLItem(self.db, self.classname, x) for x in self.klass.list()]
266+
if self.classname == 'user':
267+
klass = HTMLUser
268+
else:
269+
klass = HTMLItem
270+
l = [klass(self.client, self.classname, x) for x in self.klass.list()]
266271
return l
267272

268273
def csv(self):
@@ -307,7 +312,11 @@ def filter(self, request=None):
307312
filterspec = request.filterspec
308313
sort = request.sort
309314
group = request.group
310-
l = [HTMLItem(self.db, self.classname, x)
315+
if self.classname == 'user':
316+
klass = HTMLUser
317+
else:
318+
klass = HTMLItem
319+
l = [klass(self.client, self.classname, x)
311320
for x in self.klass.filter(None, filterspec, sort, group)]
312321
return l
313322

@@ -357,8 +366,9 @@ def renderWith(self, name, **kwargs):
357366
class HTMLItem:
358367
''' Accesses through an *item*
359368
'''
360-
def __init__(self, db, classname, nodeid):
361-
self.db = db
369+
def __init__(self, client, classname, nodeid):
370+
self.client = client
371+
self.db = client.db
362372
self.classname = classname
363373
self.nodeid = nodeid
364374
self.klass = self.db.getclass(classname)
@@ -368,7 +378,9 @@ def __repr__(self):
368378
return '<HTMLItem(0x%x) %s %s>'%(id(self), self.classname, self.nodeid)
369379

370380
def __getitem__(self, item):
371-
''' return an HTMLItem instance'''
381+
''' return an HTMLProperty instance
382+
'''
383+
#print 'getitem', (self, item)
372384
if item == 'id':
373385
return self.nodeid
374386
if not self.props.has_key(item):
@@ -384,7 +396,7 @@ def __getitem__(self, item):
384396
# look up the correct HTMLProperty class
385397
for klass, htmlklass in propclasses:
386398
if isinstance(prop, klass):
387-
return htmlklass(self.db, self.nodeid, prop, item, value)
399+
return htmlklass(self.client, self.nodeid, prop, item, value)
388400

389401
raise KeyErorr, item
390402

@@ -556,10 +568,9 @@ def remove(self):
556568
class HTMLUser(HTMLItem):
557569
''' Accesses through the *user* (a special case of item)
558570
'''
559-
def __init__(self, client):
560-
HTMLItem.__init__(self, client.db, 'user', client.userid)
571+
def __init__(self, client, classname, nodeid):
572+
HTMLItem.__init__(self, client, 'user', nodeid)
561573
self.default_classname = client.classname
562-
self.userid = client.userid
563574

564575
# used for security checks
565576
self.security = client.db.security
@@ -572,15 +583,16 @@ def hasPermission(self, role, classname=_marker):
572583
'''
573584
if classname is self._marker:
574585
classname = self.default_classname
575-
return self.security.hasPermission(role, self.userid, classname)
586+
return self.security.hasPermission(role, self.nodeid, classname)
576587

577588
class HTMLProperty:
578589
''' String, Number, Date, Interval HTMLProperty
579590
580591
A wrapper object which may be stringified for the plain() behaviour.
581592
'''
582-
def __init__(self, db, nodeid, prop, name, value):
583-
self.db = db
593+
def __init__(self, client, nodeid, prop, name, value):
594+
self.client = client
595+
self.db = client.db
584596
self.nodeid = nodeid
585597
self.prop = prop
586598
self.name = name
@@ -730,7 +742,11 @@ def __getattr__(self, attr):
730742
#print 'getattr', (self, attr, self.value)
731743
if not self.value:
732744
raise AttributeError, "Can't access missing value"
733-
i = HTMLItem(self.db, self.prop.classname, self.value)
745+
if self.prop.classname == 'user':
746+
klass = HTMLItem
747+
else:
748+
klass = HTMLUser
749+
i = klass(self.client, self.prop.classname, self.value)
734750
return getattr(i, attr)
735751

736752
def plain(self, escape=0):
@@ -853,16 +869,26 @@ def __getattr__(self, attr):
853869
raise AttributeError, attr
854870

855871
def __getitem__(self, num):
856-
''' iterate and return a new HTMLItem '''
872+
''' iterate and return a new HTMLItem
873+
'''
857874
#print 'getitem', (self, num)
858875
value = self.value[num]
859-
return HTMLItem(self.db, self.prop.classname, value)
876+
if self.prop.classname == 'user':
877+
klass = HTMLUser
878+
else:
879+
klass = HTMLItem
880+
return klass(self.client, self.prop.classname, value)
860881

861882
def reverse(self):
862-
''' return the list in reverse order '''
883+
''' return the list in reverse order
884+
'''
863885
l = self.value[:]
864886
l.reverse()
865-
return [HTMLItem(self.db, self.prop.classname, value) for value in l]
887+
if self.prop.classname == 'user':
888+
klass = HTMLUser
889+
else:
890+
klass = HTMLItem
891+
return [klass(self.client, self.prop.classname, value) for value in l]
866892

867893
def plain(self, escape=0):
868894
linkcl = self.db.classes[self.prop.classname]
@@ -1003,7 +1029,7 @@ def __init__(self, client):
10031029
self.env = client.env
10041030
self.base = client.base
10051031
self.url = client.url
1006-
self.user = HTMLUser(client)
1032+
self.user = HTMLUser(client, 'user', client.userid)
10071033

10081034
# store the current class name and action
10091035
self.classname = client.classname
@@ -1240,7 +1266,11 @@ def __getitem__(self, index):
12401266
self.last_index = index
12411267

12421268
# wrap the return in an HTMLItem
1243-
self.current_item = HTMLItem(self.client.db, self.classname,
1269+
if self.classname == 'user':
1270+
klass = HTMLUser
1271+
else:
1272+
klass = HTMLItem
1273+
self.current_item = klass(self.client, self.classname,
12441274
self._sequence[index+self.first])
12451275
return self.current_item
12461276

0 commit comments

Comments
 (0)