view libervia/pages/events/admin/page_meta.py @ 1216:b2d067339de3

python 3 port: /!\ Python 3.6+ is now needed to use libervia /!\ instability may occur and features may not be working anymore, this will improve with time /!\ TxJSONRPC dependency has been removed The same procedure as in backend has been applied (check backend commit ab2696e34d29 logs for details). Removed now deprecated code (Pyjamas compiled browser part, legacy blog, JSON RPC related code). Adapted code to work without `html` and `themes` dirs.
author Goffi <goffi@goffi.org>
date Tue, 13 Aug 2019 19:12:31 +0200
parents 0f37b65fe7c2
children acec8e9185db
line wrap: on
line source

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from libervia.server.constants import Const as C
from twisted.internet import defer
from twisted.words.protocols.jabber import jid
from sat.tools.common.template import safe
from sat.core.i18n import _
from sat.core.log import getLogger
import time
import cgi
import math
import re

name = "event_admin"
access = C.PAGES_ACCESS_PROFILE
template = "event/admin.html"
log = getLogger(__name__)
REG_EMAIL_RE = re.compile(C.REG_EMAIL_RE, re.IGNORECASE)


def parse_url(self, request):
    self.getPathArgs(
        request,
        ("event_service", "event_node", "event_id"),
        min_args=2,
        event_service="@jid",
        event_id="",
    )


@defer.inlineCallbacks
def prepare_render(self, request):
    data = self.getRData(request)
    template_data = request.template_data

    ## Event ##

    event_service = template_data["event_service"] = data["event_service"]
    event_node = template_data["event_node"] = data["event_node"]
    event_id = template_data["event_id"] = data["event_id"]
    profile = self.getProfile(request)
    event_timestamp, event_data = yield self.host.bridgeCall(
        "eventGet",
        event_service.userhost() if event_service else "",
        event_node,
        event_id,
        profile,
    )
    try:
        background_image = event_data.pop("background-image")
    except KeyError:
        pass
    else:
        template_data["dynamic_style"] = safe(
            """
            html {
                background-image: url("%s");
                background-size: 15em;
            }
            """
            % cgi.escape(background_image, True)
        )
    template_data["event"] = event_data
    invitees = yield self.host.bridgeCall(
        "eventInviteesList",
        event_data["invitees_service"],
        event_data["invitees_node"],
        profile,
    )
    template_data["invitees"] = invitees
    invitees_guests = 0
    for invitee_data in invitees.values():
        if invitee_data.get("attend", "no") == "no":
            continue
        try:
            invitees_guests += int(invitee_data.get("guests", 0))
        except ValueError:
            log.warning(
                _("guests value is not valid: {invitee}").format(invitee=invitee_data)
            )
    template_data["invitees_guests"] = invitees_guests
    template_data["days_left"] = int(
        math.ceil((event_timestamp - time.time()) / (60 * 60 * 24))
    )

    ## Blog ##

    data["service"] = jid.JID(event_data["blog_service"])
    data["node"] = event_data["blog_node"]
    data["allow_commenting"] = "simple"

    # we now need blog items, using blog common page
    # this will fill the "items" template data
    blog_page = self.getPageByName("blog_view")
    yield blog_page.prepare_render(self, request)


@defer.inlineCallbacks
def on_data_post(self, request):
    profile = self.getProfile(request)
    if not profile:
        log.error("got post data without profile")
        self.pageError(request, C.HTTP_INTERNAL_ERROR)
    type_ = self.getPostedData(request, "type")
    if type_ == "blog":
        service, node, title, body, lang = self.getPostedData(
            request, ("service", "node", "title", "body", "language")
        )

        if not body.strip():
            self.pageError(request, C.HTTP_BAD_REQUEST)
        data = {"content": body}
        if title:
            data["title"] = title
        if lang:
            data["language"] = lang
        try:
            comments = bool(self.getPostedData(request, "comments").strip())
        except KeyError:
            pass
        else:
            if comments:
                data["allow_comments"] = C.BOOL_TRUE

        try:
            yield self.host.bridgeCall("mbSend", service, node, data, profile)
        except Exception as e:
            if "forbidden" in str(e):
                self.pageError(request, C.HTTP_FORBIDDEN)
            else:
                raise e
    elif type_ == "event":
        service, node, event_id, jids, emails = self.getPostedData(
            request, ("service", "node", "event_id", "jids", "emails")
        )
        for invitee_jid_s in jids.split():
            try:
                invitee_jid = jid.JID(invitee_jid_s)
            except RuntimeError as e:
                log.warning(
                    _("this is not a valid jid: {jid}").format(jid=invitee_jid_s)
                )
                continue
            yield self.host.bridgeCall(
                "eventInvite", invitee_jid.userhost(), service, node, event_id, profile
            )
        for email_addr in emails.split():
            if not REG_EMAIL_RE.match(email_addr):
                log.warning(
                    _("this is not a valid email address: {email}").format(
                        email=email_addr
                    )
                )
                continue
            yield self.host.bridgeCall(
                "eventInviteByEmail",
                service,
                node,
                event_id,
                email_addr,
                {},
                "",
                "",
                "",
                "",
                "",
                "",
                profile,
            )

    else:
        log.warning(_("Unhandled data type: {}").format(type_))