diff --git a/djrill/admin.py b/djrill/admin.py index b54c3fa..979f02a 100644 --- a/djrill/admin.py +++ b/djrill/admin.py @@ -2,12 +2,17 @@ from django.contrib import admin from djrill.views import (DjrillIndexView, DjrillSendersListView, DjrillDisableSenderView, DjrillVerifySenderView, - DjrillAddSenderView) + DjrillAddSenderView, DjrillTagListView, + DjrillUrlListView) admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(), "djrill_senders", "senders") admin.site.register_view("djrill/status/", DjrillIndexView.as_view(), "djrill_status", "status") +admin.site.register_view("djrill/tags/", DjrillTagListView.as_view(), + "djrill_tags", "tags") +admin.site.register_view("djrill/urls/", DjrillUrlListView.as_view(), + "djrill_urls", "urls") admin.site.register_url("djrill/disable/sender/", DjrillDisableSenderView.as_view(), "djrill_disable_sender") diff --git a/djrill/templates/djrill/_status.html b/djrill/templates/djrill/_status.html new file mode 100644 index 0000000..6796adc --- /dev/null +++ b/djrill/templates/djrill/_status.html @@ -0,0 +1,9 @@ +
+

Tools & Info

+

Status

+ {% if status %} +

Mandrill is UP

+ {% else %} +

Mandrill is DOWN

+ {% endif %} +
diff --git a/djrill/templates/djrill/senders_list.html b/djrill/templates/djrill/senders_list.html index 653a6e7..ace3de3 100644 --- a/djrill/templates/djrill/senders_list.html +++ b/djrill/templates/djrill/senders_list.html @@ -17,6 +17,8 @@ {{ media.js }} {% endblock %} +{% block title %} Djrill Senders | {% trans "Django site admin" %}{% endblock %} + {% block bodyclass %}change-list{% endblock %} {% if not is_popup %} @@ -26,9 +28,7 @@ {% trans "Home" %} › - Djrill - › Senders @@ -56,27 +56,19 @@
{% block search %}
-
+ - {% csrf_token %} - -
+ {% csrf_token %} + +
{% endblock %} {% block date_hierarchy %}{% endblock %} {% block filters %} -
-

Tools & Info

-

Status

- {% if status %} -

Mandrill is UP

- {% else %} -

Mandrill is DOWN

- {% endif %} -
+ {% include "djrill/_status.html" %} {% endblock %} {% block result_list %} diff --git a/djrill/templates/djrill/tags_list.html b/djrill/templates/djrill/tags_list.html new file mode 100644 index 0000000..da61445 --- /dev/null +++ b/djrill/templates/djrill/tags_list.html @@ -0,0 +1,102 @@ +{% extends "admin/base_site.html" %} +{% load adminmedia admin_list i18n %} +{% load url from future %} +{% block extrastyle %} + {{ block.super }} + + {{ media.css }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block extrahead %} +{{ block.super }} +{{ media.js }} +{% endblock %} + +{% block title %} Djrill Tags | {% trans "Django site admin" %}{% endblock %} + +{% block bodyclass %}change-list{% endblock %} + +{% if not is_popup %} + {% block breadcrumbs %} + + {% endblock %} +{% endif %} + +{% block coltype %}flex{% endblock %} + +{% block content %} +
+ {% block object-tools %} + {% if has_add_permission %} + + {% endif %} + {% endblock %} + +
+ {% block search %} {% endblock %} + + {% block date_hierarchy %}{% endblock %} + + {% block filters %} + {% include "djrill/_status.html" %} + {% endblock %} + + {% block result_list %} + {% if objects %} +
+ + + + + + + + + + + + + + + {% for result in objects %} + + + + + + + + + + + {% endfor %} + +
TagIDSentOpensClicksRejectsBouncesComplaints
{{ result.tag }}{{ result.id }}{{ result.sent }}{{ result.opens }}{{ result.clicks }}{{ result.rejects }}{{ result.bounces }}{{ result.complaints }}
+
+ {% endif %} + {% endblock %} + {% block pagination %}{% endblock %} +
+
+{% endblock %} diff --git a/djrill/templates/djrill/urls_list.html b/djrill/templates/djrill/urls_list.html new file mode 100644 index 0000000..bc41e62 --- /dev/null +++ b/djrill/templates/djrill/urls_list.html @@ -0,0 +1,108 @@ +{% extends "admin/base_site.html" %} +{% load adminmedia admin_list i18n %} +{% load url from future %} +{% block extrastyle %} + {{ block.super }} + + {{ media.css }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block extrahead %} +{{ block.super }} +{{ media.js }} +{% endblock %} + +{% block title %} Djrill URLs | {% trans "Django site admin" %}{% endblock %} + +{% block bodyclass %}change-list{% endblock %} + +{% if not is_popup %} + {% block breadcrumbs %} + + {% endblock %} +{% endif %} + +{% block coltype %}flex{% endblock %} + +{% block content %} +
+ {% block object-tools %} + {% if has_add_permission %} + + {% endif %} + {% endblock %} + +
+ {% block search %}{% endblock %} + + {% block date_hierarchy %}{% endblock %} + + {% block filters %} + {% include "djrill/_status.html" %} + {% endblock %} + + {% block result_list %} + {% if objects %} +
+ + + + {% for header in objects.0.keys %} + + {% endfor %} + + + + + {% for result in objects %} + + {% for item in result.values %} + + {% endfor %} + + + {% endfor %} + +
{{ header|capfirst }}
{{ item }} + {% if result.is_enabled and result.approved_at %} +
+ {% else %} + + {% endif %} + + {% csrf_token %} + {% if result.is_enabled and result.approved_at %} +
+
+ {% endif %} + {% endblock %} + {% block pagination %}{% endblock %} +
+
+{% endblock %} diff --git a/djrill/views.py b/djrill/views.py index 41fddb5..624d8d5 100644 --- a/djrill/views.py +++ b/djrill/views.py @@ -39,6 +39,18 @@ class DjrillApiMixin(object): raise ImproperlyConfigured("You have not added the Mandrill api " "url to your settings.py") + def get_context_data(self, **kwargs): + kwargs = super(DjrillApiMixin, self).get_context_data(**kwargs) + + status = False + req = requests.post("%s/%s" % (self.api_url, "users/ping.json"), + data={"key": self.api_key}) + if req.status_code == 200: + status = True + + kwargs.update({"status": status}) + return kwargs + class DjrillApiJsonObjectsMixin(object): """ @@ -46,13 +58,24 @@ class DjrillApiJsonObjectsMixin(object): """ api_uri = None - def get_json_objects(self): - payload = json.dumps({"key": self.api_key}) - req = requests.post("%s/%s" % (self.api_url, self.api_uri), + def get_api_uri(self): + if self.api_uri is None: + raise ImproperlyConfigured(u"%(cls)s is missing an api_uri. Define " + u"%(cls)s.api_uri or override %(cls)s.get_api_uri()." % { + "cls": self.__class__.__name__ + }) + + def get_json_objects(self, extra_dict=None, extra_api_uri=None): + request_dict = {"key": self.api_key} + if extra_dict: + request_dict.update(extra_dict) + payload = json.dumps(request_dict) + api_uri = extra_api_uri or self.api_uri + req = requests.post("%s/%s" % (self.api_url, api_uri), data=payload) if req.status_code == 200: return req.content - raise Exception("OH GOD, NO!") + raise Exception("Mandrill did not return a 200.") class DjrillIndexView(DjrillApiMixin, TemplateView): @@ -75,20 +98,15 @@ class DjrillSendersListView(DjrillAdminMedia, DjrillApiMixin, def get(self, request): form = CreateSenderForm() objects = self.get_json_objects() - - status = False - req = requests.post("%s/%s" % (self.api_url, "users/ping.json"), - data={"key": self.api_key}) - if req.status_code == 200: - status = True - - return self.render_to_response({ + context = self.get_context_data() + context.update({ "objects": json.loads(objects), "media": self.media, - "form": form, - "status": status + "form": form }) + return self.render_to_response(context) + class DjrillSenderView(DjrillApiMixin, View): api_action = None @@ -130,3 +148,34 @@ class DjrillVerifySenderView(DjrillSenderView): class DjrillAddSenderView(DjrillVerifySenderView): error_message = "Sender was not added." success_message = "Sender was added." + + +class DjrillTagListView(DjrillAdminMedia, DjrillApiMixin, + DjrillApiJsonObjectsMixin, TemplateView): + + api_uri = "tags/list.json" + template_name = "djrill/tags_list.html" + + def get(self, request): + objects = self.get_json_objects() + context = self.get_context_data() + context.update({ + "objects": json.loads(objects), + "media": self.media, + }) + return self.render_to_response(context) + +class DjrillUrlListView(DjrillAdminMedia, DjrillApiMixin, + DjrillApiJsonObjectsMixin, TemplateView): + + api_uri = "urls/list.json" + template_name = "djrill/urls_list.html" + + def get(self, request): + objects = self.get_json_objects() + context = self.get_context_data() + context.update({ + "objects": json.loads(objects), + "media": self.media + }) + return self.render_to_response(context)