# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2017, Shoop Commerce Ltd. 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.
from __future__ import unicode_literals
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.http.response import JsonResponse
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.csrf import csrf_exempt
from shuup.admin.base import AdminModule, MenuEntry, Notification
from shuup.admin.menu import SETTINGS_MENU_CATEGORY
from shuup.admin.utils.permissions import get_default_model_permissions
from shuup.admin.utils.urls import (
admin_url, derive_model_url, get_edit_and_list_urls
)
from shuup.notify.enums import Priority
from shuup.notify.models import Notification as NotificationModel
from shuup.notify.models import Script
SCRIPT_TEMPLATES_PROVIDE_CATEGORY = 'notify_script_template'
[docs]class NotifyAdminModule(AdminModule):
name = _(u"Notifications")
breadcrumbs_menu_entry = MenuEntry(name, "shuup_admin:notify.script.list")
[docs] def get_urls(self):
permissions = get_default_model_permissions(NotificationModel)
return [
admin_url(
"notify/script-item-editor/",
"shuup.notify.admin_module.views.script_item_editor",
name="notify.script-item-editor",
permissions=permissions
),
admin_url(
"notify/script/content/(?P<pk>\d+)/",
"shuup.notify.admin_module.views.EditScriptContentView",
name="notify.script.edit-content",
permissions=permissions
),
admin_url(
"notify/mark-read/(?P<pk>\d+)/$",
self.mark_notification_read_view,
name="notify.mark-read",
permissions=permissions
),
admin_url(
"notify/script-template/",
"shuup.notify.admin_module.views.ScriptTemplateView",
name="notify.script-template",
permissions=permissions
),
admin_url(
"notify/script-template-config/(?P<id>.+)/",
"shuup.notify.admin_module.views.ScriptTemplateConfigView",
name="notify.script-template-config",
permissions=permissions
),
admin_url(
"notify/script-template-edit/(?P<pk>.+)/",
"shuup.notify.admin_module.views.ScriptTemplateEditView",
name="notify.script-template-edit",
permissions=permissions
),
] + get_edit_and_list_urls(
url_prefix="^notify/script",
view_template="shuup.notify.admin_module.views.Script%sView",
name_template="notify.script.%s",
permissions=permissions
)
[docs] def get_required_permissions(self):
return get_default_model_permissions(NotificationModel)
@csrf_exempt
[docs] def mark_notification_read_view(self, request, pk):
if request.method == "POST":
try:
notif = NotificationModel.objects.for_user(request.user).get(pk=pk)
except ObjectDoesNotExist:
return JsonResponse({"error": "no such notification"})
notif.mark_read(request.user)
return JsonResponse({"ok": True})
return JsonResponse({"error": "POST only"})
[docs] def get_notifications(self, request):
notif_qs = NotificationModel.objects.unread_for_user(request.user).order_by("-id")[:15]
for notif in notif_qs:
if notif.priority == Priority.HIGH:
kind = "warning"
elif notif.priority == Priority.CRITICAL:
kind = "danger"
else:
kind = "info"
yield Notification(
text=notif.message,
url=notif.url,
kind=kind,
dismissal_url=reverse("shuup_admin:notify.mark-read", kwargs={"pk": notif.pk}),
datetime=notif.created_on
)
[docs] def get_model_url(self, object, kind):
return derive_model_url(Script, "shuup_admin:notify.script", object, kind)