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_show>
    • 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_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
  3. /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
  4. /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. 1341
    2. 1342 if not (do_cache and self.canUseCache(Parser)):
    3. 1343 self.format(parser)
    4. 1344 else:
    5. 1345 try:
    • self = <MoinMoin.Page.Page instance>
    • self.format = <bound method Page.format of <MoinMoin.Page.Page instance>>
    • parser = <MoinMoin.parser.wiki.Parser instance>
  5. /usr/lib/python2.6/site-packages/MoinMoin/Page.py in format (self=<MoinMoin.Page.Page instance>, parser=<MoinMoin.parser.wiki.Parser instance>)

    1. 1362 def format(self, parser):
    2. 1363 """ Format and write page content without caching """
    3. 1364 parser.format(self.formatter)
    4. 1365
    5. 1366 def execute(self, request, parser, code):
    • parser = <MoinMoin.parser.wiki.Parser instance>
    • parser.format = <bound method Parser.format of <MoinMoin.parser.wiki.Parser instance>>
    • self = <MoinMoin.Page.Page instance>
    • self.formatter = <MoinMoin.formatter.text_html.Formatter instance>
  6. /usr/lib/python2.6/site-packages/MoinMoin/parser/wiki.py in format (self=<MoinMoin.parser.wiki.Parser instance>, formatter=<MoinMoin.formatter.text_html.Formatter instance>)

    1. 1098
    2. 1099 # Scan line, format and write
    3. 1100 formatted_line = self.scan(scan_re, line)
    4. 1101 self.request.write(formatted_line)
    5. 1102
    • formatted_line = u'<p class="line862">The <tt>[[AttachList]]</tt> macro lists files attached to a page: '
    • self = <MoinMoin.parser.wiki.Parser instance>
    • self.scan = <bound method Parser.scan of <MoinMoin.parser.wiki.Parser instance>>
    • scan_re = <_sre.SRE_Pattern object>
    • line = u'[[AttachList]] '
  7. /usr/lib/python2.6/site-packages/MoinMoin/parser/wiki.py in scan (self=<MoinMoin.parser.wiki.Parser instance>, scan_re=<_sre.SRE_Pattern object>, line=u'[[AttachList]] ')

    1. 874 self.in_table or self.in_list):
    2. 875 result.append(self.formatter.paragraph(1, css_class="line867"))
    3. 876 result.append(self.replace(match))
    4. 877 lastpos = match.end()
    5. 878
    • result = ['<p class="line867">']
    • result.append = <built-in method append of list object>
    • self = <MoinMoin.parser.wiki.Parser instance>
    • self.replace = <bound method Parser.replace of <MoinMoin.parser.wiki.Parser instance>>
    • match = <_sre.SRE_Match object>
  8. /usr/lib/python2.6/site-packages/MoinMoin/parser/wiki.py in replace (self=<MoinMoin.parser.wiki.Parser instance>, match=<_sre.SRE_Match object>)

    1. 903 # Get replace method and replece hit
    2. 904 replace = getattr(self, '_' + type + '_repl')
    3. 905 result.append(replace(hit))
    4. 906 return ''.join(result)
    5. 907 else:
    • result = []
    • result.append = <built-in method append of list object>
    • replace = <bound method Parser._macro_repl of <MoinMoin.parser.wiki.Parser instance>>
    • hit = u'[[AttachList]]'
  9. /usr/lib/python2.6/site-packages/MoinMoin/parser/wiki.py in _macro_repl (self=<MoinMoin.parser.wiki.Parser instance>, word=u'[[AttachList]]')

    1. 848 if self.macro is None:
    2. 849 self.macro = wikimacro.Macro(self)
    3. 850 return self.formatter.macro(self.macro, macro_name, args)
    4. 851
    5. 852 def scan(self, scan_re, line):
    • self = <MoinMoin.parser.wiki.Parser instance>
    • self.formatter = <MoinMoin.formatter.text_html.Formatter instance>
    • self.formatter.macro = <bound method Formatter.macro of <MoinMoin.formatter.text_html.Formatter instance>>
    • self.macro = <MoinMoin.wikimacro.Macro instance>
    • macro_name = u'AttachList'
    • args = None
  10. /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
  11. /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
  12. /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 = '*'
  13. /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 0x55f2d386f8c0 name:'' id:1719811281.17.42515 valid:0>
    • request.user.may = <MoinMoin.security.Permissions instance>
    • request.user.may.delete undefined
    • pagename = u'HelpOnActions/AttachFile'
    • readonly = 1
  14. /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: Mon, 01 Jul 2024 05:21:21 +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)