Add ability to have named urls.

This commit is contained in:
Chris Jones
2012-01-16 16:49:56 -08:00
parent 53046715d9
commit 799f9ba7fd
4 changed files with 46 additions and 12 deletions

View File

@@ -8,8 +8,9 @@ __version__ = '.'.join([str(x) for x in VERSION])
class DjrillAdminSite(AdminSite): class DjrillAdminSite(AdminSite):
index_template = "djrill/index.html" index_template = "djrill/index.html"
custom_views = [] custom_views = []
custom_urls = []
def register_view(self, path, view, name=None): def register_view(self, path, view, name, display_name=None):
"""Add a custom admin view. """Add a custom admin view.
* `path` is the path in the admin where the view will live, e.g. * `path` is the path in the admin where the view will live, e.g.
@@ -18,25 +19,33 @@ class DjrillAdminSite(AdminSite):
* `name` is an optional pretty name for the list of custom views. If * `name` is an optional pretty name for the list of custom views. If
empty, we'll guess based on view.__name__. empty, we'll guess based on view.__name__.
""" """
self.custom_views.append((path, view, name)) self.custom_views.append((path, view, name, display_name))
def register_url(self, path, view, name):
self.custom_urls.append((path, view, name))
def get_urls(self): def get_urls(self):
"""Add our custom views to the admin urlconf.""" """Add our custom views to the admin urlconf."""
urls = super(DjrillAdminSite, self).get_urls() urls = super(DjrillAdminSite, self).get_urls()
from django.conf.urls.defaults import patterns, url from django.conf.urls.defaults import patterns, url
for path, view, name in self.custom_views: for path, view, name, display_name in self.custom_views:
urls += patterns('', urls += patterns('',
url(r'^%s$' % path, self.admin_view(view)), url(r'^%s$' % path, self.admin_view(view), name=name),
) )
for path, view, name in self.custom_urls:
urls += patterns('',
url(r'^%s$' % path, self.admin_view(view), name=name),
)
return urls return urls
def index(self, request, extra_context=None): def index(self, request, extra_context=None):
"""Make sure our list of custom views is on the index page.""" """Make sure our list of custom views is on the index page."""
if not extra_context: if not extra_context:
extra_context = {} extra_context = {}
custom_list = [(path, name if name else custom_list = [(path, display_name if display_name else
capfirst(view.__name__)) for path, view, name in capfirst(view.__name__)) for path, view, name, display_name in
self.custom_views] self.custom_views]
# Sort views alphabetically. # Sort views alphabetically.
custom_list.sort(key=lambda x: x[1]) custom_list.sort(key=lambda x: x[1])
extra_context.update({ extra_context.update({

View File

@@ -1,7 +1,12 @@
from django.contrib import admin from django.contrib import admin
from djrill.views import DjrillIndexView, DjrillSendersListView from djrill.views import (DjrillIndexView, DjrillSendersListView,
DjrillDisableSenderView)
admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(), admin.site.register_view("djrill/senders/", DjrillSendersListView.as_view(),
"senders") "djrill_sender", "senders")
admin.site.register_view("djrill/status/", DjrillIndexView.as_view(), "status") admin.site.register_view("djrill/status/", DjrillIndexView.as_view(),
"djrill_status", "status")
admin.site.register_url("djrill/disable/sender/",
DjrillDisableSenderView.as_view(), "djrill_disable_sender")

View File

@@ -89,7 +89,7 @@
<td>{{ item }}</td> <td>{{ item }}</td>
{% endfor %} {% endfor %}
{% if result.is_enabled and result.approved_at %} {% if result.is_enabled and result.approved_at %}
<td><button>disable</button></td> <td><button data-url="{% url "admin:djrill_disable_sender" %}" data-email="{{ result.address }}">disable</button></td>
{% else %} {% else %}
<td><button>enable</button></td> <td><button>enable</button></td>
{% endif %} {% endif %}

View File

@@ -1,7 +1,8 @@
from django.conf import settings from django.conf import settings
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.http import HttpResponse, HttpResponseForbidden
from django.utils import simplejson as json from django.utils import simplejson as json
from django.views.generic import TemplateView from django.views.generic import TemplateView, View
try: try:
import requests import requests
@@ -60,3 +61,22 @@ class DjrillSendersListView(DjrillApiMixin, DjrillApiJsonObjectsMixin,
def get(self, request): def get(self, request):
objects = self.get_json_objects() objects = self.get_json_objects()
return self.render_to_response({"objects": json.loads(objects)}) return self.render_to_response({"objects": json.loads(objects)})
class DjrillDisableSenderView(DjrillApiMixin, View):
def post(self, request):
email = request.POST.get("email", None)
if email:
payload = {
"key": self.api_key,
"email": email
}
req = requests.post("%s/users/disable-sender.json" % self.api_url,
data=json.dumps(payload))
if req.status_code == 200:
return HttpResponse("success")
return HttpResponseForbidden()