From 7a3626e47b968d2a56c7992ac6c6d292e91f987a Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 24 Apr 2026 13:44:08 +0200 Subject: [PATCH] Add sellable flag for audiobooks. --- .../migrations/0057_book_can_sell_mp3.py | 18 ++++++++++++++++++ src/catalogue/models/book.py | 14 ++++++++++++++ src/partners/api/views.py | 6 +++--- 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/catalogue/migrations/0057_book_can_sell_mp3.py diff --git a/src/catalogue/migrations/0057_book_can_sell_mp3.py b/src/catalogue/migrations/0057_book_can_sell_mp3.py new file mode 100644 index 000000000..900053d55 --- /dev/null +++ b/src/catalogue/migrations/0057_book_can_sell_mp3.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.8 on 2026-04-24 11:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalogue', '0056_book_isbn_mp3'), + ] + + operations = [ + migrations.AddField( + model_name='book', + name='can_sell_mp3', + field=models.BooleanField(default=True, verbose_name='do sprzedaży mp3'), + ), + ] diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index fddce429c..d0487cd5f 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -7,6 +7,7 @@ from datetime import date, timedelta from random import randint import os.path import re +import requests from slugify import slugify from sortify import sortify from urllib.request import urlretrieve @@ -62,6 +63,7 @@ class Book(models.Model): preview_key = models.CharField(max_length=32, blank=True, null=True) findable = models.BooleanField('wyszukiwalna', default=True, db_index=True) can_sell = models.BooleanField('do sprzedaży', default=True) + can_sell_mp3 = models.BooleanField('do sprzedaży mp3', default=True) isbn_mp3 = models.CharField('ISBN audiobooka', max_length=32, blank=True) # files generated during publication @@ -909,6 +911,18 @@ class Book(models.Model): narrators.append(t) self.narrators.set(narrators) + def update_can_sell_mp3(self): + ret = True + for child in self.get_children(): + child.update_can_sell_mp3() + if not child.can_sell_mp3: + ret = False + if self.has_mp3_file(): + audio_items = requests.get(f'https://audio.wolnelektury.pl/archive/book/{self.slug}.json').json()['items'] + if not all(x['project']['can_sell'] for x in audio_items): + ret = False + self.can_sell_audio = ret + @classmethod @transaction.atomic def repopulate_ancestors(cls): diff --git a/src/partners/api/views.py b/src/partners/api/views.py index a2e1de597..530938021 100644 --- a/src/partners/api/views.py +++ b/src/partners/api/views.py @@ -75,10 +75,10 @@ class PartnerAudiobookSerializer(BookSerializer2): for c in b.get_children(): fs.extend(get_for_single(c)) return fs - return get_for_single(b) + return get_for_single(obj) def get_price(self, obj): - duration = obj.get_audiobooks(True)[2] + duration = obj.get_audiobooks(True, True)[2] if not duration: return None duration /= 60 @@ -108,4 +108,4 @@ class PartnerAudiobooksView(ListAPIView): return ctx def get_queryset(self): - return Book.objects.exclude(isbn_mp3='') + return Book.objects.filter(parent=None, can_sell_mp3=True).exclude(isbn_mp3='') -- 2.20.1