Browse Source

Changed warns syncing implementation. #37

Rafał Pitoń 11 years ago
parent
commit
8ee5a86a15
1 changed files with 19 additions and 15 deletions
  1. 19 15
      misago/models/usermodel.py

+ 19 - 15
misago/models/usermodel.py

@@ -541,25 +541,26 @@ class User(models.Model):
 
 
     def is_warning_level_expired(self):
     def is_warning_level_expired(self):
         if self.warning_level and self.warning_level_update_on:
         if self.warning_level and self.warning_level_update_on:
-            return timezone.now() > self.warning_level_update_on
+            return tz_util.now() > self.warning_level_update_on
         return False
         return False
 
 
-    def update_warning_level(self):
-        if self.is_warning_level_expired():
-            self.warning_level -= 1
-            self.warning_level_update_on = None
+    def update_expired_warning_level(self):
+        self.warning_level -= 1
 
 
-        warning_level_model = None
-        if self.warning_level:
+        try:
             from misago.models import WarnLevel
             from misago.models import WarnLevel
-            warning_level_model = WarnLevel.objects.get_level(
-                self.warning_level)
-            if (warning_level_model
-                    and warning_level_model.expires_after_minutes):
-                self.warning_level_update_on = timezone.now()
-                self.warning_level_update_on += timedelta(
+            warning_levels = WarnLevel.objects.get_levels()
+            new_warning_level = warning_levels[self.warning_level]
+            if new_warning_level.expires_after_minutes:
+                self.warning_level_update_on -= timedelta(
                     minutes=warning_level_model.expires_after_minutes)
                     minutes=warning_level_model.expires_after_minutes)
-        self.save(force_update=True)
+            else:
+                self.warning_level_update_on = None
+        except KeyError:
+            # Break expiration chain so infinite loop won't happen
+            # This should only happen if your warning level is 0, but
+            # will also keep app responsive if data corruption happens
+            self.warning_level_update_on = None
 
 
     def get_warning_level(self):
     def get_warning_level(self):
         if self.warning_level:
         if self.warning_level:
@@ -571,7 +572,10 @@ class User(models.Model):
 
 
     def get_current_warning_level(self):
     def get_current_warning_level(self):
         if self.is_warning_level_expired():
         if self.is_warning_level_expired():
-            self.update_warning_level()
+            while self.update_expired_warning_level():
+                self.update_warning_level()
+            self.save(force_update=True)
+
         return self.get_warning_level()
         return self.get_warning_level()
 
 
     def timeline(self, qs, length=100):
     def timeline(self, qs, length=100):