Skip to content
This repository has been archived by the owner on Jan 19, 2021. It is now read-only.

Commit

Permalink
[fix bug 1282452] Update basket for nda subscription.
Browse files Browse the repository at this point in the history
  • Loading branch information
akatsoulas committed Jul 5, 2016
1 parent 3cf4043 commit cb65049
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 13 deletions.
27 changes: 20 additions & 7 deletions mozillians/groups/models.py
@@ -1,16 +1,18 @@
from django.core.exceptions import ValidationError
from django.conf import settings
from django.db import models
from django.utils.timezone import now

from autoslug.fields import AutoSlugField
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy as _lazy

from autoslug.fields import AutoSlugField

from mozillians.common.urlresolvers import reverse
from mozillians.common.utils import absolutify
from mozillians.groups.managers import GroupBaseManager, GroupQuerySet
from mozillians.groups.templatetags.helpers import slugify
from mozillians.groups.tasks import email_membership_change, member_removed_email
from mozillians.users.tasks import unsubscribe_from_basket_task, update_basket_task


class GroupBase(models.Model):
Expand Down Expand Up @@ -252,6 +254,8 @@ def add_member(self, userprofile, status=GroupMembership.MEMBER):
If user is already in the group with a different status, their status will
be updated if the change is a promotion. Otherwise, their status will not change.
If the group in question is the NDA group, also add the user to the NDA newsletter.
"""
defaults = dict(status=status, date_joined=now())
membership, created = GroupMembership.objects.get_or_create(userprofile=userprofile,
Expand All @@ -274,6 +278,10 @@ def add_member(self, userprofile, status=GroupMembership.MEMBER):
membership.save()
if membership.status in [GroupMembership.PENDING, GroupMembership.MEMBER]:
email_membership_change.delay(self.pk, userprofile.user.pk, old_status, status)
# Since there is no demotion, we can check if the new status is MEMBER and
# subscribe the user to the NDA newsletter if the group is NDA
if self.name == settings.NDA_GROUP and status == GroupMembership.MEMBER:
update_basket_task.delay(userprofile.id, [settings.BASKET_NDA_NEWSLETTER])

def remove_member(self, userprofile, send_email=True):
try:
Expand All @@ -285,11 +293,16 @@ def remove_member(self, userprofile, send_email=True):

if old_status == GroupMembership.PENDING and send_email:
# Request denied
email_membership_change.delay(self.pk, userprofile.user.pk,
old_status, None)
elif old_status == GroupMembership.MEMBER and send_email:
# Member removed
member_removed_email.delay(self.pk, userprofile.user.pk)
email_membership_change.delay(self.pk, userprofile.user.pk, old_status, None)
elif old_status == GroupMembership.MEMBER:
# If group is the NDA group, unsubscribe user from the newsletter.
if self.name == settings.NDA_GROUP:
unsubscribe_from_basket_task.delay(userprofile.email, userprofile.basket_token,
[settings.BASKET_NDA_NEWSLETTER])

if send_email:
# Member removed
member_removed_email.delay(self.pk, userprofile.user.pk)

# delete the invitation to the group if exists
Invite.objects.filter(group=self, redeemer=userprofile).delete()
Expand Down
55 changes: 49 additions & 6 deletions mozillians/groups/tests/test_models.py
Expand Up @@ -3,12 +3,12 @@
from django.core.urlresolvers import reverse
from django.test.utils import override_settings

from mock import patch
from nose.tools import eq_, ok_

from mozillians.common.tests import TestCase
from mozillians.groups.models import Group, GroupAlias, GroupMembership
from mozillians.groups.tests import (GroupAliasFactory, GroupFactory,
SkillFactory)
from mozillians.groups.tests import GroupAliasFactory, GroupFactory, SkillFactory
from mozillians.users.tests import UserFactory


Expand Down Expand Up @@ -236,32 +236,75 @@ def test_deleted_curator_sets_null(self):
group = Group.objects.get(id=group.id)
eq_(group.curators.all().count(), 0)

def test_remove_member(self):
@patch('mozillians.users.tasks.unsubscribe_from_basket_task')
def test_remove_member(self, unsubscribe_basket_mock):
user = UserFactory.create()
group = GroupFactory.create()
group = GroupFactory.create(name='foo')
GroupMembership.objects.create(userprofile=user.userprofile, group=group,
status=GroupMembership.MEMBER)
ok_(group.has_member(user.userprofile))

group.remove_member(user.userprofile)
# The basket needs update only when the group is NDA.
ok_(not unsubscribe_basket_mock.called)
ok_(not GroupMembership.objects.filter(userprofile=user.userprofile,
group=group).exists())
ok_(not group.has_member(user.userprofile))

def test_add_member(self):
@patch('mozillians.users.tasks.unsubscribe_from_basket_task')
@override_settings(BASKET_VOUCHED_NEWSLETTER='nda')
def test_remove_member_nda(self, unsubscribe_basket_mock):
user = UserFactory.create(userprofile__email='user@example.com',
userprofile__basket_token='basket_token')
group = GroupFactory.create(name='nda')
GroupMembership.objects.create(userprofile=user.userprofile, group=group,
status=GroupMembership.MEMBER)
ok_(group.has_member(user.userprofile))

group.remove_member(user.userprofile)
ok_(not group.has_member(user.userprofile))
ok_(unsubscribe_basket_mock.called_with('user@example.com', 'basket_token', ['nda']))

@patch('mozillians.users.tasks.unsubscribe_from_basket_task')
@override_settings(BASKET_VOUCHED_NEWSLETTER='nda')
def test_remove_member_nda_pending_status(self, unsubscribe_basket_mock):
user = UserFactory.create(userprofile__email='user@example.com',
userprofile__basket_token='basket_token')
group = GroupFactory.create(name='nda')
GroupMembership.objects.create(userprofile=user.userprofile, group=group,
status=GroupMembership.PENDING_TERMS)

group.remove_member(user.userprofile)
ok_(not group.has_member(user.userprofile))
ok_(not unsubscribe_basket_mock.called)

@patch('mozillians.users.tasks.update_basket_task')
def test_add_member(self, update_basket_mock):
user = UserFactory.create()
group = GroupFactory.create()
group = GroupFactory.create(name='foo')
ok_(not group.has_member(user.userprofile))
group.add_member(user.userprofile)
ok_(GroupMembership.objects.filter(userprofile=user.userprofile, group=group,
status=GroupMembership.MEMBER).exists())
ok_(group.has_member(user.userprofile))
ok_(not update_basket_mock.called)
group.add_member(user.userprofile, status=GroupMembership.PENDING)
# never demotes anyone
ok_(GroupMembership.objects.filter(userprofile=user.userprofile, group=group,
status=GroupMembership.MEMBER).exists())
ok_(group.has_member(user.userprofile))

@patch('mozillians.users.tasks.update_basket_task')
@override_settings(BASKET_VOUCHED_NEWSLETTER='nda')
def test_add_member_nda(self, update_basket_mock):
user = UserFactory.create()
group = GroupFactory.create(name='nda')
ok_(not group.has_member(user.userprofile))
group.add_member(user.userprofile)
ok_(GroupMembership.objects.filter(userprofile=user.userprofile, group=group,
status=GroupMembership.MEMBER).exists())
ok_(update_basket_mock.called_with(user.userprofile.id, ['nda']))

def test_has_member(self):
user = UserFactory.create()
group = GroupFactory.create()
Expand Down

0 comments on commit cb65049

Please sign in to comment.