forked from mirrors/bookwyrm
5e99002aad
By default, OpenLibrary and Inventaire were prioritzed below other BookWyrm nodes. In practice, people have gotten better search results from these connectors, hence the change. With the search refactor, this has much less impact, but it will show these search results higher in the list. If the results page shows all the connectors' results integrated, this field should be removed entirely.
171 lines
5.3 KiB
Python
171 lines
5.3 KiB
Python
""" What you need in the database to make it work """
|
|
from django.core.management.base import BaseCommand
|
|
from django.contrib.auth.models import Group, Permission
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
from bookwyrm import models
|
|
|
|
|
|
def init_groups():
|
|
"""permission levels"""
|
|
groups = ["admin", "moderator", "editor"]
|
|
for group in groups:
|
|
Group.objects.create(name=group)
|
|
|
|
|
|
def init_permissions():
|
|
"""permission types"""
|
|
permissions = [
|
|
{
|
|
"codename": "edit_instance_settings",
|
|
"name": "change the instance info",
|
|
"groups": ["admin"],
|
|
},
|
|
{
|
|
"codename": "set_user_group",
|
|
"name": "change what group a user is in",
|
|
"groups": ["admin", "moderator"],
|
|
},
|
|
{
|
|
"codename": "control_federation",
|
|
"name": "control who to federate with",
|
|
"groups": ["admin", "moderator"],
|
|
},
|
|
{
|
|
"codename": "create_invites",
|
|
"name": "issue invitations to join",
|
|
"groups": ["admin", "moderator"],
|
|
},
|
|
{
|
|
"codename": "moderate_user",
|
|
"name": "deactivate or silence a user",
|
|
"groups": ["admin", "moderator"],
|
|
},
|
|
{
|
|
"codename": "moderate_post",
|
|
"name": "delete other users' posts",
|
|
"groups": ["admin", "moderator"],
|
|
},
|
|
{
|
|
"codename": "edit_book",
|
|
"name": "edit book info",
|
|
"groups": ["admin", "moderator", "editor"],
|
|
},
|
|
]
|
|
|
|
content_type = ContentType.objects.get_for_model(models.User)
|
|
for permission in permissions:
|
|
permission_obj = Permission.objects.create(
|
|
codename=permission["codename"],
|
|
name=permission["name"],
|
|
content_type=content_type,
|
|
)
|
|
# add the permission to the appropriate groups
|
|
for group_name in permission["groups"]:
|
|
Group.objects.get(name=group_name).permissions.add(permission_obj)
|
|
|
|
|
|
def init_connectors():
|
|
"""access book data sources"""
|
|
models.Connector.objects.create(
|
|
identifier="bookwyrm.social",
|
|
name="Bookwyrm.social",
|
|
connector_file="bookwyrm_connector",
|
|
base_url="https://bookwyrm.social",
|
|
books_url="https://bookwyrm.social/book",
|
|
covers_url="https://bookwyrm.social/images/",
|
|
search_url="https://bookwyrm.social/search?q=",
|
|
isbn_search_url="https://bookwyrm.social/isbn/",
|
|
priority=2,
|
|
)
|
|
|
|
# pylint: disable=line-too-long
|
|
models.Connector.objects.create(
|
|
identifier="inventaire.io",
|
|
name="Inventaire",
|
|
connector_file="inventaire",
|
|
base_url="https://inventaire.io",
|
|
books_url="https://inventaire.io/api/entities",
|
|
covers_url="https://inventaire.io",
|
|
search_url="https://inventaire.io/api/search?types=works&types=works&search=",
|
|
isbn_search_url="https://inventaire.io/api/entities?action=by-uris&uris=isbn%3A",
|
|
priority=1,
|
|
)
|
|
|
|
models.Connector.objects.create(
|
|
identifier="openlibrary.org",
|
|
name="OpenLibrary",
|
|
connector_file="openlibrary",
|
|
base_url="https://openlibrary.org",
|
|
books_url="https://openlibrary.org",
|
|
covers_url="https://covers.openlibrary.org",
|
|
search_url="https://openlibrary.org/search?q=",
|
|
isbn_search_url="https://openlibrary.org/api/books?jscmd=data&format=json&bibkeys=ISBN:",
|
|
priority=1,
|
|
)
|
|
|
|
|
|
def init_settings():
|
|
"""info about the instance"""
|
|
models.SiteSettings.objects.create(
|
|
support_link="https://www.patreon.com/bookwyrm",
|
|
support_title="Patreon",
|
|
install_mode=True,
|
|
)
|
|
|
|
|
|
def init_link_domains():
|
|
"""safe book links"""
|
|
domains = [
|
|
("standardebooks.org", "Standard EBooks"),
|
|
("www.gutenberg.org", "Project Gutenberg"),
|
|
("archive.org", "Internet Archive"),
|
|
("openlibrary.org", "Open Library"),
|
|
("theanarchistlibrary.org", "The Anarchist Library"),
|
|
]
|
|
for domain, name in domains:
|
|
models.LinkDomain.objects.create(
|
|
domain=domain,
|
|
name=name,
|
|
status="approved",
|
|
)
|
|
|
|
|
|
# pylint: disable=no-self-use
|
|
# pylint: disable=unused-argument
|
|
class Command(BaseCommand):
|
|
"""command-line options"""
|
|
|
|
help = "Initializes the database with starter data"
|
|
|
|
def add_arguments(self, parser):
|
|
"""specify which function to run"""
|
|
parser.add_argument(
|
|
"--limit",
|
|
default=None,
|
|
help="Limit init to specific table",
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
"""execute init"""
|
|
limit = options.get("limit")
|
|
tables = [
|
|
"group",
|
|
"permission",
|
|
"connector",
|
|
"settings",
|
|
"linkdomain",
|
|
]
|
|
if limit and limit not in tables:
|
|
raise Exception("Invalid table limit:", limit)
|
|
|
|
if not limit or limit == "group":
|
|
init_groups()
|
|
if not limit or limit == "permission":
|
|
init_permissions()
|
|
if not limit or limit == "connector":
|
|
init_connectors()
|
|
if not limit or limit == "settings":
|
|
init_settings()
|
|
if not limit or limit == "linkdomain":
|
|
init_link_domains()
|