Skip to content

Commit

Permalink
Merge 8e5f357 into 3964976
Browse files Browse the repository at this point in the history
  • Loading branch information
Chive committed May 28, 2015
2 parents 3964976 + 8e5f357 commit d53e77f
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 12 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,7 @@ docs/_build

#DB
*.sqlite
*.db
*.db

# Coverage
coverage_html
67 changes: 58 additions & 9 deletions aldryn_apphooks_config/tests/test_config.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
# -*- coding: utf-8 -*-

import os.path

from django.template import Template, RequestContext
from aldryn_apphooks_config.utils import get_app_instance

from cms import api
from cms.apphook_pool import apphook_pool
from cms.utils import get_cms_setting
from django.core.urlresolvers import reverse
from django.http import SimpleCookie
from django.utils.encoding import force_text
from django.utils.six import StringIO
from django.conf import settings
from djangocms_helper.base_test import BaseTestCase

from cms import api
from cms.apphook_pool import apphook_pool
from cms.utils import get_cms_setting

from djangocms_helper.base_test import BaseTestCase

from ..utils import (
get_app_instance, get_apphook_field_names, get_apphook_configs
)
from .utils.example.models import (
AnotherExampleConfig, ExampleConfig, Article, News, TranslatableArticle
AnotherExampleConfig, ExampleConfig, Article, News, TranslatableArticle,
NotApphookedModel
)


Expand All @@ -37,6 +39,10 @@ def setUp(self):
self.ns_app_2.app_data.config.property = 'app2_property'
self.ns_app_2.app_data.config.published_default = True
self.ns_app_2.save()
self.ns_app_3 = AnotherExampleConfig.objects.create(namespace='app3')
self.ns_app_3.app_data.config.property = 'app3_property'
self.ns_app_3.app_data.config.published_default = True
self.ns_app_3.save()

self.page_1 = api.create_page(
'page_1', self.template, self.language, published=True,
Expand Down Expand Up @@ -364,4 +370,47 @@ def test_templatetag(self):
context = RequestContext(request, {'object': article, 'current_app': self.ns_app_2.namespace})
template = Template('{% load apphooks_config_tags %}{% namespace_url "example_list" %}')
response = template.render(context)
self.assertEqual(response, self.page_2.get_absolute_url())
self.assertEqual(response, self.page_2.get_absolute_url())

def test_apphook_field_name_discovery(self):
field_names = get_apphook_field_names(Article)
self.assertEqual(field_names, ['section'])

field_names = get_apphook_field_names(TranslatableArticle)
self.assertEqual(field_names, ['section'])

field_names = get_apphook_field_names(News)
self.assertEqual(set(field_names), set(['config', 'section']))

field_names = get_apphook_field_names(NotApphookedModel)
self.assertEqual(field_names, [])

def test_apphook_field_name_discovery_from_objects(self):
field_names = get_apphook_field_names(Article())
self.assertEqual(field_names, ['section'])

field_names = get_apphook_field_names(TranslatableArticle())
self.assertEqual(field_names, ['section'])

field_names = get_apphook_field_names(News())
self.assertEqual(set(field_names), set(['config', 'section']))

field_names = get_apphook_field_names(NotApphookedModel())
self.assertEqual(field_names, [])

def test_apphook_config_objects_discovery(self):
obj = Article(section=self.ns_app_1)
configs = get_apphook_configs(obj)
self.assertEqual(configs, [self.ns_app_1])

obj = TranslatableArticle(section=self.ns_app_1)
configs = get_apphook_configs(obj)
self.assertEqual(configs, [self.ns_app_1])

obj = News(section=self.ns_app_1, config=self.ns_app_3)
configs = get_apphook_configs(obj)
self.assertEqual(set(configs), set([self.ns_app_1, self.ns_app_3]))

obj = NotApphookedModel()
configs = get_apphook_configs(obj)
self.assertEqual(configs, [])
3 changes: 3 additions & 0 deletions aldryn_apphooks_config/tests/utils/example/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,6 @@ class TranslatableArticle(TranslatableModel):
section = AppHookConfigField(ExampleConfig, verbose_name=_('section'))

objects = AppHookConfigTranslatableManager()

class NotApphookedModel(models.Model):
title = models.CharField(_('title'), max_length=234)
35 changes: 33 additions & 2 deletions aldryn_apphooks_config/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def setup_config(form_class, config_model):
app_registry.register('config', AppDataContainer.from_form(form_class), config_model)


def get_apphook_field_names(model):
def _get_apphook_field_names(model):
"""
Return all foreign key field names for a AppHookConfig based model
"""
Expand All @@ -53,6 +53,37 @@ def get_apphook_field_names(model):
fields.append(field)
return [field.name for field in fields]

# making key app/model specific to avoid inheritance issues
APP_CONFIG_FIELDS_KEY = '_app_config_field_names_{app_label}_{model_name}'


def get_apphook_field_names(model):
"""
Cache app-hook field names on model
:param model: model class or object
:return: list of foreign key field names to AppHookConfigs
"""
key = APP_CONFIG_FIELDS_KEY.format(
app_label=model._meta.app_label,
model_name=model._meta.object_name
).lower()
if not hasattr(model, key):
field_names = _get_apphook_field_names(model)
setattr(model, key, field_names)
return getattr(model, key)


def get_apphook_configs(obj):
"""
Get apphook configs for an object obj
:param obj: any model instance
:return: list of apphook configs for given obj
"""
keys = get_apphook_field_names(obj)
return [getattr(obj, key) for key in keys] if keys else []


def get_apphook_model(model, app_config_attribute):
"""
Expand All @@ -62,4 +93,4 @@ def get_apphook_model(model, app_config_attribute):
:param app_config_attribute: Fieldname of the app_config
:return: app_config model
"""
return model._meta.get_field_by_name(app_config_attribute)[0].rel.to
return model._meta.get_field_by_name(app_config_attribute)[0].rel.to

0 comments on commit d53e77f

Please sign in to comment.