Skip to content

Commit d47660a

Browse files
authored
Refactor settings to make override_settings in tests more consistent (#168)
* Refactor settings to make override_settings in tests more consistent
1 parent 0ac87d3 commit d47660a

File tree

9 files changed

+226
-272
lines changed

9 files changed

+226
-272
lines changed

changes/167.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Refactor settings to make override_settings in tests more consistent

meta/models.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
import warnings
22
from copy import copy
33

4-
from django.conf import settings as dj_settings
5-
6-
from . import settings
4+
from .settings import get_setting
75
from .utils import get_request, set_request
86

97
NEED_REQUEST_OBJECT_ERR_MSG = (
@@ -28,28 +26,28 @@ class ModelMeta:
2826
"twitter_description": False,
2927
"schemaorg_description": False,
3028
"keywords": False,
31-
"image": settings.DEFAULT_IMAGE,
29+
"image": get_setting("DEFAULT_IMAGE"),
3230
"image_object": None,
3331
"image_width": False,
3432
"image_height": False,
35-
"object_type": settings.DEFAULT_TYPE,
36-
"og_type": settings.FB_TYPE,
37-
"og_app_id": settings.FB_APPID,
38-
"og_profile_id": settings.FB_PROFILE_ID,
39-
"og_publisher": settings.FB_PUBLISHER,
40-
"og_author_url": settings.FB_AUTHOR_URL,
41-
"fb_pages": settings.FB_PAGES,
42-
"twitter_type": settings.TWITTER_TYPE,
43-
"twitter_site": settings.TWITTER_SITE,
44-
"twitter_author": settings.TWITTER_AUTHOR,
45-
"schemaorg_type": settings.SCHEMAORG_TYPE,
33+
"object_type": get_setting("DEFAULT_TYPE"),
34+
"og_type": get_setting("FB_TYPE"),
35+
"og_app_id": get_setting("FB_APPID"),
36+
"og_profile_id": get_setting("FB_PROFILE_ID"),
37+
"og_publisher": get_setting("FB_PUBLISHER"),
38+
"og_author_url": get_setting("FB_AUTHOR_URL"),
39+
"fb_pages": get_setting("FB_PAGES"),
40+
"twitter_type": get_setting("TWITTER_TYPE"),
41+
"twitter_site": get_setting("TWITTER_SITE"),
42+
"twitter_author": get_setting("TWITTER_AUTHOR"),
43+
"schemaorg_type": get_setting("SCHEMAORG_TYPE"),
4644
"published_time": False,
4745
"modified_time": False,
4846
"expiration_time": False,
4947
"tag": False,
5048
"url": False,
5149
"locale": False,
52-
"custom_namespace": settings.OG_NAMESPACES,
50+
"custom_namespace": get_setting("OG_NAMESPACES"),
5351
}
5452

5553
def get_meta(self, request=None):
@@ -178,7 +176,7 @@ def get_meta_protocol(self):
178176
"""
179177
Current http protocol
180178
"""
181-
return dj_settings.META_SITE_PROTOCOL
179+
return get_setting("SITE_PROTOCOL")
182180

183181
def build_absolute_uri(self, url):
184182
"""
@@ -188,7 +186,7 @@ def build_absolute_uri(self, url):
188186
if request:
189187
return request.build_absolute_uri(url)
190188

191-
if not settings.USE_SITES:
189+
if not get_setting("USE_SITES"):
192190
raise RuntimeError(NEED_REQUEST_OBJECT_ERR_MSG)
193191

194192
from django.contrib.sites.models import Site

meta/settings.py

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from django.conf import settings as django_settings
22
from django.utils.translation import gettext_lazy as _
33

4-
SITE_PROTOCOL = getattr(django_settings, "META_SITE_PROTOCOL", None)
5-
SITE_DOMAIN = getattr(django_settings, "META_SITE_DOMAIN", None)
6-
SITE_TYPE = getattr(django_settings, "META_SITE_TYPE", None)
7-
SITE_NAME = getattr(django_settings, "META_SITE_NAME", None)
8-
INCLUDE_KEYWORDS = getattr(django_settings, "META_INCLUDE_KEYWORDS", [])
9-
DEFAULT_KEYWORDS = getattr(django_settings, "META_DEFAULT_KEYWORDS", [])
10-
IMAGE_URL = getattr(django_settings, "META_IMAGE_URL", django_settings.STATIC_URL)
11-
USE_OG_PROPERTIES = getattr(django_settings, "META_USE_OG_PROPERTIES", False)
12-
USE_TWITTER_PROPERTIES = getattr(django_settings, "META_USE_TWITTER_PROPERTIES", False)
13-
USE_FACEBOOK_PROPERTIES = getattr(django_settings, "META_USE_FACEBOOK_PROPERTIES", False)
14-
USE_SCHEMAORG_PROPERTIES = getattr(django_settings, "META_USE_SCHEMAORG_PROPERTIES", False)
15-
USE_SITES = getattr(django_settings, "META_USE_SITES", False)
16-
USE_TITLE_TAG = getattr(django_settings, "META_USE_TITLE_TAG", False)
17-
OG_NAMESPACES = getattr(django_settings, "META_OG_NAMESPACES", None)
4+
META_SITE_PROTOCOL = None
5+
META_SITE_DOMAIN = None
6+
META_SITE_TYPE = None
7+
META_SITE_NAME = None
8+
META_INCLUDE_KEYWORDS = []
9+
META_DEFAULT_KEYWORDS = []
10+
META_IMAGE_URL = django_settings.STATIC_URL
11+
META_USE_OG_PROPERTIES = False
12+
META_USE_TWITTER_PROPERTIES = False
13+
META_USE_FACEBOOK_PROPERTIES = False
14+
META_USE_SCHEMAORG_PROPERTIES = False
15+
META_USE_SITES = False
16+
META_USE_TITLE_TAG = False
17+
META_OG_NAMESPACES = None
1818

1919
OBJECT_TYPES = (
2020
("Article", _("Article")),
@@ -44,19 +44,28 @@
4444
("Review", _("Review")),
4545
)
4646

47-
OG_SECURE_URL_ITEMS = getattr(django_settings, "META_OG_SECURE_URL_ITEMS", ("image", "audio", "video"))
48-
DEFAULT_IMAGE = getattr(django_settings, "META_DEFAULT_IMAGE", "")
49-
DEFAULT_TYPE = getattr(django_settings, "META_SITE_TYPE", OBJECT_TYPES[0][0])
50-
FB_TYPE = getattr(django_settings, "META_FB_TYPE", OBJECT_TYPES[0][0])
51-
FB_TYPES = getattr(django_settings, "META_FB_TYPES", FB_TYPES)
52-
FB_APPID = getattr(django_settings, "META_FB_APPID", "")
53-
FB_PROFILE_ID = getattr(django_settings, "META_FB_PROFILE_ID", "")
54-
FB_PUBLISHER = getattr(django_settings, "META_FB_PUBLISHER", "")
55-
FB_AUTHOR_URL = getattr(django_settings, "META_FB_AUTHOR_URL", "")
56-
FB_PAGES = getattr(django_settings, "META_FB_PAGES", "")
57-
TWITTER_TYPE = getattr(django_settings, "META_TWITTER_TYPE", TWITTER_TYPES[0][0])
58-
TWITTER_TYPES = getattr(django_settings, "META_TWITTER_TYPES", TWITTER_TYPES)
59-
TWITTER_SITE = getattr(django_settings, "META_TWITTER_SITE", "")
60-
TWITTER_AUTHOR = getattr(django_settings, "META_TWITTER_AUTHOR", "")
61-
SCHEMAORG_TYPE = getattr(django_settings, "META_SCHEMAORG_TYPE", SCHEMAORG_TYPES[0][0])
62-
SCHEMAORG_TYPES = getattr(django_settings, "META_SCHEMAORG_TYPES", SCHEMAORG_TYPES)
47+
META_OG_SECURE_URL_ITEMS = ("image", "audio", "video")
48+
META_DEFAULT_IMAGE = ""
49+
META_DEFAULT_TYPE = OBJECT_TYPES[0][0]
50+
META_FB_TYPE = OBJECT_TYPES[0][0]
51+
META_FB_TYPES = FB_TYPES
52+
META_FB_APPID = ""
53+
META_FB_PROFILE_ID = ""
54+
META_FB_PUBLISHER = ""
55+
META_FB_AUTHOR_URL = ""
56+
META_FB_PAGES = ""
57+
META_TWITTER_TYPE = TWITTER_TYPES[0][0]
58+
META_TWITTER_TYPES = TWITTER_TYPES
59+
META_TWITTER_SITE = ""
60+
META_TWITTER_AUTHOR = ""
61+
META_SCHEMAORG_TYPE = SCHEMAORG_TYPES[0][0]
62+
META_SCHEMAORG_TYPES = SCHEMAORG_TYPES
63+
64+
params = {param: value for param, value in locals().items() if param.startswith("META_")}
65+
66+
67+
def get_setting(name):
68+
"""Get setting value from django settings with fallback to globals defaults."""
69+
from django.conf import settings
70+
71+
return getattr(settings, "META_%s" % name, params["META_%s" % name])

meta/templatetags/meta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.utils.html import escape
77
from django.utils.safestring import mark_safe
88

9-
from .. import settings
9+
from ..settings import get_setting
1010

1111
register = template.Library()
1212

@@ -124,7 +124,7 @@ def og_prop(name, value):
124124
:param name: property name (without 'og:' namespace)
125125
:param value: property value
126126
"""
127-
if not isinstance(value, dict) and name in settings.OG_SECURE_URL_ITEMS and value.startswith("https"):
127+
if not isinstance(value, dict) and name in get_setting("OG_SECURE_URL_ITEMS") and value.startswith("https"):
128128
data = {name: value, "%s:secure_url" % name: value}
129129
elif not isinstance(value, dict):
130130
data = {

meta/views.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from django.core.exceptions import ImproperlyConfigured
44

5-
from . import settings
5+
from .settings import get_setting
66

77

88
class Meta:
@@ -18,7 +18,7 @@ class Meta:
1818

1919
def __init__(self, **kwargs):
2020
self.request = kwargs.get("request", None)
21-
self.use_sites = kwargs.get("use_sites", settings.USE_SITES)
21+
self.use_sites = kwargs.get("use_sites", get_setting("USE_SITES"))
2222
self.title = kwargs.get("title")
2323
self.og_title = kwargs.get("og_title")
2424
self.twitter_title = kwargs.get("twitter_title")
@@ -27,43 +27,43 @@ def __init__(self, **kwargs):
2727
self.description = kwargs.get("description")
2828
self.extra_props = kwargs.get("extra_props")
2929
self.extra_custom_props = kwargs.get("extra_custom_props")
30-
self.custom_namespace = kwargs.get("custom_namespace", settings.OG_NAMESPACES)
30+
self.custom_namespace = kwargs.get("custom_namespace", get_setting("OG_NAMESPACES"))
3131
self.keywords = kwargs.get("keywords")
3232
self.url = kwargs.get("url")
3333
self.image = kwargs.get("image")
3434
self.image_object = kwargs.get("image_object")
3535
self.image_width = kwargs.get("image_width")
3636
self.image_height = kwargs.get("image_height")
37-
self.object_type = kwargs.get("object_type", settings.SITE_TYPE)
38-
self.site_name = kwargs.get("site_name", settings.SITE_NAME)
37+
self.object_type = kwargs.get("object_type", get_setting("SITE_TYPE"))
38+
self.site_name = kwargs.get("site_name", get_setting("SITE_NAME"))
3939
self.twitter_site = kwargs.get("twitter_site")
4040
self.twitter_creator = kwargs.get("twitter_creator")
41-
self.twitter_type = kwargs.get("twitter_type", kwargs.get("twitter_card", settings.TWITTER_TYPE))
41+
self.twitter_type = kwargs.get("twitter_type", kwargs.get("twitter_card", get_setting("TWITTER_TYPE")))
4242
self.twitter_card = self.twitter_type
4343
self.facebook_app_id = kwargs.get("facebook_app_id")
4444
self.locale = kwargs.get("locale")
45-
self.use_og = kwargs.get("use_og", settings.USE_OG_PROPERTIES)
46-
self.use_twitter = kwargs.get("use_twitter", settings.USE_TWITTER_PROPERTIES)
47-
self.use_facebook = kwargs.get("use_facebook", settings.USE_FACEBOOK_PROPERTIES)
48-
self.use_schemaorg = kwargs.get("use_schemaorg", settings.USE_SCHEMAORG_PROPERTIES)
49-
self.use_title_tag = kwargs.get("use_title_tag", settings.USE_TITLE_TAG)
50-
self.schemaorg_type = kwargs.get("schemaorg_type", settings.SCHEMAORG_TYPE)
51-
self.fb_pages = kwargs.get("fb_pages", settings.FB_PAGES)
52-
self.og_app_id = kwargs.get("og_app_id", settings.FB_APPID)
45+
self.use_og = kwargs.get("use_og", get_setting("USE_OG_PROPERTIES"))
46+
self.use_twitter = kwargs.get("use_twitter", get_setting("USE_TWITTER_PROPERTIES"))
47+
self.use_facebook = kwargs.get("use_facebook", get_setting("USE_FACEBOOK_PROPERTIES"))
48+
self.use_schemaorg = kwargs.get("use_schemaorg", get_setting("USE_SCHEMAORG_PROPERTIES"))
49+
self.use_title_tag = kwargs.get("use_title_tag", get_setting("USE_TITLE_TAG"))
50+
self.schemaorg_type = kwargs.get("schemaorg_type", get_setting("SCHEMAORG_TYPE"))
51+
self.fb_pages = kwargs.get("fb_pages", get_setting("FB_PAGES"))
52+
self.og_app_id = kwargs.get("og_app_id", get_setting("FB_APPID"))
5353

5454
def get_domain(self):
5555
if self.use_sites:
5656
from django.contrib.sites.models import Site
5757

5858
return Site.objects.get_current(self.request).domain
59-
if not settings.SITE_DOMAIN:
59+
if not get_setting("SITE_DOMAIN"):
6060
raise ImproperlyConfigured("META_SITE_DOMAIN is not set")
61-
return settings.SITE_DOMAIN
61+
return get_setting("SITE_DOMAIN")
6262

6363
def get_protocol(self):
64-
if not settings.SITE_PROTOCOL:
64+
if not get_setting("SITE_PROTOCOL"):
6565
raise ImproperlyConfigured("META_SITE_PROTOCOL is not set")
66-
return settings.SITE_PROTOCOL
66+
return get_setting("SITE_PROTOCOL")
6767

6868
def get_full_url(self, url):
6969
if not url:
@@ -83,14 +83,14 @@ def keywords(self):
8383
@keywords.setter
8484
def keywords(self, keywords):
8585
if keywords is None:
86-
kws = settings.DEFAULT_KEYWORDS
86+
kws = get_setting("DEFAULT_KEYWORDS")
8787
else:
8888
if not hasattr(keywords, "__iter__"):
8989
# Not iterable
9090
raise ValueError("Keywords must be an intrable")
9191
kws = list(keywords)
92-
if settings.INCLUDE_KEYWORDS:
93-
kws += settings.INCLUDE_KEYWORDS
92+
if get_setting("INCLUDE_KEYWORDS"):
93+
kws += get_setting("INCLUDE_KEYWORDS")
9494
seen = set()
9595
seen_add = seen.add
9696
self._keywords = [k for k in kws if k not in seen and not seen_add(k)]
@@ -105,7 +105,7 @@ def url(self, url):
105105

106106
def _normalize_media_url(self, url):
107107
if not url.startswith("http") and not url.startswith("/"):
108-
url = "{}{}".format(settings.IMAGE_URL, url)
108+
url = "{}{}".format(get_setting("IMAGE_URL"), url)
109109
return self.get_full_url(url)
110110

111111
@property
@@ -117,8 +117,8 @@ def image(self):
117117

118118
@image.setter
119119
def image(self, image):
120-
if image is None and settings.DEFAULT_IMAGE:
121-
image = settings.DEFAULT_IMAGE
120+
if image is None and get_setting("DEFAULT_IMAGE"):
121+
image = get_setting("DEFAULT_IMAGE")
122122
if image:
123123
self._image = self._normalize_media_url(image)
124124

@@ -175,19 +175,19 @@ class MetadataMixin:
175175
schemaorg_type = None
176176

177177
def __init__(self, **kwargs):
178-
self.use_sites = settings.USE_SITES
179-
self.use_og = settings.USE_OG_PROPERTIES
180-
self.use_title_tag = settings.USE_TITLE_TAG
178+
self.use_sites = get_setting("USE_SITES")
179+
self.use_og = get_setting("USE_OG_PROPERTIES")
180+
self.use_title_tag = get_setting("USE_TITLE_TAG")
181181
super().__init__(**kwargs)
182182

183183
def get_meta_class(self):
184184
return self.meta_class
185185

186186
def get_protocol(self):
187-
return settings.SITE_PROTOCOL
187+
return get_setting("SITE_PROTOCOL")
188188

189189
def get_domain(self):
190-
return settings.SITE_DOMAIN
190+
return get_setting("SITE_DOMAIN")
191191

192192
def get_meta_title(self, context=None):
193193
return self.title
@@ -222,10 +222,10 @@ def get_meta_image_object(self, context=None):
222222
return self.image_object
223223

224224
def get_meta_object_type(self, context=None):
225-
return self.object_type or settings.SITE_TYPE
225+
return self.object_type or get_setting("SITE_TYPE")
226226

227227
def get_meta_site_name(self, context=None):
228-
return self.site_name or settings.SITE_NAME
228+
return self.site_name or get_setting("SITE_NAME")
229229

230230
def get_meta_extra_props(self, context=None):
231231
return self.extra_props
@@ -234,7 +234,7 @@ def get_meta_extra_custom_props(self, context=None):
234234
return self.extra_custom_props
235235

236236
def get_meta_custom_namespace(self, context=None):
237-
return self.custom_namespace or settings.OG_NAMESPACES
237+
return self.custom_namespace or get_setting("OG_NAMESPACES")
238238

239239
def get_meta_twitter_site(self, context=None):
240240
return self.twitter_site

tests/test_asgi.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
try:
1111
from asgiref.sync import sync_to_async
12-
from django.test import AsyncRequestFactory
12+
from django.test import AsyncRequestFactory, override_settings
1313
except ImportError:
1414
# stub to avoid decorator failures
1515
def sync_to_async(__):
@@ -35,7 +35,6 @@ def get_post(title):
3535
text="post text",
3636
image_url="/path/to/image",
3737
)
38-
print(post.og_title)
3938
return post
4039

4140

@@ -53,18 +52,20 @@ def get_meta(post, request=None):
5352
@pytest.mark.asyncio
5453
@pytest.mark.django_db
5554
async def test_mixin_on_asgi():
56-
post = await get_post("first post")
57-
meta = await get_meta(post)
58-
assert meta.title == "first post"
59-
assert meta.og_title == "og first post"
55+
with override_settings(META_USE_SITES=True, META_SITE_PROTOCOL="http", META_USE_OG_PROPERTIES=True):
56+
post = await get_post("first post")
57+
meta = await get_meta(post)
58+
assert meta.title == "first post"
59+
assert meta.og_title == "og first post"
6060

6161

6262
@minversion
6363
@pytest.mark.asyncio
6464
@pytest.mark.django_db
6565
async def test_mixin_on_asgi_request():
66-
request = AsyncRequestFactory().get("/")
67-
post = await get_post("first post")
68-
meta = await get_meta(post, request)
69-
assert meta.title == "first post"
70-
assert meta.og_title == "og first post"
66+
with override_settings(META_USE_SITES=True, META_SITE_PROTOCOL="http", META_USE_OG_PROPERTIES=True):
67+
request = AsyncRequestFactory().get("/")
68+
post = await get_post("first post")
69+
meta = await get_meta(post, request)
70+
assert meta.title == "first post"
71+
assert meta.og_title == "og first post"

0 commit comments

Comments
 (0)