Skip to content
This repository has been archived by the owner on Oct 25, 2019. It is now read-only.

Commit

Permalink
Merge pull request #9 from nephila/feature/use_request
Browse files Browse the repository at this point in the history
Add methods to access the request, if as_meta is passed it
  • Loading branch information
yakky committed Sep 26, 2015
2 parents ca415e2 + f5798c1 commit ddef11c
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 28 deletions.
2 changes: 1 addition & 1 deletion example/example_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def get_description(self):
return description.strip()

def get_image_full_url(self):
return self.make_full_url(self.main_image.url)
return self.build_absolute_uri(self.main_image.url)

def get_full_url(self):
return self.make_full_url(self.get_absolute_url())
Expand Down
49 changes: 33 additions & 16 deletions meta_mixin/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
import contextlib
from copy import copy

from django.conf import settings as dj_settings
Expand Down Expand Up @@ -39,35 +40,44 @@ class ModelMeta(object):
'locale': False,
}

def as_meta(self):
def as_meta(self, request=None):
"""
Method that generates the Meta object (from django-meta)
"""
from meta.views import Meta
metadata = copy(self._metadata_default)
metadata.update(self._metadata)
meta = Meta()
for field, value in metadata.items():
if value:
attr = getattr(self, value, False)
if attr is not False:
if callable(attr):
try:
data = attr(field)
except TypeError:
data = attr()
with self.request(request):
for field, value in metadata.items():
if value:
attr = getattr(self, value, False)
if attr is not False:
if callable(attr):
try:
data = attr(field)
except TypeError:
data = attr()
else:
data = attr
else:
data = attr
else:
data = value
setattr(meta, field, data)
for field in ('og_description', 'twitter_description',
'gplus_description'):
data = value
setattr(meta, field, data)
for field in ('og_description', 'twitter_description', 'gplus_description'):
generaldesc = getattr(meta, 'description', False)
if not getattr(meta, field, False) and generaldesc:
setattr(meta, field, generaldesc)
return meta

@contextlib.contextmanager
def request(self, request):
self._request = request
yield
delattr(self, '_request')

def get_request(self):
return getattr(self, '_request', None)

def get_author(self):
"""
Retrieve the author object. This is meant to be overridden in the model
Expand Down Expand Up @@ -110,6 +120,13 @@ def get_meta_protocol(self):
return dj_settings.META_SITE_PROTOCOL

def make_full_url(self, url):
DeprecationWarning()
return self.build_absolute_uri(url)

def build_absolute_uri(self, url):
request = self.get_request()
if request:
return request.build_absolute_uri(url)
s = Site.objects.get_current()
meta_protocol = self.get_meta_protocol()
if url.startswith('http'):
Expand Down
57 changes: 46 additions & 11 deletions tests/test_mixin.py
Original file line number Diff line number Diff line change
@@ -1,30 +1,24 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from datetime import timedelta

from django.contrib.auth.models import User
from django.test import TestCase
from django.test.utils import override_settings
from django.utils import timezone

from djangocms_helper.base_test import BaseTestCase
from example_app.models import Post
from meta_mixin.models import ModelMeta
from meta_mixin.templatetags.meta_extra import generic_prop, googleplus_scope


class TestMeta_(TestCase):
class TestMeta(BaseTestCase):

def setUp(self):
user = User.objects.create(username='auser', first_name='Jane',
last_name='Doe')

self.post = Post.objects.create(
title='a title',
slug='title',
abstract='post abstract',
meta_description='post meta',
meta_keywords='post keyword1,post keyword 2',
author=user,
author=self.user,
date_published_end=timezone.now() + timedelta(days=2),
text='post text',
main_image='/path/to/image'
Expand Down Expand Up @@ -67,9 +61,50 @@ def test_as_meta(self):
else:
self.assertFalse(hasattr(meta, key))

self.assertEqual(self.post.build_absolute_uri('hi'), 'http://example.com/hi')
self.assertEqual(self.post.build_absolute_uri('http://example.com/hi'), 'http://example.com/hi')

def test_as_meta_with_request(self):
# Server is different as it's taken directly from the request object
expected = {
'locale': 'dummy_locale',
'image': 'https://testserver/path/to/image',
'object_type': 'Article',
'tag': False,
'keywords': ['post keyword1', 'post keyword 2'],
'og_profile_id': '1111111111111',
'twitter_description': 'post meta',
'gplus_type': 'Article',
'title': 'a title',
'gplus_description': 'post meta',
'expiration_time': self.post.date_published_end,
'og_description': 'post meta',
'description': 'post meta',
'twitter_type': 'Summary',
'modified_time': self.post.date_modified,
'og_author_url': 'https://facebook.com/foo.bar',
'og_app_id': False,
'gplus_author': '+FooBar',
'published_time': self.post.date_published,
'url': 'https://testserver/title/',
'og_publisher': 'https://facebook.com/foo.blag',
'og_type': 'Article',
'twitter_author': '@FooBar',
'twitter_site': '@FooBlag',
}
request = self.get_request(None, 'en', path='/title/', secure=True)
meta = self.post.as_meta(request)
self.assertTrue(meta)
for key in ModelMeta._metadata_default.keys():
value = expected[key]
if value is not False:
self.assertEqual(value, getattr(meta, key))
else:
self.assertFalse(hasattr(meta, key))

def test_templatetag(self):
meta = self.post.as_meta()
response = self.client.get("/title/")
response = self.client.get('/title/')
self.assertContains(response, 'itemscope itemtype="http://schema.org/Article"')
self.assertContains(response, 'article:published_time"')
self.assertContains(response, '<meta name="twitter:image:src" content="http://example.com/path/to/image">')
Expand All @@ -84,7 +119,7 @@ def test_templatetag(self):
def test_templatetag_no_og(self):
from meta import settings
settings.USE_OG_PROPERTIES = False
response = self.client.get("/title/")
response = self.client.get('/title/')
self.assertFalse(response.rendered_content.find('og:description') > -1)
self.assertContains(response, '<meta itemprop="description" content="%s">' % self.post.meta_description)
self.assertContains(response, '<meta name="twitter:description" content="%s">' % self.post.meta_description)
Expand Down

0 comments on commit ddef11c

Please sign in to comment.