Enabling the AttachFile action

The AttachFile action lets a page have multiple attached files. Since file uploads could be abused for DoS (Denial of Service) attacks, AttachFile is an action that can be disabled by the wiki administrator. See Configuration of MoinMoin for details.

Creating attachments

To create a new attachment, you can either add an attachment link to any page (see below on how to do that), or click on the AttachFile link at the bottom of the page. In the first case, you will see an Upload new attachment link after saving the page. Clicking on it will lead you to the upload page, just like directly clicking on the AttachFile link.

The upload form consist of two fields. In addition to the file input there is an optional field (Rename to), used to give the file a different name than on your own computer.

An upload will never overwrite an existing file. If there is a name conflict, you have to rename the file that you want to upload. Otherwise, if "Rename to" is left blank, the original filename will be used.

Existing attachments may be viewed, downloaded, or removed, depending on the configuration of the wiki and the access rights of the user. For example, an attachment cannot be deleted if the user doesn't have the delete permission on the particular page.

Any upload or deletion of attachments is reflected on RecentChanges and thus subject to peer review. Unlike page changes, there is no history though, so keep a local copy of files so you can revert possible vandalism.

Listing and information about attachments

Two macros are defined which give information about attachments on a page. The [[AttachInfo]] macro gives a short sentence about any attachments:

There are 8 attachment(s) stored for this page.

The [[AttachList]] macro lists files attached to a page:

--> -->

AttributeError

delete

If you want to report a bug, please save this page and attach it to your bug report.

Traceback

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

  1. /usr/lib/python2.6/site-packages/MoinMoin/request.py in run (self=<MoinMoin.request.RequestModPy object>)

    1. 1205 self.page.send_page(self, msg=msg)
    2. 1206 else:
    3. 1207 handler(self.page.page_name, self)
    4. 1208
    5. 1209 # generate page footer (actions that do not want this footer use
    • handler = <function do_print>
    • self = <MoinMoin.request.RequestModPy object>
    • self.page = <MoinMoin.Page.Page instance>
    • self.page.page_name = u'HelpOnActions/AttachFile'
  2. /usr/lib/python2.6/site-packages/MoinMoin/wikiaction.py in do_print (pagename=u'HelpOnActions/AttachFile', request=<MoinMoin.request.RequestModPy object>)

    1. 486
    2. 487 def do_print(pagename, request):
    3. 488 do_show(pagename, request)
    4. 489
    5. 490
    • global do_show = <function do_show>
    • pagename = u'HelpOnActions/AttachFile'
    • request = <MoinMoin.request.RequestModPy object>
  3. /usr/lib/python2.6/site-packages/MoinMoin/wikiaction.py in do_show (pagename=u'HelpOnActions/AttachFile', request=<MoinMoin.request.RequestModPy object>)

    1. 466 else:
    2. 467 request.cacheable = 1
    3. 468 Page(request, pagename).send_page(request, count_hit=1)
    4. 469
    5. 470
    • global Page = <class MoinMoin.Page.Page>
    • request = <MoinMoin.request.RequestModPy object>
    • pagename = u'HelpOnActions/AttachFile'
    • ).send_page undefined
    • count_hit undefined
  4. /usr/lib/python2.6/site-packages/MoinMoin/Page.py in send_page (self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestModPy object>, msg='', **keywords={'count_hit': 1})

    1. 1254 format_args=pi_formatargs,
    2. 1255 do_cache=do_cache,
    3. 1256 start_line=pi_lines)
    4. 1257
    5. 1258 # check for pending footnotes
    • start_line undefined
    • pi_lines = 7
  5. /usr/lib/python2.6/site-packages/MoinMoin/Page.py in send_page_content (self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestModPy object>, Parser=<class MoinMoin.parser.wiki.Parser>, body=u'== Enabling the AttachFile action ==\n\nThe `Attac...unzip6b.png\n\n= To do on this page =\n * to review\n', format_args=u'', do_cache=1, **kw={'start_line': 7})

    1. 1345 try:
    2. 1346 code = self.loadCache(request)
    3. 1347 self.execute(request, parser, code)
    4. 1348 except Exception, e:
    5. 1349 if not is_cache_exception(e):
    • self = <MoinMoin.Page.Page instance>
    • self.execute = <bound method Page.execute of <MoinMoin.Page.Page instance>>
    • request = <MoinMoin.request.RequestModPy object>
    • parser = <MoinMoin.parser.wiki.Parser instance>
    • code = <code object <module> at 0x559d19ab1eb8, file "HelpOnActions/AttachFile", line 2>
  6. /usr/lib/python2.6/site-packages/MoinMoin/Page.py in execute (self=<MoinMoin.Page.Page instance>, request=<MoinMoin.request.RequestModPy object>, parser=<MoinMoin.parser.wiki.Parser instance>, code=<code object <module> at 0x559d19ab1eb8, file "HelpOnActions/AttachFile", line 2>)

    1. 1374 __file__ = os.path.join(MoinMoin.__loader__.archive, 'dummy')
    2. 1375 try:
    3. 1376 exec code
    4. 1377 except 'CacheNeedsUpdate':
    5. 1378 raise Exception('CacheNeedsUpdate')
    • code = <code object <module> at 0x559d19ab1eb8, file "HelpOnActions/AttachFile", line 2>
  7. /HelpOnActions/AttachFile in ()

  8. /usr/lib/python2.6/site-packages/MoinMoin/formatter/base.py in macro (self=<MoinMoin.formatter.text_html.Formatter instance>, macro_obj=<MoinMoin.wikimacro.Macro instance>, name=u'AttachList', args=None)

    1. 288 def macro(self, macro_obj, name, args):
    2. 289 # call the macro
    3. 290 return macro_obj.execute(name, args)
    4. 291
    5. 292 def _get_bang_args(self, line):
    • macro_obj = <MoinMoin.wikimacro.Macro instance>
    • macro_obj.execute = <bound method Macro.execute of <MoinMoin.wikimacro.Macro instance>>
    • name = u'AttachList'
    • args = None
  9. /usr/lib/python2.6/site-packages/MoinMoin/wikimacro.py in execute (self=<MoinMoin.wikimacro.Macro instance>, macro_name=u'AttachList', args=None)

    1. 118 else:
    2. 119 raise ImportError("Cannot load macro %s" % macro_name)
    3. 120 return execute(self, args)
    4. 121
    5. 122 def _m_lang(self, text):
    • execute = <function execute>
    • self = <MoinMoin.wikimacro.Macro instance>
    • args = None
  10. /usr/lib/python2.6/site-packages/MoinMoin/macro/AttachList.py in execute (macro=<MoinMoin.wikimacro.Macro instance>, args=None)

    1. 25 pagename = args[0].strip()
    2. 26 if len(args) > 1 and args[1].strip():
    3. 27 mime_type = args[1].strip()
    4. 28 return _build_filelist(macro.request, pagename, 0, 1, mime_type=mime_type)
    5. 29
    • global _build_filelist = <function _build_filelist>
    • macro = <MoinMoin.wikimacro.Macro instance>
    • macro.request = <MoinMoin.request.RequestModPy object>
    • pagename = u'HelpOnActions/AttachFile'
    • mime_type = '*'
  11. /usr/lib/python2.6/site-packages/MoinMoin/action/AttachFile.py in _build_filelist (request=<MoinMoin.request.RequestModPy object>, pagename=u'HelpOnActions/AttachFile', showheader=0, readonly=1, mime_type='*')

    1. 259
    2. 260 del_link = ''
    3. 261 if request.user.may.delete(pagename) and not readonly:
    4. 262 del_link = '<a href="%(baseurl)s/%(urlpagename)s' \
    5. 263 '?action=%(action)s&amp;do=del&amp;target=%(urlfile)s">%(label_del)s</a>&nbsp;| ' % parmdict
    • request = <MoinMoin.request.RequestModPy object>
    • request.user = <MoinMoin.user.User at 0x559d1992c518 name:'' id:1732814038.94.12253 valid:0>
    • request.user.may = <MoinMoin.security.Permissions instance>
    • request.user.may.delete undefined
    • pagename = u'HelpOnActions/AttachFile'
    • readonly = 1
  12. /usr/lib/python2.6/site-packages/MoinMoin/security.py in __getattr__ (self=<MoinMoin.security.Permissions instance>, attr='delete')

    1. 52 return lambda pagename, Page=Page, request=request, attr=attr: Page(request, pagename).getACL(request).may(request, self.name, attr)
    2. 53 else:
    3. 54 raise AttributeError, attr
    4. 55
    5. 56
    • builtin AttributeError = <type 'exceptions.AttributeError'>
    • attr = 'delete'

AttributeError

delete

  • args = ('delete',)
  • message = 'delete'

System Details

  • Date: Thu, 28 Nov 2024 17:13:59 +0000
  • Platform: Linux graphics.stanford.edu 2.6.32-754.35.1.el6.x86_64 #1 SMP Sat Nov 7 12:42:14 UTC 2020 x86_64
  • Python: Python 2.6.6 (/usr/bin/python)
  • MoinMoin: Release 1.5.8 (release)