diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py
index 7b18a2ff..0c3b19ba 100644
--- a/bookwyrm/forms.py
+++ b/bookwyrm/forms.py
@@ -52,47 +52,31 @@ class RegisterForm(CustomForm):
class RatingForm(CustomForm):
class Meta:
model = models.Review
- fields = ['rating']
+ fields = ['user', 'book', 'content', 'rating', 'privacy']
class ReviewForm(CustomForm):
class Meta:
model = models.Review
- fields = ['name', 'content']
- help_texts = {f: None for f in fields}
- labels = {
- 'name': 'Title',
- 'content': 'Review',
- }
+ fields = ['user', 'book', 'name', 'content', 'rating', 'privacy']
class CommentForm(CustomForm):
class Meta:
model = models.Comment
- fields = ['content']
- help_texts = {f: None for f in fields}
- labels = {
- 'content': 'Comment',
- }
+ fields = ['user', 'book', 'content', 'privacy']
class QuotationForm(CustomForm):
class Meta:
model = models.Quotation
- fields = ['quote', 'content']
- help_texts = {f: None for f in fields}
- labels = {
- 'quote': 'Quote',
- 'content': 'Comment',
- }
+ fields = ['user', 'book', 'quote', 'content', 'privacy']
class ReplyForm(CustomForm):
class Meta:
model = models.Status
- fields = ['content']
- help_texts = {f: None for f in fields}
- labels = {'content': 'Comment'}
+ fields = ['user', 'content', 'reply_parent', 'privacy']
class EditUserForm(CustomForm):
diff --git a/bookwyrm/migrations/0057_auto_20201026_2131.py b/bookwyrm/migrations/0057_auto_20201026_2131.py
new file mode 100644
index 00000000..cc414e98
--- /dev/null
+++ b/bookwyrm/migrations/0057_auto_20201026_2131.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.7 on 2020-10-26 21:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('bookwyrm', '0056_auto_20201021_0150'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='status',
+ name='privacy',
+ field=models.CharField(choices=[('public', 'Public'), ('unlisted', 'Unlisted'), ('followers', 'Followers'), ('direct', 'Direct')], default='public', max_length=255),
+ ),
+ ]
diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py
index 61e9c500..b1283c9d 100644
--- a/bookwyrm/models/status.py
+++ b/bookwyrm/models/status.py
@@ -10,6 +10,13 @@ from .base_model import ActivitypubMixin, OrderedCollectionPageMixin
from .base_model import ActivityMapping, BookWyrmModel
+PrivacyLevels = models.TextChoices('Privacy', [
+ 'public',
+ 'unlisted',
+ 'followers',
+ 'direct'
+])
+
class Status(OrderedCollectionPageMixin, BookWyrmModel):
''' any post, like a reply to a review, etc '''
user = models.ForeignKey('User', on_delete=models.PROTECT)
@@ -18,7 +25,11 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
mention_books = models.ManyToManyField(
'Edition', related_name='mention_book')
local = models.BooleanField(default=True)
- privacy = models.CharField(max_length=255, default='public')
+ privacy = models.CharField(
+ max_length=255,
+ default='public',
+ choices=PrivacyLevels.choices
+ )
sensitive = models.BooleanField(default=False)
# the created date can't be this, because of receiving federated posts
published_date = models.DateTimeField(default=timezone.now)
@@ -181,9 +192,14 @@ class Review(Status):
@property
def ap_pure_name(self):
''' clarify review names for mastodon serialization '''
- return 'Review of "%s" (%d stars): %s' % (
+ if self.rating:
+ return 'Review of "%s" (%d stars): %s' % (
+ self.book.title,
+ self.rating,
+ self.name
+ )
+ return 'Review of "%s": %s' % (
self.book.title,
- self.rating,
self.name
)
diff --git a/bookwyrm/outgoing.py b/bookwyrm/outgoing.py
index f496a211..4681a670 100644
--- a/bookwyrm/outgoing.py
+++ b/bookwyrm/outgoing.py
@@ -9,9 +9,7 @@ import requests
from bookwyrm import activitypub
from bookwyrm import models
from bookwyrm.broadcast import broadcast
-from bookwyrm.status import create_review, create_status
-from bookwyrm.status import create_quotation, create_comment
-from bookwyrm.status import create_tag, create_notification, create_rating
+from bookwyrm.status import create_tag, create_notification
from bookwyrm.status import create_generated_note
from bookwyrm.status import delete_status
from bookwyrm.remote_user import get_or_create_remote_user
@@ -178,15 +176,16 @@ def handle_import_books(user, items):
broadcast(user, activity)
if item.rating or item.review:
- review_title = "Review of {!r} on Goodreads".format(
+ review_title = 'Review of {!r} on Goodreads'.format(
item.book.title,
- ) if item.review else ""
- handle_review(
- user,
- item.book,
- review_title,
- item.review,
- item.rating,
+ ) if item.review else ''
+
+ models.Review.objects.create(
+ user=user,
+ book=item.book,
+ name=review_title,
+ content=item.review,
+ rating=item.rating,
)
for read in item.reads:
read.book = item.book
@@ -209,44 +208,25 @@ def handle_delete_status(user, status):
broadcast(user, status.to_activity())
-def handle_rate(user, book, rating):
- ''' a review that's just a rating '''
- builder = create_rating
- handle_status(user, book, builder, rating)
-
-
-def handle_review(user, book, name, content, rating):
- ''' post a review '''
- # validated and saves the review in the database so it has an id
- builder = create_review
- handle_status(user, book, builder, name, content, rating)
-
-
-def handle_quotation(user, book, content, quote):
- ''' post a review '''
- # validated and saves the review in the database so it has an id
- builder = create_quotation
- handle_status(user, book, builder, content, quote)
-
-
-def handle_comment(user, book, content):
- ''' post a comment '''
- # validated and saves the review in the database so it has an id
- builder = create_comment
- handle_status(user, book, builder, content)
-
-
-def handle_status(user, book_id, builder, *args):
+def handle_status(user, form):
''' generic handler for statuses '''
- book = models.Edition.objects.get(id=book_id)
- status = builder(user, book, *args)
+ status = form.save()
+
+ # notify reply parent or (TODO) tagged users
+ if status.reply_parent and status.reply_parent.user.local:
+ create_notification(
+ status.reply_parent.user,
+ 'REPLY',
+ related_user=user,
+ related_status=status
+ )
broadcast(user, status.to_create_activity(user), software='bookwyrm')
# re-format the activity for non-bookwyrm servers
- remote_activity = status.to_create_activity(user, pure=True)
-
- broadcast(user, remote_activity, software='other')
+ if hasattr(status, 'pure_activity_serializer'):
+ remote_activity = status.to_create_activity(user, pure=True)
+ broadcast(user, remote_activity, software='other')
def handle_tag(user, book, name):
@@ -265,21 +245,6 @@ def handle_untag(user, book, name):
broadcast(user, tag_activity)
-def handle_reply(user, review, content):
- ''' respond to a review or status '''
- # validated and saves the comment in the database so it has an id
- reply = create_status(user, content, reply_parent=review)
- if reply.reply_parent:
- create_notification(
- reply.reply_parent.user,
- 'REPLY',
- related_user=user,
- related_status=reply,
- )
-
- broadcast(user, reply.to_create_activity(user))
-
-
def handle_favorite(user, status):
''' a user likes a status '''
try:
diff --git a/bookwyrm/static/css/fonts/icomoon.eot b/bookwyrm/static/css/fonts/icomoon.eot
index 5568c0ad..99a90268 100644
Binary files a/bookwyrm/static/css/fonts/icomoon.eot and b/bookwyrm/static/css/fonts/icomoon.eot differ
diff --git a/bookwyrm/static/css/fonts/icomoon.svg b/bookwyrm/static/css/fonts/icomoon.svg
index 4324502b..28612eee 100644
--- a/bookwyrm/static/css/fonts/icomoon.svg
+++ b/bookwyrm/static/css/fonts/icomoon.svg
@@ -7,27 +7,28 @@