1- # $Id: client.py,v 1.10 2002-09-03 07:42:38 richard Exp $
1+ # $Id: client.py,v 1.11 2002-09-04 04:31:51 richard Exp $
22
33__doc__ = """
44WWW request handler (also used in the stand-alone server).
@@ -110,11 +110,11 @@ def main(self):
110110 self .determine_user ()
111111 # figure out the context and desired content template
112112 self .determine_context ()
113- # possibly handle a form submit action (may change self.message
114- # and self.template_name )
113+ # possibly handle a form submit action (may change self.message,
114+ # self.classname and self.template )
115115 self .handle_action ()
116116 # now render the page
117- self .write (self .template ('page' , ok_message = self .ok_message ,
117+ self .write (self .renderTemplate ('page' , ' ' , ok_message = self .ok_message ,
118118 error_message = self .error_message ))
119119 except Redirect , url :
120120 # let's redirect - if the url isn't None, then we need to do
@@ -127,8 +127,7 @@ def main(self):
127127 except SendStaticFile , file :
128128 self .serve_static_file (str (file ))
129129 except Unauthorised , message :
130- self .write (self .template ('page.unauthorised' ,
131- error_message = message ))
130+ self .write (self .renderTemplate ('page' , '' , error_message = message ))
132131 except :
133132 # everything else
134133 self .write (cgitb .html ())
@@ -207,9 +206,9 @@ def determine_context(self, dre=re.compile(r'([^\d]+)(\d+)')):
207206 full item designator supplied: "item"
208207
209208 We set:
210- self.classname
211- self.nodeid
212- self.template_name
209+ self.classname - the class to display, can be None
210+ self.template - the template to render the current context with
211+ self.nodeid - the nodeid of the class we're displaying
213212 '''
214213 # default the optional variables
215214 self .classname = None
@@ -219,11 +218,9 @@ def determine_context(self, dre=re.compile(r'([^\d]+)(\d+)')):
219218 path = self .split_path
220219 if not path or path [0 ] in ('' , 'home' , 'index' ):
221220 if self .form .has_key (':template' ):
222- self .template_type = self .form [':template' ].value
223- self .template_name = 'home' + '.' + self .template_type
221+ self .template = self .form [':template' ].value
224222 else :
225- self .template_type = ''
226- self .template_name = 'home'
223+ self .template = ''
227224 return
228225 elif path [0 ] == '_file' :
229226 raise SendStaticFile , path [1 ]
@@ -239,14 +236,14 @@ def determine_context(self, dre=re.compile(r'([^\d]+)(\d+)')):
239236 self .classname = m .group (1 )
240237 self .nodeid = m .group (2 )
241238 # with a designator, we default to item view
242- self .template_type = 'item'
239+ self .template = 'item'
243240 else :
244241 # with only a class, we default to index view
245- self .template_type = 'index'
242+ self .template = 'index'
246243
247244 # see if we have a template override
248245 if self .form .has_key (':template' ):
249- self .template_type = self .form [':template' ].value
246+ self .template = self .form [':template' ].value
250247
251248
252249 # see if we were passed in a message
@@ -255,9 +252,6 @@ def determine_context(self, dre=re.compile(r'([^\d]+)(\d+)')):
255252 if self .form .has_key (':error_message' ):
256253 self .error_message .append (self .form [':error_message' ].value )
257254
258- # we have the template name now
259- self .template_name = self .classname + '.' + self .template_type
260-
261255 def serve_file (self , designator , dre = re .compile (r'([^\d]+)(\d+)' )):
262256 ''' Serve the file from the content property of the designated item.
263257 '''
@@ -279,10 +273,10 @@ def serve_static_file(self, file):
279273 self .header ({'Content-Type' : mt })
280274 self .write (open (os .path .join (self .instance .TEMPLATES , file )).read ())
281275
282- def template (self , name , ** kwargs ):
276+ def renderTemplate (self , name , extension , ** kwargs ):
283277 ''' Return a PageTemplate for the named page
284278 '''
285- pt = getTemplate (self .instance .TEMPLATES , name )
279+ pt = getTemplate (self .instance .TEMPLATES , name , extension )
286280 # XXX handle PT rendering errors here more nicely
287281 try :
288282 # let the template render figure stuff out
@@ -297,14 +291,23 @@ def template(self, name, **kwargs):
297291 def content (self ):
298292 ''' Callback used by the page template to render the content of
299293 the page.
294+
295+ If we don't have a specific class to display, that is none was
296+ determined in determine_context(), then we display a "home"
297+ template.
300298 '''
301299 # now render the page content using the template we determined in
302300 # determine_context
303- return self .template (self .template_name )
301+ if self .classname is None :
302+ name = 'home'
303+ else :
304+ name = self .classname
305+ return self .renderTemplate (self .classname , self .template )
304306
305307 # these are the actions that are available
306308 actions = {
307309 'edit' : 'editItemAction' ,
310+ 'editCSV' : 'editCSVAction' ,
308311 'new' : 'newItemAction' ,
309312 'register' : 'registerAction' ,
310313 'login' : 'login_action' ,
@@ -631,14 +634,17 @@ def newItemAction(self):
631634 self .error_message .append (
632635 _ ('You do not have permission to create %s' % self .classname ))
633636
634- # XXX
635- # cl = self.db.classes[cn]
636- # if self.form.has_key(':multilink'):
637- # link = self.form[':multilink'].value
638- # designator, linkprop = link.split(':')
639- # xtra = ' for <a href="%s">%s</a>' % (designator, designator)
640- # else:
641- # xtra = ''
637+ # create a little extra message for anticipated :link / :multilink
638+ if self .form .has_key (':multilink' ):
639+ link = self .form [':multilink' ].value
640+ elif self .form .has_key (':link' ):
641+ link = self .form [':multilink' ].value
642+ else :
643+ link = None
644+ xtra = ''
645+ if link :
646+ designator , linkprop = link .split (':' )
647+ xtra = ' for <a href="%s">%s</a>' % (designator , designator )
642648
643649 try :
644650 # do the create
@@ -654,7 +660,7 @@ def newItemAction(self):
654660 self .nodeid = nid
655661
656662 # and some nice feedback for the user
657- message = _ ('%(classname)s created ok' )% self .__dict__
663+ message = _ ('%(classname)s created ok' )% self .__dict__ + xtra
658664 except (ValueError , KeyError ), message :
659665 self .error_message .append (_ ('Error: ' ) + str (message ))
660666 return
@@ -686,15 +692,15 @@ def newItemPermission(self, props):
686692 return 1
687693 return 0
688694
689- def genericEditAction (self ):
695+ def editCSVAction (self ):
690696 ''' Performs an edit of all of a class' items in one go.
691697
692698 The "rows" CGI var defines the CSV-formatted entries for the
693699 class. New nodes are identified by the ID 'X' (or any other
694700 non-existent ID) and removed lines are retired.
695701 '''
696- # generic edit is per-class only
697- if not self .genericEditPermission ():
702+ # this is per-class only
703+ if not self .editCSVPermission ():
698704 self .error_message .append (
699705 _ ('You do not have permission to edit %s' % self .classname ))
700706
@@ -709,26 +715,32 @@ def genericEditAction(self):
709715
710716 cl = self .db .classes [self .classname ]
711717 idlessprops = cl .getprops (protected = 0 ).keys ()
718+ idlessprops .sort ()
712719 props = ['id' ] + idlessprops
713720
714721 # do the edit
715722 rows = self .form ['rows' ].value .splitlines ()
716723 p = csv .parser ()
717724 found = {}
718725 line = 0
719- for row in rows :
726+ for row in rows [ 1 :] :
720727 line += 1
721728 values = p .parse (row )
722729 # not a complete row, keep going
723730 if not values : continue
724731
732+ # skip property names header
733+ if values == props :
734+ continue
735+
725736 # extract the nodeid
726737 nodeid , values = values [0 ], values [1 :]
727738 found [nodeid ] = 1
728739
729740 # confirm correct weight
730741 if len (idlessprops ) != len (values ):
731- message = (_ ('Not enough values on line %(line)s' % {'line' :line }))
742+ self .error_message .append (
743+ _ ('Not enough values on line %(line)s' )% {'line' :line })
732744 return
733745
734746 # extract the new values
@@ -755,13 +767,12 @@ def genericEditAction(self):
755767 if not found .has_key (nodeid ):
756768 cl .retire (nodeid )
757769
758- message = _ ('items edited OK' )
770+ # all OK
771+ self .db .commit ()
759772
760- # redirect to the class' edit page
761- raise Redirect , '%s/%s?:ok_message=%s' % (self .base , self .classname ,
762- urllib .quote (message ))
773+ self .ok_message .append (_ ('Items edited OK' ))
763774
764- def genericEditPermission (self ):
775+ def editCSVPermission (self ):
765776 ''' Determine whether the user has permission to edit this class.
766777
767778 Base behaviour is to check the user can edit this class.
0 commit comments