From b49ce13a2309c3bab86837759457a09dd8001989 Mon Sep 17 00:00:00 2001 From: Mika Ivarsson <13712961+Mojken@users.noreply.github.com> Date: Tue, 29 Mar 2022 16:56:40 +0200 Subject: [PATCH] Remove compat.py completely --- djedi/admin/api.py | 48 ++++++++++++------------ djedi/admin/cms.py | 7 +++- djedi/admin/urls.py | 2 +- djedi/compat.py | 68 ---------------------------------- djedi/middleware/mixins.py | 50 ++++++++++++------------- djedi/rest/urls.py | 2 +- djedi/templatetags/template.py | 42 ++++++++++++++++++++- djedi/tests/test_admin.py | 2 +- djedi/tests/test_rest.py | 2 +- djedi/tests/urls.py | 2 +- djedi/urls.py | 2 +- djedi/utils/templates.py | 9 +++-- 12 files changed, 106 insertions(+), 130 deletions(-) delete mode 100644 djedi/compat.py diff --git a/djedi/admin/api.py b/djedi/admin/api.py index 223853fb..d70c65d2 100644 --- a/djedi/admin/api.py +++ b/djedi/admin/api.py @@ -16,12 +16,12 @@ from .exceptions import InvalidNodeData from .mixins import JSONResponseMixin, DjediContextMixin -from ..compat import TemplateResponse from .. import auth +from django.template.response import TemplateResponse -class APIView(View): +class APIView(View): @csrf_exempt def dispatch(self, request, *args, **kwargs): if not auth.has_permission(request): @@ -50,17 +50,19 @@ def get_post_data(self, request): if isinstance(value, list) and len(value) <= 1: value = value[0] if value else None - prefix, _, field = param.partition('[') + prefix, _, field = param.partition("[") if field: field = field[:-1] try: data[prefix][field] = value except TypeError: - raise InvalidNodeData('Got both reserved parameter "data" and plugin specific parameters.') + raise InvalidNodeData( + 'Got both reserved parameter "data" and plugin specific parameters.' + ) else: data[prefix] = value - return data['data'], data['meta'] + return data["data"], data["meta"] def decode_uri(self, uri): decoded = urlunquote(uri) @@ -71,12 +73,11 @@ def decode_uri(self, uri): return decoded - def render_to_response(self, content=u''): + def render_to_response(self, content=u""): return HttpResponse(content) class NodeApi(JSONResponseMixin, APIView): - @never_cache def get(self, request, uri): """ @@ -91,10 +92,7 @@ def get(self, request, uri): if node.content is None: raise Http404 - return self.render_to_json({ - 'uri': node.uri, - 'content': node.content - }) + return self.render_to_json({"uri": node.uri, "content": node.content}) def post(self, request, uri): """ @@ -105,7 +103,7 @@ def post(self, request, uri): """ uri = self.decode_uri(uri) data, meta = self.get_post_data(request) - meta['author'] = auth.get_username(request) + meta["author"] = auth.get_username(request) node = cio.set(uri, data, publish=False, **meta) return self.render_to_json(node) @@ -123,7 +121,6 @@ def delete(self, request, uri): class PublishApi(JSONResponseMixin, APIView): - def put(self, request, uri): """ Publish versioned uri. @@ -141,7 +138,6 @@ def put(self, request, uri): class RevisionsApi(JSONResponseMixin, APIView): - def get(self, request, uri): """ List uri revisions. @@ -151,12 +147,13 @@ def get(self, request, uri): """ uri = self.decode_uri(uri) revisions = cio.revisions(uri) - revisions = [list(revision) for revision in revisions] # Convert tuples to lists + revisions = [ + list(revision) for revision in revisions + ] # Convert tuples to lists return self.render_to_json(revisions) class LoadApi(JSONResponseMixin, APIView): - @never_cache def get(self, request, uri): """ @@ -171,7 +168,6 @@ def get(self, request, uri): class RenderApi(APIView): - def post(self, request, ext): """ Render data for plugin and return text response. @@ -188,7 +184,6 @@ def post(self, request, ext): class NodeEditor(JSONResponseMixin, DjediContextMixin, APIView): - @never_cache @xframe_options_exempt def get(self, request, uri): @@ -210,11 +205,11 @@ def get(self, request, uri): def post(self, request, uri): uri = self.decode_uri(uri) data, meta = self.get_post_data(request) - meta['author'] = auth.get_username(request) + meta["author"] = auth.get_username(request) node = cio.set(uri, data, publish=False, **meta) context = cio.load(node.uri) - context['content'] = node.content + context["content"] = node.content if request.is_ajax(): return self.render_to_json(context) @@ -222,7 +217,12 @@ def post(self, request, uri): return self.render_plugin(request, context) def render_plugin(self, request, context): - return TemplateResponse(request, [ - 'djedi/plugins/%s/editor.html' % context['uri'].ext, - 'djedi/plugins/base/editor.html' - ], self.get_context_data(**context)) + return TemplateResponse( + request, + [ + "djedi/plugins/%s/editor.html" % context["uri"].ext, + "djedi/plugins/base/editor.html", + ], + self.get_context_data(**context), + using="django", + ) diff --git a/djedi/admin/cms.py b/djedi/admin/cms.py index 97ec9b0e..8a84e0a0 100644 --- a/djedi/admin/cms.py +++ b/djedi/admin/cms.py @@ -4,8 +4,9 @@ from django.views.generic import View from ..auth import has_permission -from ..compat import include, render, url +from django.conf.urls import include, url from .mixins import DjediContextMixin +from django.shortcuts import render class Admin(ModelAdmin): @@ -40,6 +41,8 @@ class DjediCMS(DjediContextMixin, View): @xframe_options_exempt def get(self, request): if has_permission(request): - return render(request, "djedi/cms/cms.html", self.get_context_data()) + return render( + request, "djedi/cms/cms.html", self.get_context_data(), using="django" + ) else: raise PermissionDenied diff --git a/djedi/admin/urls.py b/djedi/admin/urls.py index bc9ef7b5..c18155b7 100644 --- a/djedi/admin/urls.py +++ b/djedi/admin/urls.py @@ -1,4 +1,4 @@ -from ..compat import include, url +from django.conf.urls import include, url from .api import LoadApi, NodeApi, NodeEditor, PublishApi, RenderApi, RevisionsApi from .cms import DjediCMS diff --git a/djedi/compat.py b/djedi/compat.py deleted file mode 100644 index 652dac69..00000000 --- a/djedi/compat.py +++ /dev/null @@ -1,68 +0,0 @@ -from functools import partial -from inspect import getfullargspec -from collections import namedtuple - -from django.shortcuts import render -from django.template.loader import render_to_string -from django.template.response import TemplateResponse as BaseTemplateResponse -from django.conf.urls import include, url -from django.urls import reverse, NoReverseMatch -from django.template.library import parse_bits - - -def generic_tag_compiler( - parser, token, params, varargs, varkw, defaults, name, takes_context, node_class -): - """ - Returns a template.Node subclass. - This got inlined into django.template.library since Django since 1.9, this here - is a copypasta replacement: - https://github.com/django/django/blob/stable/1.8.x/django/template/base.py#L1089 - """ - bits = token.split_contents()[1:] - args, kwargs = parse_bits( - parser=parser, - bits=bits, - params=params, - varargs=varargs, - varkw=varkw, - defaults=defaults, - kwonly=(), - kwonly_defaults=(), - takes_context=takes_context, - name=name, - ) - return node_class(takes_context, args, kwargs) - - -render_to_string = partial(render_to_string, using="django") -render = partial(render, using="django") - - -class TemplateResponse(BaseTemplateResponse): - def __init__(self, *args, **kwargs): - kwargs["using"] = "django" - super(TemplateResponse, self).__init__(*args, **kwargs) - - -ArgSpec = namedtuple("ArgSpec", ["args", "varargs", "keywords", "defaults"]) - - -def getargspec(func): - spec = getfullargspec(func) - return ArgSpec( - args=spec.args, - varargs=spec.varargs, - keywords=spec.varkw, - defaults=spec.defaults, - ) - - -__all__ = [ - "generic_tag_compiler", - "render_to_string", - "render", - "include", - "url", - "reverse", -] diff --git a/djedi/middleware/mixins.py b/djedi/middleware/mixins.py index 6dfb3738..88bae1d3 100644 --- a/djedi/middleware/mixins.py +++ b/djedi/middleware/mixins.py @@ -4,18 +4,17 @@ from django.core.exceptions import ImproperlyConfigured from django.utils import translation +from django.urls import reverse, NoReverseMatch from cio.conf import settings from cio.pipeline import pipeline from djedi.auth import has_permission -from djedi.compat import reverse, NoReverseMatch from djedi.utils.templates import render_embed _log = logging.getLogger(__name__) class TranslationMixin(object): - def activate_language(self): # Activate current django translation language = translation.get_language() @@ -23,49 +22,50 @@ def activate_language(self): class AdminPanelMixin(object): - def inject_admin_panel(self, request, response): # Do not inject admin panel on gzipped responses - if 'gzip' in response.get('Content-Encoding', ''): - _log.debug('gzip detected, not injecting panel.') + if "gzip" in response.get("Content-Encoding", ""): + _log.debug("gzip detected, not injecting panel.") return # Only inject admin panel in html pages - content_type = response.get('Content-Type', '').split(';')[0] - if content_type not in ('text/html', 'application/xhtml+xml'): - _log.debug('Non-HTML Content-Type detected, not injecting') + content_type = response.get("Content-Type", "").split(";")[0] + if content_type not in ("text/html", "application/xhtml+xml"): + _log.debug("Non-HTML Content-Type detected, not injecting") return # Do not inject admin panel in admin try: - admin_prefix = reverse('admin:index') + admin_prefix = reverse("admin:index") except NoReverseMatch: _log.debug( 'No reverse match for "admin:index", can\'t detect ' - 'django-admin pages' + "django-admin pages" ) else: if request.path.startswith(admin_prefix): _log.debug( - 'admin page detected, not injecting panel. admin_prefix=%r', - admin_prefix + "admin page detected, not injecting panel. admin_prefix=%r", + admin_prefix, ) return try: - djedi_cms_url = reverse('admin:djedi:cms') + djedi_cms_url = reverse("admin:djedi:cms") except NoReverseMatch: - raise ImproperlyConfigured('Could not find djedi in your url conf, ' - 'enable django admin or include ' - 'djedi.urls within the admin namespace.') + raise ImproperlyConfigured( + "Could not find djedi in your url conf, " + "enable django admin or include " + "djedi.urls within the admin namespace." + ) else: if request.path.startswith(djedi_cms_url): - _log.debug('djedi page detected, not injecting panel') + _log.debug("djedi page detected, not injecting panel") return # Validate user permissions if not has_permission(request): - _log.debug('insufficient permissions, not injecting.') + _log.debug("insufficient permissions, not injecting.") return embed = self.render_cms() @@ -84,18 +84,18 @@ def get_requested_uri(node): defaults = dict( (get_requested_uri(node), node.initial) - for node in pipeline.history.list('get') + for node in pipeline.history.list("get") ) return render_embed(nodes=defaults) def body_append(self, response, html): - idx = response.content.lower().rfind(b'') + idx = response.content.lower().rfind(b"") if idx >= 0: - response.content = b''.join((response.content[:idx], - html.encode('utf8'), - response.content[idx:])) + response.content = b"".join( + (response.content[:idx], html.encode("utf8"), response.content[idx:]) + ) - if response.get('Content-Length', None): - response['Content-Length'] = len(response.content) + if response.get("Content-Length", None): + response["Content-Length"] = len(response.content) diff --git a/djedi/rest/urls.py b/djedi/rest/urls.py index 22887cb6..9680f024 100644 --- a/djedi/rest/urls.py +++ b/djedi/rest/urls.py @@ -1,6 +1,6 @@ from django.http import Http404 -from ..compat import url +from django.conf.urls import url from .api import EmbedApi, NodesApi app_name = "rest" diff --git a/djedi/templatetags/template.py b/djedi/templatetags/template.py index ddc2d936..361c54ab 100644 --- a/djedi/templatetags/template.py +++ b/djedi/templatetags/template.py @@ -2,12 +2,52 @@ from django import template from django.template import Context from django.template.base import Node, TemplateSyntaxError +from django.template.library import parse_bits +from collections import namedtuple +from inspect import getfullargspec -from ..compat import getargspec, generic_tag_compiler register = template.Library() +ArgSpec = namedtuple("ArgSpec", ["args", "varargs", "keywords", "defaults"]) + + +def getargspec(func): + spec = getfullargspec(func) + return ArgSpec( + args=spec.args, + varargs=spec.varargs, + keywords=spec.varkw, + defaults=spec.defaults, + ) + + +def generic_tag_compiler( + parser, token, params, varargs, varkw, defaults, name, takes_context, node_class +): + """ + Returns a template.Node subclass. + This got inlined into django.template.library since Django since 1.9, this here + is a copypasta replacement: + https://github.com/django/django/blob/stable/1.8.x/django/template/base.py#L1089 + """ + bits = token.split_contents()[1:] + args, kwargs = parse_bits( + parser=parser, + bits=bits, + params=params, + varargs=varargs, + varkw=varkw, + defaults=defaults, + kwonly=(), + kwonly_defaults=(), + takes_context=takes_context, + name=name, + ) + return node_class(takes_context, args, kwargs) + + def lazy_tag(self, func=None, takes_context=None, name=None, node_class=None): """ A tag function decorator, injected on Django's template tag library, similar to simple_tag(). diff --git a/djedi/tests/test_admin.py b/djedi/tests/test_admin.py index 39b0622e..929a2120 100644 --- a/djedi/tests/test_admin.py +++ b/djedi/tests/test_admin.py @@ -2,7 +2,7 @@ import cio.conf from django.utils.encoding import smart_text from djedi.tests.base import ClientTest -from ..compat import reverse +from django.urls import reverse class PanelTest(ClientTest): diff --git a/djedi/tests/test_rest.py b/djedi/tests/test_rest.py index 7ceac6d5..7928ddaf 100644 --- a/djedi/tests/test_rest.py +++ b/djedi/tests/test_rest.py @@ -15,7 +15,7 @@ from djedi.tests.base import ClientTest, DjediTest, UserMixin from django.utils.encoding import smart_text -from ..compat import reverse +from django.urls import reverse def json_node(response, simple=True): diff --git a/djedi/tests/urls.py b/djedi/tests/urls.py index da9d8626..df0fee0a 100644 --- a/djedi/tests/urls.py +++ b/djedi/tests/urls.py @@ -1,7 +1,7 @@ from django.contrib import admin from django.shortcuts import render -from ..compat import include, url +from django.conf.urls import include, url admin.autodiscover() diff --git a/djedi/urls.py b/djedi/urls.py index e069f2eb..04956be9 100644 --- a/djedi/urls.py +++ b/djedi/urls.py @@ -1,6 +1,6 @@ from django.urls import path -from .compat import include +from django.conf.urls import include app_name = "djedi" diff --git a/djedi/utils/templates.py b/djedi/utils/templates.py index eb3eafd3..102316a2 100644 --- a/djedi/utils/templates.py +++ b/djedi/utils/templates.py @@ -1,8 +1,9 @@ import json from django.core.exceptions import ImproperlyConfigured - -from ..compat import NoReverseMatch, render, render_to_string, reverse +from django.urls import reverse, NoReverseMatch +from django.template.loader import render_to_string +from django.shortcuts import render def render_embed(nodes=None, request=None): @@ -17,7 +18,7 @@ def render_embed(nodes=None, request=None): "exclude_json_nodes": True, } ) - output = render(request, "djedi/cms/embed.html", context) + output = render(request, "djedi/cms/embed.html", context, using="django") except NoReverseMatch: raise ImproperlyConfigured( "Could not find djedi in your url conf, " @@ -33,6 +34,6 @@ def render_embed(nodes=None, request=None): "json_nodes": json.dumps(nodes).replace("