@@ -7,7 +7,7 @@ import re | |||||
from hyde.model import Expando | from hyde.model import Expando | ||||
from hyde.plugin import Plugin | from hyde.plugin import Plugin | ||||
from hyde.site import Node, Resource | from hyde.site import Node, Resource | ||||
from hyde.util import add_method, pairwalk | |||||
from hyde.util import add_method, add_property, pairwalk | |||||
from collections import namedtuple | from collections import namedtuple | ||||
from functools import partial | from functools import partial | ||||
@@ -42,6 +42,10 @@ class Group(Expando): | |||||
'walk_resources_grouped_by_%s' % self.name, | 'walk_resources_grouped_by_%s' % self.name, | ||||
Group.walk_resources, | Group.walk_resources, | ||||
group=self) | group=self) | ||||
add_property(Resource, | |||||
'%s_group' % self.name, | |||||
Group.get_resource_group, | |||||
group=self) | |||||
add_method(Resource, | add_method(Resource, | ||||
'walk_%s_groups' % self.name, | 'walk_%s_groups' % self.name, | ||||
Group.walk_resource_groups, | Group.walk_resource_groups, | ||||
@@ -57,6 +61,23 @@ class Group(Expando): | |||||
else: | else: | ||||
return super(Group, self).set_expando(key, value) | return super(Group, self).set_expando(key, value) | ||||
@staticmethod | |||||
def get_resource_group(resource, group): | |||||
""" | |||||
This method gets attached to the resource object. | |||||
Returns group and its ancestors that the resource | |||||
belongs to, in that order. | |||||
""" | |||||
try: | |||||
group_name = getattr(resource.meta, group.root.name) | |||||
except AttributeError: | |||||
group_name = None | |||||
return next((g for g in group.walk_groups() | |||||
if g.name == group_name), None) \ | |||||
if group_name \ | |||||
else None | |||||
@staticmethod | @staticmethod | ||||
def walk_resource_groups(resource, group): | def walk_resource_groups(resource, group): | ||||
""" | """ | ||||
@@ -130,6 +130,19 @@ class TestGrouperSingleLevel(object): | |||||
plugin_resources = [resource.name for resource in self.s.content.walk_resources_grouped_by_plugins()] | plugin_resources = [resource.name for resource in self.s.content.walk_resources_grouped_by_plugins()] | ||||
assert plugin_resources == self.plugins | assert plugin_resources == self.plugins | ||||
def test_resource_group(self): | |||||
groups = dict([(g.name, g) for g in self.s.grouper['section'].groups]) | |||||
for name, group in groups.items(): | |||||
pages = getattr(self, name) | |||||
for page in pages: | |||||
res = self.s.content.resource_from_relative_path('blog/' + page) | |||||
assert hasattr(res, 'section_group') | |||||
res_group = getattr(res, 'section_group') | |||||
print "%s, %s=%s" % (page, group.name, res_group.name) | |||||
assert res_group == group | |||||
def test_resource_belongs_to(self): | def test_resource_belongs_to(self): | ||||
groups = dict([(g.name, g) for g in self.s.grouper['section'].groups]) | groups = dict([(g.name, g) for g in self.s.grouper['section'].groups]) | ||||
@@ -92,11 +92,16 @@ def make_method(method_name, method_): | |||||
method__.__name__ = method_name | method__.__name__ = method_name | ||||
return method__ | return method__ | ||||
def add_property(obj, method_name, method_, *args, **kwargs): | |||||
from functools import partial | |||||
m = make_method(method_name, partial(method_, *args, **kwargs)) | |||||
setattr(obj, method_name, property(m)) | |||||
def add_method(obj, method_name, method_, *args, **kwargs): | def add_method(obj, method_name, method_, *args, **kwargs): | ||||
from functools import partial | from functools import partial | ||||
m = make_method(method_name, partial(method_, *args, **kwargs)) | m = make_method(method_name, partial(method_, *args, **kwargs)) | ||||
setattr(obj, method_name, m) | setattr(obj, method_name, m) | ||||
def pairwalk(iterable): | def pairwalk(iterable): | ||||
a, b = tee(iterable) | a, b = tee(iterable) | ||||
next(b, None) | next(b, None) |