mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-12-12 03:06:32 +00:00
Merge branch 'main' into production
This commit is contained in:
commit
ac80df7ee0
5 changed files with 61 additions and 13 deletions
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
patreon: bookwyrm
|
patreon: bookwyrm
|
||||||
open_collective: # Replace with a single Open Collective username
|
open_collective: bookwyrm
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
|
47
README.md
47
README.md
|
@ -4,22 +4,36 @@ Social reading and reviewing, decentralized with ActivityPub
|
||||||
|
|
||||||
## Contents
|
## Contents
|
||||||
- [Joining BookWyrm](#joining-bookwyrm)
|
- [Joining BookWyrm](#joining-bookwyrm)
|
||||||
- [The overall idea](#the-overall-idea)
|
- [Contributing](#contributing)
|
||||||
|
- [About BookWyrm](#about-bookwyrm)
|
||||||
- [What it is and isn't](#what-it-is-and-isnt)
|
- [What it is and isn't](#what-it-is-and-isnt)
|
||||||
- [The role of federation](#the-role-of-federation)
|
- [The role of federation](#the-role-of-federation)
|
||||||
- [Features](#features)
|
- [Features](#features)
|
||||||
- [Setting up the developer environment](#setting-up-the-developer-environment)
|
- [Setting up the developer environment](#setting-up-the-developer-environment)
|
||||||
- [Installing in Production](#installing-in-production)
|
- [Installing in Production](#installing-in-production)
|
||||||
- [Project structure](#project-structure)
|
|
||||||
- [Book data](#book-data)
|
- [Book data](#book-data)
|
||||||
- [Contributing](#contributing)
|
|
||||||
|
|
||||||
## Joining BookWyrm
|
## Joining BookWyrm
|
||||||
BookWyrm is still a young piece of software, and isn't at the level of stability and feature-richness that you'd find in a production-ready application. But it does what it says on the box! If you'd like to join an instance, you can check out the [instances](https://github.com/mouse-reeve/bookwyrm/blob/main/instances.md) list.
|
BookWyrm is still a young piece of software, and isn't at the level of stability and feature-richness that you'd find in a production-ready application. But it does what it says on the box! If you'd like to join an instance, you can check out the [instances](https://github.com/mouse-reeve/bookwyrm/blob/main/instances.md) list.
|
||||||
|
|
||||||
You can request an invite to https://bookwyrm.social by [email](mailto:mousereeve@riseup.net), [Mastodon direct message](https://friend.camp/@tripofmice), or [Twitter direct message](https://twitter.com/tripofmice).
|
You can request an invite to https://bookwyrm.social by [email](mailto:mousereeve@riseup.net), [Mastodon direct message](https://friend.camp/@tripofmice), or [Twitter direct message](https://twitter.com/tripofmice).
|
||||||
|
|
||||||
## The overall idea
|
|
||||||
|
## Contributing
|
||||||
|
There are many ways you can contribute to this project, regardless of your level of technical expertise.
|
||||||
|
|
||||||
|
### Feedback and feature requests
|
||||||
|
Please feel encouraged and welcome to point out bugs, suggestions, feature requests, and ideas for how things ought to work using [GitHub issues](https://github.com/mouse-reeve/bookwyrm/issues).
|
||||||
|
|
||||||
|
### Code contributions
|
||||||
|
Code contributons are gladly welcomed! If you're not sure where to start, take a look at the ["Good first issue"](https://github.com/mouse-reeve/bookwyrm/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) tag. Because BookWyrm is a small project, there isn't a lot of formal structure, but there is a huge capacity for one-on-one support, which can look like asking questions as you go, pair programming, video chats, et cetera, so please feel free to reach out.
|
||||||
|
|
||||||
|
If you have questions about the project or contributing, you can seet up a video call during BookWyrm ["office hours"](https://calendly.com/mouse-reeve/30min).
|
||||||
|
|
||||||
|
### Financial Support
|
||||||
|
BookWyrm is an ad-free passion project with no intentions of seeking out venture funding or corporate financial relationships. If you want to help keep the project going, you can donate to the [Patreon](https://www.patreon.com/bookwyrm), or make a one time gift via [PayPal](https://paypal.me/oulipo).
|
||||||
|
|
||||||
|
## About BookWyrm
|
||||||
### What it is and isn't
|
### What it is and isn't
|
||||||
BookWyrm is a platform for social reading! You can use it to track what you're reading, review books, and follow your friends. It isn't primarily meant for cataloguing or as a datasource for books, but it does do both of those things to some degree.
|
BookWyrm is a platform for social reading! You can use it to track what you're reading, review books, and follow your friends. It isn't primarily meant for cataloguing or as a datasource for books, but it does do both of those things to some degree.
|
||||||
|
|
||||||
|
@ -55,6 +69,25 @@ Since the project is still in its early stages, the features are growing every d
|
||||||
- Option for users to manually approve followers
|
- Option for users to manually approve followers
|
||||||
- Allow blocking and flagging for moderation
|
- Allow blocking and flagging for moderation
|
||||||
|
|
||||||
|
### The Tech Stack
|
||||||
|
Web backend
|
||||||
|
- [Django](https://www.djangoproject.com/) web server
|
||||||
|
- [PostgreSQL](https://www.postgresql.org/) database
|
||||||
|
- [ActivityPub](http://activitypub.rocks/) federation
|
||||||
|
- [Celery](http://celeryproject.org/) task queuing
|
||||||
|
- [Redis](https://redis.io/) task backend
|
||||||
|
|
||||||
|
Front end
|
||||||
|
- Django templates
|
||||||
|
- [Bulma.io](https://bulma.io/) css framework
|
||||||
|
- Vanilla JavaScript, in moderation
|
||||||
|
|
||||||
|
Deployment
|
||||||
|
- [Docker](https://www.docker.com/) and docker-compose
|
||||||
|
- [Gunicorn](https://gunicorn.org/) web runner
|
||||||
|
- [Flower](https://github.com/mher/flower) celery monitoring
|
||||||
|
- [Nginx](https://nginx.org/en/) HTTP server
|
||||||
|
|
||||||
## Setting up the developer environment
|
## Setting up the developer environment
|
||||||
|
|
||||||
Set up the environment file:
|
Set up the environment file:
|
||||||
|
@ -132,9 +165,3 @@ There are three concepts in the book data model:
|
||||||
- `Edition`, a concrete, actually published version of a book
|
- `Edition`, a concrete, actually published version of a book
|
||||||
|
|
||||||
Whenever a user interacts with a book, they are interacting with a specific edition. Every work has a default edition, but the user can select other editions. Reviews aggregated for all editions of a work when you view an edition's page.
|
Whenever a user interacts with a book, they are interacting with a specific edition. Every work has a default edition, but the user can select other editions. Reviews aggregated for all editions of a work when you view an edition's page.
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
There are many ways you can contribute to this project! You are welcome and encouraged to create or contribute an issue to report a bug, request a feature, make a usability suggestion, or express a nebulous desire.
|
|
||||||
|
|
||||||
If you'd like to add to the codebase, that's super rad and you should do it! At this point, there isn't a formalized process, but you can take a look at the open issues, or contact me directly and chat about it.
|
|
||||||
|
|
|
@ -82,11 +82,16 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship):
|
||||||
try:
|
try:
|
||||||
UserFollows.objects.get(
|
UserFollows.objects.get(
|
||||||
user_subject=self.user_subject,
|
user_subject=self.user_subject,
|
||||||
user_object=self.user_object
|
user_object=self.user_object,
|
||||||
)
|
)
|
||||||
|
# blocking in either direction is a no-go
|
||||||
UserBlocks.objects.get(
|
UserBlocks.objects.get(
|
||||||
user_subject=self.user_subject,
|
user_subject=self.user_subject,
|
||||||
user_object=self.user_object
|
user_object=self.user_object,
|
||||||
|
)
|
||||||
|
UserBlocks.objects.get(
|
||||||
|
user_subject=self.user_object,
|
||||||
|
user_object=self.user_subject,
|
||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
except (UserFollows.DoesNotExist, UserBlocks.DoesNotExist):
|
except (UserFollows.DoesNotExist, UserBlocks.DoesNotExist):
|
||||||
|
|
|
@ -224,6 +224,17 @@
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if lists.exists %}
|
||||||
|
<section class="content block">
|
||||||
|
<h2 class="title is-5">Lists</h2>
|
||||||
|
<ul>
|
||||||
|
{% for list in lists %}
|
||||||
|
<li><a href="{{ list.local_path }}">{{ list.name }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -15,6 +15,7 @@ from bookwyrm.activitypub import ActivitypubResponse
|
||||||
from bookwyrm.connectors import connector_manager
|
from bookwyrm.connectors import connector_manager
|
||||||
from bookwyrm.settings import PAGE_LENGTH
|
from bookwyrm.settings import PAGE_LENGTH
|
||||||
from .helpers import is_api_request, get_activity_feed, get_edition
|
from .helpers import is_api_request, get_activity_feed, get_edition
|
||||||
|
from .helpers import privacy_filter
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable= no-self-use
|
# pylint: disable= no-self-use
|
||||||
|
@ -94,6 +95,10 @@ class Book(View):
|
||||||
'ratings': reviews.filter(Q(content__isnull=True) | Q(content='')),
|
'ratings': reviews.filter(Q(content__isnull=True) | Q(content='')),
|
||||||
'rating': reviews.aggregate(Avg('rating'))['rating__avg'],
|
'rating': reviews.aggregate(Avg('rating'))['rating__avg'],
|
||||||
'tags': models.UserTag.objects.filter(book=book),
|
'tags': models.UserTag.objects.filter(book=book),
|
||||||
|
'lists': privacy_filter(
|
||||||
|
request.user,
|
||||||
|
book.list_set.all(),
|
||||||
|
['public', 'unlisted', 'followers']),
|
||||||
'user_tags': user_tags,
|
'user_tags': user_tags,
|
||||||
'user_shelves': user_shelves,
|
'user_shelves': user_shelves,
|
||||||
'other_edition_shelves': other_edition_shelves,
|
'other_edition_shelves': other_edition_shelves,
|
||||||
|
|
Loading…
Reference in a new issue