Skip to content
Snippets Groups Projects
utils.py 3.04 KiB
import json
import logging
import urllib.request
from urllib.parse import urljoin

import bleach
import requests
from django.conf import settings
from django.core.files import File
from django.http import HttpResponse
from django.utils.translation import gettext_lazy
from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel
from wagtail.images.models import Image
from wagtail.models import Page

from tuning import admin_help

logger = logging.getLogger()


def create_image_from_url(url, filename):
    img_data = urllib.request.urlretrieve(url)
    img_obj = Image(title=filename)
    img_obj.file.save(filename, File(open(img_data[0], "rb")))
    img_obj.save()
    return img_obj


def get_subpage_url(page, dest_page_type):
    try:
        return page.get_descendants().type(dest_page_type).live().first().get_url()
    except (Page.DoesNotExist, AttributeError):
        return "#"


def make_promote_panels(
    help_content=None, *, seo_title=True, search_description=True, search_image=True
):
    if help_content is None:
        help_content = admin_help.build(
            admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE
        )

    panels = [FieldPanel("slug")]
    if seo_title:
        panels.append(FieldPanel("seo_title"))
    if search_description:
        panels.append(FieldPanel("search_description"))
    if search_image:
        # TODO
        panels.append(FieldPanel("search_image"))  # , label="Obrázek pro embed"))
    panels.append(HelpPanel(help_content))
    panels.append(CommentPanel())

    return [MultiFieldPanel(panels, gettext_lazy("Metadata stránky"))]


def subscribe_to_newsletter(email, list_id):
    url = urljoin(settings.MAILTRAIN_API_URL, f"subscribe/{list_id}")
    data = {"EMAIL": email, "FORCE_SUBSCRIBE": False, "REQUIRE_CONFIRMATION": True}
    response = requests.post(
        url, data=data, headers={"access-token": settings.MAILTRAIN_API_TOKEN}
    )
    if response.status_code != 200:
        logger.error(
            "Failed to subscribe!", extra={"data": data, "response": response.text}
        )
    return response


def subscribe_to_newsletter_ajax(request):
    client_response = HttpResponse()
    if request.method == "POST":
        body = json.loads(request.body)
        response = subscribe_to_newsletter(body["email"], body["list_id"])
        if "error" in response.json():
            client_response.status_code = 500
        else:
            client_response.status_code = response.status_code

        return client_response

    client_response.status_code = 400
    return client_response


def strip_all_html_tags(value: str):
    """Drop all HTML tags from given value.

    :param value: string to sanitize
    """
    return bleach.clean(value, tags=[], attributes=[], strip=True, strip_comments=True)


def trim_to_length(value: str, max_length: int = 150):
    """Trim value to max length shall it exceed it.

    :param value: input string
    :param max_length: max allowed length
    """
    if len(value) > max_length:
        return value[:max_length] + "..."
    return value