예제 #1
0
    def get_context_data(self, **kwargs):
        context = super(UserCollectionsBase, self).get_context_data(**kwargs)
        try:
            user = UserProfile.objects.get(
                user__username=self.kwargs['username']).user
        except UserProfile.DoesNotExist:
            raise Http404

        image_ct = ContentType.objects.get_for_model(Image)

        context['requested_user'] = user
        context['public_images_no'] = Image.objects.filter(user=user).count()
        context['wip_images_no'] = Image.wip.filter(user=user).count()

        try:
            context['mobile_header_background'] = \
                    UserService(user).get_public_images().first().thumbnail('regular', None, sync=True) \
                        if UserService(user).get_public_images().exists() \
                        else None
        except IOError:
            context['mobile_header_background'] = None

        # TODO: stats

        return context
예제 #2
0
    def test_get_case_insensitive_one(self):
        user = Generators.user(username="******")

        self.assertEqual(user.username,
                         UserService.get_case_insensitive("one").username)
        self.assertEqual(user.username,
                         UserService.get_case_insensitive("onE").username)
예제 #3
0
    def test_get_wip_images(self):
        user = Generators.user()
        image = Generators.image(user=user)
        wip = Generators.image(user=user, is_wip=True)

        self.assertFalse(image in UserService(user).get_wip_images())
        self.assertTrue(wip in UserService(user).get_wip_images())
예제 #4
0
    def test_get_corrupted_images(self):
        user = Generators.user()
        non_corrupted = Generators.image(user=user)
        corrupted = Generators.image(user=user, corrupted=True)

        self.assertFalse(non_corrupted in UserService(user).get_corrupted_images())
        self.assertTrue(corrupted in UserService(user).get_corrupted_images())
예제 #5
0
    def test_get_deleted_images(self):
        user = Generators.user()
        image = Generators.image(user=user)
        deleted = Generators.image(user=user)

        deleted.delete()

        self.assertFalse(image in UserService(user).get_deleted_images())
        self.assertTrue(deleted in UserService(user).get_deleted_images())
예제 #6
0
    def test_can_unlike_anon(self, is_authenticated):
        image = Generators.image()
        like = Generators.like(image)

        is_authenticated.return_value = False

        self.assertFalse(UserService(like.user).can_unlike(image))
        self.assertEqual("ANONYMOUS",
                         UserService(like.user).can_unlike_reason(image))
예제 #7
0
    def test_get_public_images(self):
        user = Generators.user()
        image = Generators.image(user=user)
        wip = Generators.image(user=user, is_wip=True)
        corrupted = Generators.image(user=user, corrupted=True)

        self.assertTrue(image in UserService(user).get_public_images())
        self.assertFalse(wip in UserService(user).get_public_images())
        self.assertTrue(corrupted in UserService(user).get_public_images())
예제 #8
0
    def test_can_unlike_never_liked(self, is_authenticated):
        is_authenticated.return_value = True

        image = Generators.image()
        user = Generators.user()

        self.assertFalse(UserService(user).can_unlike(image))
        self.assertEqual("NEVER_LIKED",
                         UserService(user).can_unlike_reason(image))
예제 #9
0
    def test_get_users_in_group_sample_one_user(self):
        group = Group.objects.create(name='test_group')
        user = Generators.user()
        user.groups.add(group)

        self.assertEqual(
            1, len(UserService.get_users_in_group_sample(group.name, 10)))
        self.assertEqual(
            1, len(UserService.get_users_in_group_sample(group.name, 50)))
        self.assertEqual(
            1, len(UserService.get_users_in_group_sample(group.name, 100)))
예제 #10
0
    def test_shadow_bans(self):
        a = Generators.user()
        b = Generators.user()

        self.assertFalse(UserService(a).shadow_bans(b))
        self.assertFalse(UserService(b).shadow_bans(a))

        a.userprofile.shadow_bans.add(b.userprofile)

        self.assertTrue(UserService(a).shadow_bans(b))
        self.assertFalse(UserService(b).shadow_bans(a))
예제 #11
0
def image_post_save(sender, instance, created, **kwargs):
    # type: (object, Image, bool, object) -> None

    if created:
        instance.user.userprofile.premium_counter += 1
        instance.user.userprofile.save(keep_deleted=True)

        if not instance.user.userprofile.exclude_from_competitions:
            instance.designated_iotd_submitters.add(
                *UserService.get_users_in_group_sample(
                    'iotd_submitters', settings.
                    IOTD_DESIGNATED_SUBMITTERS_PERCENTAGE, instance.user))
            instance.designated_iotd_reviewers.add(
                *UserService.get_users_in_group_sample(
                    'iotd_reviewers', settings.
                    IOTD_DESIGNATED_REVIEWERS_PERCENTAGE, instance.user))

        if not instance.is_wip:
            if not instance.skip_notifications:
                push_notification_for_new_image.apply_async(args=(
                    instance.user.pk,
                    instance.pk,
                ))
            if instance.moderator_decision == 1:
                add_story(instance.user,
                          verb='VERB_UPLOADED_IMAGE',
                          action_object=instance)

        if Image.all_objects.filter(user=instance.user).count() == 1:
            push_notification(
                [instance.user], None, 'congratulations_for_your_first_image',
                {
                    'BASE_URL': settings.BASE_URL,
                    'PREMIUM_MAX_IMAGES_FREE':
                    settings.PREMIUM_MAX_IMAGES_FREE,
                    'url': reverse_url('image_detail',
                                       args=(instance.get_id(), ))
                })

    if not instance.uploader_in_progress:
        groups = instance.user.joined_group_set.filter(autosubmission=True)
        for group in groups:
            if instance.is_wip:
                group.images.remove(instance)
            else:
                group.images.add(instance)

        if instance.user.userprofile.updated < datetime.datetime.now(
        ) - datetime.timedelta(minutes=5):
            instance.user.save()
            try:
                instance.user.userprofile.save(keep_deleted=True)
            except UserProfile.DoesNotExist:
                pass
예제 #12
0
    def test_can_unlike_too_late(self, is_authenticated):
        is_authenticated.return_value = True

        image = Generators.image()
        like = Generators.like(image)

        like.created_on = timezone.now() - timedelta(hours=2)
        like.save()

        self.assertFalse(UserService(like.user).can_unlike(image))
        self.assertEqual("TOO_LATE",
                         UserService(like.user).can_unlike_reason(image))
예제 #13
0
    def test_get_users_in_group_sample_many_users(self):
        group = Group.objects.create(name='test_group')
        for i in range(100):
            user = Generators.user()
            user.groups.add(group)

        self.assertEqual(
            10, len(UserService.get_users_in_group_sample(group.name, 10)))
        self.assertEqual(
            50, len(UserService.get_users_in_group_sample(group.name, 50)))
        self.assertEqual(
            100, len(UserService.get_users_in_group_sample(group.name, 100)))
예제 #14
0
    def test_get_case_insensitive_two(self):
        user1 = Generators.user(username="******")
        user2 = Generators.user(username="******")

        self.assertEqual(
            user1.username,
            UserService.get_case_insensitive(user1.username).username)
        self.assertEqual(
            user2.username,
            UserService.get_case_insensitive(user2.username).username)

        with self.assertRaises(User.DoesNotExist):
            UserService.get_case_insensitive("One")
예제 #15
0
    def test_can_like_post_same_user(self, get_scores, is_free):
        user = Generators.user()
        post = Generators.forum_post(user=user)

        is_free.return_value = False

        self.assertFalse(UserService(user).can_like(post))
예제 #16
0
    def test_can_like_image_anon(self, is_authenticated):
        user = Generators.user()
        image = Generators.image()

        is_authenticated.return_value = False

        self.assertFalse(UserService(user).can_like(image))
예제 #17
0
    def test_can_like_image_superuser(self):
        user = Generators.user()
        image = Generators.image()
        user.is_superuser = True
        user.save()

        self.assertTrue(UserService(user).can_like(image))
예제 #18
0
 def post(self, request, *args, **kwargs):
     count = UserService(request.user).empty_trash()
     messages.success(
         request,
         _("%(number)s image(s) deleted from your trash." %
           {"number": count}))
     return self.render_json_response({"status": "OK"})
예제 #19
0
    def test_get_corrupted_images_when_non_final_revision_is_corrupted(self):
        user = Generators.user()
        image = Generators.image(user=user, is_final=False)
        Generators.imageRevision(image=image, is_final=False, corrupted=True)
        Generators.imageRevision(image=image, is_final=True, label='C')

        self.assertFalse(image in UserService(user).get_corrupted_images())
예제 #20
0
def image_post_delete(sender, instance, **kwargs):
    def decrease_counter(user):
        user.userprofile.premium_counter -= 1
        with transaction.atomic():
            user.userprofile.save(keep_deleted=True)

    ImageIndex().remove_object(instance)
    UserService(instance.user).clear_gallery_image_list_cache()

    try:
        if instance.uploaded > datetime.datetime.now() - relativedelta(
                hours=24):
            decrease_counter(instance.user)
        elif is_lite(instance.user):
            usersub = premium_get_valid_usersubscription(instance.user)
            usersub_created = usersub.expires - relativedelta(years=1)
            dt = instance.uploaded.date() - usersub_created
            if dt.days >= 0:
                decrease_counter(instance.user)
        elif is_lite_2020(instance.user) or \
                is_premium(instance.user) or \
                is_premium_2020(instance.user) or \
                is_any_ultimate(instance.user):
            decrease_counter(instance.user)
    except IntegrityError:
        # Possibly the user is being deleted
        pass
예제 #21
0
    def test_can_like_image_ok(self, get_scores, is_free):
        user = Generators.user()
        image = Generators.image()

        is_free.return_value = False

        self.assertTrue(UserService(user).can_like(image))
예제 #22
0
    def test_can_like_comment_same_user(self, get_scores, is_free):
        user = Generators.user()
        comment = NestedCommentsGenerators.comment(author=user)

        is_free.return_value = False

        self.assertFalse(UserService(user).can_like(comment))
예제 #23
0
    def test_can_like_image_index_zero(self, get_scores, is_free):
        get_scores.return_value = {'user_scores_index': 0}
        is_free.return_value = True

        user = Generators.user()
        image = Generators.image()

        self.assertTrue(UserService(user).can_like(image))
예제 #24
0
    def test_get_corrupted_images_when_corrupted_revision_is_deleted(self):
        user = Generators.user()
        image = Generators.image(user=user)
        revision = Generators.imageRevision(image=image, is_final=False, corrupted=True)

        revision.delete()

        self.assertFalse(image in UserService(user).get_corrupted_images())
예제 #25
0
    def test_can_like_image_index_too_low(self, get_scores, is_free):
        user = Generators.user()
        image = Generators.image()

        is_free.return_value = True
        get_scores.return_value = {'user_scores_index': .5}

        self.assertFalse(UserService(user).can_like(image))
예제 #26
0
    def test_get_users_in_group_sample_with_exclude(self):
        group = Group.objects.create(name='test_group')
        user = Generators.user()
        user.groups.add(group)

        self.assertEqual(
            0, len(UserService.get_users_in_group_sample(group.name, 10,
                                                         user)))
예제 #27
0
    def test_can_like_image_same_user(self, get_scores, is_free):
        get_scores.return_value = {'user_scores_index': 0}
        is_free.return_value = False

        user = Generators.user()
        image = Generators.image(user=user)

        self.assertFalse(UserService(user).can_like(image))
예제 #28
0
    def test_can_like_comment_ok(self, get_scores, is_free):
        get_scores.return_value = {'user_scores_index': 0}
        is_free.return_value = False

        user = Generators.user()
        comment = NestedCommentsGenerators.comment()

        self.assertTrue(UserService(user).can_like(comment))
예제 #29
0
    def test_can_like_post_ok(self, get_scores, is_free):
        get_scores.return_value = {'user_scores_index': 0}
        is_free.return_value = False

        user = Generators.user()
        post = Generators.forum_post()

        self.assertTrue(UserService(user).can_like(post))
예제 #30
0
def shadow_ban_applies(notice_type, recipient, context):
    from astrobin_apps_users.services import UserService

    if notice_type.label == 'received_email':
        message_sender = context.get('message').sender
        if UserService(recipient).shadow_bans(message_sender):
            return True

    return False