Skip to content

Commit

Permalink
WIP: Add Series model
Browse files Browse the repository at this point in the history
  • Loading branch information
Minnozz committed Apr 26, 2024
1 parent c4b21ee commit 5fcdfbc
Show file tree
Hide file tree
Showing 6 changed files with 201 additions and 21 deletions.
6 changes: 1 addition & 5 deletions bookwyrm/forms/books.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
""" using django model forms """

from django import forms

from file_resubmit.widgets import ResubmitImageWidget
Expand All @@ -25,7 +26,6 @@ class Meta:
"subtitle",
"description",
"series",
"series_number",
"languages",
"subjects",
"publishers",
Expand Down Expand Up @@ -55,9 +55,6 @@ class Meta:
attrs={"aria-describedby": "desc_description"}
),
"series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
"series_number": forms.TextInput(
attrs={"aria-describedby": "desc_series_number"}
),
"subjects": ArrayWidget(),
"languages": forms.TextInput(
attrs={"aria-describedby": "desc_languages_help desc_languages"}
Expand Down Expand Up @@ -116,7 +113,6 @@ class Meta:
"description",
"languages",
"series",
"series_number",
"subjects",
"subject_places",
"cover",
Expand Down
148 changes: 148 additions & 0 deletions bookwyrm/migrations/0206_series_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
# Generated by Django 3.2.23 on 2024-02-04 20:27

import bookwyrm.models.fields
from django.db import migrations, models
import django.db.models.deletion


def make_series(apps, schema_editor):
Edition = apps.get_model("bookwyrm", "Edition")
Series = apps.get_model("bookwyrm", "Series")
SeriesBook = apps.get_model("bookwyrm", "SeriesBook")

db_alias = schema_editor.connection.alias

with_series = (
Edition.objects.using(db_alias)
.exclude(series_name__isnull=True)
.exclude(series_name__exact="")
.order_by("series_name", "series_number")
)
for edition in with_series:
# TODO: Try to parse number from series_name if series_number is empty?
series, _ = Series.objects.using(db_alias).get_or_create(
name=edition.series_name,
authors=edition.authors.all(),
)
SeriesBook.objects.using(db_alias).create(
book=edition, series=series, number=edition.series_number
)


class Migration(migrations.Migration):

dependencies = [
("bookwyrm", "0205_merge_20240413_0232.py"),
]

operations = [
migrations.RenameField(
model_name="book",
old_name="series",
new_name="series_name",
),
migrations.CreateModel(
name="Series",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_date", models.DateTimeField(auto_now_add=True)),
("updated_date", models.DateTimeField(auto_now=True)),
(
"remote_id",
bookwyrm.models.fields.RemoteIdField(
max_length=255,
null=True,
validators=[bookwyrm.models.fields.validate_remote_id],
),
),
("name", bookwyrm.models.fields.CharField(max_length=100)),
(
"authors",
bookwyrm.models.fields.ManyToManyField(to="bookwyrm.Author"),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="SeriesBook",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_date", models.DateTimeField(auto_now_add=True)),
("updated_date", models.DateTimeField(auto_now=True)),
(
"remote_id",
bookwyrm.models.fields.RemoteIdField(
max_length=255,
null=True,
validators=[bookwyrm.models.fields.validate_remote_id],
),
),
(
"number",
bookwyrm.models.fields.CharField(
blank=True, max_length=255, null=True
),
),
(
"book",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, to="bookwyrm.book"
),
),
(
"series",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to="bookwyrm.series",
),
),
],
options={
"ordering": ["-number"],
"unique_together": {("book", "series")},
},
),
migrations.AddField(
model_name="series",
name="books",
field=bookwyrm.models.fields.ManyToManyField(
related_name="series_books",
through="bookwyrm.SeriesBook",
to="bookwyrm.Book",
),
),
migrations.AddField(
model_name="book",
name="series",
field=models.ManyToManyField(
through="bookwyrm.SeriesBook", to="bookwyrm.Series"
),
),
migrations.RunPython(make_series), # TODO: reverse_code
migrations.RemoveField(
model_name="book",
name="series_number",
),
migrations.RemoveField(
model_name="book",
name="series_name",
),
]
3 changes: 3 additions & 0 deletions bookwyrm/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
""" bring all the models into the app namespace """

import inspect
import sys

Expand All @@ -7,6 +8,8 @@
from .link import Link, FileLink, LinkDomain
from .connector import Connector

from .series import Series, SeriesBook

from .shelf import Shelf, ShelfBook
from .list import List, ListItem

Expand Down
7 changes: 5 additions & 2 deletions bookwyrm/models/book.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,11 @@ class Book(BookDataModel):
languages = fields.ArrayField(
models.CharField(max_length=255), blank=True, default=list
)
series = fields.TextField(max_length=255, blank=True, null=True)
series_number = fields.CharField(max_length=255, blank=True, null=True)
series = models.ManyToManyField(
"Series",
through="SeriesBook",
through_fields=("book", "series"),
)
subjects = fields.ArrayField(
models.CharField(max_length=255), blank=True, null=True, default=list
)
Expand Down
35 changes: 35 additions & 0 deletions bookwyrm/models/series.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""series of books"""

from django.db import models

from .base_model import BookWyrmModel
from . import fields


class Series(BookWyrmModel):
"""a named series of books"""

name = fields.CharField(max_length=100)
authors = fields.ManyToManyField("Author") # TODO: add on Author model
books = fields.ManyToManyField(
"Book",
through="SeriesBook",
through_fields=("series", "book"),
related_name="series_books",
)


class SeriesBook(BookWyrmModel):
"""membership of a series"""

book = models.ForeignKey("Book", on_delete=models.PROTECT)
series = models.ForeignKey("Series", on_delete=models.PROTECT)
number = fields.CharField(max_length=255, blank=True, null=True)

collection_field = "series"

class Meta:
"""a series can't contain the same book twice"""

unique_together = ("book", "series")
ordering = ["-number"]
23 changes: 9 additions & 14 deletions bookwyrm/templates/book/book.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ <h1 class="title" itemprop="name" dir="auto">
{{ book.title }}
</h1>

{% if book.subtitle or book.series %}
{% if book.subtitle or book.series.exists %}
<p class="subtitle title is-5">
{% if book.subtitle %}
<meta
Expand All @@ -44,24 +44,19 @@ <h1 class="title" itemprop="name" dir="auto">
</span>
{% endif %}

{% if book.series %}
{% for book_series in book.series.all %}
{% spaceless %}
<span itemprop="isPartOf" itemscope itemtype="https://schema.org/BookSeries">
{% if book.authors.exists %}
<a href="{% url 'book-series-by' book.authors.first.id %}?series_name={{ book.series | urlencode }}"
itemprop="url">
{% endif %}
<span itemprop="name">{{ book.series }}</span>
{% if book.authors.exists %}
<a href="{{ book_series.local_path }}" itemprop="url">
<span itemprop="name">{{ book_series.series.name }}</span>
</a>
{% endif %}
{% if book_series.number %}
<span>, #</span>
<span itemprop="position">{{ book.series_number }}</span>
{% endif %}
</span>
{% if book.series_number %}
<span>, #</span>
<span itemprop="position">{{ book.series_number }}</span>
{% endif %}
{% endspaceless %}
{% endif %}
{% endfor %}
</p>
{% endif %}

Expand Down

0 comments on commit 5fcdfbc

Please sign in to comment.