Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions sockpuppet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
from sockpuppet.consumer import SockpuppetConsumer # noqa

__version__ = '0.5.2'
default_app_config = 'sockpuppet.apps.SockpuppetConfig'
54 changes: 54 additions & 0 deletions sockpuppet/apps.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,60 @@
# -*- coding: utf-8
import inspect

from django.apps import AppConfig
from django.urls import URLPattern, URLResolver, get_resolver

from .reflex import PROTECTED_VARIABLES, Reflex


class SockpuppetConfig(AppConfig):
name = 'sockpuppet'

def ready(self):
process_resolver(get_resolver())


def get_context_data(self, **context):
context = self._patched_get_context_data(**context)

try:
reflex = self.request.reflex
except AttributeError:
pass
else:
instance_variables = [
name for (name, member) in inspect.getmembers(reflex)
if not name.startswith('__') and name not in PROTECTED_VARIABLES
]
reflex_context = {key: getattr(reflex, key) for key in instance_variables}
reflex_context['stimulus_reflex'] = True

reflex.get_context_data(**reflex_context)
context.update(reflex_context)

return context


def process_callback(callback):
try:
view_class = callback.view_class
view_class._patched_get_context_data = view_class.get_context_data
view_class.get_context_data = get_context_data
except AttributeError:
pass

return callback


def process_resolver(resolver: URLResolver) -> None:
if resolver.callback:
resolver.callback = process_callback(resolver.callback)

for pattern in resolver.url_patterns:
if isinstance(pattern, URLPattern) and pattern.callback:
pattern.callback = process_callback(pattern.callback)
elif isinstance(pattern, URLResolver):
process_resolver(pattern)

if resolver._populated:
resolver._populate()
7 changes: 5 additions & 2 deletions sockpuppet/reflex.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from urllib.parse import urlparse

from django.test import RequestFactory
from django.utils.functional import cached_property


PROTECTED_VARIABLES = [
'consumer',
Expand Down Expand Up @@ -36,7 +38,7 @@ def get_context_data(self, *args, **kwargs):
view.request = self.request
try:
view.kwargs = resolved.kwargs
context = view.get_context_data()
context = view._patched_get_context_data()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you manage to fix so that we can use get_context_data here I think this PR will be usable. Because that's the issue where we get an infinite recursion here.

except AttributeError:
view.get(self.request)
context = view.get_context_data()
Expand All @@ -52,13 +54,14 @@ def get_channel_id(self):
'''
return self.session.session_key

@property
@cached_property
def request(self):
factory = RequestFactory()
request = factory.get(self.url)
request.session = self.consumer.scope['session']
request.user = self.consumer.scope['user']
request.POST = self.params
request.reflex = self
return request

def reload(self):
Expand Down