Browse Source

#410: event model

Rafał Pitoń 10 years ago
parent
commit
058e7b2c2a

+ 15 - 0
misago/threads/checksums.py

@@ -14,3 +14,18 @@ def make_post_checksum(post):
 def update_post_checksum(post):
     post.checksum = make_post_checksum(post)
     return post.checksum
+
+
+def is_event_valid(event):
+    valid_checksum = make_event_checksum(event)
+    return event.checksum == valid_checksum
+
+
+def make_event_checksum(event):
+    event_seeds = [unicode(v) for v in (event.id, event.occured_on)]
+    return checksums.make_checksum(event.message, event_seeds)
+
+
+def update_event_checksum(event):
+    event.checksum = make_event_checksum(event)
+    return event.checksum

+ 22 - 3
misago/threads/migrations/0001_initial.py

@@ -37,7 +37,7 @@ class Migration(migrations.Migration):
                 ('poster_ip', models.GenericIPAddressField()),
                 ('original', models.TextField()),
                 ('parsed', models.TextField()),
-                ('checksum', models.CharField(max_length=64)),
+                ('checksum', models.CharField(max_length=64, default='-')),
                 ('has_attachments', models.BooleanField(default=False)),
                 ('pickled_attachments', models.TextField(null=True, blank=True)),
                 ('posted_on', models.DateTimeField()),
@@ -94,6 +94,25 @@ class Migration(migrations.Migration):
             },
             bases=(models.Model,),
         ),
+        migrations.CreateModel(
+            name='Event',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('author_name', models.CharField(max_length=255)),
+                ('author_slug', models.CharField(max_length=255)),
+                ('icon', models.CharField(max_length=255)),
+                ('occured_on', models.DateTimeField(default=django.utils.timezone.now, db_index=True)),
+                ('message', models.CharField(max_length=255)),
+                ('checksum', models.CharField(max_length=64, default='-')),
+                ('is_hidden', models.BooleanField(default=False)),
+                ('author', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, null=True)),
+                ('forum', models.ForeignKey(to='misago_forums.Forum')),
+                ('thread', models.ForeignKey(to='misago_threads.Thread')),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
         CreatePartialIndex(
             field='Thread.has_reported_posts',
             index_name='misago_thread_has_reported_posts_partial',
@@ -154,10 +173,10 @@ class Migration(migrations.Migration):
         migrations.AlterIndexTogether(
             name='thread',
             index_together=set([
-                ('forum', 'weight'),
                 ('forum', 'weight', 'id'),
                 ('forum', 'weight', 'last_post'),
-                ('forum', 'weight', 'replies')
+                ('forum', 'weight', 'replies'),
+                ('forum', 'weight')
             ]),
         ),
 ]

+ 1 - 0
misago/threads/models/__init__.py

@@ -2,3 +2,4 @@
 from misago.threads.models.label import *
 from misago.threads.models.post import *
 from misago.threads.models.thread import *
+from misago.threads.models.event import *

+ 29 - 0
misago/threads/models/event.py

@@ -0,0 +1,29 @@
+from django.db import models
+from django.utils import timezone
+
+from misago.conf import settings
+
+from misago.threads.checksums import is_event_valid
+
+
+class Event(models.Model):
+    forum = models.ForeignKey('misago_forums.Forum')
+    thread = models.ForeignKey('Thread')
+    author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
+                               on_delete=models.SET_NULL)
+    author_name = models.CharField(max_length=255)
+    author_slug = models.CharField(max_length=255)
+    icon = models.CharField(max_length=255)
+    occured_on = models.DateTimeField(default=timezone.now, db_index=True)
+    message = models.CharField(max_length=255)
+    checksum = models.CharField(max_length=64, default='-')
+    is_hidden = models.BooleanField(default=False)
+
+    @property
+    def is_valid(self):
+        return is_event_valid(self)
+
+    def set_author(self, user):
+        self.author = user
+        self.author_name = user.username
+        self.author_slug = user.slug

+ 1 - 1
misago/threads/models/post.py

@@ -15,7 +15,7 @@ class Post(models.Model):
     poster_ip = models.GenericIPAddressField()
     original = models.TextField()
     parsed = models.TextField()
-    checksum = models.CharField(max_length=64)
+    checksum = models.CharField(max_length=64, default='-')
     mentions = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                       related_name="mention_set")
     has_attachments = models.BooleanField(default=False)

+ 1 - 1
misago/threads/posting/reply.py

@@ -40,7 +40,7 @@ class ReplyFormMiddleware(PostingMiddleware):
         if self.mode != EDIT:
             self.post.save()# We need post id for checksum
 
-        self.post.post_checksum = update_post_checksum(self.post)
+        update_post_checksum(self.post)
         self.post.update_fields.append('checksum')
 
     def new_thread(self, form):

+ 9 - 2
misago/threads/signals.py

@@ -4,7 +4,7 @@ from django.dispatch import receiver, Signal
 from misago.core.pgutils import batch_update, batch_delete
 from misago.forums.models import Forum
 
-from misago.threads.models import Thread, Post
+from misago.threads.models import Thread, Post, Event
 
 
 delete_post = Signal()
@@ -25,13 +25,15 @@ def merge_threads_posts(sender, **kwargs):
 
 
 @receiver(move_thread)
-def move_thread_posts(sender, **kwargs):
+def move_thread_content(sender, **kwargs):
     sender.post_set.update(forum=sender.forum)
+    sender.event_set.update(forum=sender.forum)
 
 
 from misago.forums.signals import delete_forum_content, move_forum_content
 @receiver(delete_forum_content)
 def delete_forum_threads(sender, **kwargs):
+    sender.event_set.all().delete()
     sender.thread_set.all().delete()
     sender.post_set.all().delete()
 
@@ -41,6 +43,7 @@ def move_forum_threads(sender, **kwargs):
     new_forum = kwargs['new_forum']
     Thread.objects.filter(forum=sender).update(forum=new_forum)
     Post.objects.filter(forum=sender).update(forum=new_forum)
+    Event.objects.filter(forum=sender).update(forum=new_forum)
 
 
 from misago.users.signals import delete_user_content, username_changed
@@ -85,3 +88,7 @@ def update_usernames(sender, **kwargs):
     Post.objects.filter(last_editor=sender).update(
         last_editor_name=sender.username,
         last_editor_slug=sender.slug)
+
+    Event.objects.filter(author=sender).update(
+        author_name=sender.username,
+        author_slug=sender.slug)

+ 50 - 0
misago/threads/tests/test_event_model.py

@@ -0,0 +1,50 @@
+from django.contrib.auth import get_user_model
+from django.test import TestCase
+from django.utils import timezone
+
+from misago.forums.models import Forum
+
+from misago.threads.checksums import is_event_valid, update_event_checksum
+from misago.threads.models import Thread, Event
+
+
+class EventModelTests(TestCase):
+    def setUp(self):
+        User = get_user_model()
+        self.user = User.objects.create_user("Bob", "bob@bob.com", "Pass.123")
+
+        datetime = timezone.now()
+
+        self.forum = Forum.objects.filter(role="forum")[:1][0]
+        self.thread = Thread(
+            forum=self.forum,
+            weight=0,
+            started_on=datetime,
+            starter_name='Tester',
+            starter_slug='tester',
+            last_post_on=datetime,
+            last_poster_name='Tester',
+            last_poster_slug='tester')
+
+        self.thread.set_title("Test thread")
+        self.thread.save()
+
+    def test_is_event_valid(self):
+        """event is_valid flag returns valid value"""
+        event = Event.objects.create(
+            forum=self.forum,
+            thread=self.thread,
+            author=self.user,
+            message="Lorem ipsum",
+            author_name=self.user.username,
+            author_slug=self.user.slug)
+
+        update_event_checksum(event)
+
+        self.assertTrue(is_event_valid(event))
+        self.assertTrue(event.is_valid)
+
+        event.message = "Ipsum lorem"
+
+        self.assertFalse(is_event_valid(event))
+        self.assertFalse(event.is_valid)