From a94c612af7db3893b2e97f7b3f752565f71e1556 Mon Sep 17 00:00:00 2001 From: yaemiku Date: Wed, 28 Sep 2022 23:51:32 +0200 Subject: [PATCH] [func] anchors on steroids --- core/models.py | 16 ++++++ core/templates/base.html | 2 +- core/templates/calendar.html | 21 ++++--- core/templates/membership.html | 20 ++++--- .../migrations/0005_calendar_current.py | 18 ++++++ db/calendar/models.py | 12 +++- .../migrations/0005_membership_current.py | 18 ++++++ db/membership/models.py | 13 +++++ static/css/dist/styles.css | 57 +++++++++---------- theme/static/css/dist/styles.css | 57 +++++++++---------- 10 files changed, 158 insertions(+), 76 deletions(-) create mode 100644 db/calendar/migrations/0005_calendar_current.py create mode 100644 db/membership/migrations/0005_membership_current.py diff --git a/core/models.py b/core/models.py index 2b4b6b0..072fbea 100644 --- a/core/models.py +++ b/core/models.py @@ -1,6 +1,10 @@ from django.db import models from admin_ordering.models import OrderableModel from filebrowser.fields import FileBrowseField +from django.urls.base import reverse_lazy + +from db.calendar.models import Calendar +from db.membership.models import Membership # Create your models here. @@ -13,6 +17,18 @@ class Button(OrderableModel): def __str__(self): return self.title or '-' + @property + def link(self): + h = self.href + c = None + + if h == reverse_lazy('calendar'): + c = Calendar.get_current() + elif h in reverse_lazy('membership'): + c = Membership.get_current() + + return h + (('#' + str(c.year)) if c is not None else '') + class Meta(OrderableModel.Meta): verbose_name = 'Przycisk nawigacji (zielony)' verbose_name_plural = 'Przyciski nawigacji (zielone)' diff --git a/core/templates/base.html b/core/templates/base.html index 6f252b2..7e1cb75 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -55,7 +55,7 @@
  • {{ button.title }} diff --git a/core/templates/calendar.html b/core/templates/calendar.html index 2c80238..f9fbc65 100644 --- a/core/templates/calendar.html +++ b/core/templates/calendar.html @@ -4,6 +4,7 @@ {% if calendars %} + {% endif %} -
    +
    {% for calendar in calendars %} - +
    + + +
    {% empty %} Brak kalendarzy {% endfor %} diff --git a/core/templates/membership.html b/core/templates/membership.html index e8c4bbc..62c50f7 100644 --- a/core/templates/membership.html +++ b/core/templates/membership.html @@ -20,14 +20,20 @@ {% endif %} -
    +
    {% for membership in memberships %} - +
    + + +
    {% empty %} Brak dokumentów {% endfor %} diff --git a/db/calendar/migrations/0005_calendar_current.py b/db/calendar/migrations/0005_calendar_current.py new file mode 100644 index 0000000..5ccde23 --- /dev/null +++ b/db/calendar/migrations/0005_calendar_current.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.5 on 2022-09-28 20:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('calendar', '0004_calendar_buttons'), + ] + + operations = [ + migrations.AddField( + model_name='calendar', + name='current', + field=models.BooleanField(default=False, verbose_name='Aktualny kalendarz (pokazywany przy przekierowaniu na stronę)'), + ), + ] diff --git a/db/calendar/models.py b/db/calendar/models.py index ea770f6..14b801b 100644 --- a/db/calendar/models.py +++ b/db/calendar/models.py @@ -32,10 +32,20 @@ class Calendar(models.Model): published = models.BooleanField('Kalendarz opublikowany', default=True) year = models.IntegerField('Rok', primary_key=True) content = HTMLField('Kalendarz', default='', blank=True) - buttons = models.TextField( 'Przyciski', default='', blank=True, help_text=buttons_help_text) + current = models.BooleanField( + 'Aktualny kalendarz (pokazywany przy przekierowaniu na stronę)', default=False) + + @staticmethod + def get_current(): + return Calendar.objects.filter(current=True).first() + + def update(self, *args, **kwargs): + if self.current is True: + Calendar.objects.exclude(year=self.year).update(current=False) + def __str__(self): return f'Kalendarz {self.year}' diff --git a/db/membership/migrations/0005_membership_current.py b/db/membership/migrations/0005_membership_current.py new file mode 100644 index 0000000..6bb4351 --- /dev/null +++ b/db/membership/migrations/0005_membership_current.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.5 on 2022-09-28 20:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('membership', '0004_membership_buttons'), + ] + + operations = [ + migrations.AddField( + model_name='membership', + name='current', + field=models.BooleanField(default=False, verbose_name='Aktualne składki (pokazywane przy przekierowaniu na stronę)'), + ), + ] diff --git a/db/membership/models.py b/db/membership/models.py index 259cdab..ecc97a9 100644 --- a/db/membership/models.py +++ b/db/membership/models.py @@ -36,6 +36,19 @@ class Membership(models.Model): buttons = models.TextField( 'Przyciski', default='', blank=True, help_text=buttons_help_text) + current = models.BooleanField( + 'Aktualne składki (pokazywane przy przekierowaniu na stronę)', default=False) + + @staticmethod + def get_current(): + return Membership.objects.filter(current=True).first() + + def save(self, *args, **kwargs): + if self.current is True: + Membership.objects.exclude(year=self.year).update(current=False) + + super(Membership, self).save(*args, **kwargs) + def __str__(self): return f'Składki członkowskie {self.year}' diff --git a/static/css/dist/styles.css b/static/css/dist/styles.css index 913a5c4..4e6b3c1 100644 --- a/static/css/dist/styles.css +++ b/static/css/dist/styles.css @@ -1262,6 +1262,19 @@ select { position: sticky; } +.inset-x-0 { + left: 0px; + right: 0px; +} + +.top-0 { + top: 0px; +} + +.float-right { + float: right; +} + .m-4 { margin: 1rem; } @@ -1305,22 +1318,6 @@ select { margin-bottom: auto; } -.mt-8 { - margin-top: 2rem; -} - -.mt-12 { - margin-top: 3rem; -} - -.mt-16 { - margin-top: 4rem; -} - -.mt-20 { - margin-top: 5rem; -} - .block { display: block; } @@ -1483,16 +1480,16 @@ select { border-color: rgb(148 163 184 / var(--tw-border-opacity)); } -.border-stone-200 { - --tw-border-opacity: 1; - border-color: rgb(231 229 228 / var(--tw-border-opacity)); -} - .border-stone-300 { --tw-border-opacity: 1; border-color: rgb(214 211 209 / var(--tw-border-opacity)); } +.border-stone-200 { + --tw-border-opacity: 1; + border-color: rgb(231 229 228 / var(--tw-border-opacity)); +} + .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); @@ -1535,16 +1532,16 @@ select { padding-bottom: 0.75rem; } -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + .pb-1 { padding-bottom: 0.25rem; } @@ -1807,10 +1804,6 @@ h4 { display: block; } -.last\:hidden:last-child { - display: none; -} - .target\:block:target { display: block; } @@ -1821,6 +1814,10 @@ h4 { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.peer:target ~ .peer-target\:block { + display: block; +} + .prose-h2\:mb-2 :is(:where(h2):not(:where([class~="not-prose"] *))) { margin-bottom: 0.5rem; } diff --git a/theme/static/css/dist/styles.css b/theme/static/css/dist/styles.css index 913a5c4..4e6b3c1 100644 --- a/theme/static/css/dist/styles.css +++ b/theme/static/css/dist/styles.css @@ -1262,6 +1262,19 @@ select { position: sticky; } +.inset-x-0 { + left: 0px; + right: 0px; +} + +.top-0 { + top: 0px; +} + +.float-right { + float: right; +} + .m-4 { margin: 1rem; } @@ -1305,22 +1318,6 @@ select { margin-bottom: auto; } -.mt-8 { - margin-top: 2rem; -} - -.mt-12 { - margin-top: 3rem; -} - -.mt-16 { - margin-top: 4rem; -} - -.mt-20 { - margin-top: 5rem; -} - .block { display: block; } @@ -1483,16 +1480,16 @@ select { border-color: rgb(148 163 184 / var(--tw-border-opacity)); } -.border-stone-200 { - --tw-border-opacity: 1; - border-color: rgb(231 229 228 / var(--tw-border-opacity)); -} - .border-stone-300 { --tw-border-opacity: 1; border-color: rgb(214 211 209 / var(--tw-border-opacity)); } +.border-stone-200 { + --tw-border-opacity: 1; + border-color: rgb(231 229 228 / var(--tw-border-opacity)); +} + .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); @@ -1535,16 +1532,16 @@ select { padding-bottom: 0.75rem; } -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + .pb-1 { padding-bottom: 0.25rem; } @@ -1807,10 +1804,6 @@ h4 { display: block; } -.last\:hidden:last-child { - display: none; -} - .target\:block:target { display: block; } @@ -1821,6 +1814,10 @@ h4 { box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } +.peer:target ~ .peer-target\:block { + display: block; +} + .prose-h2\:mb-2 :is(:where(h2):not(:where([class~="not-prose"] *))) { margin-bottom: 0.5rem; }