Просмотр исходного кода

silence race condition fails cos #516

Rafał Pitoń 10 лет назад
Родитель
Сommit
39385f5e5f
2 измененных файлов с 17 добавлено и 6 удалено
  1. 7 1
      misago/users/models/ban.py
  2. 10 5
      misago/users/models/user.py

+ 7 - 1
misago/users/models/ban.py

@@ -1,7 +1,7 @@
 import re
 
 from django.conf import settings
-from django.db import models
+from django.db import IntegrityError, models
 from django.utils import timezone
 from django.utils.translation import ugettext_lazy as _
 
@@ -129,6 +129,12 @@ class BanCache(models.Model):
     staff_message = models.TextField(null=True, blank=True)
     expires_on = models.DateTimeField(null=True, blank=True)
 
+    def save(self, *args, **kwargs):
+        try:
+            super(BanCache, self).save(*args, **kwargs)
+        except IntegrityError:
+            pass # first come is first serve with ban cache
+
     @property
     def is_banned(self):
         return bool(self.ban)

+ 10 - 5
misago/users/models/user.py

@@ -5,10 +5,9 @@ from django.contrib.auth.models import (AbstractBaseUser, PermissionsMixin,
                                         AnonymousUser as DjangoAnonymousUser)
 from django.core.mail import send_mail
 from django.core.urlresolvers import reverse
-from django.db import models, transaction
+from django.db import IntegrityError, models, transaction
 from django.dispatch import receiver
 from django.utils import timezone
-dj_timezone = timezone
 from django.utils.translation import ugettext_lazy as _
 
 from misago.acl import get_user_acl
@@ -234,9 +233,9 @@ class User(AbstractBaseUser, PermissionsMixin):
     last_posted_on = models.DateTimeField(null=True, blank=True)
     last_searched_on = models.DateTimeField(null=True, blank=True)
 
-    reads_cutoff = models.DateTimeField(default=dj_timezone.now)
-    new_threads_cutoff = models.DateTimeField(default=dj_timezone.now)
-    unread_threads_cutoff = models.DateTimeField(default=dj_timezone.now)
+    reads_cutoff = models.DateTimeField(default=timezone.now)
+    new_threads_cutoff = models.DateTimeField(default=timezone.now)
+    unread_threads_cutoff = models.DateTimeField(default=timezone.now)
 
     USERNAME_FIELD = 'slug'
     REQUIRED_FIELDS = ['email']
@@ -421,6 +420,12 @@ class Online(models.Model):
     last_click = models.DateTimeField(default=timezone.now)
     is_visible_on_index = models.BooleanField(default=False)
 
+    def save(self, *args, **kwargs):
+        try:
+            super(Online, self).save(*args, **kwargs)
+        except IntegrityError:
+            pass # first come is first serve in online tracker
+
 
 class UsernameChange(models.Model):
     user = models.ForeignKey(settings.AUTH_USER_MODEL,