Merge pull request #278 from mouse-reeve/incoming-shelve

Incoming shelve
This commit is contained in:
Mouse Reeve 2020-11-02 15:39:37 -08:00 committed by GitHub
commit 752193d0e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 9 deletions

View file

@ -55,7 +55,6 @@ class Work(Book):
@dataclass(init=False)
class Author(ActivityObject):
''' author of a book '''
url: str
name: str
born: str
died: str

View file

@ -62,6 +62,8 @@ def shared_inbox(request):
'Announce': handle_boost,
'Add': {
'Tag': handle_tag,
'Edition': handle_shelve,
'Work': handle_shelve,
},
'Undo': {
'Follow': handle_unfollow,
@ -318,6 +320,22 @@ def handle_tag(activity):
status_builder.create_tag(user, book, activity['object']['name'])
@app.task
def handle_shelve(activity):
''' putting a book on a shelf '''
user = get_or_create_remote_user(activity['actor'])
book = books_manager.get_or_create_book(activity['object'])
try:
shelf = models.Shelf.objects.get(remote_id=activity['target'])
except models.Shelf.DoesNotExist:
return
if shelf.user != user:
# this doesn't add up.
return
shelf.books.add(book)
shelf.save()
@app.task
def handle_update_user(activity):
''' receive an updated user Person activity object '''

View file

@ -68,7 +68,10 @@ class ActivitypubMixin:
if not hasattr(self, mapping.model_key) or not mapping.activity_key:
continue
value = getattr(self, mapping.model_key)
if hasattr(value, 'remote_id'):
print(value)
if hasattr(value, 'local_id'):
value = value.local_id
elif hasattr(value, 'remote_id'):
value = value.remote_id
if isinstance(value, datetime):
value = value.isoformat()

View file

@ -56,7 +56,7 @@ class Book(ActivitypubMixin, BookWyrmModel):
@property
def ap_authors(self):
''' the activitypub serialization should be a list of author ids '''
return [a.remote_id for a in self.authors.all()]
return [a.local_id for a in self.authors.all()]
@property
def ap_cover(self):
@ -73,7 +73,7 @@ class Book(ActivitypubMixin, BookWyrmModel):
return self.parent_work.local_id
activity_mappings = [
ActivityMapping('id', 'remote_id'),
ActivityMapping('id', 'local_id'),
ActivityMapping('authors', 'ap_authors'),
ActivityMapping('first_published_date', 'first_published_date'),
@ -258,7 +258,7 @@ class Author(ActivitypubMixin, BookWyrmModel):
an instance, so it needs a local url for federation. but it still needs
the remote_id for easier deduplication and, if appropriate, to sync with
the remote canonical copy (ditto here for author)'''
return 'https://%s/book/%d' % (DOMAIN, self.id)
return 'https://%s/author/%d' % (DOMAIN, self.id)
@property
def display_name(self):
@ -271,8 +271,7 @@ class Author(ActivitypubMixin, BookWyrmModel):
return self.last_name or self.first_name
activity_mappings = [
ActivityMapping('id', 'remote_id'),
ActivityMapping('url', 'remote_id'),
ActivityMapping('id', 'local_id'),
ActivityMapping('name', 'display_name'),
ActivityMapping('born', 'born'),
ActivityMapping('died', 'died'),

View file

@ -49,8 +49,8 @@ class ShelfBook(BookWyrmModel):
return activitypub.Add(
id='%s#add' % self.remote_id,
actor=user.remote_id,
object=self.book.to_activity(),
target=self.shelf.to_activity()
object=self.book.local_id,
target=self.shelf.remote_id,
).serialize()
def to_remove_activity(self, user):