diff --git a/seminar/views/views_all.py b/seminar/views/views_all.py index 316211fd..a550c40a 100644 --- a/seminar/views/views_all.py +++ b/seminar/views/views_all.py @@ -127,6 +127,7 @@ class TNLData(object): def from_treenode(cls,anode,parent=None,index=None): out = cls(anode,parent,index) for (idx,ch) in enumerate(treelib.all_children(anode)): + # FIXME přidat filtrování na veřejnost outitem = cls.from_treenode(ch,out,idx) out.children.append(outitem) out.add_edit_options() diff --git a/seminar/viewsets.py b/seminar/viewsets.py index 57dac391..cc59f7d7 100644 --- a/seminar/viewsets.py +++ b/seminar/viewsets.py @@ -18,12 +18,30 @@ class PermissionMixin(object): # návštěvník nemusí být zalogován, aby si prohlížel obsah return [permission() for permission in permission_classes] - def has_object_permission(self, request, view, obj): - if obj.verejne: - return True - else: - return False + def verejne_nad(self, node): + """ Returns output of verejne for closest Rocnik, Cislo or Problem above. + (All of them have method verejne.)""" + parent = get_parent(node) + while True: + rocnik = isinstance(parent, RocnikNode) + cislo = isinstance(parent, CisloNode) + problem = isinstance(parent, ProblemNode) + + if (rocnik or cislo or problem): + break + else: + parent = get_parent(parent) + if rocnik: + return parent.rocnik.verejne() + elif cislo: + return parent.cislo.verejne() + elif problem: + return parent.problem.verjne() + def has_object_permission(self, request, view, obj): + # test that obj is Node + assert isinstance(obj, Node) + return verejne_nad(node) class ReadWriteSerializerMixin(object): """