# -*- coding: utf-8 -*-
"""
    MoinMoin - edit a page containing dict formatted data

    @copyright: 2000-2004 Juergen Hermann <jh@web.de>,
                2006 MoinMoin:ThomasWaldmann,
                2012 Gordon Messmer <gordon@dragonsdawn.net>

    @license: GNU GPL, see COPYING for details.
"""
from MoinMoin import wikiutil
from MoinMoin.Page import Page
from MoinMoin.web.utils import check_surge_protect
from MoinMoin.datastruct.backends.wiki_dicts import WikiDict

def execute(pagename, request):
    """ edit a page """
    _ = request.getText

    vardict = request.form.get('vardict')

    if not request.user.may.write(vardict):
        page = wikiutil.getLocalizedPage(request, 'PermissionDeniedPage')
        page.body = _('You are not allowed to edit this page.')
        page.page_name = pagename
        page.send_page(send_special=True)
        return

    # Load the existing dict values
    d = request.dicts.get(vardict, {})

    # Check acl only if dictionary is defined on a wiki page.
    if isinstance(d, WikiDict) and not request.user.may.read(vardict):
        raise ValueError(_('You don\'t have enough rights on this page'))

    savedict = {}
    for k in d:
        savedict[k] = d[k]
    for k in request.form:
        if k in ('vardict',):
            continue
        savedict[k] = request.form.get(k)

    savetext = u''
    for k in savedict:
        savetext = u''.join((savetext, u' ', k, u':: ', savedict[k], u'\n'))
    rev = request.rev or 0

    # Save new text
    from MoinMoin.PageEditor import PageEditor
    pg = PageEditor(request, vardict)
    try:
        savemsg = pg.saveText(savetext, rev)
    except pg.EditConflict, e:
        msg = e.message

        # Handle conflict and send editor
        pg.set_raw_body(savetext, modified=1)

        pg.mergeEditConflict(rev)
        # We don't send preview when we do merge conflict
        pg.sendEditor(msg=msg)
        return

    except pg.SaveError, msg:
        # Show the error message
        request.theme.add_msg(unicode(msg), 'error')
        # And show the editor again
        pg.sendEditor(preview=savetext, staytop=1)
        return

    # Send new page after successful save
    request.reset()
    pg = Page(request, pagename)

    # sets revision number to default for further actions
    request.rev = 0
    request.theme.add_msg(savemsg, 'info')
    pg.send_page()