Skip to content

Commit

Permalink
Merge 61da050 into 9cb3026
Browse files Browse the repository at this point in the history
  • Loading branch information
jayvdb committed Jun 10, 2020
2 parents 9cb3026 + 61da050 commit b56ae4a
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 3 deletions.
1 change: 1 addition & 0 deletions siteprefs/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ def value(self):

assert M(4)() == 4
assert str(M('www')) == 'www'
assert str(M('abc')[1]) == 'b'
assert len(M('some')) == 4
assert int(M(4)) == 4
assert float(M(4.2)) == 4.2
Expand Down
21 changes: 18 additions & 3 deletions siteprefs/toolbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from django.db.models import Model, Field

from .exceptions import SitePrefsException
from .models import Preference
from .settings import MANAGE_SAFE_COMMANDS
from .signals import prefs_save
from .utils import import_prefs, get_frame_locals, traverse_local_prefs, get_pref_model_admin_class, \
Expand All @@ -26,8 +25,12 @@ def on_pref_update(*args, **kwargs):
Issues DB save and reread.
"""
from .models import Preference

Preference.update_prefs(*args, **kwargs)
Preference.read_prefs(get_prefs())
prefs = get_prefs()
populate_django_settings(prefs)
Preference.read_prefs(prefs)

prefs_save.connect(on_pref_update)

Expand Down Expand Up @@ -156,19 +159,31 @@ def register_admin_models(admin_site: AdminSite):
admin_site.register(model_class, get_pref_model_admin_class(prefs_items))


def populate_django_settings(mem_prefs: dict):
from django.conf import settings

for app, prefs in mem_prefs.items():
for pref_name, pref_proxy in prefs.items():
setattr(settings, pref_name.upper(), pref_proxy)


def autodiscover_siteprefs(admin_site: AdminSite = None):
"""Automatically discovers and registers all preferences available in all apps.
:param admin_site: Custom AdminSite object.
"""
from .models import Preference

if admin_site is None:
admin_site = admin.site

# Do not discover anything if called from manage.py (e.g. executing commands from cli).
if 'manage' not in sys.argv[0] or (len(sys.argv) > 1 and sys.argv[1] in MANAGE_SAFE_COMMANDS):
import_prefs()
Preference.read_prefs(get_prefs())
prefs = get_prefs()
Preference.read_prefs(prefs)
populate_django_settings(prefs)
register_admin_models(admin_site)


Expand Down
38 changes: 38 additions & 0 deletions siteprefs/utils.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@

import inspect
import os
import sys

from collections import OrderedDict
from datetime import datetime
from typing import Any, Callable, Type, Generator, Tuple
from warnings import warn

from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from django.utils.translation import gettext_lazy as _

Expand Down Expand Up @@ -90,6 +93,9 @@ def __len__(self):
def __contains__(self, item):
return self.value.__contains__(item)

def __getitem__(self, item):
return self.value[item]

def __sub__(self, other):
return self.value.__sub__(other)

Expand Down Expand Up @@ -126,6 +132,38 @@ def __eq__(self, other):
def __ne__(self, other):
return self.value.__ne__(other)

def __repr__(self):
return self.value

# TODO: check/implement list and dict parts of for_json
def for_json(self):
return {'for_json': self.value}

# https://bugs.python.org/issue27362
def __json__(self):
return self.value

to_json = __json__


class PrefProxyJSONEncoder(DjangoJSONEncoder):

def default(self, o):
if isinstance(o, Mimic):
return o.value
else:
return super().default(o)


import django.core.serializers.json
django.core.serializers.json.DjangoJSONEncoder = PrefProxyJSONEncoder
import django.http.response
django.http.response.DjangoJSONEncoder = PrefProxyJSONEncoder
django.http.response.JsonResponse.__init__.__defaults__ = (PrefProxyJSONEncoder, True, None)
import django.test.client
django.test.client.DjangoJSONEncoder = PrefProxyJSONEncoder
django.test.client.RequestFactory.__init__.__kwdefaults__ = {'json_encoder': PrefProxyJSONEncoder}


class PrefProxy(Mimic):
"""Objects of this class replace app preferences."""
Expand Down

0 comments on commit b56ae4a

Please sign in to comment.