Files
django-anymail/djrill/views.py

133 lines
3.9 KiB
Python

from django import forms
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse
from django.http import (HttpResponseForbidden, HttpResponseRedirect)
from django.utils import simplejson as json
from django.views.generic import TemplateView, View
from djrill.forms import CreateSenderForm
try:
import requests
except ImportError:
raise ImportError("Install the damn requirements!")
class DjrillAdminMedia(object):
def _media(self):
js = ["js/core.js", "js/jquery.min.js", "js/jquery.init.js"]
return forms.Media(js=["%s%s" % (settings.ADMIN_MEDIA_PREFIX, url)
for url in js])
media = property(_media)
class DjrillApiMixin(object):
"""
Simple Mixin to grab the api info from the settings file.
"""
def __init__(self, *args, **kwargs):
self.api_key = getattr(settings, "MANDRILL_API_KEY", None)
self.api_url = getattr(settings, "MANDRILL_API_URL", None)
if not self.api_key:
raise ImproperlyConfigured("You have not set your mandrill api key "
"in the settings file.")
if not self.api_url:
raise ImproperlyConfigured("You have not added the Mandrill api "
"url to your settings.py")
class DjrillApiJsonObjectsMixin(object):
"""
Mixin to grab json objects from the api.
"""
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),
data=payload)
if req.status_code == 200:
return req.content
raise Exception("OH GOD, NO!")
class DjrillIndexView(DjrillApiMixin, TemplateView):
template_name = "djrill/status.html"
def get(self, request):
payload = json.dumps({"key": self.api_key})
req = requests.post("%s/users/info.json" % self.api_url, data=payload)
return self.render_to_response({"status": json.loads(req.content)})
class DjrillSendersListView(DjrillAdminMedia, DjrillApiMixin,
DjrillApiJsonObjectsMixin, TemplateView):
api_uri = "users/senders.json"
template_name = "djrill/senders_list.html"
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({
"objects": json.loads(objects),
"media": self.media,
"form": form,
"status": status
})
class DjrillSenderView(DjrillApiMixin, View):
api_action = None
error_message = None
success_message = None
def post(self, request):
email = request.POST.get("email", None)
if email:
payload = {
"key": self.api_key,
"email": email
}
req = requests.post("%s/%s" % (self.api_url, self.api_action),
data=json.dumps(payload))
if req.status_code == 200:
messages.success(request, self.success_message)
else:
messages.error(request, self.error_message)
return HttpResponseRedirect(reverse("admin:djrill_senders"))
return HttpResponseForbidden()
class DjrillDisableSenderView(DjrillSenderView):
api_action = "users/disable-sender.json"
error_message = "Sender was not disabled."
success_message = "Sender was disabled."
class DjrillVerifySenderView(DjrillSenderView):
api_action = "users/verify-sender.json"
error_message = "Sender was not verified."
success_message = "Sender was verified."
class DjrillAddSenderView(DjrillVerifySenderView):
error_message = "Sender was not added."
success_message = "Sender was added."