From 0188fd570c9698cf2e3a3ee41df142f33329cb38 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Tue, 25 Nov 2025 16:35:09 +0100 Subject: [PATCH 1/1] add book-page-center banner --- src/annoy/admin.py | 3 ++ ...anner_books_alter_banner_place_and_more.py | 38 +++++++++++++++++++ src/annoy/models.py | 26 ++++++++++++- src/annoy/places.py | 1 + src/annoy/templates/annoy/banner.html | 8 ++-- src/annoy/templatetags/annoy.py | 4 +- .../templates/catalogue/book_detail.html | 15 +------- .../static/2022/styles/layout/_annoy.scss | 20 ++++++++++ 8 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 src/annoy/migrations/0019_campaign_banner_books_alter_banner_place_and_more.py diff --git a/src/annoy/admin.py b/src/annoy/admin.py index ab7be6aca..ed651b2c5 100644 --- a/src/annoy/admin.py +++ b/src/annoy/admin.py @@ -5,6 +5,9 @@ from modeltranslation.admin import TranslationAdmin from . import models +admin.site.register(models.Campaign) + + class BannerAdmin(TranslationAdmin): list_display = [ 'place', 'text', diff --git a/src/annoy/migrations/0019_campaign_banner_books_alter_banner_place_and_more.py b/src/annoy/migrations/0019_campaign_banner_books_alter_banner_place_and_more.py new file mode 100644 index 000000000..51e33392f --- /dev/null +++ b/src/annoy/migrations/0019_campaign_banner_books_alter_banner_place_and_more.py @@ -0,0 +1,38 @@ +# Generated by Django 4.0.8 on 2025-11-25 15:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalogue', '0051_book_has_audio'), + ('annoy', '0018_alter_banner_style'), + ] + + operations = [ + migrations.CreateModel( + name='Campaign', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Dla zespołu', max_length=255)), + ('image', models.FileField(blank=True, upload_to='annoy/banners/', verbose_name='obraz')), + ], + ), + migrations.AddField( + model_name='banner', + name='books', + field=models.ManyToManyField(blank=True, to='catalogue.book'), + ), + migrations.AlterField( + model_name='banner', + name='place', + field=models.SlugField(choices=[('top', 'U góry wszystkich stron'), ('book-page', 'Strona książki'), ('book-page-center', 'Strona książki, środek'), ('book-text-intermission', 'Przerwa w treści książki'), ('book-fragment-list', 'Obok listy fragmentów książki'), ('blackout', 'Blackout'), ('crisis', 'Kryzysowa')], verbose_name='miejsce'), + ), + migrations.AddField( + model_name='banner', + name='campaign', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='annoy.campaign'), + ), + ] diff --git a/src/annoy/models.py b/src/annoy/models.py index 0d887920d..097872b40 100644 --- a/src/annoy/models.py +++ b/src/annoy/models.py @@ -8,8 +8,18 @@ from django.utils.timezone import now from .places import PLACES, PLACE_CHOICES, STYLES +class Campaign(models.Model): + name = models.CharField(max_length=255, help_text='Dla zespołu') + image = models.FileField('obraz', upload_to='annoy/banners/', blank=True) + + def __str__(self): + return self.name + + class Banner(models.Model): place = models.SlugField('miejsce', choices=PLACE_CHOICES) + campaign = models.ForeignKey(Campaign, models.PROTECT, null=True, blank=True) + style = models.CharField( 'styl', max_length=255, blank=True, choices=STYLES, @@ -32,6 +42,8 @@ class Banner(models.Model): help_text='Bannery z wyższym priorytetem mają pierwszeństwo.') since = models.DateTimeField('od', null=True, blank=True) until = models.DateTimeField('do', null=True, blank=True) + books = models.ManyToManyField('catalogue.Book', blank=True) + target = models.IntegerField('cel', null=True, blank=True) progress = models.IntegerField('postęp', null=True, blank=True) show_members = models.BooleanField('widoczny dla członków klubu', default=False) @@ -49,8 +61,14 @@ class Banner(models.Model): def get_text(self): return Template(self.text).render(Context()) + def get_image(self): + if self.campaign and self.campaign.image: + return self.campaign.image + else: + return self.image + @classmethod - def choice(cls, place, request, exemptions=True): + def choice(cls, place, request, exemptions=True, book=None): Membership = apps.get_model('club', 'Membership') if exemptions and hasattr(request, 'annoy_banner_exempt'): @@ -68,6 +86,12 @@ class Banner(models.Model): until__lt=n ).order_by('-priority', '?') + if book is None: + banners = banners.filter(books=None) + else: + banners = banners.filter(models.Q(books=None) | models.Q(books=book)) + + if not request.user.is_authenticated: banners = banners.filter(only_authenticated=False) diff --git a/src/annoy/places.py b/src/annoy/places.py index 8fa767bba..0de0483b9 100644 --- a/src/annoy/places.py +++ b/src/annoy/places.py @@ -1,6 +1,7 @@ PLACE_DEFINITIONS = [ ('top', 'U góry wszystkich stron', True), ('book-page', 'Strona książki', False), + ('book-page-center', 'Strona książki, środek', False), ('book-text-intermission', 'Przerwa w treści książki', False), ('book-fragment-list', 'Obok listy fragmentów książki', False), ('blackout', 'Blackout', True, ( diff --git a/src/annoy/templates/annoy/banner.html b/src/annoy/templates/annoy/banner.html index 4b2bdcfb8..bfecd9d36 100644 --- a/src/annoy/templates/annoy/banner.html +++ b/src/annoy/templates/annoy/banner.html @@ -11,7 +11,7 @@ annoy-banner annoy-banner_{{ banner.place }} annoy-banner-style_{{ banner.style }} - {% if banner.image %}with-image{% endif %} + {% if banner.get_image %}with-image{% endif %} {% if banner.smallfont %}banner-smallfont{% endif %} " id="annoy-banner-{{ banner.id }}" @@ -24,8 +24,10 @@ {% endif %}
- {% if banner.image %} - + {% if banner.get_image %} +
+ +
{% endif %}
{{ banner.get_text|safe|linebreaks }} diff --git a/src/annoy/templatetags/annoy.py b/src/annoy/templatetags/annoy.py index 25293f1ca..cdf4dbc5d 100644 --- a/src/annoy/templatetags/annoy.py +++ b/src/annoy/templatetags/annoy.py @@ -7,8 +7,8 @@ register = template.Library() @register.inclusion_tag('annoy/banner.html', takes_context=True) -def annoy_banner(context, place): - banners = Banner.choice(place, request=context['request']) +def annoy_banner(context, place, **kwargs): + banners = Banner.choice(place, request=context['request'], **kwargs) return { 'banner': banners.first(), 'closable': PLACES.get(place, False), diff --git a/src/catalogue/templates/catalogue/book_detail.html b/src/catalogue/templates/catalogue/book_detail.html index b648fac68..ccce18bf8 100644 --- a/src/catalogue/templates/catalogue/book_detail.html +++ b/src/catalogue/templates/catalogue/book_detail.html @@ -349,20 +349,7 @@ {% if accessible %} -
-
-

- {% blocktrans trimmed %} - Ta książka jest dostępna dla tysięcy dzieciaków dzięki - darowiznom od osób takich jak Ty! - {% endblocktrans %} -

- {% trans "Dorzuć się!" %} -
-
- -
-
+ {% annoy_banner 'book-page-center' book=book %} {% endif %}
{% endwith %} diff --git a/src/wolnelektury/static/2022/styles/layout/_annoy.scss b/src/wolnelektury/static/2022/styles/layout/_annoy.scss index 157e4e2b5..f0885348c 100644 --- a/src/wolnelektury/static/2022/styles/layout/_annoy.scss +++ b/src/wolnelektury/static/2022/styles/layout/_annoy.scss @@ -283,3 +283,23 @@ } } } + +.annoy-banner_book-page-center { + background: white; + margin-top: 20px; + padding: 20px; + border: 1px solid #018189; + border-radius: 15px; + color:#018189; + + .annoy-banner-inner { + display: flex; + gap: 15px; + img { + max-width: 200px; + } + p { + margin: 0; + } + } +} -- 2.20.1