Skip to content

Commit

Permalink
Refactor rules and predicates
Browse files Browse the repository at this point in the history
 - move all predicates to corresponding package
  • Loading branch information
slomo committed Sep 1, 2016
1 parent 64f5285 commit 59e3974
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 64 deletions.
58 changes: 11 additions & 47 deletions euth/ideas/rules.py
Original file line number Diff line number Diff line change
@@ -1,54 +1,18 @@
import rules
from rules.predicates import is_superuser

from euth.phases import content
from euth.modules.predicates import (is_context_member, is_context_moderator,
is_owner)
from euth.phases.predicates import phase_allows_create, phase_allows_modify

from . import models
from .models import Idea


@rules.predicate
def is_active_phase(project, phase_type):
return[content.active_phase.type] == phase_type
rules.add_perm('ideas.modify_idea',
is_superuser | is_context_moderator |
(is_context_member & is_owner & phase_allows_modify))


@rules.predicate
def is_moderator(user, project):
return user in project.moderators.all()


@rules.predicate
def is_member(user, project):
return (
(project.is_public and user.is_authenticated())
or user in project.participants.all())


def has_feature_active(project, model, feature):
if not project.active_phase:
return False
else:
return project.active_phase.has_feature('crud', model)


@rules.predicate
def is_owner(user, item):
return item.creator == user


@rules.predicate
def can_modify_idea(user, idea):
return (
is_moderator(user, idea.project) | (
is_owner(user, idea) &
is_member(user, idea.project) &
has_feature_active(idea.project, models.Idea, 'crud')))


@rules.predicate
def can_create_idea(user, module):
return (
is_moderator(user, module.project) | (
is_member(user, module.project) &
has_feature_active(module.project, models.Idea, 'crud')))

rules.add_perm('ideas.modify_idea', can_modify_idea)
rules.add_perm('ideas.create_idea', can_create_idea)
rules.add_perm('ideas.create_idea',
is_superuser | is_context_moderator |
(is_context_member & phase_allows_create(Idea)))
18 changes: 18 additions & 0 deletions euth/modules/predicates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import rules

from euth.projects.predicates import is_member, is_moderator


@rules.predicate
def is_context_moderator(user, item):
return is_moderator(user, item.project)


@rules.predicate
def is_context_member(user, item):
return is_member(user, item.project)


@rules.predicate
def is_owner(user, item):
return item.creator == user
31 changes: 31 additions & 0 deletions euth/phases/predicates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import rules


def has_feature_active(project, model, feature):
if not project.active_phase:
return False
else:
return project.active_phase.has_feature(feature, model)


@rules.predicate
def phase_allows_modify(user, item):
return has_feature_active(item.project, item.__class__, 'crud')


def phase_allows_create(item_class):
@rules.predicate
def _create_predicate(user, module):
print(user, module, item_class)
return has_feature_active(module.project, item_class, 'crud')
return _create_predicate


@rules.predicate
def phase_allows_comment(user, item):
return has_feature_active(item.project, item.__class__, 'comment')


@rules.predicate
def phase_allows_rate(user, item):
return has_feature_active(item.project, item.__class__, 'rate')
2 changes: 1 addition & 1 deletion euth/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def has_member(self, user):
be joined as moderator or participant.
"""
return (
self.is_public
(user.is_authenticated() and self.is_public)
or (user in self.participants.all())
or (user in self.moderators.all())
)
Expand Down
26 changes: 26 additions & 0 deletions euth/projects/predicates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import rules


@rules.predicate
def is_member(user, project):
return project.has_member(user)


@rules.predicate
def is_public(user, project):
return project.is_public


@rules.predicate
def is_live(user, project):
return not project.is_draft


@rules.predicate
def is_initiator(user, project):
return user in project.organisation.initiators.all()


@rules.predicate
def is_moderator(user, project):
return user in project.moderators.all()
21 changes: 5 additions & 16 deletions euth/projects/rules.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
import rules
from rules.predicates import is_superuser

from .predicates import is_initiator, is_live, is_member, is_public

@rules.predicate
def is_member(user, project):
return project.has_member(user)


@rules.predicate
def is_live(user, project):
return not project.is_draft


@rules.predicate
def is_initiator(user, project):
return user in project.organisation.initiators.all()


rules.add_perm('projects.view_project', is_initiator | is_member & is_live)
rules.add_perm('projects.view_project',
is_superuser | is_initiator |
((is_public | is_member) & is_live))

0 comments on commit 59e3974

Please sign in to comment.