[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