Cleaning up model fields
This commit is contained in:
@ -5,6 +5,9 @@ from model_utils.managers import InheritanceManager
|
||||
|
||||
from fedireads.utils.fields import JSONField
|
||||
|
||||
# TODO: I don't know that these Activity models should exist, at least in this way
|
||||
# but I'm not sure what the right approach is for now.
|
||||
|
||||
class Activity(models.Model):
|
||||
''' basic fields for storing activities '''
|
||||
uuid = models.CharField(max_length=255, unique=True)
|
||||
@ -14,6 +17,7 @@ class Activity(models.Model):
|
||||
activity_type = models.CharField(max_length=255)
|
||||
# custom types internal to fedireads (Review, Shelve, ...)
|
||||
fedireads_type = models.CharField(max_length=255, blank=True, null=True)
|
||||
local = models.BooleanField(default=True)
|
||||
created_date = models.DateTimeField(auto_now_add=True)
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
objects = InheritanceManager()
|
||||
@ -48,7 +52,7 @@ class ReviewActivity(Activity):
|
||||
book = models.ForeignKey('Book', on_delete=models.PROTECT)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.activity_type = 'Article'
|
||||
self.activity_type = 'Note'
|
||||
self.fedireads_type = 'Review'
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
@ -58,6 +62,7 @@ class Status(models.Model):
|
||||
user = models.ForeignKey('User', on_delete=models.PROTECT)
|
||||
status_type = models.CharField(max_length=255, default='Note')
|
||||
activity = JSONField(max_length=5000, null=True)
|
||||
local = models.BooleanField(default=True)
|
||||
reply_parent = models.ForeignKey(
|
||||
'self',
|
||||
null=True,
|
||||
|
@ -1,23 +1,13 @@
|
||||
''' database schema for the whole dang thing '''
|
||||
''' database schema for books and shelves '''
|
||||
from django.db import models
|
||||
from model_utils.managers import InheritanceManager
|
||||
from django.dispatch import receiver
|
||||
from django.contrib.auth.models import AbstractUser
|
||||
from django.core.exceptions import ValidationError
|
||||
from Crypto import Random
|
||||
from Crypto.PublicKey import RSA
|
||||
import re
|
||||
|
||||
from fedireads.settings import DOMAIN, OL_URL
|
||||
from fedireads.utils.fields import JSONField
|
||||
|
||||
|
||||
class Shelf(models.Model):
|
||||
activitypub_id = models.CharField(max_length=255)
|
||||
identifier = models.CharField(max_length=255, unique=True)
|
||||
name = models.CharField(max_length=100)
|
||||
identifier = models.CharField(max_length=100)
|
||||
user = models.ForeignKey('User', on_delete=models.PROTECT)
|
||||
editable = models.BooleanField(default=True)
|
||||
shelf_type = models.CharField(default='custom', max_length=100)
|
||||
books = models.ManyToManyField(
|
||||
'Book',
|
||||
symmetrical=False,
|
||||
@ -28,18 +18,7 @@ class Shelf(models.Model):
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('user', 'name')
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.identifier:
|
||||
self.identifier = '%s_%s' % (
|
||||
self.user.localname,
|
||||
re.sub(r'\W', '-', self.name).lower()
|
||||
)
|
||||
if not self.activitypub_id:
|
||||
self.activitypub_id = 'https://%s/shelf/%s' % \
|
||||
(DOMAIN, self.identifier)
|
||||
super().save(*args, **kwargs)
|
||||
unique_together = ('user', 'identifier')
|
||||
|
||||
|
||||
class ShelfBook(models.Model):
|
||||
@ -52,7 +31,7 @@ class ShelfBook(models.Model):
|
||||
null=True,
|
||||
on_delete=models.PROTECT
|
||||
)
|
||||
added_date = models.DateTimeField(auto_now_add=True)
|
||||
created_date = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('book', 'shelf')
|
||||
@ -60,7 +39,6 @@ class ShelfBook(models.Model):
|
||||
|
||||
class Book(models.Model):
|
||||
''' a non-canonical copy of a work (not book) from open library '''
|
||||
activitypub_id = models.CharField(max_length=255)
|
||||
openlibrary_key = models.CharField(max_length=255, unique=True)
|
||||
data = JSONField()
|
||||
authors = models.ManyToManyField('Author')
|
||||
@ -81,12 +59,9 @@ class Book(models.Model):
|
||||
added_date = models.DateTimeField(auto_now_add=True)
|
||||
updated_date = models.DateTimeField(auto_now=True)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.activitypub_id = '%s%s' % (OL_URL, self.openlibrary_key)
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class Author(models.Model):
|
||||
''' copy of an author from OL '''
|
||||
openlibrary_key = models.CharField(max_length=255)
|
||||
data = JSONField()
|
||||
added_date = models.DateTimeField(auto_now_add=True)
|
||||
|
@ -13,7 +13,6 @@ class User(AbstractUser):
|
||||
''' a user who wants to read books '''
|
||||
private_key = models.TextField(blank=True, null=True)
|
||||
public_key = models.TextField(blank=True, null=True)
|
||||
api_key = models.CharField(max_length=255, blank=True, null=True)
|
||||
actor = models.CharField(max_length=255, unique=True)
|
||||
inbox = models.CharField(max_length=255, unique=True)
|
||||
shared_inbox = models.CharField(max_length=255, blank=True, null=True)
|
||||
@ -41,7 +40,6 @@ class User(AbstractUser):
|
||||
class FederatedServer(models.Model):
|
||||
''' store which server's we federate with '''
|
||||
server_name = models.CharField(max_length=255, unique=True)
|
||||
shared_inbox = models.CharField(max_length=255, unique=True)
|
||||
# federated, blocked, whatever else
|
||||
status = models.CharField(max_length=255, default='federated')
|
||||
# is it mastodon, fedireads, etc
|
||||
@ -50,7 +48,7 @@ class FederatedServer(models.Model):
|
||||
|
||||
@receiver(models.signals.pre_save, sender=User)
|
||||
def execute_before_save(sender, instance, *args, **kwargs):
|
||||
''' create shelves for new users '''
|
||||
''' populate fields for new local users '''
|
||||
# this user already exists, no need to poplate fields
|
||||
if instance.id or not instance.local:
|
||||
return
|
||||
@ -72,25 +70,24 @@ def execute_before_save(sender, instance, *args, **kwargs):
|
||||
@receiver(models.signals.post_save, sender=User)
|
||||
def execute_after_save(sender, instance, created, *args, **kwargs):
|
||||
''' create shelves for new users '''
|
||||
# TODO: how are remote users handled? what if they aren't readers?
|
||||
if not instance.local or not created:
|
||||
return
|
||||
|
||||
shelves = [{
|
||||
'name': 'To Read',
|
||||
'type': 'to-read',
|
||||
'identifier': 'to-read',
|
||||
}, {
|
||||
'name': 'Currently Reading',
|
||||
'type': 'reading',
|
||||
'identifier': 'reading',
|
||||
}, {
|
||||
'name': 'Read',
|
||||
'type': 'read',
|
||||
'identifier': 'read',
|
||||
}]
|
||||
|
||||
for shelf in shelves:
|
||||
Shelf(
|
||||
name=shelf['name'],
|
||||
shelf_type=shelf['type'],
|
||||
identifier=shelf['identifier'],
|
||||
user=instance,
|
||||
editable=False
|
||||
).save()
|
||||
|
Reference in New Issue
Block a user