[Moin-devel] CVS: MoinMoin/action AttachFile.py,1.20,1.21

J?rgen Hermann jhermann at users.sourceforge.net
Tue Feb 5 16:31:01 EST 2002


Update of /cvsroot/moin/MoinMoin/action
In directory usw-pr-cvs1:/tmp/cvs-serv7703/action

Modified Files:
	AttachFile.py 
Log Message:
Completed I18N of AttachFile; added logging into editlog


Index: AttachFile.py
===================================================================
RCS file: /cvsroot/moin/MoinMoin/action/AttachFile.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -r1.20 -r1.21
*** AttachFile.py	2002/02/05 23:32:29	1.20
--- AttachFile.py	2002/02/06 00:30:30	1.21
***************
*** 18,22 ****
      4. /pataname/fname, do=view[&mimetype=type]:create a page
         to view the content of the file
-     5. do=list: list attached files
  
      To insert an attachment into the page, use the "attachment:" pseudo
--- 18,21 ----
***************
*** 26,30 ****
  """
  
! import cgi, os, mimetypes, string, sys, urllib
  from MoinMoin import config, user, wikiutil, webapi
  from MoinMoin.Page import Page
--- 25,29 ----
  """
  
! import cgi, os, mimetypes, string, sys, time, urllib
  from MoinMoin import config, user, wikiutil, webapi
  from MoinMoin.Page import Page
***************
*** 92,148 ****
      remote_name = os.environ.get('REMOTE_ADDR', '')
      log.addEntry(pagename, remote_name, time.time(),
!         _('Upload of file "%(filename)s for page "%(pagename)s') % {},
          action)
  
  
! def error_msg(pagename, form, msg):
!     Page(pagename).send_page(form, msg=msg)
! 
! 
! #############################################################################
! ### Web interface for file upload, viewing and deletion
! #############################################################################
  
! def execute(pagename, form):
!     """ Main dispatcher for the 'AttachFile' action.
      """
!     msg = None
!     if action_name in config.excluded_actions:
!         msg = _('<b>File attachments are not allowed in this wiki!</b>')
!     elif not form.has_key('do'):
!         upload_form(pagename, form)
!     elif form['do'].value == 'upload':
!         if user.current.may.edit:
!             do_upload(pagename, form)
!         else:
!             msg = _('<b>You are not allowed to upload files.</b>')
!     elif form['do'].value == 'del':
!         if user.current.may.delete:
!             del_file(pagename, form)
!         else:
!             msg = _('<b>You are not allowed to delete attachments.</b>')
!     elif form['do'].value == 'get':
!         get_file(pagename, form)
!     elif form['do'].value == 'list':
!         list_files(pagename, form)
!     elif form['do'].value == 'view':
!         view_file(pagename, form)
      else:
!         msg = _('<b>Unsupported upload action: %s</b>') % (form['do'].value,)
  
!     if msg:
!         error_msg(pagename, form, msg)
  
  
- def upload_form(pagename, form, msg=''):
-     webapi.http_headers()
-     wikiutil.send_title(_('Attachments for "%(pagename)s"') % locals(), pagename=pagename, msg=msg)
-     send_uploadform(pagename, form)
-     wikiutil.send_footer(pagename, showpage=1)
  
      
  def send_uploadform(pagename, form):
      print _("<h2>Attached Files</h2>")
!     print get_filelist(pagename)
  
      if not user.current.may.edit:
--- 91,174 ----
      remote_name = os.environ.get('REMOTE_ADDR', '')
      log.addEntry(pagename, remote_name, time.time(),
!         _('File "%(filename)s for page "%(pagename)s') % locals(),
          action)
  
  
! def _access_file(pagename, form):
!     """ Check form parameter `target` and return a tuple of
!         `(filename, filepath)` for an existing attachment.
  
!         Return `(None, None)` if an error occurs.
      """
!     error = None
!     if not form.getvalue('target', ''):
!         error = _("<b>Filename of attachment not specified!</b>")
      else:
!         filename = wikiutil.taintfilename(form['target'].value)
!         fpath = os.path.join(getAttachDir(pagename), filename)
  
!         if os.path.isfile(fpath):
!             return (filename, fpath)
!         error = _("<b>Attachment '%(filename)s' does not exist!</b>") % locals()
  
+     error_msg(pagename, form, error)
+     return (None, None)
  
  
+ def _get_filelist(pagename):
+     # access directory
+     attach_dir = getAttachDir(pagename)
+     files = []
+     if os.path.isdir(attach_dir):
+         files = os.listdir(attach_dir)
+ 
+     str = ""
+     if files:
+         str = str + _("<p>"
+             "To refer to attachments on a page, use <b><tt>attachment:filename</tt></b>, \n"
+             "as shown below in the list of files. \n"
+             "Do <b>NOT</b> use the URL of the <tt>[get]</tt> link, \n"
+             "since this is subject to change and can break easily.</p>"
+         )
+         str = str + "<ul>"
+         for file in files:
+             fsize = os.stat(os.path.join(attach_dir,file))[6] # in byte
+             fsize = float(int(float(fsize)/102.4))/10.0
+             baseurl = webapi.getBaseURL()
+             action = action_name
+             urlpagename = wikiutil.quoteWikiname(pagename)
+             urlfile = urllib.quote_plus(file)
+ 
+             del_link = ''
+             if user.current.may.delete:
+                 del_link = '<A HREF="%(baseurl)s/%(pagename)s' \
+                     '?action=%(action)s&do=del&target=%(urlfile)s">del</A> | ' % locals()
+ 
+             get_url = getAttachUrl(pagename, file)
+             str = str + ('<li>[%(del_link)s'
+                 '<A HREF="%(get_url)s">get</A> | '
+                 '<A HREF="%(baseurl)s/%(urlpagename)s?action=%(action)s&do=view&target=%(urlfile)s">view</A>] '
+                 '(%(fsize)g KB) attachment:<b>%(file)s</b></li>') % locals()
+         str = str + "</ul>"
+     else:
+         str = '%s<p>%s</p>' % (str, _("No attachments stored for %(pagename)s") % locals())
+ 
+     return str
+         
      
+ def error_msg(pagename, form, msg):
+     Page(pagename).send_page(form, msg=msg)
+ 
+ 
+ #############################################################################
+ ### Create parts of the Web interface
+ #############################################################################
+ 
  def send_uploadform(pagename, form):
+     """ Send the HTML code for the list of already stored attachments and
+         the file upload form.
+     """
      print _("<h2>Attached Files</h2>")
!     print _get_filelist(pagename)
  
      if not user.current.may.edit:
***************
*** 182,190 ****
  
  
  def do_upload(pagename, form):
      # check file & mimetype
      fileitem = form['file']
      if not fileitem.file:
!         return error_msg(pagename, form, "no filename specified")
  
      # get directory, and possibly create it
--- 208,257 ----
  
  
+ #############################################################################
+ ### Web interface for file upload, viewing and deletion
+ #############################################################################
+ 
+ def execute(pagename, form):
+     """ Main dispatcher for the 'AttachFile' action.
+     """
+     msg = None
+     if action_name in config.excluded_actions:
+         msg = _('<b>File attachments are not allowed in this wiki!</b>')
+     elif not form.has_key('do'):
+         upload_form(pagename, form)
+     elif form['do'].value == 'upload':
+         if user.current.may.edit:
+             do_upload(pagename, form)
+         else:
+             msg = _('<b>You are not allowed to upload files.</b>')
+     elif form['do'].value == 'del':
+         if user.current.may.delete:
+             del_file(pagename, form)
+         else:
+             msg = _('<b>You are not allowed to delete attachments.</b>')
+     elif form['do'].value == 'get':
+         get_file(pagename, form)
+     elif form['do'].value == 'view':
+         view_file(pagename, form)
+     else:
+         msg = _('<b>Unsupported upload action: %s</b>') % (form['do'].value,)
+ 
+     if msg:
+         error_msg(pagename, form, msg)
+ 
+ 
+ def upload_form(pagename, form, msg=''):
+     webapi.http_headers()
+     wikiutil.send_title(_('Attachments for "%(pagename)s"') % locals(), pagename=pagename, msg=msg)
+     send_uploadform(pagename, form)
+     wikiutil.send_footer(pagename, showpage=1)
+ 
+     
  def do_upload(pagename, form):
      # check file & mimetype
      fileitem = form['file']
      if not fileitem.file:
!         return error_msg(pagename, form,
!             _("<b>Filename of attachment not specified!</b>"))
  
      # get directory, and possibly create it
***************
*** 193,211 ****
          os.makedirs(attach_dir, 0777 & config.umask)
  
!     # make filename (if no ext -> try to set from mimetype)
!     fname = fileitem.filename
      rename = ''
      if form.has_key('rename'):
!         rename = form['rename'].value
  
!     target = fname
      target = string.replace(target, ':', '/')
      target = string.replace(target, '\\', '/')
      target = string.split(target, '/')[-1]
!     if string.strip(rename):
          target = string.strip(rename)
  
      target = wikiutil.taintfilename(target)
!     
      type, encoding = mimetypes.guess_type(target)
      if not type:
--- 260,279 ----
          os.makedirs(attach_dir, 0777 & config.umask)
  
!     # make filename
!     filename = fileitem.filename
      rename = ''
      if form.has_key('rename'):
!         rename = string.strip(form['rename'].value)
  
!     target = filename
      target = string.replace(target, ':', '/')
      target = string.replace(target, '\\', '/')
      target = string.split(target, '/')[-1]
!     if rename:
          target = string.strip(rename)
  
      target = wikiutil.taintfilename(target)
! 
!     # set mimetype from extension, or from given mimetype
      type, encoding = mimetypes.guess_type(target)
      if not type:
***************
*** 214,218 ****
              ext = mimetypes.guess_extension(form['mime'].value)
          if not ext:
!             type, encoding = mimetypes.guess_type(fname)
              if type:
                  ext = mimetypes.guess_extension(type)
--- 282,286 ----
              ext = mimetypes.guess_extension(form['mime'].value)
          if not ext:
!             type, encoding = mimetypes.guess_type(filename)
              if type:
                  ext = mimetypes.guess_extension(type)
***************
*** 222,320 ****
      
      # save file
!     target = os.path.join(attach_dir, target)
!     if os.path.exists(target):
!         msg = "File (%s->%s) already exists." % (fname, rename)
      else:
-         #content = form.getvalue('file')
          content = fileitem.file.read()
!         open(target, 'wb').write(content)
!         msg = "File (%s->%s) with %d bytes uploaded." % (fname, rename, len(content))
!     
!     # return attachment list
!     webapi.http_headers()
!     wikiutil.send_title('Attachment for "%s"' % (pagename,), pagename=pagename, msg=msg)
!     send_uploadform(pagename, form)
!     wikiutil.send_footer(pagename, showpage=1)
! 
! 
! def list_files(pagename, form):
!     # send header & title
!     webapi.http_headers()
!     wikiutil.send_title('Attachment files for "%s"' % (pagename,),pagename=pagename)
!     # send body
!     print get_filelist(pagename)
!     # send footer
!     wikiutil.send_footer(pagename, showpage=1)
! 
  
! def get_filelist(pagename):
!     # access directory
!     attach_dir = getAttachDir(pagename)
!     files = []
!     if os.path.isdir(attach_dir):
!         files = os.listdir(attach_dir)
! 
!     str = ""
!     if files:
!         str = str + _("<p>"
!             "To refer to attachments on a page, use <b><tt>attachment:filename</tt></b>, \n"
!             "as shown below in the list of files. \n"
!             "Do <b>NOT</b> use the URL of the <tt>[get]</tt> link, \n"
!             "since this is subject to change and can break easily.</p>"
!         )
!         str = str + "<ul>"
!         for file in files:
!             fsize = os.stat(os.path.join(attach_dir,file))[6] # in byte
!             fsize = float(int(float(fsize)/102.4))/10.0
!             baseurl = webapi.getBaseURL()
!             action = action_name
!             urlpagename = wikiutil.quoteWikiname(pagename)
!             urlfile = urllib.quote_plus(file)
! 
!             del_link = ''
!             if user.current.may.delete:
!                 del_link = '<A HREF="%(baseurl)s/%(pagename)s' \
!                     '?action=%(action)s&do=del&target=%(urlfile)s">del</A> | ' % locals()
! 
!             get_url = getAttachUrl(pagename, file)
!             str = str + ('<li>[%(del_link)s'
!                 '<A HREF="%(get_url)s">get</A> | '
!                 '<A HREF="%(baseurl)s/%(urlpagename)s?action=%(action)s&do=view&target=%(urlfile)s">view</A>] '
!                 '(%(fsize)g KB) attachment:<b>%(file)s</b></li>') % locals()
!         str = str + "</ul>"
!     else:
!         str = '%s<p>%s</p>' % (str, _("No attachments stored for %(pagename)s") % locals())
! 
!     return str
!         
!     
! def _access_file(pagename, form):
!     if not form.has_key('target'):
!         error_msg(pagename, form, "(no file name specified)")
!         return (None, None)
! 
!     fname = form['target'].value
!     if not fname:
!         error_msg(pagename, form, "(no file name specified for retrieval)")
!         return (None, None)
! 
!     fname = wikiutil.taintfilename(fname)
! 
!     fpath = os.path.join(getAttachDir(pagename), fname)
!     if not os.path.isfile(fpath):
!         error_msg(pagename, form, "(specified file (%s) does not exists)" % fname)
!         return (None, None)
! 
!     return (fname, fpath)
  
  
  def del_file(pagename, form):
!     fname, fpath = _access_file(pagename, form)
!     if not fname: return # error msg already sent in _access_file
      
      # delete file
      os.remove(fpath)
  
!     upload_form(pagename, form, msg="File '%s' deleted." % fname)
  
  
--- 290,321 ----
      
      # save file
!     fpath = os.path.join(attach_dir, target)
!     if os.path.exists(fpath):
!         msg = _("Attachment '%(target)s' (remote name '%(filename)s') already exists.") % locals()
      else:
          content = fileitem.file.read()
!         stream = open(fpath, 'wb')
!         try:
!             stream.write(content)
!         finally:
!             stream.close()
!         bytes = len(content)
!         msg = _("Attachment '%(target)s' (remote name '%(filename)s')"
!                 " with %(bytes)d bytes saved.") % locals()
!         _addLogEntry('ATTNEW', pagename, target)
  
!     # return attachment list
!     upload_form(pagename, form, msg)
  
  
  def del_file(pagename, form):
!     filename, fpath = _access_file(pagename, form)
!     if not filename: return # error msg already sent in _access_file
      
      # delete file
      os.remove(fpath)
+     _addLogEntry('ATTDEL', pagename, filename)
  
!     upload_form(pagename, form, msg=_("Attachment '%(filename)s' deleted.") % locals())
  
  
***************
*** 322,330 ****
      import shutil
  
!     fname, fpath = _access_file(pagename, form)
!     if not fname: return # error msg already sent in _access_file
      
      # get mimetype
!     type, enc = mimetypes.guess_type(fname)
      if not type:
          type = "application/octet-stream"
--- 323,331 ----
      import shutil
  
!     filename, fpath = _access_file(pagename, form)
!     if not filename: return # error msg already sent in _access_file
      
      # get mimetype
!     type, enc = mimetypes.guess_type(filename)
      if not type:
          type = "application/octet-stream"
***************
*** 334,338 ****
          "Content-Type: %s" % type,
          "Content-Length: %d" % os.path.getsize(fpath),
!         "Content-Disposition: attachment; filename=%s" % fname, 
      ])
      
--- 335,339 ----
          "Content-Type: %s" % type,
          "Content-Length: %d" % os.path.getsize(fpath),
!         "Content-Disposition: attachment; filename=%s" % filename, 
      ])
      
***************
*** 344,370 ****
  
  def send_viewfile(pagename, form):
!     fname, fpath = _access_file(pagename, form)
!     if not fname: return
  
!     print "<h2>Attachment '%s'</h2>" % fname
      
!     type, enc = mimetypes.guess_type(fname)
!     if not type:
!         print "(Err:Unknown file type)"
!     if type[:5] == 'image':
!         print '<img src="%s" alt="%s">' % (getAttachUrl(pagename, fname), cgi.escape(fname, 1))
!     elif type[:4] == 'text': 
!         print "<pre>", cgi.escape(open(fpath, 'rb').read()), "</pre>"
!     else:
!         print '<a href="%s">%s</a>' % (getAttachUrl(pagename, fname), cgi.escape(fname))
  
      
  def view_file(pagename, form):
!     fname, fpath = _access_file(pagename, form)
!     if not fname: return
      
      # send header & title
      webapi.http_headers()
!     wikiutil.send_title('attachment:%s of %s' % (fname,pagename), pagename=pagename)
  
      # send body
--- 345,378 ----
  
  def send_viewfile(pagename, form):
!     filename, fpath = _access_file(pagename, form)
!     if not filename: return
  
!     print _("<h2>Attachment '%(filename)s'</h2>") % locals()
      
!     type, enc = mimetypes.guess_type(filename)
!     if type:
!         if type[:5] == 'image':
!             print '<img src="%s" alt="%s">' % (
!                 getAttachUrl(pagename, filename), cgi.escape(filename, 1))
!             return
!         elif type[:4] == 'text': 
!             sys.stdout.write("<pre>")
!             sys.stdout.write(cgi.escape(open(fpath, 'r').read()))
!             sys.stdout.write("</pre>")
!             return
! 
!     print _("<p>Unknown file type, cannot display this attachment inline.</p>")
!     print '<a href="%s">%s</a>' % (
!         getAttachUrl(pagename, filename), cgi.escape(filename))
  
      
  def view_file(pagename, form):
!     filename, fpath = _access_file(pagename, form)
!     if not filename: return
      
      # send header & title
      webapi.http_headers()
!     wikiutil.send_title(_('attachment:%(filename)s of %(pagename)s') % locals(),
!         pagename=pagename)
  
      # send body





More information about the Moin-devel mailing list