diff --git a/lacommunaute/forum_conversation/forms.py b/lacommunaute/forum_conversation/forms.py index 81f4ed376..0c997d5f1 100644 --- a/lacommunaute/forum_conversation/forms.py +++ b/lacommunaute/forum_conversation/forms.py @@ -7,6 +7,8 @@ from lacommunaute.forum_moderation.enums import BlockedPostReason from lacommunaute.forum_moderation.models import BlockedPost from lacommunaute.forum_moderation.utils import check_post_approbation +from lacommunaute.users.enums import EmailLastSeenKind +from lacommunaute.users.models import EmailLastSeen class CreateUpdatePostMixin: @@ -35,6 +37,13 @@ def update_post(self, post): post.updates_count = F("updates_count") + 1 + def save(self): + post = super().save() + EmailLastSeen.objects.seen( + email=post.username if self.user.is_anonymous else self.user.email, kind=EmailLastSeenKind.POST + ) + return post + class PostForm(CreateUpdatePostMixin, AbstractPostForm): subject = CharField(widget=HiddenInput(), required=False) diff --git a/lacommunaute/forum_conversation/tests/tests_forms.py b/lacommunaute/forum_conversation/tests/tests_forms.py index 138cad91c..d262fbb97 100644 --- a/lacommunaute/forum_conversation/tests/tests_forms.py +++ b/lacommunaute/forum_conversation/tests/tests_forms.py @@ -15,7 +15,9 @@ ) from lacommunaute.forum_conversation.forms import PostForm from lacommunaute.forum_conversation.models import Topic +from lacommunaute.users.enums import EmailLastSeenKind from lacommunaute.users.factories import UserFactory +from lacommunaute.users.models import EmailLastSeen faker = Faker(settings.LANGUAGE_CODE) @@ -86,6 +88,10 @@ def get_post_update_url(post): ) +def check_email_last_seen(email): + assert EmailLastSeen.objects.filter(email=email, last_seen_kind=EmailLastSeenKind.POST).exists() + + superuser_hidden_fields = { "poll-TOTAL_FORMS": 2, "poll-INITIAL_FORMS": 0, @@ -111,6 +117,8 @@ def test_create_topic_as_anonymous(self, db, client, public_forum): assert topic.first_post.updates_count == 0 assert topic.first_post.updated_by is None + check_email_last_seen(username) + def test_update_anonymous_topic_as_self(self, db, client, public_forum): topic = AnonymousTopicFactory(forum=public_forum, with_post=True) username = topic.first_post.username @@ -128,6 +136,9 @@ def test_update_anonymous_topic_as_self(self, db, client, public_forum): assert topic.first_post.updates_count == 0 # surprisingly, this is not incremented assert topic.first_post.updated_by is None # updated_by is a FK on User + # vincentporte TODO: assert UpdateTopicView override has to be fix up + # check_email_last_seen(username) + def test_update_anonymous_topic_as_superuser(self, db, client, public_forum): topic = AnonymousTopicFactory(forum=public_forum, with_post=True) username = topic.first_post.username @@ -149,6 +160,8 @@ def test_update_anonymous_topic_as_superuser(self, db, client, public_forum): assert topic.first_post.updates_count == 1 assert topic.first_post.updated_by == superuser + check_email_last_seen(superuser.email) + def test_create_topic_as_authenticated(self, db, client, public_forum): user = UserFactory() client.force_login(user) @@ -165,6 +178,8 @@ def test_create_topic_as_authenticated(self, db, client, public_forum): assert topic.first_post.updates_count == 0 assert topic.first_post.updated_by is None + check_email_last_seen(user.email) + def test_update_authenticated_topic_as_self(self, db, client, public_forum): topic = TopicFactory(forum=public_forum, with_post=True) user = topic.poster @@ -181,6 +196,8 @@ def test_update_authenticated_topic_as_self(self, db, client, public_forum): assert topic.first_post.updates_count == 1 assert topic.first_post.updated_by == user + check_email_last_seen(user.email) + def test_update_authenticated_topic_as_superuser(self, db, client, public_forum): topic = TopicFactory(forum=public_forum, with_post=True) user = topic.poster @@ -202,6 +219,8 @@ def test_update_authenticated_topic_as_superuser(self, db, client, public_forum) assert topic.first_post.updates_count == 1 assert topic.first_post.updated_by == superuser + check_email_last_seen(superuser.email) + def test_init_tags_when_creating_topic(self, db, client, public_forum): response = client.get(get_create_topic_url(public_forum)) assert response.status_code == 200 @@ -240,6 +259,8 @@ def test_reply_as_anonymous(self, db, client, public_forum): assert post.updates_count == 0 assert post.updated_by is None + check_email_last_seen(username) + def test_update_anonymous_reply_as_self(self, db, client, public_forum): post = AnonymousPostFactory(topic=TopicFactory(forum=public_forum, with_post=True)) username = post.username @@ -256,6 +277,9 @@ def test_update_anonymous_reply_as_self(self, db, client, public_forum): assert post.updates_count == 0 # surprisingly, this is not incremented assert post.updated_by is None + # vincentporte TODO: assert UpdatePostView override has to be fix up + # check_email_last_seen(username) + def test_update_anonymous_reply_as_superuser(self, db, client, public_forum): post = AnonymousPostFactory(topic=TopicFactory(forum=public_forum, with_post=True)) username = post.username @@ -272,6 +296,8 @@ def test_update_anonymous_reply_as_superuser(self, db, client, public_forum): assert post.updates_count == 1 assert post.updated_by == superuser + check_email_last_seen(superuser.email) + def test_reply_as_authenticated(self, db, client, public_forum): topic = TopicFactory(forum=public_forum, with_post=True) user = UserFactory() @@ -289,6 +315,8 @@ def test_reply_as_authenticated(self, db, client, public_forum): assert post.updates_count == 0 assert post.updated_by is None + check_email_last_seen(user.email) + def test_update_authenticated_reply_as_self(self, db, client, public_forum): post = PostFactory(topic=TopicFactory(forum=public_forum, with_post=True)) user = post.poster @@ -304,6 +332,8 @@ def test_update_authenticated_reply_as_self(self, db, client, public_forum): assert post.updates_count == 1 assert post.updated_by == user + check_email_last_seen(user.email) + def test_update_authenticated_reply_as_superuser(self, db, client, public_forum): post = PostFactory(topic=TopicFactory(forum=public_forum, with_post=True)) user = post.poster @@ -319,3 +349,5 @@ def test_update_authenticated_reply_as_superuser(self, db, client, public_forum) assert post.poster == user assert post.updates_count == 1 assert post.updated_by == superuser + + check_email_last_seen(superuser.email) diff --git a/lacommunaute/forum_conversation/tests/tests_views_htmx.py b/lacommunaute/forum_conversation/tests/tests_views_htmx.py index ac87dd15c..2e1398c9d 100644 --- a/lacommunaute/forum_conversation/tests/tests_views_htmx.py +++ b/lacommunaute/forum_conversation/tests/tests_views_htmx.py @@ -1,3 +1,4 @@ +import pytest from django.conf import settings from django.contrib.auth.models import AnonymousUser from django.test import RequestFactory, TestCase @@ -6,6 +7,7 @@ from machina.core.db.models import get_model from machina.core.loading import get_class +from lacommunaute.forum.factories import ForumFactory from lacommunaute.forum_conversation.factories import CertifiedPostFactory, PostFactory, TopicFactory from lacommunaute.forum_conversation.forms import PostForm from lacommunaute.forum_conversation.models import CertifiedPost, Topic @@ -15,7 +17,9 @@ from lacommunaute.forum_moderation.models import BlockedPost from lacommunaute.forum_upvote.factories import UpVoteFactory from lacommunaute.notification.factories import NotificationFactory +from lacommunaute.users.enums import EmailLastSeenKind from lacommunaute.users.factories import UserFactory +from lacommunaute.users.models import EmailLastSeen faker = Faker(settings.LANGUAGE_CODE) @@ -424,6 +428,33 @@ def test_create_post_with_blocked_domain_name(self): assert blocked_post.block_reason == BlockedPostReason.BLOCKED_DOMAIN +class TestPostFeedCreateView: + @pytest.mark.parametrize("logged", [True, False]) + def test_email_last_seen_is_updated(self, client, db, logged): + topic = TopicFactory(with_post=True, forum=ForumFactory(with_public_perms=True)) + url = reverse( + "forum_conversation_extension:post_create", + kwargs={ + "forum_pk": topic.forum.pk, + "forum_slug": topic.forum.slug, + "pk": topic.pk, + "slug": topic.slug, + }, + ) + data = {"content": faker.paragraph(nb_sentences=5)} + + if logged: + client.force_login(topic.poster) + else: + data["username"] = "bobby@lapointe.fr" + + response = client.post(url, data=data) + assert response.status_code == 200 + + email = topic.poster.email if logged else data["username"] + assert EmailLastSeen.objects.filter(email=email, last_seen_kind=EmailLastSeenKind.POST).exists() + + # vincentporte : not to futur self, rewrite it in pytest style class CertifiedPostViewTest(TestCase): @classmethod