From 136c68aa0a6e9b1fdd111248caa538f49eb9f612 Mon Sep 17 00:00:00 2001 From: Christopher Neugebauer Date: Mon, 5 Sep 2016 10:01:36 +1000 Subject: [PATCH] Adds GroupMemberCondition, derivatives, and controllers. --- registrasion/controllers/conditions.py | 14 ++++++- registrasion/models/conditions.py | 58 ++++++++++++++++++++------ 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/registrasion/controllers/conditions.py b/registrasion/controllers/conditions.py index ac198347..31413d27 100644 --- a/registrasion/controllers/conditions.py +++ b/registrasion/controllers/conditions.py @@ -23,6 +23,8 @@ class ConditionController(object): def _controllers(): return { conditions.CategoryFlag: CategoryConditionController, + conditions.GroupMemberDiscount: GroupMemberConditionController, + conditions.GroupMemberFlag: GroupMemberConditionController, conditions.IncludedProductDiscount: ProductConditionController, conditions.ProductFlag: ProductConditionController, conditions.SpeakerFlag: SpeakerConditionController, @@ -319,7 +321,17 @@ class SpeakerConditionController(IsMetByFilter, ConditionController): # User is a copresenter user_is_copresenter = Q( is_copresenter=True, - proposal_kind__proposalbase__presentation__additional_speakers__user=u, + proposal_kind__proposalbase__presentation__additional_speakers__user=u, # NOQA ) return queryset.filter(user_is_presenter | user_is_copresenter) + + +class GroupMemberConditionController(IsMetByFilter, ConditionController): + + @classmethod + def pre_filter(self, queryset, user): + ''' Returns all of the items from queryset which are enabled by a user + being member of a Django Auth Group. ''' + + return queryset diff --git a/registrasion/models/conditions.py b/registrasion/models/conditions.py index c04b453f..8fac369b 100644 --- a/registrasion/models/conditions.py +++ b/registrasion/models/conditions.py @@ -2,6 +2,7 @@ import itertools from . import inventory +from django.contrib.auth.models import Group from django.core.exceptions import ValidationError from django.db import models from django.utils.encoding import python_2_unicode_compatible @@ -81,7 +82,7 @@ class IncludedProductCondition(models.Model): class SpeakerCondition(models.Model): ''' Conditions that are met if a user is a presenter, or copresenter, - of a specific of presentation. ''' + of a specific kind of presentation. ''' class Meta: abstract = True @@ -103,6 +104,20 @@ class SpeakerCondition(models.Model): ) +class GroupMemberCondition(models.Model): + ''' Conditions that are met if a user is a member (not declined or + rejected) of a specific django auth group. ''' + + class Meta: + abstract = True + + group = models.ManyToManyField( + Group, + help_text=_("The groups a user needs to be a member of for this" + "condition to be met."), + ) + + # Discounts @python_2_unicode_compatible @@ -325,12 +340,23 @@ class SpeakerDiscount(SpeakerCondition, DiscountBase): verbose_name_plural = _("discounts (speaker)") -class RoleDiscount(object): - ''' Discounts that are enabled because the active user has a specific - role. This is for e.g. volunteers who can get a discount ticket. ''' - # TODO: implement RoleDiscount - pass +class GroupMemberDiscount(GroupMemberCondition, DiscountBase): + ''' Discounts that are enabled because the user is a member of a specific + django auth Group. + Attributes: + group ([Group, ...]): The condition should be met if the user is a + member of one of these groups. + + ''' + + class Meta: + app_label = "registrasion" + verbose_name = _("discount (group member)") + verbose_name_plural = _("discounts (group member)") + + +# Flags @python_2_unicode_compatible class FlagBase(models.Model): @@ -517,9 +543,17 @@ class SpeakerFlag(SpeakerCondition, FlagBase): verbose_name_plural = _("flags (speaker)") -# @python_2_unicode_compatible -class RoleFlag(object): - ''' The condition is met because the active user has a particular Role. - This is for e.g. enabling Team tickets. ''' - # TODO: implement RoleFlag - pass +class GroupMemberFlag(GroupMemberCondition, FlagBase): + ''' Flag whose conditions are metbecause the user is a member of a specific + django auth Group. + + Attributes: + group ([Group, ...]): The condition should be met if the user is a + member of one of these groups. + + ''' + + class Meta: + app_label = "registrasion" + verbose_name = _("flag (group member)") + verbose_name_plural = _("flags (group member)")