Source code for shuup.order_printouts.admin_module.views

# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
import datetime
from django.core.mail import EmailMessage
from django.http import HttpResponse, JsonResponse
from django.template.loader import render_to_string
from django.utils.translation import ugettext_lazy as _

from shuup.admin.shop_provider import get_shop
from shuup.apps.provides import get_provide_objects
from shuup.core.models import Order, OrderLine, OrderLineType, Shipment
from shuup.utils.excs import Problem
from shuup.utils.pdf import html_to_pdf, render_html_to_pdf

from .forms import PrintoutsEmailForm


[docs]def validate_shop_for_order(request, order): if get_shop(request) != order.shop: raise Problem( _("The current shop doesn't match the order shop. Please change to the shop that is currently active.") )
[docs]def get_delivery_pdf(request, shipment_pk): shipment = Shipment.objects.get(pk=shipment_pk) validate_shop_for_order(request, shipment.order) html = _get_delivery_html(request, shipment.order, shipment) return render_html_to_pdf(html, stylesheet_paths=["order_printouts/css/extra.css"])
[docs]def get_confirmation_pdf(request, order_pk): order = Order.objects.get(pk=order_pk) validate_shop_for_order(request, order) html = _get_confirmation_html(request, order) return render_html_to_pdf(html, stylesheet_paths=["order_printouts/css/extra.css"])
[docs]def get_delivery_html(request, shipment_pk): shipment = Shipment.objects.get(pk=shipment_pk) validate_shop_for_order(request, shipment.order) return HttpResponse(_get_delivery_html(request, shipment.order, shipment, True))
[docs]def get_confirmation_html(request, order_pk): order = Order.objects.get(pk=order_pk) validate_shop_for_order(request, order) return HttpResponse(_get_confirmation_html(request, order, True))
[docs]def send_delivery_email(request, shipment_pk): if request.method != "POST": raise Exception(_("Non-POST request methods are forbidden.")) shipment = Shipment.objects.get(pk=shipment_pk) validate_shop_for_order(request, shipment.order) form = PrintoutsEmailForm(request.POST) if form.is_valid(): data = form.cleaned_data _send_printouts_email( [data["to"]], data["subject"], data["body"], _get_delivery_html(request, shipment.order, shipment), "delivery.pdf", ) return JsonResponse({"success": "Success!"})
[docs]def send_confirmation_email(request, order_pk): if request.method != "POST": raise Exception(_("Non-POST request methods are forbidden.")) order = Order.objects.get(pk=order_pk) validate_shop_for_order(request, order) form = PrintoutsEmailForm(request.POST) if form.is_valid(): data = form.cleaned_data _send_printouts_email( [data["to"]], data["subject"], data["body"], _get_confirmation_html(request, order), "confirmation.pdf" ) return JsonResponse({"success": "Success!"})
def _get_delivery_html(request, order, shipment, html_mode=False): context = { "shipment": shipment, "order": order, "method_lines": OrderLine.objects.filter( order_id=order.id, type__in=[OrderLineType.PAYMENT, OrderLineType.SHIPPING] ).order_by("ordering"), "today": datetime.date.today(), "header": "%s | %s | %s %s" % (_("Delivery slip"), order.shop.name, _("Order"), order.pk), "footer": _get_footer_information(order.shop), "html_mode": html_mode, } provided_information = {} for provided_info in sorted(get_provide_objects("order_printouts_delivery_extra_fields")): info = provided_info(order, shipment) if info.provides_extra_fields(): provided_information.update(info.extra_fields) context["extra_fields"] = provided_information return render_to_string("shuup/order_printouts/admin/delivery_pdf.jinja", context=context, request=request) def _get_confirmation_html(request, order, html_mode=False): context = { "order": order, "today": datetime.date.today(), "header": "%s | %s | %s %s" % (_("Order confirmation"), order.shop.name, _("Order"), order.pk), "footer": _get_footer_information(order.shop), "html_mode": html_mode, } return render_to_string("shuup/order_printouts/admin/confirmation_pdf.jinja", context=context, request=request) def _get_footer_information(shop): address = shop.contact_address if not address: return shop.name return "%s | %s %s, %s, %s | %s %s" % ( shop.name, address.street, address.postal_code, address.city, address.country.name, address.phone, address.email, ) def _send_printouts_email(recipients, subject, body, html, attachment_filename): email = EmailMessage(subject=subject, body=body, to=recipients) pdf = html_to_pdf(html, stylesheet_paths=["order_printouts/css/extra.css"]) email.attach(attachment_filename, pdf, mimetype="application/pdf") email.send()