From 9abde3ca18805e48fe55f6278db14f4e5bff618d Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 19 Feb 2023 19:21:23 +0100 Subject: [PATCH 01/11] dav_base css: add colorful universal buttons and colored sport specific buttons --- dav_base/static/dav_base/css/local.css | 200 +++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index 90b1278..0b9dd27 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -1,3 +1,19 @@ +/* + * Colors + * color text focus bg focus btn focus border focus active function + * orange #f07d00 #bd6200 #f07d00 #bd6200 #f07d00 #bd6200 #d77000 #572d00 #995000 primary + * green #3c763d #2b542c #dff0d8 #c1e2b3 #58ab27 #43811e #4d9622 #182e0b #346417 success + * blue #31708f #245269 #d9edf7 #afd9ee #1d70b7 #16558b #1a63a1 #081f33 #11426c info + * yellow #8a6d3b #66512c #fcf8e3 #f7ecb5 #f9b000 #c68c00 #e09e00 #604400 #a27300 warning, Klettern + * red #a94442 #843534 #f2dede #e4b9b9 #be1621 #901119 #a7131d #350609 #700d14 danger + * mandarin #b43a12 #902c0e #f0ded8 #e1bcb0 #e84e1b #b43a12 #aa3711 #3c1306 #78250c + * lime #859201 #656e01 #eef0d8 #dde1b0 #bccf07 #859201 #7c8801 #2e3200 #4f5601 Bergsteigen + * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 Ski + * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 Wanderung + * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 Mountainbike + * brown ??? ??? ??? ??? #925f36 ??? ??? ??? ??? + */ + /* * General elements */ @@ -256,3 +272,187 @@ thead input { border-color: #aa3711; color: #fff; } + +/* + * Elements for sport categories + */ +/* + * Bergsteigen: lime + */ +.btn-sport-B { + background-color: #bccf07; + border-color: #7c8801; + color: #fff; +} +.btn-sport-B.focus, .btn-sport-B:focus, .btn-sport-B:hover { + background-color: #859201; + border-color: #2e3200; + color: #fff; +} +/* + * Klettern: yellow + */ +.btn-sport-K { + background-color: #f9b000; + border-color: #e09e00; + color: #fff; +} +.btn-sport-K.focus, .btn-sport-K:focus, .btn-sport-K:hover { + background-color: #c68c00; + border-color: #604400; + color: #fff; +} +/* + * Mountainbike: purple + */ +.btn-sport-M { + background-color: #a694c2; + border-color: #8067a8; + color: #fff; +} +.btn-sport-M.focus, .btn-sport-M:focus, .btn-sport-M:hover { + background-color: #866dac; + border-color: #2f263c; + color: #fff; +} +/* + * Ski: cyan + */ +.btn-sport-S { + background-color: #86cfe4; + border-color: #4cb8d7; + color: #fff; +} +.btn-sport-S.focus, .btn-sport-S:focus, .btn-sport-S:hover { + background-color: #54bbd9; + border-color: #17343c; + color: #fff; +} +/* + * Wanderung: caramel + */ +.btn-sport-W { + background-color: #ce792d; + border-color: #935720; + color: #fff; +} +.btn-sport-W.focus, .btn-sport-W:focus, .btn-sport-W:hover { + background-color: #9c5b22; + border-color: #3c230d; + color: #fff; +} + +/* + * Universal Buttons + */ +.btn-orange { + background-color: #f07d00; + border-color: #d77000; + color: #fff; +} +.btn-orange.focus, .btn-orange:focus, .btn-orange:hover { + background-color: #bd6200; + border-color: #572d00; + color: #fff; +} +.btn-green { + background-color: #58ab27; + border-color: #4d9622; + color: #fff; +} +.btn-green.focus, .btn-green:focus, .btn-green:hover { + background-color: #43811e; + border-color: #182e0b; + color: #fff; +} +.btn-blue { + background-color: #1d70b7; + border-color: #1a63a1; + color: #fff; +} +.btn-blue.focus, .btn-blue:focus, .btn-blue:hover { + background-color: #16558b; + border-color: #081f33; + color: #fff; +} +.btn-yellow { + background-color: #f9b000; + border-color: #e09e00; + color: #fff; +} +.btn-yellow.focus, .btn-yellow:focus, .btn-yellow:hover { + background-color: #c68c00; + border-color: #604400; + color: #fff; +} +.btn-red { + background-color: #be1621; + border-color: #a7131d; + color: #fff; +} +.btn-red.focus, .btn-red:focus, .btn-red:hover { + background-color: #901119; + border-color: #350609; + color: #fff; +} +.btn-mandarin { + background-color: #e84e1b; + border-color: #aa3711; + color: #fff; +} +.btn-mandarin.focus, .btn-mandarin:focus, .btn-mandarin:hover { + background-color: #b43a12; + border-color: #3c1306; + color: #fff; +} +.btn-lime { + background-color: #bccf07; + border-color: #7c8801; + color: #fff; +} +.btn-lime.focus, .btn-lime:focus, .btn-lime:hover { + background-color: #859201; + border-color: #2e3200; + color: #fff; +} +.btn-cyan { + background-color: #86cfe4; + border-color: #4cb8d7; + color: #fff; +} +.btn-cyan.focus, .btn-cyan:focus, .btn-cyan:hover { + background-color: #54bbd9; + border-color: #17343c; + color: #fff; +} +.btn-caramel { + background-color: #ce792d; + border-color: #935720; + color: #fff; +} +.btn-caramel.focus, .btn-caramel:focus, .btn-caramel:hover { + background-color: #9c5b22; + border-color: #3c230d; + color: #fff; +} +.btn-purple { + background-color: #a694c2; + border-color: #8067a8; + color: #fff; +} +.btn-purple.focus, .btn-purple:focus, .btn-purple:hover { + background-color: #866dac; + border-color: #2f263c; + color: #fff; +} + +.btn-white { + background-color: #fff; + border-color: #ccc; + color: #333; +} +.btn-white.focus, .btn-white:focus, .btn-white:hover { + background-color: #e6e6e6; + border-color: #8c8c8c; + color: #333; +} -- 2.52.0 From af2ec6d344b747a6c19cb451eb0877a8746d62f6 Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 19 Feb 2023 19:23:14 +0100 Subject: [PATCH 02/11] dav_registration: added filter function to select single sport --- .../dav_registration/img/sport_icons/F.png | Bin 0 -> 7080 bytes .../outdooractive/Noun_Project_Original.png | Bin 0 -> 14984 bytes .../dav_registration/event_list.html | 47 ++++++++++++++++-- dav_registration/views.py | 14 ++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 dav_registration/static/dav_registration/img/sport_icons/F.png create mode 100644 dav_registration/static/dav_registration/img/sport_icons/outdooractive/Noun_Project_Original.png diff --git a/dav_registration/static/dav_registration/img/sport_icons/F.png b/dav_registration/static/dav_registration/img/sport_icons/F.png new file mode 100644 index 0000000000000000000000000000000000000000..f388388c7d7201db959610f6743e7b9e7ed37cf7 GIT binary patch literal 7080 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 b(4yG#-5VXFzPJJa0DvLVM6VX%9Q*$Ok}Gz} literal 0 HcmV?d00001 diff --git a/dav_registration/static/dav_registration/img/sport_icons/outdooractive/Noun_Project_Original.png b/dav_registration/static/dav_registration/img/sport_icons/outdooractive/Noun_Project_Original.png new file mode 100644 index 0000000000000000000000000000000000000000..6303865e2ff414694be7de9698bf0326046bf004 GIT binary patch literal 14984 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 +
+ + + + + + +

{% trans 'Touren & Kurse' %}

+ {% for event in event_list %} +
diff --git a/dav_registration/views.py b/dav_registration/views.py index d8efc02..068a2b4 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -8,6 +8,7 @@ from django.urls import reverse_lazy from django.utils.translation import ugettext as _ from django.views import generic +from dav_events.choices import SPORT_CHOICES from dav_events.models.event import Event from .forms import RegistrationForm @@ -44,6 +45,19 @@ class EventListView(generic.ListView): return qs + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if hasattr(self, 'init_sport_filter'): + context['init_sport_filter'] = self.init_sport_filter + return context + + def get(self, request, *args, **kwargs): + if 'sport' in request.GET: + sport = request.GET['sport'] + if (sport, 'Bogus') in SPORT_CHOICES: + self.init_sport_filter = sport + return super().get(request, *args, **kwargs) + class EventDetailView(generic.DetailView): model = Event -- 2.52.0 From f79d54c7528247e802a86bb5bdc67b46cb40f1bd Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 26 Feb 2023 20:25:56 +0100 Subject: [PATCH 03/11] Added tests for dav_events.roles --- dav_events/tests/generic.py | 28 ++++-- dav_events/tests/test_apps.py | 1 + dav_events/tests/test_emails.py | 10 +-- dav_events/tests/test_roles.py | 128 +++++++++++++++++++++++++++ dav_events/tests/test_screenshots.py | 32 ++++--- 5 files changed, 171 insertions(+), 28 deletions(-) create mode 100644 dav_events/tests/test_roles.py diff --git a/dav_events/tests/generic.py b/dav_events/tests/generic.py index f12a516..d10b92e 100644 --- a/dav_events/tests/generic.py +++ b/dav_events/tests/generic.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import datetime import json +import logging import os from django.apps import apps from django.contrib.auth import get_user_model @@ -12,21 +13,30 @@ from ..models.eventstatus import EventStatus class RoleMixin: - def create_user_for_role(self, role_name, password, first_name, last_name): - group = Group(name=role_name) - group.save() + def create_user_for_role(self, role_name, first_name, last_name, password='password'): + app_config = apps.get_app_config('dav_events') + var_name = 'groups_{}'.format(role_name) + if hasattr(app_config.settings, var_name): + # There are groups configured for this role. + # Use the first group name of the configured groups. + group_name = getattr(app_config.settings, var_name)[0] + else: + # There are no groups configured for this role. + # Configure one. + group_name = role_name + setting_name = 'groups_{}'.format(role_name) + setattr(app_config.settings, setting_name, [group_name]) + + # Make sure the configured group exists. + group = Group.objects.get_or_create(name=group_name)[0] user_model = get_user_model() - email = '{}@localhost'.format(role_name) - user_name = email + number = user_model.objects.all().count() + 1 + user_name = 'user{}-{}@localhost'.format(number, role_name) user = user_model.objects.create_user(username=user_name, password=password, email=user_name, first_name=first_name, last_name=last_name) user.groups.add(group) - setting_name = 'groups_{}'.format(role_name) - app_config = apps.get_app_config('dav_events') - setattr(app_config.settings, setting_name, [role_name]) - return user diff --git a/dav_events/tests/test_apps.py b/dav_events/tests/test_apps.py index 80180f5..443ab7d 100644 --- a/dav_events/tests/test_apps.py +++ b/dav_events/tests/test_apps.py @@ -10,6 +10,7 @@ class TestCase(AppsTestCase): AppSetting('enable_email_on_status_update', bool), AppSetting('enable_email_on_update', bool), AppSetting('groups_manager_super', list), + AppSetting('groups_manager_f', list), AppSetting('groups_manager_w', list), AppSetting('groups_manager_s', list), AppSetting('groups_manager_m', list), diff --git a/dav_events/tests/test_emails.py b/dav_events/tests/test_emails.py index f17fb42..91e9200 100644 --- a/dav_events/tests/test_emails.py +++ b/dav_events/tests/test_emails.py @@ -176,11 +176,11 @@ class EmailTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): self.event = self.create_event_by_model(event_data) self.trainer = self.event.owner - self.manager_super = self.create_user_for_role('manager_super', 'password', 'Touren', 'Referent') - self.manager_w = self.create_user_for_role('manager_w', 'password', 'Bereichsleiter', 'Wandern') - self.manager_s = self.create_user_for_role('manager_s', 'password', 'Bereichsleiter', 'Ski') - self.publisher_web = self.create_user_for_role('publisher_web', 'password', 'Joomla', 'Redakteur') - self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'password', 'Facebook', 'Redakteur') + self.manager_super = self.create_user_for_role('manager_super', 'Touren', 'Referent') + self.manager_w = self.create_user_for_role('manager_w', 'Bereichsleiter', 'Wandern') + self.manager_s = self.create_user_for_role('manager_s', 'Bereichsleiter', 'Ski') + self.publisher_web = self.create_user_for_role('publisher_web', 'Joomla', 'Redakteur') + self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'Facebook', 'Redakteur') model = get_user_model() self.recipient = model.objects.create_user(username='recipient@example.com', diff --git a/dav_events/tests/test_roles.py b/dav_events/tests/test_roles.py new file mode 100644 index 0000000..321fa41 --- /dev/null +++ b/dav_events/tests/test_roles.py @@ -0,0 +1,128 @@ +from django.apps import apps +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from django.test import TestCase + +from ..roles import get_system_user, get_ghost_user, get_group_members +from ..roles import get_group_names_by_role, get_users_by_role, has_role + +from .generic import RoleMixin + + +class RolesTestCase(RoleMixin, TestCase): + def test_get_system_user(self): + u = get_system_user() + self.assertIsInstance(u, get_user_model()) + self.assertEqual(u.username, '-system-') + self.assertIsNotNone(u.pk) + + def test_get_ghost_user(self): + u = get_ghost_user() + self.assertIsInstance(u, get_user_model()) + self.assertEqual(u.username, '-deleted-') + self.assertIsNotNone(u.pk) + + def test_group_members(self): + # Create some groups + g1 = Group(name='gruppe1') + g1.save() + g2 = Group(name='gruppe2') + g2.save() + + # Create some users and add them to groups + user_model = get_user_model() + u1 = user_model(username='user1') + u1.save() + g1.user_set.add(u1) + u2 = user_model(username='user2') + u2.save() + g1.user_set.add(u2) + u3 = user_model(username='user3') + u3.save() + g2.user_set.add(u3) + + # Create a user, that will belong to no group + u4 = user_model(username='user4') + u4.save() + + # Check results of get_group_members + self.assertSequenceEqual(get_group_members('gruppe1'), [u1, u2]) + self.assertSequenceEqual(get_group_members('gruppe2'), [u3]) + with self.assertRaises(Group.DoesNotExist): + get_group_members('gruppe3') + self.assertSequenceEqual(get_group_members('gruppe3', ignore_missing=True), []) + + def test_get_group_names_by_role_default_config(self): + test_data = [ + ('publisher_print', ['Redaktion_KA-Alpin']), + ('publisher_web', ['Redaktion_Joomla']), + ('publisher_facebook', ['Redaktion_Facebook']), + ('manager_w', ['Bereichsleiter_Wandern', 'Tourenreferenten']), + ('manager_s', ['Bereichsleiter_Ski', 'Tourenreferenten']), + ('manager_m', ['Bereichsleiter_MTB', 'Tourenreferenten']), + ('manager_k', ['Bereichsleiter_Klettern', 'Tourenreferenten']), + ('manager_b', ['Bereichsleiter_Bergsteigen', 'Tourenreferenten']), + ('manager_super', ['Tourenreferenten']), + ('publisher', ['Redaktion_KA-Alpin', 'Redaktion_Joomla', 'Redaktion_Facebook']), + ('manager', ['Bereichsleiter_Wandern', 'Bereichsleiter_Ski', 'Bereichsleiter_MTB', + 'Bereichsleiter_Klettern', 'Bereichsleiter_Bergsteigen', 'Tourenreferenten']), + ('office', ['Geschaeftsstelle']), + ] + for role, expected_group_names in test_data: + group_names = get_group_names_by_role(role) + self.assertEqual(len(group_names), len(expected_group_names)) + for name in group_names: + self.assertIn(name, expected_group_names) + + def get_group_names_by_role_adhoc_config(self): + role_name = 'manager_w' + super_role_name = 'manager_super' + role_groups = ['group1', 'group2'] + super_role_groups = ['group3', 'group4'] + + role_setting = 'groups_{}'.format(role_name) + super_role_setting = 'groups_{}'.format(super_role_name) + + app_config = apps.get_app_config('dav_events') + + buf_role_setting = getattr(app_config.settings, role_setting) + buf_super_role_setting = getattr(app_config.settings, super_role_setting) + + setattr(app_config.settings, role_setting, role_groups) + setattr(app_config.settings, super_role_setting, super_role_groups) + + expected_groups = role_groups + super_role_groups + self.assertSequenceEqual(get_group_names_by_role(role_name), expected_groups) + + setattr(app_config.settings, role_setting, buf_role_setting) + setattr(app_config.settings, super_role_setting, buf_super_role_setting) + + def test_get_group_names_by_role_notexist(self): + self.assertSequenceEqual(get_group_names_by_role('not_existing_test_role'), []) + + def test_get_users_by_role(self): + u1 = self.create_user_for_role('manager_super', 'Touren', 'Referent') + u2 = self.create_user_for_role('manager_super', 'Praktikant', 'Referent') + u3 = self.create_user_for_role('manager_w', 'Bereichsleiter', 'Wandern') + u4 = self.create_user_for_role('manager_w', 'Praktikant', 'Wandern') + u5 = self.create_user_for_role('manager_s', 'Bereichsleiter', 'Ski') + users = get_users_by_role('manager_w') + self.assertSequenceEqual(users, [u1, u2, u3, u4]) + + def test_has_role(self): + u1 = self.create_user_for_role('test_role1', 'User1', 'Test') + u2 = self.create_user_for_role('test_role1', 'User2', 'Test') + u3 = self.create_user_for_role('test_role2', 'User3', 'Test') + u4 = self.create_user_for_role('test_role2', 'User4', 'Test') + + g1 = u1.groups.first() + g1.user_set.add(u4) + + self.assertTrue(has_role(u1, 'test_role1')) + self.assertFalse(has_role(u1, 'test_role2')) + self.assertTrue(has_role(u2, 'test_role1')) + self.assertFalse(has_role(u2, 'test_role2')) + self.assertFalse(has_role(u3, 'test_role1')) + self.assertTrue(has_role(u3, 'test_role2')) + self.assertTrue(has_role(u4, 'test_role1')) + self.assertTrue(has_role(u4, 'test_role2')) \ No newline at end of file diff --git a/dav_events/tests/test_screenshots.py b/dav_events/tests/test_screenshots.py index a211883..78de5aa 100644 --- a/dav_events/tests/test_screenshots.py +++ b/dav_events/tests/test_screenshots.py @@ -658,20 +658,24 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): def setUp(self): super(TestCase, self).setUp() - - password = TEST_PASSWORD - self.manager_super = self.create_user_for_role('manager_super', password, - 'Manager Super', 'Tourenreferent') - self.manager_w = self.create_user_for_role('manager_w', password, - 'Manager W', 'BereichsleiterWandern') - self.manager_s = self.create_user_for_role('manager_s', password, - 'Manager S', 'BereichsleiterSki') - self.publisher_print = self.create_user_for_role('publisher_print', password, - 'Publisher Print', 'RedaktionPrint') - self.publisher_web = self.create_user_for_role('publisher_web', password, - 'Publisher Web', 'RedaktionWeb') - self.publisher_facebook = self.create_user_for_role('publisher_facebook', password, - 'Publisher Facebook', 'RedaktionFacebook') + self.manager_super = self.create_user_for_role('manager_super', + 'Manager Super', 'Tourenreferent', + password=TEST_PASSWORD) + self.manager_w = self.create_user_for_role('manager_w', + 'Manager W', 'BereichsleiterWandern', + password=TEST_PASSWORD) + self.manager_s = self.create_user_for_role('manager_s', + 'Manager S', 'BereichsleiterSki', + password=TEST_PASSWORD) + self.publisher_print = self.create_user_for_role('publisher_print', + 'Publisher Print', 'RedaktionPrint', + password=TEST_PASSWORD) + self.publisher_web = self.create_user_for_role('publisher_web', + 'Publisher Web', 'RedaktionWeb', + password=TEST_PASSWORD) + self.publisher_facebook = self.create_user_for_role('publisher_facebook', + 'Publisher Facebook', 'RedaktionFacebook', + password=TEST_PASSWORD) def test_screenshots(self): # self.quit_selenium = False -- 2.52.0 From 65a3082c02ad2d521aae8d823cd144358b2994c8 Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 26 Feb 2023 23:21:02 +0100 Subject: [PATCH 04/11] Added support for level=family --- dav_base/static/dav_base/css/local.css | 86 ++++++++++++++++++- dav_events/choices.py | 1 + dav_events/forms/events.py | 30 ++++--- .../migrations/0043_alter_event_level.py | 18 ++++ .../dav_registration/event_list.html | 42 +++++++-- 5 files changed, 158 insertions(+), 19 deletions(-) create mode 100644 dav_events/migrations/0043_alter_event_level.py diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index 0b9dd27..b1f3bc6 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -11,7 +11,8 @@ * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 Ski * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 Wanderung * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 Mountainbike - * brown ??? ??? ??? ??? #925f36 ??? ??? ??? ??? + * plum #a068a0 #784e78 #ebd4eb #dcb1dc #be91be #906e90 #a780a7 #352935 #705670 family + * brown #??? #??? #??? #??? #925f36 #??? #??? #??? #??? */ /* @@ -274,7 +275,7 @@ thead input { } /* - * Elements for sport categories + * Elements for sport choices */ /* * Bergsteigen: lime @@ -343,8 +344,47 @@ thead input { } /* - * Universal Buttons + * Elements for level choices */ +/* + * advanced: mandarin + */ +.label-level-advanced { + background-color: #e84e1b; +} +.btn-level-advanced { + background-color: #e84e1b; + border-color: #aa3711; + color: #fff; +} +.btn-level-advanced.focus, .btn-level-advanced:focus, .btn-level-advanced:hover { + background-color: #b43a12; + border-color: #3c1306; + color: #fff; +} +/* + * family: plum + */ +.label-level-family { + background-color: #be91be; +} +.btn-level-family { + background-color: #be91be; + border-color: #a780a7; + color: #fff; +} +.btn-level-family.focus, .btn-level-family:focus, .btn-level-family:hover { + background-color: #906e90; + border-color: #352935; + color: #fff; +} + +/* + * Coloured Elements (Buttons, Labels) for universal use + */ +.label-orange { + background-color: #f07d00; +} .btn-orange { background-color: #f07d00; border-color: #d77000; @@ -355,6 +395,9 @@ thead input { border-color: #572d00; color: #fff; } +.label-green { + background-color: #58ab27; +} .btn-green { background-color: #58ab27; border-color: #4d9622; @@ -365,6 +408,9 @@ thead input { border-color: #182e0b; color: #fff; } +.label-blue { + background-color: #1d70b7; +} .btn-blue { background-color: #1d70b7; border-color: #1a63a1; @@ -375,6 +421,9 @@ thead input { border-color: #081f33; color: #fff; } +.label-yellow { + background-color: #f9b000; +} .btn-yellow { background-color: #f9b000; border-color: #e09e00; @@ -385,6 +434,9 @@ thead input { border-color: #604400; color: #fff; } +.label-red { + background-color: #be1621; +} .btn-red { background-color: #be1621; border-color: #a7131d; @@ -395,6 +447,9 @@ thead input { border-color: #350609; color: #fff; } +.label-mandarin { + background-color: #e84e1b; +} .btn-mandarin { background-color: #e84e1b; border-color: #aa3711; @@ -405,6 +460,9 @@ thead input { border-color: #3c1306; color: #fff; } +.label-lime { + background-color: #bccf07; +} .btn-lime { background-color: #bccf07; border-color: #7c8801; @@ -415,6 +473,9 @@ thead input { border-color: #2e3200; color: #fff; } +.label-cyan { + background-color: #86cfe4; +} .btn-cyan { background-color: #86cfe4; border-color: #4cb8d7; @@ -425,6 +486,9 @@ thead input { border-color: #17343c; color: #fff; } +.label-caramel { + background-color: #ce792d; +} .btn-caramel { background-color: #ce792d; border-color: #935720; @@ -435,6 +499,9 @@ thead input { border-color: #3c230d; color: #fff; } +.label-purple { + background-color: #a694c2; +} .btn-purple { background-color: #a694c2; border-color: #8067a8; @@ -445,6 +512,19 @@ thead input { border-color: #2f263c; color: #fff; } +.label-plum { + background-color: #be91be; +} +.btn-plum { + background-color: #be91be; + border-color: #a780a7; + color: #fff; +} +.btn-plum.focus, .btn-plum:focus, .btn-plum:hover { + background-color: #906e90; + border-color: #352935; + color: #fff; +} .btn-white { background-color: #fff; diff --git a/dav_events/choices.py b/dav_events/choices.py index 8167b8b..6388955 100644 --- a/dav_events/choices.py +++ b/dav_events/choices.py @@ -71,6 +71,7 @@ DEADLINE_CHOICES = ChoiceSet([ LEVEL_CHOICES = ChoiceSet([ ('beginner', _(u'Anfänger')), ('advanced', _(u'Fortgeschrittene')), + ('family', _(u'Familien')), ]) MEALS_CHOICES = ChoiceSet([ diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index af144f1..53a8289 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -970,28 +970,38 @@ class DescriptionForm(EventCreateForm): value = u'' if mode == 'training': - if level == 'beginner': - value += u'%s ' % ugettext(u'Grundkurs') + # Titelprefix für Kurse + if level == 'family': + value += u'%s' % ugettext(u'Familienkurs') + elif level == 'beginner': + value += u'%s' % ugettext(u'Grundkurs') else: - value += u'%s ' % ugettext(u'Aufbaukurs') + value += u'%s' % ugettext(u'Aufbaukurs') if sport == 'B': - value += u'%s' % ugettext(u'Alpin') + value += u' %s' % ugettext(u'Alpin') elif sport == 'K': if terrain == 'gym': - value += ugettext(u'Indoorklettern') + value += u' %s' % ugettext(u'Indoorklettern') elif terrain == 'crag': - value += ugettext(u'Fels') + value += u' %s' % ugettext(u'Fels') elif terrain == 'alpine': - value += ugettext(u'Alpinklettern') + value += u' %s' % ugettext(u'Alpinklettern') value += u': ...' - elif sport == 'W' and not last_day: - value += u'%s ...' % ugettext(u'Tageswanderung') + elif sport == 'W': + # Titelprefix für Wanderungen + if level == 'family': + value += u'%s ...' % ugettext(u'Familienwanderung') + elif not last_day: + value += u'%s ...' % ugettext(u'Tageswanderung') + elif level == 'family': + # Titelprefix für sonstige Familientouren + value += u'%s: ...' % ugettext(u'Familientour') if app_config.settings.forms_development_init: if not value: - value = u'%s' % choices.SPORT_CHOICES.get_label(sport) + value += u'%s' % choices.SPORT_CHOICES.get_label(sport) return value diff --git a/dav_events/migrations/0043_alter_event_level.py b/dav_events/migrations/0043_alter_event_level.py new file mode 100644 index 0000000..60d0f76 --- /dev/null +++ b/dav_events/migrations/0043_alter_event_level.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2023-02-26 22:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dav_events', '0042_auto_20220607_1345'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='level', + field=models.CharField(choices=[('beginner', 'Anfänger'), ('advanced', 'Fortgeschrittene'), ('family', 'Familien')], max_length=25, verbose_name='Schwierigkeitsnivau'), + ), + ] diff --git a/dav_registration/templates/dav_registration/event_list.html b/dav_registration/templates/dav_registration/event_list.html index aa22557..600a138 100644 --- a/dav_registration/templates/dav_registration/event_list.html +++ b/dav_registration/templates/dav_registration/event_list.html @@ -8,6 +8,7 @@
+ @@ -18,6 +19,7 @@ Sport + Level @@ -25,6 +27,7 @@ {% for event in event_list %} {{ event.sport }} + {{ event.level }}
+ {% if event.level == 'family' %} +  für Familien + {% endif %}

{% if event.is_canceled %}{% endif %} {{ event.get_formated_date }} @@ -121,19 +127,33 @@

diff --git a/dav_registration/views.py b/dav_registration/views.py index 068a2b4..961cab1 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -8,7 +8,7 @@ from django.urls import reverse_lazy from django.utils.translation import ugettext as _ from django.views import generic -from dav_events.choices import SPORT_CHOICES +from dav_events.choices import SPORT_CHOICES, LEVEL_CHOICES from dav_events.models.event import Event from .forms import RegistrationForm @@ -49,6 +49,8 @@ class EventListView(generic.ListView): context = super().get_context_data(**kwargs) if hasattr(self, 'init_sport_filter'): context['init_sport_filter'] = self.init_sport_filter + if hasattr(self, 'init_level_filter'): + context['init_level_filter'] = self.init_level_filter return context def get(self, request, *args, **kwargs): @@ -56,6 +58,10 @@ class EventListView(generic.ListView): sport = request.GET['sport'] if (sport, 'Bogus') in SPORT_CHOICES: self.init_sport_filter = sport + if 'level' in request.GET: + level = request.GET['level'] + if (level, 'Bogus') in LEVEL_CHOICES: + self.init_level_filter = level return super().get(request, *args, **kwargs) -- 2.52.0 From fb21a8721f5a313add45d1666932461e2009ebca Mon Sep 17 00:00:00 2001 From: heinzel Date: Mon, 27 Feb 2023 15:20:08 +0100 Subject: [PATCH 07/11] Cosmetic changes --- dav_base/config/modules.py | 16 ++-- .../settings-dav_base.py | 4 +- dav_base/static/dav_base/css/local.css | 12 ++- dav_base/templates/dav_base/base.html | 12 +-- dav_base/templates/dav_base/css_demo.html | 75 ++++++++++++++++--- dav_base/tests/test_templates.py | 6 +- dav_events/forms/events.py | 2 +- dav_events/templates/dav_events/home.html | 2 +- dav_events/tests/test_urls.py | 4 +- .../templates/dav_registration/home.html | 8 ++ .../dav_registration/includes/home_tiles.html | 17 +++++ dav_registration/urls.py | 1 + dav_registration/views.py | 4 + 13 files changed, 132 insertions(+), 31 deletions(-) create mode 100644 dav_registration/templates/dav_registration/home.html create mode 100644 dav_registration/templates/dav_registration/includes/home_tiles.html diff --git a/dav_base/config/modules.py b/dav_base/config/modules.py index ebba340..6c82e87 100644 --- a/dav_base/config/modules.py +++ b/dav_base/config/modules.py @@ -36,20 +36,22 @@ class ModuleMeta: return self._additional_apps @property - def url_conf_pattern(self): - url_pattern = '^' + def url_prefix(self): if self._url_prefix is None: - url_pattern += self._package_name + return self._package_name else: - url_pattern += self._url_prefix - url_pattern += '/' - url_conf = self._package_name + '.urls' - return django_conf_url(url_pattern, include(url_conf, self.url_namespace)) + return self._url_prefix @property def url_namespace(self): return self._package_name.replace('.', '_') + @property + def url_conf_pattern(self): + url_pattern = '^{}/'.format(self.url_prefix) + url_conf = self._package_name + '.urls' + return django_conf_url(url_pattern, include(url_conf, self.url_namespace)) + def _load_from_package(self): package_name = self._package_name json_text = pkg_resources.resource_string(package_name, self._json_file) diff --git a/dav_base/console_scripts/django_project_config/settings-dav_base.py b/dav_base/console_scripts/django_project_config/settings-dav_base.py index a86f7bc..be0fabe 100644 --- a/dav_base/console_scripts/django_project_config/settings-dav_base.py +++ b/dav_base/console_scripts/django_project_config/settings-dav_base.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- # E-Mails -EMAIL_SENDER = 'DAV heinzel ' +EMAIL_SENDER = 'DAV Touren & Kurse ' EMAIL_BASE_URL = 'http://localhost:8000' -EMAIL_SUBJECT_PREFIX = u'[DAV heinzel]' +EMAIL_SUBJECT_PREFIX = u'[DAV Touren & Kurse]' # The following settings are for the test suite. Do not change them. TEST_SETTING = 'do not change this value' diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index b1f3bc6..2b3c64a 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -63,7 +63,7 @@ thead input { } #page-header h2 img { - margin-right: 1.2rem; + margin-right: .6rem; } #page-header h2 a { @@ -166,6 +166,16 @@ thead input { padding: 0px; } +/* + * Used to decolourize a link. + */ +.text-default { + color: #333; +} +a.text-default:hover, a.text-default:focus { + color: #333; +} + /* * We need more text colors (for event stati) */ diff --git a/dav_base/templates/dav_base/base.html b/dav_base/templates/dav_base/base.html index 058cc21..d26f8f2 100644 --- a/dav_base/templates/dav_base/base.html +++ b/dav_base/templates/dav_base/base.html @@ -31,9 +31,9 @@
diff --git a/dav_base/templates/dav_base/css_demo.html b/dav_base/templates/dav_base/css_demo.html index 59f8ecb..e382c05 100644 --- a/dav_base/templates/dav_base/css_demo.html +++ b/dav_base/templates/dav_base/css_demo.html @@ -5,8 +5,10 @@ {% block messages %}
- {% bootstrap_alert "This is a message." %} - {% bootstrap_alert "This is a message." %} + {% bootstrap_alert "This is a default (info) message." %} + {% bootstrap_alert "This is a success message." alert_type="success" %} + {% bootstrap_alert "This is a warning message." alert_type="warning" %} + {% bootstrap_alert "This is a error (danger) message." alert_type="danger" %}
{% endblock messages %} @@ -19,13 +21,14 @@
Header h6 Small Text
-

Hallo

+

This is a jumbotron with h1 header

{% lorem %}

+

This is a well with h2 header

{% lorem %}

@@ -33,24 +36,78 @@ {% lorem %}

+
+

Regular Bootstrap Buttons

btn-default btn-primary btn-success btn-info btn-warning btn-danger + +

Additional defined Buttons

+

+btn-white +btn-orange +btn-green +btn-blue +btn-yellow +btn-red +

+

+btn-black +btn-mandarin +btn-lime +btn-cyan +btn-caramel +btn-plum +btn-purple +


-

Text-Muted {% lorem %}

-

Text-Primary {% lorem %}

-

Text-Success {% lorem %}

-

Text-Info {% lorem %}

-

Text-Warning {% lorem %}

-

Text-Danger {% lorem %}

+

Regular Bootstrap Text

+

text-muted {% lorem %}

+

text-primary {% lorem %}

+

text-success {% lorem %}

+

text-info {% lorem %}

+

text-warning {% lorem %}

+

text-danger {% lorem %}

+

Additional defined Text

+

text-default {% lorem %}

+

text-orange {% lorem %}

+

text-green {% lorem %}

+

text-blue {% lorem %}

+

text-yellow {% lorem %}

+

text-red {% lorem %}

+

text-mandarin {% lorem %}

+

text-lime {% lorem %}

+

text-cyan {% lorem %}

+

text-caramel {% lorem %}

+

text-plum {% lorem %}

+

text-purple {% lorem %}

+
+ + +

Regular Bootstrap Backgrounds

+

bg-primary {% lorem %}

bg-success {% lorem %}

bg-info {% lorem %}

bg-warning {% lorem %}

bg-danger {% lorem %}

+ +

Additional defined Backgrounds

+

bg-orange {% lorem %}

+

bg-green {% lorem %}

+

bg-blue {% lorem %}

+

bg-yellow {% lorem %}

+

bg-red {% lorem %}

+

bg-mandarin {% lorem %}

+

bg-lime {% lorem %}

+

bg-cyan {% lorem %}

+

bg-caramel {% lorem %}

+

bg-plum {% lorem %}

+

bg-purple {% lorem %}

+
{% endblock page-container-fluid %} diff --git a/dav_base/tests/test_templates.py b/dav_base/tests/test_templates.py index f5fb812..b61e7ee 100644 --- a/dav_base/tests/test_templates.py +++ b/dav_base/tests/test_templates.py @@ -45,9 +45,9 @@ class TemplatesTestCase(SimpleTestCase): html = """ """ diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index 53a8289..2b83268 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -227,7 +227,7 @@ class ModeForm(EventCreateForm): ) level = forms.ChoiceField(choices=choices.LEVEL_CHOICES, - label=_(u'Schwierigkeitsnivau'), + label=_(u'Schwierigkeitsnivau / Familien'), widget=forms.RadioSelect()) first_day = forms.DateField(required=True, diff --git a/dav_events/templates/dav_events/home.html b/dav_events/templates/dav_events/home.html index ce39d20..9e7809b 100644 --- a/dav_events/templates/dav_events/home.html +++ b/dav_events/templates/dav_events/home.html @@ -3,6 +3,6 @@ {% load i18n %} {% block page-container-fluid %} -

{% trans 'Für Tourenleiter' %}

+

{% trans 'Für Tourenleiter*innen' %}

{% include './includes/home_tiles.html' %} {% endblock page-container-fluid %} diff --git a/dav_events/tests/test_urls.py b/dav_events/tests/test_urls.py index c626b84..df70ec7 100644 --- a/dav_events/tests/test_urls.py +++ b/dav_events/tests/test_urls.py @@ -1,8 +1,10 @@ +from django.conf import settings + from dav_base.tests.generic import Url, UrlsTestCase from .. import views -url_prefix = 'events' +url_prefix = settings.MODULE_CONFIG.modules['dav_events'].url_prefix class TestCase(UrlsTestCase): diff --git a/dav_registration/templates/dav_registration/home.html b/dav_registration/templates/dav_registration/home.html new file mode 100644 index 0000000..efdac5c --- /dev/null +++ b/dav_registration/templates/dav_registration/home.html @@ -0,0 +1,8 @@ +{% extends "dav_registration/base.html" %} +{% load bootstrap3 %} +{% load i18n %} + +{% block page-container-fluid %} +

{% trans 'Für Teilnehmer*innen' %}

+{% include './includes/home_tiles.html' %} +{% endblock page-container-fluid %} diff --git a/dav_registration/templates/dav_registration/includes/home_tiles.html b/dav_registration/templates/dav_registration/includes/home_tiles.html new file mode 100644 index 0000000..247b82e --- /dev/null +++ b/dav_registration/templates/dav_registration/includes/home_tiles.html @@ -0,0 +1,17 @@ +{% load bootstrap3 %} +{% load i18n %} + +
+
+
+

Bei Veranstaltungen anmelden...

+

+ Hier siehst du welche Touren und Kurse angeboten werden und + kannst dich dafür anmelden. +

+

+ Zur Veranstaltungsliste +

+
+
+
diff --git a/dav_registration/urls.py b/dav_registration/urls.py index c0585d8..3051da5 100644 --- a/dav_registration/urls.py +++ b/dav_registration/urls.py @@ -6,6 +6,7 @@ app_name = 'dav_registration' urlpatterns = [ url(r'^$', views.RootView.as_view(), name='root'), + url(r'^home$', views.HomeView.as_view(), name='home'), url(r'^finished', views.RegistrationSuccessView.as_view(), name='registered'), url(r'^event/(?P\d+)/registration', views.RegistrationView.as_view(), name='register'), url(r'^event/(?P\d+)/', views.EventDetailView.as_view(), name='event'), diff --git a/dav_registration/views.py b/dav_registration/views.py index 961cab1..f2b39d0 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -27,6 +27,10 @@ class RootView(generic.RedirectView): return super().get(request, *args, **kwargs) +class HomeView(generic.TemplateView): + template_name = 'dav_registration/home.html' + + class EventListView(generic.ListView): model = Event template_name = 'dav_registration/event_list.html' -- 2.52.0 From 3cd82a30b57d81fe4db538308ee5afbd0abbee39 Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 5 Mar 2023 16:20:44 +0100 Subject: [PATCH 08/11] Minor: Fixed typo in comment --- dav_events/views/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dav_events/views/events.py b/dav_events/views/events.py index 40f3f37..823cdd3 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -713,7 +713,7 @@ class EventCreateView(EventPermissionMixin, generic.FormView): else: event.editor = self.request.user - # Check for double submission (seems to happens accidentally if smartphone user reload the submit page) + # Check for double submission (seems to happen accidentally if smartphone user reload the submit page) possible_doublets = models.Event.objects.filter(owner=event.owner, title=event.title, first_day=event.first_day) -- 2.52.0 From 8c36b86cbc2563a8f5e6b815acd4beae1f944fde Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 5 Mar 2023 18:22:10 +0100 Subject: [PATCH 09/11] Added/Cleanup coloured css elements --- dav_base/static/dav_base/css/local.css | 201 +++++++++--------- dav_base/templates/dav_base/css_demo.html | 1 + .../templates/dav_events/event_detail.html | 4 +- 3 files changed, 103 insertions(+), 103 deletions(-) diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index 2b3c64a..4724bb8 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -1,18 +1,20 @@ /* * Colors - * color text focus bg focus btn focus border focus active function - * orange #f07d00 #bd6200 #f07d00 #bd6200 #f07d00 #bd6200 #d77000 #572d00 #995000 primary - * green #3c763d #2b542c #dff0d8 #c1e2b3 #58ab27 #43811e #4d9622 #182e0b #346417 success - * blue #31708f #245269 #d9edf7 #afd9ee #1d70b7 #16558b #1a63a1 #081f33 #11426c info - * yellow #8a6d3b #66512c #fcf8e3 #f7ecb5 #f9b000 #c68c00 #e09e00 #604400 #a27300 warning, Klettern - * red #a94442 #843534 #f2dede #e4b9b9 #be1621 #901119 #a7131d #350609 #700d14 danger - * mandarin #b43a12 #902c0e #f0ded8 #e1bcb0 #e84e1b #b43a12 #aa3711 #3c1306 #78250c - * lime #859201 #656e01 #eef0d8 #dde1b0 #bccf07 #859201 #7c8801 #2e3200 #4f5601 Bergsteigen - * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 Ski - * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 Wanderung - * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 Mountainbike - * plum #a068a0 #784e78 #ebd4eb #dcb1dc #be91be #906e90 #a780a7 #352935 #705670 family - * brown #??? #??? #??? #??? #925f36 #??? #??? #??? #??? + * color text focus bg focus btn focus border focus active function sport level status + * orange #f07d00 #bd6200 #f07d00 #bd6200 #f07d00 #bd6200 #d77000 #572d00 #995000 primary ----- ----- ------ + * green #3c763d #2b542c #dff0d8 #c1e2b3 #58ab27 #43811e #4d9622 #182e0b #346417 success ----- ----- publis + * blue #31708f #245269 #d9edf7 #afd9ee #1d70b7 #16558b #1a63a1 #081f33 #11426c info -- ----- ----- draft + * yellow #8a6d3b #66512c #fcf8e3 #f7ecb5 #f9b000 #c68c00 #e09e00 #604400 #a27300 warning Klett ----- accept + * red #a94442 #843534 #f2dede #e4b9b9 #be1621 #901119 #a7131d #350609 #700d14 danger ----- ----- submit + * mandarin #b43a12 #902c0e #f0ded8 #e1bcb0 #e84e1b #b43a12 #aa3711 #3c1306 #78250c -------- ----- advan cancel + * lime #859201 #656e01 #eef0d8 #dde1b0 #bccf07 #859201 #7c8801 #2e3200 #4f5601 -------- Bergs ----- done - + * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 -------- Ski - ----- ------ + * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 -------- Wande ----- ------ + * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 -------- MTB - ----- ------ + * plum #a068a0 #784e78 #ebd4eb #dcb1dc #be91be #906e90 #a780a7 #352935 #705670 -------- ----- famil ------ + * brown #??? #??? #??? #??? #925f36 #??? #??? #??? #??? -------- ----- ----- ------ + * black #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- clear + * white #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- ------ */ /* @@ -178,111 +180,25 @@ a.text-default:hover, a.text-default:focus { /* * We need more text colors (for event stati) + * TODO: we try to replace this with dedicated status elements */ -.text-dav-purple { - color: #866dac; -} .text-dav-lime { color: #859201; } -.text-dav-cyan { - color: #54bbd9; -} -.text-dav-caramel { - color: #9c5b22; -} .text-dav-mandarin { color: #b43a12; } /* * We need more label colors (for event stati) + * TODO: we try to replace this with dedicated status elements */ -.label-black { - background-color: #333; -} -.label-dav-purple { - background-color: #a694c2; -} .label-dav-lime { background-color: #bccf07; } -.label-dav-cyan { - background-color: #86cfe4; -} -.label-dav-caramel { - background-color: #ce792d; -} .label-dav-mandarin { background-color: #e84e1b; } -.label-dav-brown { - background-color: #925f36; -} - -/* - * We need more button colors (for event stati) - */ -.btn-black { - background-color: #333; - border-color: #ccc; - color: #fff; -} -.btn-black.focus, .btn-black:focus, .btn-black:hover { - background-color: #555; - border-color: #ccc; - color: #fff; -} -.btn-dav-purple { - background-color: #a694c2; - border-color: #8067a8; - color: #fff; -} -.btn-dav-purple.focus, .btn-dav-purple:focus, .btn-dav-purple:hover { - background-color: #866dac; - border-color: #8067a8; - color: #fff; -} -.btn-dav-lime { - background-color: #bccf07; - border-color: #7c8801; - color: #fff; -} -.btn-dav-lime.focus, .btn-dav-lime:focus, .btn-dav-lime:hover { - background-color: #859201; - border-color: #7c8801; - color: #fff; -} -.btn-dav-cyan { - background-color: #86cfe4; - border-color: #4cb8d7; - color: #fff; -} -.btn-dav-cyan.focus, .btn-dav-cyan:focus, .btn-dav-cyan:hover { - background-color: #54bbd9; - border-color: #4cb8d7; - color: #fff; -} -.btn-dav-caramel { - background-color: #ce792d; - border-color: #935720; - color: #fff; -} -.btn-dav-caramel.focus, .btn-dav-caramel:focus, .btn-dav-caramel:hover { - background-color: #9c5b22; - border-color: #935720; - color: #fff; -} -.btn-dav-mandarin { - background-color: #e84e1b; - border-color: #aa3711; - color: #fff; -} -.btn-dav-mandarin.focus, .btn-dav-mandarin:focus, .btn-dav-mandarin:hover { - background-color: #b43a12; - border-color: #aa3711; - color: #fff; -} /* * Elements for sport choices @@ -392,6 +308,13 @@ a.text-default:hover, a.text-default:focus { /* * Coloured Elements (Buttons, Labels) for universal use */ +.text-orange { + color: #f07d00; +} +.bg-orange { + color: #fff; + background-color: #f07d00; +} .label-orange { background-color: #f07d00; } @@ -405,6 +328,12 @@ a.text-default:hover, a.text-default:focus { border-color: #572d00; color: #fff; } +.text-green { + color: #3c763d; +} +.bg-green { + background-color: #dff0d8; +} .label-green { background-color: #58ab27; } @@ -418,6 +347,12 @@ a.text-default:hover, a.text-default:focus { border-color: #182e0b; color: #fff; } +.text-blue { + color: #31708f; +} +.bg-blue { + background-color: #d9edf7; +} .label-blue { background-color: #1d70b7; } @@ -431,6 +366,12 @@ a.text-default:hover, a.text-default:focus { border-color: #081f33; color: #fff; } +.text-yellow { + color: #8a6d3b; +} +.bg-yellow { + background-color: #fcf8e3; +} .label-yellow { background-color: #f9b000; } @@ -444,6 +385,12 @@ a.text-default:hover, a.text-default:focus { border-color: #604400; color: #fff; } +.text-red { + color: #a94442; +} +.bg-red { + background-color: #f2dede; +} .label-red { background-color: #be1621; } @@ -457,6 +404,12 @@ a.text-default:hover, a.text-default:focus { border-color: #350609; color: #fff; } +.text-mandarin { + color: #b43a12; +} +.bg-mandarin { + background-color: #f0ded8; +} .label-mandarin { background-color: #e84e1b; } @@ -470,6 +423,12 @@ a.text-default:hover, a.text-default:focus { border-color: #3c1306; color: #fff; } +.text-lime { + color: #859201; +} +.bg-lime { + background-color: #eef0d8; +} .label-lime { background-color: #bccf07; } @@ -483,6 +442,12 @@ a.text-default:hover, a.text-default:focus { border-color: #2e3200; color: #fff; } +.text-cyan { + color: #54bbd9; +} +.bg-cyan { + background-color: #d8ebf0; +} .label-cyan { background-color: #86cfe4; } @@ -496,6 +461,12 @@ a.text-default:hover, a.text-default:focus { border-color: #17343c; color: #fff; } +.text-caramel { + color: #9c5b22; +} +.bg-caramel { + background-color: #f0e3d8; +} .label-caramel { background-color: #ce792d; } @@ -509,6 +480,12 @@ a.text-default:hover, a.text-default:focus { border-color: #3c230d; color: #fff; } +.text-purple { + color: #866dac; +} +.bg-purple { + background-color: #e1d8f0; +} .label-purple { background-color: #a694c2; } @@ -522,6 +499,12 @@ a.text-default:hover, a.text-default:focus { border-color: #2f263c; color: #fff; } +.text-plum { + color: #a068a0; +} +.bg-plum { + background-color: #ebd4eb; +} .label-plum { background-color: #be91be; } @@ -536,6 +519,22 @@ a.text-default:hover, a.text-default:focus { color: #fff; } +.text-black { + color: #333; +} +.label-black { + background-color: #333; +} +.btn-black { + background-color: #333; + border-color: #ccc; + color: #fff; +} +.btn-black.focus, .btn-black:focus, .btn-black:hover { + background-color: #555; + border-color: #ccc; + color: #fff; +} .btn-white { background-color: #fff; border-color: #ccc; diff --git a/dav_base/templates/dav_base/css_demo.html b/dav_base/templates/dav_base/css_demo.html index e382c05..cb2d67a 100644 --- a/dav_base/templates/dav_base/css_demo.html +++ b/dav_base/templates/dav_base/css_demo.html @@ -81,6 +81,7 @@

text-blue {% lorem %}

text-yellow {% lorem %}

text-red {% lorem %}

+

text-black {% lorem %}

text-mandarin {% lorem %}

text-lime {% lorem %}

text-cyan {% lorem %}

diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html index b2865d7..e2515a2 100644 --- a/dav_events/templates/dav_events/event_detail.html +++ b/dav_events/templates/dav_events/event_detail.html @@ -147,7 +147,7 @@ {% endif %} {% if has_permission_realize and is_started and not is_canceled %} - {% if is_realized %} {% bootstrap_icon 'check' %}  @@ -158,7 +158,7 @@ {% endif %} {% if has_permission_cancel and is_submitted and not is_realized %} - {% if is_canceled %} {% bootstrap_icon 'check' %}  -- 2.52.0 From f045517b3eddd3d8b7cf1197b80f281217635259 Mon Sep 17 00:00:00 2001 From: heinzel Date: Fri, 5 May 2023 13:42:39 +0200 Subject: [PATCH 10/11] Refined color "plum" --- dav_base/static/dav_base/css/local.css | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index 4724bb8..f51444b 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -11,7 +11,7 @@ * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 -------- Ski - ----- ------ * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 -------- Wande ----- ------ * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 -------- MTB - ----- ------ - * plum #a068a0 #784e78 #ebd4eb #dcb1dc #be91be #906e90 #a780a7 #352935 #705670 -------- ----- famil ------ + * plum #aa6c95 #784c69 #f0d4e7 #e6b0d4 #be91be #aa6c95 #a66691 #3c2635 #764867 -------- ----- famil ------ * brown #??? #??? #??? #??? #925f36 #??? #??? #??? #??? -------- ----- ----- ------ * black #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- clear * white #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- ------ @@ -296,12 +296,12 @@ a.text-default:hover, a.text-default:focus { } .btn-level-family { background-color: #be91be; - border-color: #a780a7; + border-color: #a66691; color: #fff; } .btn-level-family.focus, .btn-level-family:focus, .btn-level-family:hover { - background-color: #906e90; - border-color: #352935; + background-color: #aa6c95; + border-color: #3c2635; color: #fff; } @@ -500,22 +500,22 @@ a.text-default:hover, a.text-default:focus { color: #fff; } .text-plum { - color: #a068a0; + color: #aa6c95; } .bg-plum { - background-color: #ebd4eb; + background-color: #f0d4e7; } .label-plum { background-color: #be91be; } .btn-plum { background-color: #be91be; - border-color: #a780a7; + border-color: #a66691; color: #fff; } .btn-plum.focus, .btn-plum:focus, .btn-plum:hover { - background-color: #906e90; - border-color: #352935; + background-color: #aa6c95; + border-color: #3c2635; color: #fff; } -- 2.52.0 From d1199eebda6c2f42760cc4fada2810a54a5a0682 Mon Sep 17 00:00:00 2001 From: heinzel Date: Mon, 8 May 2023 12:35:01 +0200 Subject: [PATCH 11/11] Fixed plum button color --- dav_base/static/dav_base/css/local.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dav_base/static/dav_base/css/local.css b/dav_base/static/dav_base/css/local.css index f51444b..8f3980e 100644 --- a/dav_base/static/dav_base/css/local.css +++ b/dav_base/static/dav_base/css/local.css @@ -11,7 +11,7 @@ * cyan #54bbd9 #469db5 #d8ebf0 #a7d5e1 #86cfe4 #54bbd9 #4cb8d7 #17343c #3a8ea5 -------- Ski - ----- ------ * caramel #9c5b22 #78461a #f0e3d8 #e1c6b0 #ce792d #9c5b22 #935720 #3c230d #613915 -------- Wande ----- ------ * purple #866dac #566088 #e1d8f0 #c2b0e1 #a694c2 #866dac #8067a8 #2f263c #5a4876 -------- MTB - ----- ------ - * plum #aa6c95 #784c69 #f0d4e7 #e6b0d4 #be91be #aa6c95 #a66691 #3c2635 #764867 -------- ----- famil ------ + * plum #aa6c95 #784c69 #f0d4e7 #e6b0d4 #be91af #aa6c95 #a66691 #3c2635 #764867 -------- ----- famil ------ * brown #??? #??? #??? #??? #925f36 #??? #??? #??? #??? -------- ----- ----- ------ * black #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- clear * white #??? #??? #??? #??? #??? #??? #??? #??? #??? -------- ----- ----- ------ @@ -292,10 +292,10 @@ a.text-default:hover, a.text-default:focus { * family: plum */ .label-level-family { - background-color: #be91be; + background-color: #be91af; } .btn-level-family { - background-color: #be91be; + background-color: #be91af; border-color: #a66691; color: #fff; } @@ -506,10 +506,10 @@ a.text-default:hover, a.text-default:focus { background-color: #f0d4e7; } .label-plum { - background-color: #be91be; + background-color: #be91af; } .btn-plum { - background-color: #be91be; + background-color: #be91af; border-color: #a66691; color: #fff; } -- 2.52.0