From 995aa475706a3df466aad7c136d715cd837a64e1 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Tue, 12 May 2015 14:49:09 +0100 Subject: [PATCH] First pass templates for admin style --- rest_framework/pagination.py | 3 + rest_framework/renderers.py | 37 +++ .../templates/rest_framework/admin.html | 212 ++++++++++++++++++ .../rest_framework/admin/detail.html | 9 + .../templates/rest_framework/admin/list.html | 20 ++ 5 files changed, 281 insertions(+) create mode 100644 rest_framework/templates/rest_framework/admin.html create mode 100644 rest_framework/templates/rest_framework/admin/detail.html create mode 100644 rest_framework/templates/rest_framework/admin/list.html diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index b6be6b7cc..b1c88d8dd 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -200,6 +200,9 @@ class BasePagination(object): def to_html(self): # pragma: no cover raise NotImplementedError('to_html() must be implemented to display page controls.') + def get_results(self, data): + return data['results'] + class PageNumberPagination(BasePagination): """ diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 6c7cdf537..c439b1f25 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -668,6 +668,43 @@ class BrowsableAPIRenderer(BaseRenderer): return ret +class AdminRenderer(BrowsableAPIRenderer): + template = 'rest_framework/admin.html' + format = 'admin' + + def get_context(self, data, accepted_media_type, renderer_context): + """ + Render the HTML for the browsable API representation. + """ + context = super(AdminRenderer, self).get_context( + data, accepted_media_type, renderer_context + ) + + paginator = getattr(context['view'], 'paginator', None) + try: + results = data if paginator is None else paginator.get_results(data) + except KeyError: + results = data + + if isinstance(results, list): + header = results[0] + style = 'list' + else: + header = results + style = 'detail' + + columns = [key for key in header.keys() if key != 'url'] + details = [key for key in header.keys() if key != 'url'] + linked = [columns[0]] + + context['style'] = style + context['columns'] = columns + context['details'] = details + context['linked'] = linked + context['results'] = results + return context + + class MultiPartRenderer(BaseRenderer): media_type = 'multipart/form-data; boundary=BoUnDaRyStRiNg' format = 'multipart' diff --git a/rest_framework/templates/rest_framework/admin.html b/rest_framework/templates/rest_framework/admin.html new file mode 100644 index 000000000..eec88f8a9 --- /dev/null +++ b/rest_framework/templates/rest_framework/admin.html @@ -0,0 +1,212 @@ +{% load url from future %} +{% load staticfiles %} +{% load rest_framework %} + + + + {% block head %} + + {% block meta %} + + + {% endblock %} + + {% block title %}Django REST framework{% endblock %} + + {% block style %} + {% block bootstrap_theme %} + + + {% endblock %} + + + {% endblock %} + + {% endblock %} + + + {% block body %} + + +
+ + {% block navbar %} + + {% endblock %} + +
+ {% block breadcrumbs %} + + {% endblock %} + + +
+ + {% if 'GET' in allowed_methods %} +
+
+
+ Format + + + +
+
+
+ {% endif %} + + {% if post_form %} + + {% endif %} + + {% if put_form %} + + {% endif %} + + {% if delete_form %} +
+ {% csrf_token %} + + +
+ {% endif %} + +
+ +
+ {% block description %} + {{ description }} + {% endblock %} +
+ + {% if paginator %} + + {% endif %} + +
+ {% if style == 'list' %} + {% include "rest_framework/admin/list.html" %} + {% else %} + {% include "rest_framework/admin/detail.html" %} + {% endif %} +
+ + {% if paginator %} + + {% endif %} +
+ +
+ +
+
+ + + + + + + + {% block script %} + + + + + {% endblock %} + + {% endblock %} + diff --git a/rest_framework/templates/rest_framework/admin/detail.html b/rest_framework/templates/rest_framework/admin/detail.html new file mode 100644 index 000000000..705c203e9 --- /dev/null +++ b/rest_framework/templates/rest_framework/admin/detail.html @@ -0,0 +1,9 @@ + + + {% for key, value in results.items %} + {% if key in details %} + + {% endif %} + {% endfor %} + +
{{ key|capfirst }}{{ value }}
diff --git a/rest_framework/templates/rest_framework/admin/list.html b/rest_framework/templates/rest_framework/admin/list.html new file mode 100644 index 000000000..c48a72b0a --- /dev/null +++ b/rest_framework/templates/rest_framework/admin/list.html @@ -0,0 +1,20 @@ + + + {% for column in columns%}{% endfor %} + + + {% for row in results %} + + {% for key, value in row.items %} + {% if key in columns %} + + {% endif %} + {% endfor %} + + {% endfor %} + +
{{ column|capfirst }}
+ {% if key in linked %}{% endif %} + {{ value }} + {% if key in linked %}{% endif %} +