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

Commit

Permalink
Merge pull request #440 from abhi20161997/notifications
Browse files Browse the repository at this point in the history
Added e-mail notifications
  • Loading branch information
poojithansl committed Aug 9, 2018
2 parents 6ef8154 + e736b56 commit 210ee62
Show file tree
Hide file tree
Showing 24 changed files with 170 additions and 11 deletions.
1 change: 1 addition & 0 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ pytest-django==3.2.1
pytest-pylint==0.9.0
selenium==3.12.0
djangorestframework==3.8.2
pinax-notifications==5.0.3
21 changes: 19 additions & 2 deletions systers_portal/meetup/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
RequestMeetup)
from users.models import SystersUser
from common.models import Comment
from pinax.notifications import models as notification


class RequestMeetupLocationForm(ModelFormWithHelper):
Expand Down Expand Up @@ -52,8 +53,13 @@ def save(self, commit=True):
instance = super(RequestMeetupForm, self).save(commit=False)
instance.created_by = SystersUser.objects.get(user=self.user)
instance.meetup_location = self.meetup_location
moderators = [syster.user for syster in instance.meetup_location.moderators.all()]
if commit:
instance.save()
notification.send(moderators, 'new_meetup_request',
{'meetup_location': instance.meetup_location,
'systersuser': instance.created_by,
'meetup_request': instance})
return instance

def clean_date(self):
Expand Down Expand Up @@ -101,8 +107,11 @@ def save(self, commit=True):
instance = super(AddMeetupForm, self).save(commit=False)
instance.created_by = SystersUser.objects.get(user=self.created_by)
instance.meetup_location = self.meetup_location
members = [systers_user.user for systers_user in self.meetup_location.members.all()]
if commit:
instance.save()
notification.send(members, 'new_meetup', {'meetup_location': self.meetup_location,
'meetup': instance})
return instance

def clean_date(self):
Expand Down Expand Up @@ -143,12 +152,14 @@ class Meta:
helper_cancel_href = "{% url 'members_meetup_location' meetup_location.slug %}"

def save(self, commit=True):
"""Override save to map input username to User and append it to the meetup location."""
"""Override save to map input username to User and append it to the meetup location. Also,
send the corresponding user the relevent notification."""
instance = super(AddMeetupLocationMemberForm, self).save(commit=False)
user = get_object_or_404(User, username=self.username)
systersuser = get_object_or_404(SystersUser, user=user)
if systersuser not in instance.members.all():
instance.members.add(systersuser)
notification.send([user], 'joined_meetup_location', {'meetup_location': instance})
if commit:
instance.save()
return instance
Expand Down Expand Up @@ -265,12 +276,18 @@ def __init__(self, *args, **kwargs):
super(AddSupportRequestForm, self).__init__(*args, **kwargs)

def save(self, commit=True):
"""Override save to add volunteer and meetup to the instance"""
"""Override save to add volunteer and meetup to the instance. Also, send notification to
all organizers."""
instance = super(AddSupportRequestForm, self).save(commit=False)
instance.volunteer = SystersUser.objects.get(user=self.volunteer)
instance.meetup = self.meetup
moderators = [syster.user for syster in instance.meetup.meetup_location.moderators.all()]
if commit:
instance.save()
notification.send(moderators, 'new_support_request',
{'meetup_location': instance.meetup.meetup_location,
'meetup': instance.meetup, 'systersuser': instance.volunteer,
'support_request': instance})
return instance


Expand Down
2 changes: 2 additions & 0 deletions systers_portal/meetup/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ class Migration(migrations.Migration):
dependencies = [
('cities_light', '0006_compensate_for_0003_bytestring_bug'),
('users', '0001_squashed_0003_auto_20160207_1550'),
('cities_light', '0006_compensate_for_0003_bytestring_bug'),

]

operations = [
Expand Down
22 changes: 21 additions & 1 deletion systers_portal/meetup/signals.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.db.models.signals import post_save, post_delete, m2m_changed, post_migrate
from django.dispatch import receiver
from django.contrib.auth.models import Group
from django.shortcuts import get_object_or_404
from pinax.notifications.models import NoticeType

from meetup.models import MeetupLocation
from meetup.constants import COMMUNITY_MEMBER, COMMUNITY_MODERATOR, COMMUNITY_LEADER
Expand Down Expand Up @@ -82,3 +83,22 @@ def delete_meetup_location_moderators(sender, **kwargs):
moderators_group = get_object_or_404(Group, name=COMMUNITY_MODERATOR.format(instance.name))
if systersuser.is_group_member(moderators_group.name):
systersuser.leave_group(moderators_group)


@receiver(post_migrate, dispatch_uid="create_notice_types")
def create_notice_types(sender, **kwargs):
"""Create notice types to send email notifications"""
NoticeType.create("new_join_request", ("New Join Request"),
("a user has requested to join the meetup location"))
NoticeType.create("joined_meetup_location", ("Joined Meetup Location"),
("you have joined a meetup location"))
NoticeType.create("made_moderator", ("Made moderator"),
("you have been made an moderator of a meetup location"))
NoticeType.create("new_meetup", ("New Meetup"),
("a new meetup has been added"))
NoticeType.create("new_support_request", ("New Support Request"),
("a user has added a support request"))
NoticeType.create("support_request_approved", ("Support Request Approved"),
("your support request has been approved"))
NoticeType.create("new_meetup_request", ("New Meetup Request"),
("a user has added a meetup request"))
28 changes: 27 additions & 1 deletion systers_portal/meetup/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from cities_light.models import City, Country
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.core import mail

from meetup.forms import (AddMeetupForm, EditMeetupForm, AddMeetupLocationMemberForm,
AddMeetupLocationForm, EditMeetupLocationForm, AddMeetupCommentForm,
Expand All @@ -28,6 +29,8 @@ def setUp(self):
self.meetup_location = MeetupLocation.objects.create(
name="Foo Systers", slug="foo", location=self.location,
description="It's a test meetup location", sponsors="BarBaz", leader=self.systers_user)
self.meetup_location.members.add(self.systers_user)
self.meetup_location.moderators.add(self.systers_user)

self.meetup = Meetup.objects.create(title='Foo Bar Baz', slug='foobarbaz',
date=timezone.now().date(),
Expand Down Expand Up @@ -76,6 +79,9 @@ def test_add_request_meetup_form(self):
self.assertTrue(new_meetup_request.title, 'Foo')
self.assertTrue(new_meetup_request.created_by, self.systers_user)
self.assertTrue(new_meetup_request.meetup_location, self.meetup_location)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user.email, mail.outbox[0].to)
self.assertIn('New Meetup Request', mail.outbox[0].subject)

def test_request_meetup_form_with_past_date(self):
"""Test add Meetup form with a date that has passed."""
Expand Down Expand Up @@ -103,6 +109,14 @@ def test_request_meetup_form_with_passed_time(self):


class AddMeetupFormTestCase(MeetupFormTestCaseBase, TestCase):
def setUp(self):
super(AddMeetupFormTestCase, self).setUp()
self.password = 'bazbar'
self.user2 = User.objects.create_user(username='baz', password=self.password,
email='user2@test.com')
self.systers_user2 = SystersUser.objects.get(user=self.user2)
self.meetup_location.members.add(self.systers_user2)

def test_add_meetup_form(self):
"""Test add Meetup form"""
invalid_data = {'title': 'abc', 'date': timezone.now().date()}
Expand All @@ -122,6 +136,11 @@ def test_add_meetup_form(self):
self.assertTrue(new_meetup.title, 'Foo')
self.assertTrue(new_meetup.created_by, self.systers_user)
self.assertTrue(new_meetup.meetup_location, self.meetup_location)
self.assertEqual(len(mail.outbox), 2)
self.assertIn(self.user.email, mail.outbox[0].to)
self.assertIn('New Meetup', mail.outbox[0].subject)
self.assertIn(self.user2.email, mail.outbox[1].to)
self.assertIn('New Meetup', mail.outbox[1].subject)

def test_add_meetup_form_with_past_date(self):
"""Test add Meetup form with a date that has passed."""
Expand Down Expand Up @@ -172,7 +191,8 @@ def test_edit_meetup_form(self):
class AddMeetupLocationMemberFormTestCase(MeetupFormTestCaseBase, TestCase):
def setUp(self):
super(AddMeetupLocationMemberFormTestCase, self).setUp()
self.user2 = User.objects.create_user(username='baz', password='bazbar')
self.user2 = User.objects.create_user(username='baz', password='bazbar',
email='user2@test.com')
self.systers_user2 = SystersUser.objects.get(user=self.user2)

def test_add_meetup_location_member_form(self):
Expand All @@ -190,6 +210,9 @@ def test_add_meetup_location_member_form(self):

members = self.meetup_location.members.all()
self.assertTrue(self.systers_user2 in members)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user2.email, mail.outbox[0].to)
self.assertIn('Joined Meetup Location', mail.outbox[0].subject)


class AddMeetupLocationFormTestCase(MeetupFormTestCaseBase, TestCase):
Expand Down Expand Up @@ -294,6 +317,9 @@ def test_add_support_request_form(self):
self.assertEqual(support_requests[0].description, 'This is a test description')
self.assertEqual(support_requests[0].volunteer, self.systers_user)
self.assertEqual(support_requests[0].meetup, self.meetup)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user.email, mail.outbox[0].to)
self.assertIn('New Support Request', mail.outbox[0].subject)


class EditSupportRequestFormTestCase(MeetupFormTestCaseBase, TestCase):
Expand Down
26 changes: 24 additions & 2 deletions systers_portal/meetup/tests/test_signals.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from django.test import TestCase
from django.contrib.auth.models import Group, User
from django.db.models.signals import post_save, post_delete, m2m_changed
from django.db.models.signals import post_save, post_delete, m2m_changed, post_migrate
from cities_light.models import City, Country
from pinax.notifications.models import NoticeType

from meetup.constants import COMMUNITY_MEMBER, COMMUNITY_MODERATOR
from meetup.models import MeetupLocation
from meetup.signals import (manage_meetup_location_groups, remove_meetup_location_groups,
add_meetup_location_members, add_meetup_location_moderators,
delete_meetup_location_members, delete_meetup_location_moderators)
delete_meetup_location_members, delete_meetup_location_moderators,
create_notice_types)
from users.models import SystersUser


Expand All @@ -27,6 +29,7 @@ def setUp(self):
m2m_changed.connect(delete_meetup_location_moderators,
sender=MeetupLocation.moderators.through,
dispatch_uid="delete_moderators")
post_migrate.connect(create_notice_types, dispatch_uid="create_notice_types")
self.password = "foobar"

def test_manage_meetup_location_groups(self):
Expand Down Expand Up @@ -124,3 +127,22 @@ def test_delete_meetup_location_moderators(self):
self.assertEqual(user.groups.get(), moderators_group)
meetup_location.moderators.remove(systers_user)
self.assertEqual(len(user.groups.all()), 0)

def test_create_notice_types(self):
"""Test creation of notice types"""
notice_types = NoticeType.objects.all()
self.assertEqual(len(notice_types), 7)
new_join_request = NoticeType.objects.get(label="new_join_request")
self.assertEqual(new_join_request.display, "New Join Request")
joined_meetup_location = NoticeType.objects.get(label="joined_meetup_location")
self.assertEqual(joined_meetup_location.display, "Joined Meetup Location")
made_moderator = NoticeType.objects.get(label="made_moderator")
self.assertEqual(made_moderator.display, "Made moderator")
new_meetup = NoticeType.objects.get(label="new_meetup")
self.assertEqual(new_meetup.display, "New Meetup")
new_support_request = NoticeType.objects.get(label="new_support_request")
self.assertEqual(new_support_request.display, "New Support Request")
support_request_approved = NoticeType.objects.get(label="support_request_approved")
self.assertEqual(support_request_approved.display, "Support Request Approved")
new_meetup_request = NoticeType.objects.get(label="new_meetup_request")
self.assertEqual(new_meetup_request.display, "New Meetup Request")
27 changes: 23 additions & 4 deletions systers_portal/meetup/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.utils import timezone
from cities_light.models import City, Country
from django.contrib.contenttypes.models import ContentType
from django.core import mail

from meetup.models import (Meetup, MeetupLocation, Rsvp, SupportRequest, RequestMeetupLocation,
RequestMeetup)
Expand Down Expand Up @@ -663,7 +664,9 @@ def test_view_remove_meetup_location_moderator_view(self):
class MakeMeetupLocationModeratorViewTestCase(MeetupLocationViewBaseTestCase, TestCase):
def setUp(self):
super(MakeMeetupLocationModeratorViewTestCase, self).setUp()
self.user2 = User.objects.create_user(username='baz', password='bazbar')
self.password = 'bazbar'
self.user2 = User.objects.create_user(username='baz', password=self.password,
email='user2@test.com')
self.systers_user2 = SystersUser.objects.get(user=self.user2)
self.meetup_location.members.add(self.systers_user2)

Expand All @@ -687,15 +690,21 @@ def test_view_make_meetup_location_moderator_view(self):
self.assertRedirects(response, '/meetup/foo/members/')
self.assertEqual(len(self.meetup_location.members.all()), 2)
self.assertEqual(len(self.meetup_location.moderators.all()), 2)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user2.email, mail.outbox[0].to)
self.assertIn('Made moderator', mail.outbox[0].subject)


class JoinMeetupLocationViewTestCase(MeetupLocationViewBaseTestCase, TestCase):
def setUp(self):
super(JoinMeetupLocationViewTestCase, self).setUp()
self.user2 = User.objects.create_user(username='baz', password='bazbar')
self.user2 = User.objects.create_user(username='baz', password='bazbar',
email='user2@test.com')
self.systers_user2 = SystersUser.objects.get(user=self.user2)
self.meetup_location.join_requests.add(self.systers_user2)
self.user3 = User.objects.create_user(username='bar', password='barbar')
self.password = 'barbar'
self.user3 = User.objects.create_user(username='bar', password=self.password,
email='user2@test.com')
self.systers_user3 = SystersUser.objects.get(user=self.user3)

def test_view_join_meetup_location_view(self):
Expand Down Expand Up @@ -725,6 +734,9 @@ def test_view_join_meetup_location_view(self):
self.assertTrue(
'Your request to join meetup location Foo Systers has been sent.'
in message.message)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user.email, mail.outbox[0].to)
self.assertIn('New Join Request', mail.outbox[0].subject)

url = reverse('join_meetup_location', kwargs={'slug': 'foo', 'username': 'baz'})
response = self.client.get(url, follow=True)
Expand Down Expand Up @@ -777,7 +789,8 @@ def test_view_meetup_location_join_requests_view(self):
class ApproveMeetupLocationJoinRequestsViewTestCase(MeetupLocationViewBaseTestCase, TestCase):
def setUp(self):
super(ApproveMeetupLocationJoinRequestsViewTestCase, self).setUp()
self.user2 = User.objects.create_user(username='baz', password='bazbar')
self.user2 = User.objects.create_user(username='baz', password='bazbar',
email='user2@test.com')
self.systers_user2 = SystersUser.objects.get(user=self.user2)
self.meetup_location.join_requests.add(self.systers_user2)

Expand All @@ -801,6 +814,9 @@ def test_view_approve_meetup_location_join_requests_view(self):
self.assertRedirects(response, '/meetup/foo/join_requests/')
self.assertEqual(len(self.meetup_location.join_requests.all()), 0)
self.assertEqual(len(self.meetup_location.members.all()), 2)
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user2.email, mail.outbox[0].to)
self.assertIn('Joined Meetup Location', mail.outbox[0].subject)


class RejectMeetupLocationJoinRequestsViewTestCase(MeetupLocationViewBaseTestCase, TestCase):
Expand Down Expand Up @@ -1593,6 +1609,9 @@ def test_view_approve_support_request_view(self):
self.assertEqual(len(response.context['supportrequest_list']), 1)
self.assertEqual(response.context['supportrequest_list'][0].description,
"Support Request: 2")
self.assertEqual(len(mail.outbox), 1)
self.assertIn(self.user.email, mail.outbox[0].to)
self.assertIn('Support Request Approved', mail.outbox[0].subject)


class RejectSupportRequestViewTestCase(MeetupLocationViewBaseTestCase, TestCase):
Expand Down

0 comments on commit 210ee62

Please sign in to comment.