Merge branch 'master' into appdev
[wolnelektury.git] / src / social / models.py
index 0b366fc..c41a78f 100644 (file)
@@ -4,7 +4,6 @@
 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
@@ -12,10 +11,11 @@ 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.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 .syncable import Syncable
 
 
 class BannerGroup(models.Model):
@@ -180,6 +180,16 @@ class CarouselItem(models.Model):
         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)
@@ -207,44 +217,6 @@ class UserConfirmation(models.Model):
         ).send()
 
 
-
-class Syncable:
-    @classmethod
-    def sync(cls, user, instance, data):
-        ts = data.get('timestamp')
-        if ts is None:
-            ts = now()
-        else:
-            ts = datetime.fromtimestamp(ts, tz=utc)
-
-        if instance is not None:
-            if ts and ts < instance.reported_timestamp:
-                return
-
-        if instance is None:
-            if data.get('deleted'):
-                return
-            instance = cls.create_from_data(user, data)
-            if instance is None:
-                return
-
-        instance.reported_timestamp = ts
-        for f in cls.syncable_fields:
-            if f in data:
-                setattr(instance, f, data[f])
-        
-        instance.save()
-        return instance
-
-    @property
-    def timestamp(self):
-        return self.updated_at.timestamp()
-    
-    @classmethod
-    def create_from_data(cls, user, data):
-        raise NotImplementedError
-
-
 class Progress(Syncable, models.Model):
     user = models.ForeignKey(User, models.CASCADE)
     book = models.ForeignKey('catalogue.Book', models.CASCADE)
@@ -281,7 +253,8 @@ class Progress(Syncable, models.Model):
     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):
@@ -363,12 +336,14 @@ class UserList(Syncable, models.Model):
                 favorites=True
             )
         except cls.DoesNotExist:
+            n = now()
             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