Beispiel #1
0
 def setUp(self):
     self.user = UserFactory()
     self.other_user = UserFactory()
     self.group = GroupFactory(members=[self.user, self.other_user])
     self.other_group = GroupFactory(members=[self.user, self.other_user])
     self.place = PlaceFactory(group=self.group)
     self.other_place = PlaceFactory(group=self.other_group)
    def setUp(self):

        self.url = '/api/activities/'

        # activity for group with one member and one place
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.activity_type = ActivityTypeFactory(group=self.group)
        self.activity = ActivityFactory(activity_type=self.activity_type,
                                        place=self.place)

        # and another place + group + activity
        self.group2 = GroupFactory(members=[self.member])
        self.place2 = PlaceFactory(group=self.group2)
        self.activity_type2 = ActivityTypeFactory(group=self.group2)
        self.activity2 = ActivityFactory(activity_type=self.activity_type2,
                                         place=self.place2)

        # an activity series
        self.series = ActivitySeriesFactory(activity_type=self.activity_type,
                                            place=self.place)

        # another activity series
        self.series2 = ActivitySeriesFactory(activity_type=self.activity_type,
                                             place=self.place)
Beispiel #3
0
    def setUpTestData(cls):
        cls.user = VerifiedUserFactory()
        cls.other_user = VerifiedUserFactory()
        cls.non_verified_user = UserFactory()
        cls.group = GroupFactory(
            members=[cls.user, cls.other_user, cls.non_verified_user])
        cls.place = PlaceFactory(
            group=cls.group,
            subscribers=[cls.user, cls.other_user, cls.non_verified_user])

        cls.declined_place = PlaceFactory(group=cls.group,
                                          status=PlaceStatus.DECLINED.value)

        # unsubscribe other_user from notifications
        GroupMembership.objects.filter(
            group=cls.group, user=cls.other_user).update(notification_types=[])

        # add some random inactive users, to make sure we don't send to them
        inactive_users = [
            VerifiedUserFactory(language='en')
            for _ in list(range(randint(2, 5)))
        ]
        for user in inactive_users:
            membership = cls.group.add_member(user)
            membership.inactive_at = timezone.now()
            membership.save()
Beispiel #4
0
    def setUp(self):

        self.now = timezone.now()
        self.url = '/api/places/'
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.place_url = self.url + str(self.place.id) + '/'
        self.series = PickupDateSeriesFactory(max_collectors=3, place=self.place)
Beispiel #5
0
    def setUp(self):
        self.url = '/api/places/'

        # two groups one place
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.group2 = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.place2 = PlaceFactory(group=self.group2)
Beispiel #6
0
    def setUp(self):

        self.now = timezone.now()
        self.url = '/api/places/'
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.place = PlaceFactory(group=self.group)
        self.place_url = self.url + str(self.place.id) + '/'
        self.series = ActivitySeriesFactory(max_participants=3,
                                            place=self.place)
Beispiel #7
0
class TestPickupDateSeriesModel(TestCase):
    def setUp(self):
        self.place = PlaceFactory()

    def test_create_all_pickup_dates_inactive_places(self):
        self.place.status = PlaceStatus.ARCHIVED.value
        self.place.save()

        start_date = self.place.group.timezone.localize(datetime.now().replace(2017, 3, 18, 15, 0, 0, 0))

        PickupDateSeriesFactory(place=self.place, start_date=start_date)

        PickupDate.objects.all().delete()
        PickupDateSeries.objects.update_pickups()
        self.assertEqual(PickupDate.objects.count(), 0)

    def test_daylight_saving_time_to_summer(self):
        start_date = self.place.group.timezone.localize(datetime.now().replace(2017, 3, 18, 15, 0, 0, 0))

        before_dst_switch = timezone.now().replace(2017, 3, 18, 4, 40, 13)
        with freeze_time(before_dst_switch, tick=True):
            series = PickupDateSeriesFactory(place=self.place, start_date=start_date)

        expected_dates = []
        for month, day in [(3, 18), (3, 25), (4, 1), (4, 8)]:
            expected_dates.append(self.place.group.timezone.localize(datetime(2017, month, day, 15, 0)))
        for actual_date, expected_date in zip(PickupDate.objects.filter(series=series), expected_dates):
            self.assertEqual(actual_date.date.start, expected_date)

    def test_daylight_saving_time_to_winter(self):
        start_date = self.place.group.timezone.localize(datetime.now().replace(2016, 10, 22, 15, 0, 0, 0))

        before_dst_switch = timezone.now().replace(2016, 10, 22, 4, 40, 13)
        with freeze_time(before_dst_switch, tick=True):
            series = PickupDateSeriesFactory(place=self.place, start_date=start_date)

        expected_dates = []
        for month, day in [(10, 22), (10, 29), (11, 5), (11, 12)]:
            expected_dates.append(self.place.group.timezone.localize(datetime(2016, month, day, 15, 0)))
        for actual_date, expected_date in zip(PickupDate.objects.filter(series=series), expected_dates):
            self.assertEqual(actual_date.date.start, expected_date)

    def test_delete(self):
        now = timezone.now()
        two_weeks_ago = now - relativedelta(weeks=2)
        with freeze_time(two_weeks_ago, tick=True):
            series = PickupDateSeriesFactory(place=self.place, start_date=two_weeks_ago)

        pickup_dates = series.pickup_dates.all()
        past_date_count = pickup_dates.filter(date__startswith__lt=now).count()
        self.assertGreater(pickup_dates.count(), 2)
        series.delete()
        upcoming_pickups = PickupDate.objects.filter(date__startswith__gte=now, is_disabled=False)
        self.assertEqual(upcoming_pickups.count(), 0, upcoming_pickups)
        self.assertEqual(PickupDate.objects.filter(date__startswith__lt=now).count(), past_date_count)
    def setUp(self):
        self.url = '/api/pickup-dates/'

        # pickup date for group with one member and one place
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.active_place = PlaceFactory(group=self.group, status='active')
        self.inactive_place = PlaceFactory(group=self.group, status='created')

        PickupDateFactory(place=self.active_place)
        PickupDateFactory(place=self.inactive_place)
Beispiel #9
0
    def setUp(self):
        self.url = '/api/activities/'

        # activity for group with one member and one place
        self.member = UserFactory()
        self.group = GroupFactory(members=[self.member])
        self.activity_type = ActivityTypeFactory(group=self.group)
        self.active_place = PlaceFactory(group=self.group, status='active')
        self.inactive_place = PlaceFactory(group=self.group, status='created')

        ActivityFactory(activity_type=self.activity_type, place=self.active_place)
        ActivityFactory(activity_type=self.activity_type, place=self.inactive_place)
    def setUp(self):
        self.url = '/api/pickup-dates/'
        self.oneWeekAgo = to_range(timezone.now() - relativedelta(weeks=1))
        self.tooLongAgo = to_range(
            timezone.now() -
            relativedelta(days=settings.FEEDBACK_POSSIBLE_DAYS + 1),
            minutes=30)

        self.member = UserFactory()
        self.member2 = UserFactory()
        self.group = GroupFactory(members=[self.member, self.member2])
        self.place = PlaceFactory(group=self.group)

        # not member (anymore)
        self.group2 = GroupFactory(members=[])
        self.place2 = PlaceFactory(group=self.group2)

        self.pickupFeedbackPossible = PickupDateFactory(place=self.place,
                                                        collectors=[
                                                            self.member,
                                                        ],
                                                        date=self.oneWeekAgo)

        # now the issues where no feedback can be given
        self.pickupUpcoming = PickupDateFactory(place=self.place,
                                                collectors=[
                                                    self.member,
                                                ])
        self.pickupNotCollector = PickupDateFactory(place=self.place,
                                                    date=self.oneWeekAgo)
        self.pickupTooLongAgo = PickupDateFactory(place=self.place,
                                                  date=self.tooLongAgo)

        self.pickupFeedbackAlreadyGiven = PickupDateFactory(
            place=self.place, collectors=[
                self.member,
            ], date=self.oneWeekAgo)
        self.feedback = FeedbackFactory(about=self.pickupFeedbackAlreadyGiven,
                                        given_by=self.member)

        self.pickupCollectorLeftGroup = PickupDateFactory(place=self.place2,
                                                          collectors=[
                                                              self.member,
                                                          ],
                                                          date=self.oneWeekAgo)
        self.pickupDoneByAnotherUser = PickupDateFactory(place=self.place,
                                                         collectors=[
                                                             self.member2,
                                                         ],
                                                         date=self.oneWeekAgo)

        PickupDateModel.objects.process_finished_pickup_dates()
    def test_creates_pickup_disabled_notification_and_deletes_pickup_upcoming_notification(
            self):
        user1, user2 = UserFactory(), UserFactory()
        group = GroupFactory(members=[user1, user2])
        place = PlaceFactory(group=group)
        in_one_hour = to_range(timezone.now() + relativedelta(hours=1))
        pickup = PickupDateFactory(place=place,
                                   date=in_one_hour,
                                   collectors=[user1, user2])
        Notification.objects.all().delete()

        create_pickup_upcoming_notifications.call_local()
        pickup.last_changed_by = user2
        pickup.is_disabled = True
        pickup.save()

        pickup_upcoming_notifications = Notification.objects.filter(
            type=NotificationType.PICKUP_UPCOMING.value)
        self.assertEqual(pickup_upcoming_notifications.count(), 0)

        pickup_disabled_notifications = Notification.objects.filter(
            type=NotificationType.PICKUP_DISABLED.value)
        self.assertEqual(pickup_disabled_notifications.count(), 1)
        self.assertEqual(pickup_disabled_notifications[0].user, user1)
        context = pickup_disabled_notifications[0].context
        self.assertEqual(context['group'], group.id)
        self.assertEqual(context['pickup'], pickup.id)
        self.assertEqual(context['place'], place.id)
Beispiel #12
0
 def setUp(self):
     self.now = timezone.now()
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.series = PickupDateSeriesFactory(max_collectors=3,
                                           place=self.place)
Beispiel #13
0
 def setUp(self):
     super().setUp()
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.activity = ActivityFactory(place=self.place,
                                     participants=[self.member])
 def setUp(self):
     super().setUp()
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.pickup = PickupDateFactory(place=self.place,
                                     collectors=[self.member])
Beispiel #15
0
    def test_create_pickup_upcoming_notifications(self):
        users = [UserFactory() for _ in range(3)]
        group = GroupFactory(members=users)
        place = PlaceFactory(group=group)
        in_one_hour = to_range(timezone.now() + relativedelta(hours=1))
        pickup1 = PickupDateFactory(place=place,
                                    date=in_one_hour,
                                    collectors=users)
        in_two_hours = to_range(timezone.now() + relativedelta(hours=1))
        PickupDateFactory(place=place, date=in_two_hours, collectors=users)
        Notification.objects.all().delete()

        create_pickup_upcoming_notifications.call_local()
        notifications = Notification.objects.filter(
            type=NotificationType.PICKUP_UPCOMING.value)
        self.assertEqual(notifications.count(), 6)
        self.assertEqual(set(n.user.id for n in notifications),
                         set(user.id for user in users))
        pickup1_user1_collector = PickupDateCollector.objects.get(
            user=users[0], pickupdate=pickup1)
        pickup1_user1_notification = next(
            n for n in notifications
            if n.context['pickup_collector'] == pickup1_user1_collector.id)
        self.assertEqual(
            pickup1_user1_notification.context, {
                'group': group.id,
                'place': place.id,
                'pickup': pickup1.id,
                'pickup_collector': pickup1_user1_collector.id,
            })
        self.assertEqual(pickup1_user1_notification.expires_at,
                         pickup1.date.start)
Beispiel #16
0
    def test_creates_activity_disabled_notification_and_deletes_activity_upcoming_notification(
            self):
        user1, user2 = UserFactory(), UserFactory()
        group = GroupFactory(members=[user1, user2])
        place = PlaceFactory(group=group)
        in_one_hour = to_range(timezone.now() + relativedelta(hours=1))
        activity = ActivityFactory(place=place,
                                   date=in_one_hour,
                                   participants=[user1, user2])
        Notification.objects.all().delete()

        create_activity_upcoming_notifications.call_local()
        activity.last_changed_by = user2
        activity.is_disabled = True
        activity.save()

        activity_upcoming_notifications = Notification.objects.filter(
            type=NotificationType.ACTIVITY_UPCOMING.value)
        self.assertEqual(activity_upcoming_notifications.count(), 0)

        activity_disabled_notifications = Notification.objects.filter(
            type=NotificationType.ACTIVITY_DISABLED.value)
        self.assertEqual(activity_disabled_notifications.count(), 1)
        self.assertEqual(activity_disabled_notifications[0].user, user1)
        context = activity_disabled_notifications[0].context
        self.assertEqual(context['group'], group.id)
        self.assertEqual(context['activity'], activity.id)
        self.assertEqual(context['place'], place.id)
Beispiel #17
0
    def setUpTestData(cls):
        cls.url = '/api/places/'

        # group with two members and one place
        cls.member = UserFactory()
        cls.member2 = UserFactory()
        cls.group = GroupFactory(members=[cls.member, cls.member2])
        cls.place = PlaceFactory(group=cls.group)
        cls.place_url = cls.url + str(cls.place.id) + '/'

        # not a member
        cls.user = UserFactory()

        # another place for above group
        cls.place_data = {
            'name': faker.name(),
            'description': faker.name(),
            'group': cls.group.id,
            'address': faker.address(),
            'latitude': faker.latitude(),
            'longitude': faker.longitude()
        }

        # another group
        cls.different_group = GroupFactory(members=[cls.member2])
Beispiel #18
0
    def test_leave_group(self):
        place = PlaceFactory(group=self.group)
        pickupdate = PickupDateFactory(place=place,
                                       collectors=[self.member, self.user],
                                       date=to_range(timezone.now() +
                                                     relativedelta(weeks=1)))
        past_pickupdate = PickupDateFactory(
            place=place,
            collectors=[
                self.member,
            ],
            date=to_range(timezone.now() - relativedelta(weeks=1)))
        unrelated_pickupdate = PickupDateFactory(
            date=to_range(timezone.now() + relativedelta(weeks=1)),
            collectors=[
                self.member,
            ],
        )
        GroupMembership.objects.create(group=unrelated_pickupdate.place.group,
                                       user=self.member)

        self.client.force_login(user=self.member)
        response = self.client.post('/api/groups/{}/leave/'.format(
            self.group.id))
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertFalse(pickupdate.collectors.get_queryset().filter(
            id=self.member.id).exists())
        self.assertTrue(past_pickupdate.collectors.get_queryset().filter(
            id=self.member.id).exists())
        self.assertTrue(unrelated_pickupdate.collectors.get_queryset().filter(
            id=self.member.id).exists())
Beispiel #19
0
 def setUp(self):
     self.maxDiff = None
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.activity_type = ActivityTypeFactory(group=self.group)
     self.archived_activity_type = ActivityTypeFactory(group=self.group, status='archived')
Beispiel #20
0
 def setUp(self):
     self.now = timezone.now()
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.series = ActivitySeriesFactory(max_participants=3,
                                         place=self.place)
Beispiel #21
0
    def test_create_activity_upcoming_notifications(self):
        users = [UserFactory() for _ in range(3)]
        group = GroupFactory(members=users)
        place = PlaceFactory(group=group)
        in_one_hour = to_range(timezone.now() + relativedelta(hours=1))
        activity1 = ActivityFactory(place=place, date=in_one_hour, participants=users)
        in_two_hours = to_range(timezone.now() + relativedelta(hours=1))
        ActivityFactory(place=place, date=in_two_hours, participants=users)
        Notification.objects.all().delete()

        create_activity_upcoming_notifications.call_local()
        notifications = Notification.objects.filter(type=NotificationType.ACTIVITY_UPCOMING.value)
        self.assertEqual(notifications.count(), 6)
        self.assertEqual(set(n.user.id for n in notifications), set(user.id for user in users))
        activity1_user1_participant = ActivityParticipant.objects.get(user=users[0], activity=activity1)
        activity1_user1_notification = next(
            n for n in notifications if n.context['activity_participant'] == activity1_user1_participant.id
        )
        self.assertEqual(
            activity1_user1_notification.context, {
                'group': group.id,
                'place': place.id,
                'activity': activity1.id,
                'activity_participant': activity1_user1_participant.id,
            }
        )
        self.assertEqual(activity1_user1_notification.expires_at, activity1.date.start)
 def setUp(self):
     self.user = UserFactory()
     self.url = '/api/unsubscribe/{}/'
     self.user = UserFactory()
     self.group = GroupFactory(members=[self.user])
     self.place = PlaceFactory(group=self.group)
     self.other_group = GroupFactory(members=[self.user])
    def setUp(self):
        self.url = '/api/places/'

        # group with two members and one place
        self.member = UserFactory()
        self.member2 = UserFactory()
        self.group = GroupFactory(members=[self.member, self.member2])
        self.place = PlaceFactory(group=self.group)
        self.place_url = self.url + str(self.place.id) + '/'

        # not a member
        self.user = UserFactory()

        # another place for above group
        self.place_data = {
            'name': faker.name(),
            'description': faker.name(),
            'group': self.group.id,
            'address': faker.address(),
            'latitude': faker.latitude(),
            'longitude': faker.longitude()
        }

        # another group
        self.different_group = GroupFactory(members=[self.member2])
Beispiel #24
0
    def test_list_conversations_with_related_data_efficiently(self):
        user = UserFactory()
        group = GroupFactory(members=[user])
        place = PlaceFactory(group=group)
        pickup = PickupDateFactory(place=place)
        application = ApplicationFactory(user=UserFactory(), group=group)
        issue = IssueFactory(group=group)

        conversations = [
            t.conversation for t in (group, pickup, application, issue)
        ]
        [c.sync_users([user]) for c in conversations]
        [c.messages.create(content='hey', author=user) for c in conversations]

        ConversationMeta.objects.get_or_create(user=user)

        self.client.force_login(user=user)
        with self.assertNumQueries(13):
            response = self.client.get('/api/conversations/',
                                       {'group': group.id},
                                       format='json')
        results = response.data['results']

        self.assertEqual(len(results['conversations']), len(conversations))
        self.assertEqual(results['pickups'][0]['id'], pickup.id)
        self.assertEqual(results['applications'][0]['id'], application.id)
        self.assertEqual(results['issues'][0]['id'], issue.id)
Beispiel #25
0
    def make_activity_in_group(self, group):
        place = PlaceFactory(group=group)
        new_users = [VerifiedUserFactory() for _ in range(self.new_user_count)]
        user = new_users[0]

        a_few_days_ago = timezone.now() - relativedelta(days=4)
        with freeze_time(a_few_days_ago, tick=True):
            [group.add_member(u) for u in new_users]

            # a couple of messages
            [
                group.conversation.messages.create(author=user,
                                                   content='hello')
                for _ in range(self.message_count)
            ]

            # missed activities
            [
                ActivityFactory(place=place)
                for _ in range(self.activities_missed_count)
            ]

            # fullfilled activities
            activities = [
                ActivityFactory(place=place,
                                max_participants=1,
                                participants=[user])
                for _ in range(self.activities_done_count)
            ]

            # activity feedback
            [
                FeedbackFactory(about=activity, given_by=user)
                for activity in activities[:self.feedback_count]
            ]
Beispiel #26
0
 def setUp(self):
     self.user = VerifiedUserFactory()
     self.group = GroupFactory(members=[self.user])
     self.place = PlaceFactory(group=self.group)
     self.pickup = PickupDateFactory(place=self.place,
                                     collectors=[self.user])
     self.conversation = self.pickup.conversation
Beispiel #27
0
 def setUp(self):
     self.user = VerifiedUserFactory()
     self.user2 = VerifiedUserFactory()
     self.group = GroupFactory(members=[self.user, self.user2])
     self.place = PlaceFactory(subscribers=[self.user, self.user2])
     self.conversation = self.place.conversation
     mail.outbox = []
Beispiel #28
0
 def setUp(self):
     self.member = UserFactory()
     self.group = GroupFactory(members=[self.member])
     self.place = PlaceFactory(group=self.group)
     self.pickup = PickupDateFactory(place=self.place)
     self.pickup_url = '/api/pickup-dates/{}/'.format(self.pickup.id)
     self.series = PickupDateSeriesFactory(place=self.place)
     self.series_url = '/api/pickup-date-series/{}/'.format(self.series.id)
Beispiel #29
0
 def setUp(self):
     self.first_member = UserFactory()
     self.second_member = UserFactory()
     self.group = GroupFactory(
         members=[self.first_member, self.second_member])
     self.place = PlaceFactory(group=self.group)
     self.pickup = PickupDateFactory(place=self.place,
                                     collectors=[self.first_member])
Beispiel #30
0
    def test_place_message_title(self):
        author = UserFactory()
        place = PlaceFactory()
        conversation = Conversation.objects.get_or_create_for_target(place)
        message = conversation.messages.create(author=author, content='bla')

        title = get_message_title(message, 'en')
        self.assertEqual(title, '{} / {}'.format(place.name, author.display_name))