Skip to content

Commit b37056e

Browse files
Support more series statuses
1 parent a442b07 commit b37056e

File tree

25 files changed

+158
-93
lines changed

25 files changed

+158
-93
lines changed

MangAdventure/search.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,8 @@ def qsfilter(params: _SearchParams) -> Q:
8989
Q(authors__aliases__name__icontains=params.author) |
9090
Q(artists__aliases__name__icontains=params.author)
9191
)
92-
if params.status == 'completed':
93-
filters &= Q(completed=True)
94-
elif params.status == 'ongoing':
95-
filters &= Q(completed=False)
92+
if params.status and params.status != 'any':
93+
filters &= Q(status=params.status)
9694
included, excluded = params.categories
9795
if excluded:
9896
filters &= ~Q(categories__in=excluded)

MangAdventure/templates/search.html

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ <h1 class="text-shadow alter-bg">Search</h1>
3131
</div>
3232
<div id="search-status">
3333
<label for="status">Series Status: </label>
34+
{# TODO: clean this up #}
3435
<input {% if status == 'any' %}checked="checked"{% endif %}
3536
name="status" id="status-any" value="any" type="radio">
3637
<label for="status-any">Any</label>
@@ -40,6 +41,12 @@ <h1 class="text-shadow alter-bg">Search</h1>
4041
<input {% if status == 'ongoing' %}checked="checked"{% endif %}
4142
name="status" id="status-ongoing" value="ongoing" type="radio">
4243
<label for="status-ongoing">Ongoing</label>
44+
<input {% if status == 'hiatus' %}checked="checked"{% endif %}
45+
name="status" id="status-hiatus" value="hiatus" type="radio">
46+
<label for="status-hiatus">On Hiatus</label>
47+
<input {% if status == 'canceled' %}checked="checked"{% endif %}
48+
name="status" id="status-canceled" value="canceled" type="radio">
49+
<label for="status-canceled">Canceled</label>
4350
</div>
4451
<fieldset id="search-categories">
4552
<legend>Categories:</legend>
@@ -85,10 +92,14 @@ <h1 class="text-shadow alter-bg">Search</h1>
8592
{% for series in results %}
8693
<tr class="result">
8794
<td class="result-title">
88-
{% if series.completed %}
89-
<i class="mi mi-book" title="Completed"></i>
90-
{% else %}
91-
<i class="mi mi-book-o" title="Ongoing"></i>
95+
{% if series.status == "completed" %}
96+
<i class="mi mi-book orange" title="Completed"></i>
97+
{% elif series.status == "ongoing" %}
98+
<i class="mi mi-book-o green" title="Ongoing"></i>
99+
{% elif series.status == "canceled" %}
100+
<i class="mi mi-book red" title="Canceled"></i>
101+
{% elif series.status == "hiatus" %}
102+
<i class="mi mi-book-o yellow" title="On Hiatus"></i>
92103
{% endif %}
93104
<a href="{{ series.get_absolute_url }}"
94105
title="{{ series.title }}">

MangAdventure/tests/test_views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def setup_method(self):
2929
title='chapter', number=1, file=get_valid_zip_file()
3030
)
3131

32-
series2 = Series.objects.create(title='series2', completed=True)
32+
series2 = Series.objects.create(title='series2', status='completed')
3333
author2 = series2.authors.create(name='Author 2')
3434
author2.aliases.create(name='author2')
3535
artist2 = series2.artists.create(name='Artist 2')

api/tests/fixtures/series.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"slug": "test-series",
88
"description": "",
99
"cover": "series/test-series/cover.png",
10-
"completed": false,
10+
"status": "OG",
1111
"created": "2019-12-30T13:58:18.645Z",
1212
"modified": "2019-12-30T13:58:18.645Z",
1313
"authors": [
@@ -29,7 +29,7 @@
2929
"slug": "test-series-2",
3030
"description": "",
3131
"cover": "series/test-series/cover.png",
32-
"completed": false,
32+
"status": "OG",
3333
"created": "2019-12-30T13:58:18.645Z",
3434
"modified": "2019-12-30T13:58:18.645Z",
3535
"authors": [],

api/v1/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from MangAdventure.search import get_response
1818

1919
from groups.models import Group, Member
20-
from reader.models import Artist, Author, Category, Chapter, Series
20+
from reader.models import Artist, Author, Category, Chapter, Series, Status
2121

2222
from .response import JsonError, deprecate_api, require_methods_api
2323

@@ -89,7 +89,7 @@ def _series_response(request: HttpRequest, _series: Series) -> Dict:
8989
_series.categories.values('name', 'description')
9090
),
9191
'cover': request.build_absolute_uri(_series.cover.url),
92-
'completed': _series.completed,
92+
'completed': _series.status in (Status.COMPLETED, Status.CANCELED),
9393
'volumes': {},
9494
}
9595
chapters = _series.chapters.filter(published__lte=tz.now())

api/v2/schema.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def map_field(self, field: Any) -> Dict:
3434
if isinstance(field, PrimaryKeyRelatedField):
3535
return {'type': 'integer'}
3636
result = super().map_field(field)
37+
# deprecate the Series.completed field
38+
if field.field_name == 'completed':
39+
result['deprecated'] = True
3740
# specify pattern for slug related fields
3841
if isinstance(field, SlugRelatedField):
3942
result['pattern'] = '^[-a-zA-Z0-9_]+$'

api/v2/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#: The generated OpenAPI schema as a view.
2323
openapi = cache_control(public=True, max_age=1296000, immutable=True)(
2424
CORSMixin.decorator(get_schema_view(
25-
title='MangAdventure API', version='2.3',
25+
title='MangAdventure API', version='2.4',
2626
generator_class=OpenAPISchemaGenerator, public=True,
2727
renderer_classes=[JSONOpenAPIRenderer] # type: ignore
2828
))

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Changelog
44
v0.9.3
55
^^^^^^
66

7+
* Added more series statuses
78
* Readded CSRF token
89

910
v0.9.2

groups/models.py

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from __future__ import annotations
44

5-
from enum import Enum, EnumMeta
65
from pathlib import PurePath
76
from typing import List
87

@@ -23,17 +22,6 @@ def _logo_uploader(obj: Group, name: str) -> str:
2322
return str(obj.get_directory() / name)
2423

2524

26-
class _ChoiceMeta(EnumMeta):
27-
def __new__(cls, name, bases, attrs):
28-
klass = super().__new__(cls, name, (Enum,) + bases, attrs)
29-
klass.do_not_call_in_templates = True
30-
klass.__str__ = lambda self: self.name
31-
return klass
32-
33-
def __iter__(cls):
34-
return ((e.name, e.value) for e in super().__iter__())
35-
36-
3725
class Group(models.Model):
3826
"""A model representing a group."""
3927
#: The group's ID.
@@ -168,16 +156,16 @@ def __str__(self) -> str:
168156
class Role(models.Model):
169157
"""A model representing a role."""
170158

171-
class Choices(metaclass=_ChoiceMeta):
159+
class Choices(models.TextChoices):
172160
"""The possible role choices."""
173-
LD = 'Leader'
174-
TL = 'Translator'
175-
PR = 'Proofreader'
176-
CL = 'Cleaner'
177-
RD = 'Redrawer'
178-
TS = 'Typesetter'
179-
RP = 'Raw Provider'
180-
QC = 'Quality Checker'
161+
LD = 'LD', 'Leader'
162+
TL = 'TL', 'Translator'
163+
PR = 'PR', 'Proofreader'
164+
CL = 'CL', 'Cleaner'
165+
RD = 'RD', 'Redrawer'
166+
TS = 'TS', 'Typesetter'
167+
RP = 'RP', 'Raw Provider'
168+
QC = 'QC', 'Quality Checker'
181169

182170
#: The member this role belongs to.
183171
member = models.ForeignKey(
@@ -188,7 +176,9 @@ class Choices(metaclass=_ChoiceMeta):
188176
Group, on_delete=models.CASCADE, related_name='roles'
189177
)
190178
#: The value of the role.
191-
role = models.CharField(blank=False, max_length=2, choices=Choices)
179+
role = models.CharField(
180+
blank=False, max_length=2, choices=Choices.choices
181+
)
192182

193183
class Meta:
194184
verbose_name = 'role'

reader/admin.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ class SeriesAdmin(admin.ModelAdmin):
218218
inlines = (alias_inline('series'),)
219219
list_display = (
220220
'cover_image', 'title', 'manager', 'created',
221-
'modified', 'views', 'completed', 'licensed'
221+
'modified', 'views', 'status', 'licensed'
222222
)
223223
list_display_links = ('title',)
224224
date_hierarchy = 'created'
@@ -227,15 +227,13 @@ class SeriesAdmin(admin.ModelAdmin):
227227
search_fields = ('title', 'aliases__name')
228228
autocomplete_fields = ('categories',)
229229
list_filter = (
230+
'status',
230231
('authors', filters.related_filter('author')),
231232
('artists', filters.related_filter('artist')),
232233
('categories', filters.related_filter('category')),
233-
filters.boolean_filter(
234-
'status', 'completed', ('Completed', 'Ongoing')
235-
),
236234
('manager', filters.related_filter('manager')),
237235
)
238-
actions = ('toggle_completed', 'toggle_licensed')
236+
actions = ('toggle_licensed',)
239237
empty_value_display = 'N/A'
240238

241239
def get_form(self, request: HttpRequest, obj: Optional[Series]
@@ -286,17 +284,6 @@ def cover_image(self, obj: Series) -> str:
286284
"""
287285
return utils.img_tag(obj.cover, 'cover', height=75)
288286

289-
@admin.display( # type: ignore
290-
description='Toggle status of selected series')
291-
def toggle_completed(self, request: HttpRequest, queryset: QuerySet):
292-
"""
293-
Toggle the publication status of the selected series.
294-
295-
:param request: The original request.
296-
:param queryset: The original queryset.
297-
"""
298-
queryset.update(completed=Q(completed=False))
299-
300287
@admin.display( # type: ignore
301288
description='Toggle licensing of selected series')
302289
def toggle_licensed(self, request: HttpRequest, queryset: QuerySet):

0 commit comments

Comments
 (0)