@@ -63,13 +63,10 @@ def __init__(self, tracker, username, password):
6363 def close (self ):
6464 """Close the database, after committing any changes, if needed."""
6565
66- if getattr (self , 'db' ):
67- try :
68- if self .db .transactions :
69- self .db .commit ()
70- finally :
71- self .db .close ()
72-
66+ try :
67+ self .db .commit ()
68+ finally :
69+ self .db .close ()
7370
7471 def get_class (self , classname ):
7572 """Return the class for the given classname."""
@@ -94,7 +91,7 @@ def props_from_args(self, cl, args):
9491 if value :
9592 try :
9693 props [key ] = hyperdb .rawToHyperdb (self .db , cl , None ,
97- key , value )
94+ key , value )
9895 except hyperdb .HyperdbValueError , message :
9996 raise UsageError , message
10097 else :
@@ -115,51 +112,53 @@ def __init__(self, tracker, verbose = False):
115112
116113 def list (self , username , password , classname , propname = None ):
117114 r = RoundupRequest (self .tracker , username , password )
118- cl = r .get_class (classname )
119- if not propname :
120- propname = cl .labelprop ()
121- def has_perm (itemid ):
122- return True
123- r .db .security .hasPermission ('View' , r .userid , classname ,
124- itemid = itemid , property = propname )
125- result = [cl .get (id , propname ) for id in cl .list ()
126- if has_perm (id )]
127- r .close ()
115+ try :
116+ cl = r .get_class (classname )
117+ if not propname :
118+ propname = cl .labelprop ()
119+ result = [cl .get (itemid , propname )
120+ for itemid in cl .list ()
121+ if r .db .security .hasPermission ('View' , r .userid ,
122+ classname , propname , itemid )
123+ ]
124+ finally :
125+ r .close ()
128126 return result
129127
130128 def display (self , username , password , designator , * properties ):
131129 r = RoundupRequest (self .tracker , username , password )
132- classname , itemid = hyperdb .splitDesignator (designator )
133-
134- if not r .db .security .hasPermission ('View' , r .userid , classname ,
135- itemid = itemid ):
136- raise Unauthorised ('Permission to view %s denied' % designator )
137-
138- cl = r .get_class (classname )
139- props = properties and list (properties ) or cl .properties .keys ()
140- props .sort ()
141- result = [(property , cl .get (itemid , property )) for property in props ]
142- r .close ()
130+ try :
131+ classname , itemid = hyperdb .splitDesignator (designator )
132+ cl = r .get_class (classname )
133+ props = properties and list (properties ) or cl .properties .keys ()
134+ props .sort ()
135+ for p in props :
136+ if not r .db .security .hasPermission ('View' , r .userid ,
137+ classname , p , itemid ):
138+ raise Unauthorised ('Permission to view %s of %s denied' %
139+ (p , designator ))
140+ result = [(prop , cl .get (itemid , prop )) for prop in props ]
141+ finally :
142+ r .close ()
143143 return dict (result )
144144
145145 def create (self , username , password , classname , * args ):
146146 r = RoundupRequest (self .tracker , username , password )
147+ try :
148+ if not r .db .security .hasPermission ('Create' , r .userid , classname ):
149+ raise Unauthorised ('Permission to create %s denied' % classname )
147150
148- if not r .db .security .hasPermission ('Create' , r .userid , classname ):
149- raise Unauthorised ('Permission to create %s denied' % classname )
150-
151- cl = r .get_class (classname )
151+ cl = r .get_class (classname )
152152
153- # convert types
154- props = r .props_from_args (cl , args )
153+ # convert types
154+ props = r .props_from_args (cl , args )
155155
156- # check for the key property
157- key = cl .getkey ()
158- if key and not props .has_key (key ):
159- raise UsageError , 'you must provide the "%s" property.' % key
156+ # check for the key property
157+ key = cl .getkey ()
158+ if key and not props .has_key (key ):
159+ raise UsageError , 'you must provide the "%s" property.' % key
160160
161- # do the actual create
162- try :
161+ # do the actual create
163162 try :
164163 result = cl .create (** props )
165164 except (TypeError , IndexError , ValueError ), message :
@@ -170,19 +169,17 @@ def create(self, username, password, classname, *args):
170169
171170 def set (self , username , password , designator , * args ):
172171 r = RoundupRequest (self .tracker , username , password )
173- classname , itemid = hyperdb .splitDesignator (designator )
174-
175- if not r .db .security .hasPermission ('Edit' , r .userid , classname ,
176- itemid = itemid ):
177- raise Unauthorised ('Permission to edit %s denied' % designator )
178-
179- cl = r .get_class (classname )
180-
181- # convert types
182- props = r .props_from_args (cl , args )
183172 try :
173+ classname , itemid = hyperdb .splitDesignator (designator )
174+ cl = r .get_class (classname )
175+ props = r .props_from_args (cl , args ) # convert types
176+ for p in props .iterkeys ():
177+ if not r .db .security .hasPermission ('Edit' , r .userid ,
178+ classname , p , itemid ):
179+ raise Unauthorised ('Permission to edit %s of %s denied' %
180+ (p , designator ))
184181 try :
185- cl .set (itemid , ** props )
182+ return cl .set (itemid , ** props )
186183 except (TypeError , IndexError , ValueError ), message :
187184 raise UsageError , message
188185 finally :
0 commit comments