seasonal: show total
[wolnelektury.git] / src / social / models.py
index c41a78f..45ee0f4 100644 (file)
@@ -277,6 +277,11 @@ class Progress(Syncable, models.Model):
         return super().save(*args, **kwargs)
 
 
+class ActiveManager(models.Manager):
+    def get_queryset(self):
+        return super().get_queryset().filter(deleted=False)
+
+
 class UserList(Syncable, models.Model):
     slug = models.SlugField(unique=True)
     user = models.ForeignKey(User, models.CASCADE)
@@ -289,7 +294,10 @@ class UserList(Syncable, models.Model):
     reported_timestamp = models.DateTimeField()
 
     syncable_fields = ['name', 'public', 'deleted']
-    
+
+    objects = ActiveManager()
+    all_objects = models.Manager()
+
     def get_absolute_url(self):
         return reverse(
             'tagged_object_list',
@@ -351,7 +359,7 @@ class UserList(Syncable, models.Model):
             # merge?
             lists = list(cls.objects.filter(user=user, favorites=True))
             for l in lists[1:]:
-                t.userlistitem_set.all().update(
+                l.userlistitem_set.all().update(
                     list=lists[0]
                 )
                 l.delete()
@@ -365,14 +373,23 @@ class UserList(Syncable, models.Model):
         return ls.userlistitem_set.filter(deleted=False, book=book).exists()
 
     def append(self, book):
-        # TODO: check for duplicates?
         n = now()
-        item = self.userlistitem_set.create(
+        items = self.userlistitem_set.filter(
             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
 
@@ -401,11 +418,11 @@ class UserList(Syncable, models.Model):
 class UserListItem(Syncable, models.Model):
     list = models.ForeignKey(UserList, models.CASCADE)
     uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False, blank=True)
-    order = models.IntegerField()
+    order = models.IntegerField(default=0)
     deleted = models.BooleanField(default=False)
     created_at = models.DateTimeField(auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True)
-    reported_timestamp = models.DateTimeField()
+    reported_timestamp = models.DateTimeField(default=now)
 
     book = models.ForeignKey('catalogue.Book', models.SET_NULL, null=True, blank=True)
     fragment = models.ForeignKey('catalogue.Fragment', models.SET_NULL, null=True, blank=True)
@@ -416,6 +433,14 @@ class UserListItem(Syncable, models.Model):
     
     syncable_fields = ['order', 'deleted', 'book', 'fragment', 'quote', 'bookmark', 'note']
 
+    objects = ActiveManager()
+    all_objects = models.Manager()
+
+    def save(self, *args, **kwargs):
+        if not self.order:
+            self.order = self.list.userlistitem_set.all().count() + 1
+        super().save(*args, **kwargs)
+
     @classmethod
     def create_from_data(cls, user, data):
         if data.get('favorites'):