Exemplo n.º 1
0
    def create_event(self, request):

        "Create an event page using the 'request'."

        _ = request.getText
        form = self.get_form()

        category_pagenames = form.get("category", [])
        description = form.get("description", [None])[0]
        location = (form.get("location") or form.get("new-location") or [""])[0]
        latitude = form.get("latitude", [None])[0]
        longitude = form.get("longitude", [None])[0]
        link = form.get("link", [None])[0]
        topics = form.get("topics", [])

        start_regime = form.get("start-regime", [None])[0]
        end_regime = form.get("end-regime", form.get("start-regime", [None]))[0]
        start_offset = form.get("start-offset", [None])[0]
        end_offset = form.get("end-offset", [None])[0]

        start_zone = start_regime or start_offset
        end_zone = end_regime or end_offset

        page_name = form.get("page-name", [None])[0]

        # Validate certain fields.

        title = form.get("title", [""])[0].strip()
        template = form.get("template", [""])[0].strip()
        parent = form.get("parent", [""])[0].strip()

        if not title:
            return 0, _("No event title specified.")
        if not template:
            return 0, _("No event template specified.")

        try:
            start_day = self._get_input(form, "start-day")
            start_month = self._get_input(form, "start-month")
            start_year = self._get_input(form, "start-year")

            if not start_day or not start_month or not start_year:
                return 0, _("A start date must be specified.")

            end_day = self._get_input(form, "end-day", start_day)
            end_month = self._get_input(form, "end-month", start_month)
            end_year = self._get_input(form, "end-year", start_year)

        except (TypeError, ValueError):
            return 0, _("Days and years must be numbers yielding a valid date!")

        try:
            start_hour = self._get_input(form, "start-hour")
            start_minute = self._get_input(form, "start-minute")
            start_second = self._get_input(form, "start-second")

            end_hour = self._get_input(form, "end-hour")
            end_minute = self._get_input(form, "end-minute")
            end_second = self._get_input(form, "end-second")

        except (TypeError, ValueError):
            return 0, _("Hours, minutes and seconds must be numbers yielding a valid time!")

        start_date = DateTime(
            (start_year, start_month, start_day, start_hour, start_minute, start_second, start_zone)
            )
        start_date.constrain()

        end_date = DateTime(
            (end_year, end_month, end_day, end_hour, end_minute, end_second, end_zone)
            )
        end_date.constrain()

        # An elementary date ordering check.

        if (start_date.as_date() != end_date.as_date() or start_date.has_time() and end_date.has_time()) and start_date > end_date:
            start_date, end_date = end_date, start_date

        event_details = {
            "start" : str(start_date), "end" : str(end_date),
            "title" : title, "summary" : title,
            "description" : description, "location" : location, "link" : link,
            "topics" : [topic for topic in topics if topic]
            }

        if latitude and longitude:
            event_details["geo"] = latitude, longitude

        # Copy the template.

        template_page = PageEditor(request, template)

        if not template_page.exists():
            return 0, _("Event template not available.")

        # Use any parent page information.

        full_title = getFullPageName(parent, title)

        if page_name:

            # Allow parameters in the page name. This permits a degree of
            # interoperability with MonthCalendar.

            page_name = page_name.replace("@PAGE@", request.page.page_name)
            page_name = page_name.replace("@DATE@", str(start_date.as_date()))
            page_name = page_name.replace("@STARTDATE@", str(start_date.as_date()))
            page_name = page_name.replace("@ENDDATE@", str(end_date.as_date()))
            page_name = page_name.replace("@PARENT@", parent)
            page_name = page_name.replace("@TITLE@", title)

            # Normalise any page hierarchy separators.

            page_name = re.sub("/+", "/", page_name)

        else:
            page_name = full_title

        # Load the new page and replace the event details in the body.

        new_page = PageEditor(request, page_name)

        if new_page.exists():
            return 0, _("The specified page already exists. Please choose another name.")

        # Complete the new page and return its body.

        body = fillEventPageFromTemplate(template_page, new_page, event_details, category_pagenames)

        # Open the page editor on the new page.
        # NOTE: Replacing the revision in the request to prevent Moin from
        # NOTE: attempting to use the queued changes page's revision.
        # NOTE: Replacing the action and page in the request to avoid issues
        # NOTE: with editing tickets.

        request.rev = 0
        request.action = "edit"
        request.page = new_page
        new_page.sendEditor(preview=body, staytop=True)

        # Return success.

        return 1, None
Exemplo n.º 2
0
def do_savepage(pagename, request):
    from MoinMoin.PageEditor import PageEditor

    _ = request.getText

    if not request.user.may.write(pagename):
        Page(request, pagename).send_page(request,
            msg = _('You are not allowed to edit this page.'))
        return

    pg = PageEditor(request, pagename)
    savetext = request.form.get('savetext', [u''])[0]
    rev = int(request.form.get('rev', ['0'])[0])
    comment = request.form.get('comment', [u''])[0]
    category = request.form.get('category', [None])[0]
    rstrip = int(request.form.get('rstrip', ['0'])[0])
    trivial = int(request.form.get('trivial', ['0'])[0])

    # IMPORTANT: normalize text from the form. This should be done in
    # one place before we manipulate the text.
    savetext = pg.normalizeText(savetext, stripspaces=rstrip)

    # Add category

    # TODO: this code does not work with extended links, and is doing
    # things behind your back, and in general not needed. Either we have
    # a full interface for categories (add, delete) or just add them by
    # markup.
    
    if category:
        # strip trailing whitespace
        savetext = savetext.rstrip()

        # Add category separator if last non-empty line contains
        # non-categories.
        lines = filter(None, savetext.splitlines())
        if lines:
            
            #TODO: this code is broken, will not work for extended links
            #categories, e.g ["category hebrew"]
            categories = lines[-1].split()
            
            if categories:
                confirmed = wikiutil.filterCategoryPages(request, categories)
                if len(confirmed) < len(categories):
                    # This was not a categories line, add separator
                    savetext += u'\n----\n'

        # Add new category
        if savetext and savetext[-1] != u'\n':
            savetext += ' '
        savetext += category + u'\n' # Should end with newline!

    # Clean comment - replace CR, LF, TAB by whitespace, delete control chars
    # TODO: move this to config, create on first call then return cached.
    remap_chars = {
        ord(u'\t'): u' ',
        ord(u'\r'): u' ',
        ord(u'\n'): u' ',
    }
    control_chars = u'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f' \
                    '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'
    for c in control_chars:
        remap_chars[c] = None
    comment = comment.translate(remap_chars)

    # Preview, spellcheck or spellcheck add new words
    if (request.form.has_key('button_preview') or
        request.form.has_key('button_spellcheck') or
        request.form.has_key('button_newwords')):
        pg.sendEditor(preview=savetext, comment=comment)

    # Edit was canceled
    elif request.form.has_key('button_cancel'):
        pg.sendCancel(savetext, rev)
    
    # Save new text
    else:
        try:
            savemsg = pg.saveText(savetext, rev, trivial=trivial,
                                  comment=comment)
        except pg.EditConflict, msg:
            # Handle conflict and send editor

            # TODO: conflict messages are duplicated from PageEditor,
            # refactor to one place only.
            conflict_msg = _('Someone else changed this page while you were editing!')
            pg.set_raw_body(savetext, modified=1)
            if pg.mergeEditConflict(rev):
                conflict_msg = _("""Someone else saved this page while you were editing!
Please review the page and save then. Do not save this page as it is!
Have a look at the diff of %(difflink)s to see what has been changed.""") % {
                    'difflink': pg.link_to(pg.request,
                                           querystr='action=diff&rev=%d' % rev)
                    }
                # We don't send preview when we do merge conflict
                pg.sendEditor(msg=conflict_msg, comment=comment)
                return
            else:
                savemsg = conflict_msg
        
        except pg.SaveError, msg:
            # msg contain a unicode string
            savemsg = unicode(msg)