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 @@
+
{% block search %}
-
+ {% 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 %}
+
+
+
+
+ | Tag |
+ ID |
+ Sent |
+ Opens |
+ Clicks |
+ Rejects |
+ Bounces |
+ Complaints |
+
+
+
+ {% for result in objects %}
+
+ | {{ result.tag }} |
+ {{ result.id }} |
+ {{ result.sent }} |
+ {{ result.opens }} |
+ {{ result.clicks }} |
+ {{ result.rejects }} |
+ {{ result.bounces }} |
+ {{ result.complaints }} |
+
+ {% endfor %}
+
+
+
+ {% 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 %}
+ | {{ header|capfirst }} |
+ {% endfor %}
+ |
+
+
+
+ {% for result in objects %}
+
+ {% for item in result.values %}
+ | {{ item }} |
+ {% endfor %}
+
+ {% if result.is_enabled and result.approved_at %}
+
+ |
+
+ {% endfor %}
+
+
+
+ {% 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)