# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - RecommendPage Action Macro

    PURPOSE:
        This macro is used to recommend a page to an other wiki user.

    CALLING SEQUENCE:
        http://localhost:8080/WikiName?action=RecommendPage

    PROCEDURE:
       You get an input mask to enter the username of the one where you like to send the recommendation. This is then stored on a page named WikiName/RecommendedPage as an wiki itemlist with the link and the first five lines in plain text. At the end your user SIG is written.
       A new entry is always written on top of the page.

       If you don't enter a name the recommendation is done to your name

       Please remove the version number from the file.

    MODIFICATION HISTORY:
        @copyright: 2005 by Reimar Bauer (R.Bauer@fz-juelich.de)
        @license: GNU GPL, see COPYING for details.
        Version: 1.3.4-1

"""

import string
from MoinMoin import config, wikiutil
from MoinMoin.Page import Page
from MoinMoin.PageEditor import PageEditor

def RecommendPage(request,pagename,user):
    if config.allow_subpages:
        delimiter = "/"
    else:
        delimiter = ""

    name=user + delimiter + "RecommendedPage"
    page = PageEditor(request,name)
    if request.user.may.write(name):

        thispage=Page(request,pagename)
        thisraw=thispage.get_raw_body()
        lines = thisraw.split('\n')

        if (lines[0].find('#acl') > -1):
           lines=lines[1:]

        if (len(lines) > 5):
           result=string.join(lines[0:4],'\n')
        else:
           result=string.join(lines,'\n')

        newtext=u" * %(pagename)s  {{{\n%(about)s\n}}}  %(user)s \n" % {
             "pagename": '["'+pagename+'"]',
             "about":result,
             "user":"@SIG@"}

        rev = page.current_rev()
        if (rev == 99999999) :
           PageEditor.saveText(page,newtext,rev)
        else:
           raw = page.get_raw_body()
           PageEditor.saveText(page,newtext+raw,rev)

        msg="recommended to read %(pagename)s to %(user)s" % {
            "pagename": pagename,
            "user":user}

        Page(request, pagename).send_page(request, msg=msg)
    else:
        Page(request, pagename).send_page(request, msg="You are not allowed to recommend pages")


def execute(pagename, request):


    _ = request.getText
    actname = __name__.split('.')[-1]


    if request.user.may.read(pagename):

        thispage=Page(request,pagename)

        if request.form.has_key('button') and request.form.has_key('ticket'):
        # check whether this is a valid recommention request (make outside
        # attacks harder by requiring two full HTTP transactions)
            if not wikiutil.checkTicket(request.form['ticket'][0]):
                  return thispage.send_page(request,
                      msg = _('Please use the interactive user interface to recommend pages!'))

            user=request.form.get('username', [u''])[0]
            if (len(user.strip()) == 0):
                user=request.user.name
            return RecommendPage(request,pagename,user)

        formhtml = '''
<form method="post" action="">
<strong>%(querytext)s</strong>
<input type="hidden" name="action" value="%(actname)s">
<input type="submit" name="button" value="%(button)s">
<input type="hidden" name="ticket" value="%(ticket)s">
<p>
Username (WikiName)<br>
<input type="text" name="username" size="30" maxlength="40">
</form>''' % {
    'querytext': 'Recommend page to',
    'actname': 'RecommendPage',
    'ticket' :wikiutil.createTicket(),
    'button': 'Recommend'}

        return thispage.send_page(request, msg=formhtml)


