fix
[wolnelektury.git] / src / social / models.py
index 2692538..862db4c 100644 (file)
@@ -4,7 +4,6 @@
 from datetime import datetime
 import uuid
 from oauthlib.common import urlencode, generate_token
 from datetime import datetime
 import uuid
 from oauthlib.common import urlencode, generate_token
-from pytz import utc
 from random import randint
 from django.db import models
 from django.conf import settings
 from random import randint
 from django.db import models
 from django.conf import settings
@@ -12,7 +11,7 @@ from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 from django.core.mail import send_mail
 from django.urls import reverse
 from django.core.exceptions import ValidationError
 from django.core.mail import send_mail
 from django.urls import reverse
-from django.utils.timezone import now
+from django.utils.timezone import now, utc
 from catalogue.models import Book
 from catalogue.utils import get_random_hash
 from wolnelektury.utils import cached_render, clear_cached_renders
 from catalogue.models import Book
 from catalogue.utils import get_random_hash
 from wolnelektury.utils import cached_render, clear_cached_renders
@@ -181,6 +180,16 @@ class CarouselItem(models.Model):
         return self.banner or self.banner_group.get_banner()
 
 
         return self.banner or self.banner_group.get_banner()
 
 
+class UserProfile(models.Model):
+    user = models.OneToOneField(User, models.CASCADE)
+    notifications = models.BooleanField(default=False)
+
+    @classmethod
+    def get_for(cls, user):
+        obj, created = cls.objects.get_or_create(user=user)
+        return obj
+
+
 class UserConfirmation(models.Model):
     user = models.ForeignKey(User, models.CASCADE)
     created_at = models.DateTimeField(auto_now_add=True)
 class UserConfirmation(models.Model):
     user = models.ForeignKey(User, models.CASCADE)
     created_at = models.DateTimeField(auto_now_add=True)
@@ -244,7 +253,8 @@ class Progress(Syncable, models.Model):
     def create_from_data(cls, user, data):
         return cls.objects.create(
             user=user,
     def create_from_data(cls, user, data):
         return cls.objects.create(
             user=user,
-            book=data['book']
+            book=data['book'],
+            reported_timestamp=now(),
         )
         
     def save(self, *args, **kwargs):
         )
         
     def save(self, *args, **kwargs):
@@ -326,12 +336,14 @@ class UserList(Syncable, models.Model):
                 favorites=True
             )
         except cls.DoesNotExist:
                 favorites=True
             )
         except cls.DoesNotExist:
+            n = now()
             if create:
                 return cls.objects.create(
                     user=user,
                     favorites=True,
             if create:
                 return cls.objects.create(
                     user=user,
                     favorites=True,
-                    slug=get_random_hash(name),
-                    updated_at=now()
+                    slug=get_random_hash('favorites'),
+                    updated_at=n,
+                    reported_timestamp=n,
                 )
             else:
                 return None
                 )
             else:
                 return None
@@ -353,14 +365,23 @@ class UserList(Syncable, models.Model):
         return ls.userlistitem_set.filter(deleted=False, book=book).exists()
 
     def append(self, book):
         return ls.userlistitem_set.filter(deleted=False, book=book).exists()
 
     def append(self, book):
-        # TODO: check for duplicates?
         n = now()
         n = now()
-        item = self.userlistitem_set.create(
+        items = self.userlistitem_set.filter(
             book=book,
             book=book,
-            order=(self.userlistitem_set.aggregate(m=models.Max('order'))['m'] or 0) + 1,
-            updated_at=n,
-            reported_timestamp=n,
         )
         )
+        if items.exists():
+            items.update(
+                deleted=False,
+                reported_timestamp=n,
+            )
+            item = items.first()
+        else:
+            item = self.userlistitem_set.create(
+                book=book,
+                order=(self.userlistitem_set.aggregate(m=models.Max('order'))['m'] or 0) + 1,
+                updated_at=n,
+                reported_timestamp=n,
+            )
         book.update_popularity()
         return item
 
         book.update_popularity()
         return item