diff --git a/src/backoffice/templates/backoffice/wa-index.html b/src/backoffice/templates/backoffice/wa-index.html index 5fe2feb511550b2cb7aaad359a54ff9db27afd6a..e0e399cc337052d456e0334cfefa5e4a64638329 100644 --- a/src/backoffice/templates/backoffice/wa-index.html +++ b/src/backoffice/templates/backoffice/wa-index.html @@ -29,7 +29,16 @@ <form action="" method="POST"> {% csrf_token %} - <input type="text" name="loglevel" placeholder="trace / debug / info / warn / error / fatal / panic" required> + <select name="loglevel" id="loglevel" required> + <option disabled selected value> -- select a loglevel -- </option> + <option value="trace">trace</option> + <option value="debug">debug</option> + <option value="info">info</option> + <option value="warn">warn</option> + <option value="error">error</option> + <option value="fatal">fatal</option> + <option value="panic">panic</option> + </select> <input type="submit" name="mapservice_loglevel" value="set loglevel" class="btn btn-secondary"> </form> diff --git a/src/plainui/jinja2/plainui/components/event_info.html b/src/plainui/jinja2/plainui/components/event_info.html index 4f3556418237dff3293c60be8ac675266112b5a4..796b0195bcfbfa60cbfb92ceae947582d6c5661e 100644 --- a/src/plainui/jinja2/plainui/components/event_info.html +++ b/src/plainui/jinja2/plainui/components/event_info.html @@ -66,7 +66,7 @@ </a> {% else %} {% if event.kind == 'sos' %} - <a href="{{ url('plainui:event_join', event_slug=event.slug) }}" class="a">{{ _("Temporary Room for Selforganized Session") }}</a> + <a href="{{ url('plainui:event_join', event_slug=event.slug) }}" class="a">{{ _("Temporary BBB-Room for Selforganized Session") }}</a> {% else %} - {% endif %} diff --git a/src/plainui/jinja2/plainui/components/header_buttons.html b/src/plainui/jinja2/plainui/components/header_buttons.html index 55067cc0cbf0bf3cbefa1a3feb66da3179d2498c..121a19a530a6eaac72e2491a38c8f5d4acfffe29 100644 --- a/src/plainui/jinja2/plainui/components/header_buttons.html +++ b/src/plainui/jinja2/plainui/components/header_buttons.html @@ -49,22 +49,22 @@ <ellipse class="st3" cx="250" cy="250" rx="100.58" ry="169"/> <path class="st3" d="M250 84.68v329.59M85.83 250h328.49"/> </svg> - <form + <form class="rc3-header__additional-lang" - method="POST" + method="POST" action="{{ url('plainui:modify_language') }}" > {{ csrf_input }} <input type="hidden" name="next" value="{{ request.get_full_path() }}"> - <button - class="btn btn-icont px-2" + <button + class="btn btn-icont px-2" value="de" name="language" > {{ _("de") }} </button> - <button - class="btn btn-icont px-2" + <button + class="btn btn-icont px-2" value="en" name="language" > @@ -85,8 +85,8 @@ {% macro logout() -%} {% if request.user.is_authenticated %} - <a - class="rc3-header__additional-btn btn-icon p-2" + <a + class="rc3-header__additional-btn btn-icon py-2 pl-2 pr-0" title="{{ _("logout") }}" href="{{ url('plainui:logout') }}" > @@ -96,8 +96,8 @@ </svg> </a> {% else %} - <a - class="rc3-header__additional-btn btn-icon p-2" + <a + class="rc3-header__additional-btn btn-icon py-2 pl-2 pr-0" title="{{ _("login") }}" href="{{ url('plainui:login') }}" > @@ -110,9 +110,9 @@ {%- endmacro %} {% macro report(report_url, kind="url", next=request.get_full_path() , title=_("report this url"), color="transparent" ) %} - <a - href="{{ url('plainui:report_content') ~ '?kind=' ~ kind ~ '&kind_data=' ~ report_url | urlencode ~ '&next=' ~ next }}" - class="btn-icon-big btn btn-{{ color }} p-2" + <a + href="{{ url('plainui:report_content') ~ '?kind=' ~ kind ~ '&kind_data=' ~ report_url | urlencode ~ '&next=' ~ next }}" + class="btn-icon-big btn btn-{{ color }} p-2" title="{{ title }}" > <svg width="1.25rem" height="1.25rem" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" fill="currentColor"> @@ -123,10 +123,10 @@ {% endmacro %} {% macro share(share_url, title=_("share this "), color="transparent" ) -%} - <a - href="{{ share_url }}" - class="btn-icon-big btn btn-{{ color }} p-2" - title="{{ title }}" + <a + href="{{ share_url }}" + class="btn-icon-big btn btn-{{ color }} p-2" + title="{{ title }}" target="_blank" > <svg width="1.25rem" height="1.25rem" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" fill="currentColor"> @@ -143,9 +143,9 @@ <input type="hidden" name="id" value="{{ sch_id }}"> {%- if sch_is %} <input type="hidden" name="mode" value="remove"> - <button - type="submit" - id="sch_{{ sch_id }}" + <button + type="submit" + id="sch_{{ sch_id }}" class="active btn-icon-big btn btn-{{ color }} p-2" title="{{ _("remove from schedule") }}" > @@ -155,10 +155,10 @@ </button> {%- else -%} <input type="hidden" name="mode" value="add"> - <button - type="submit" - id="sch_{{ sch_id }}" - class="btn-icon-big btn btn-{{ color }} p-2" + <button + type="submit" + id="sch_{{ sch_id }}" + class="btn-icon-big btn btn-{{ color }} p-2" title="{{ _("add to schedule") }}" > <svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" style="position: relative; top: 2px;" fill="currentColor" class="bi bi-calendar2-week" viewBox="0 0 16 16"> @@ -181,10 +181,10 @@ {%- if fav_is %} <input type="hidden" name="mode" value="remove"> - <button - type="submit" - id="fav_{{ fav_id }}" - class="active btn-icon-big btn btn-{{ color }} p-2" + <button + type="submit" + id="fav_{{ fav_id }}" + class="active btn-icon-big btn btn-{{ color }} p-2" title="{{ _("remove from favorites") }}" > <svg width="16px" height="16px" style="position: relative; top: 2px;" xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-heart-fill" viewBox="0 0 16 16"> @@ -193,10 +193,10 @@ </button> {%- else -%} <input type="hidden" name="mode" value="add"> - <button - type="submit" - id="fav_{{ fav_id }}" - class="btn-icon-big btn btn-{{ color }} p-2" + <button + type="submit" + id="fav_{{ fav_id }}" + class="btn-icon-big btn btn-{{ color }} p-2" title="{{ _("add to favorites") }}" > <svg width="1.25rem" height="1.25rem" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" fill="currentColor"> <style>.st0{display:none}.st1{display:inline}.st2{fill:none;stroke:#000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style> @@ -206,3 +206,52 @@ {% endif -%} </form> {% endmacro %} + +{% macro themeswitcher() -%} + <form method="POST" action="{{ url('plainui:modify_theme') }}"> + {{ csrf_input }} + <input type="hidden" name="next" value="{{ request.get_full_path() }}"> + {% if user.theme == 'full' %} + <button + class="rc3-header__additional-btn btn btn-icon py-2 pl-2 pr-0" + value="default" + name="theme" + title="switch to eyecandy theme" + > + <!-- icon animations full--> + <svg width="1.25rem" height="1.25rem" fill="currentColor" version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" xml:space="preserve"><style>.st0{display:none}.st1{display:inline}.st2{fill:none;stroke:#000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style><path d="M411.1 237.1 142.2 81.8c-4.8-2.8-10.7-2.8-15.5 0s-7.8 7.9-7.8 13.4v310.5c0 5.5 3 10.7 7.8 13.4 2.4 1.4 5 2.1 7.8 2.1s5.4-.7 7.8-2.1l268.9-155.2c4.8-2.8 7.8-7.9 7.8-13.4s-3.1-10.7-7.9-13.4z" id="animation"/></svg> + </button> + {% else %} + <button + class="rc3-header__additional-btn btn btn-icon py-2 pl-2 pr-0" + value="full" + title="switch to eyecandy deluxe theme" + name="theme" + > + <!-- icon animations --> + <svg width="1.25rem" height="1.25rem" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" xml:space="preserve"><style>.st0{display:none}.st1{display:inline}.st2{fill:none;stroke:#000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style><path d="M411.13 237.06 142.25 81.82a15.543 15.543 0 0 0-15.5 0c-4.78 2.76-7.75 7.9-7.75 13.42v310.48c0 5.52 2.97 10.66 7.75 13.42 2.35 1.36 5.03 2.08 7.75 2.08s5.4-.72 7.75-2.08L411.13 263.9c4.78-2.76 7.75-7.9 7.75-13.42s-2.96-10.66-7.75-13.42zm-38.75 13.42L150 378.88V122.09l222.38 128.39z" id="animation"/></svg> + </button> + {% endif %} + {% if user.theme == 'full' or user.theme == 'default' %} + <button + class="rc3-header__additional-btn btn btn-icon p-2" + value="distractfree" + title="switch to dark theme" + name="theme" + > + <!-- icon bulb active --> + <svg width="1.25rem" height="1.25rem" fill="currentColor" version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" xml:space="preserve"><style>.st0{display:none}.st1{display:inline}.st3{fill:none;stroke:#000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style><g id="light"><path d="M250.2 38.1c-76.6 0-139 62.3-139 139 0 26.4 7.5 52.2 21.6 74.5 13.3 21 31.9 37.9 54.1 49.2v14c0 11.8 9.6 21.4 21.4 21.4h85.1c11.8 0 21.4-9.6 21.4-21.4v-14.6c21.8-11.4 40.1-28.4 53.2-49.2 13.9-22.2 21.3-47.7 21.3-73.8-.1-76.7-62.4-139.1-139.1-139.1z"/><path d="M250.8 86.5c-2.1 0-21.3.3-41.6 11.5-19.3 10.6-42.9 32.9-46 79.4-.5 8 5.5 14.9 13.5 15.5h1c7.6 0 14-6 14.5-13.6 1.8-26.6 12.1-45.4 30.6-55.7 13.8-7.7 27.9-8.1 28-8.1 8 0 14.5-6.5 14.5-14.5 0-7.9-6.5-14.5-14.5-14.5z" style="fill:rgb(0, 0, 0)"/><path d="M294.4 351.4H211c-16.4 0-29.8 13.3-29.8 29.7v19.1c0 11.6 6.7 21.8 16.6 26.6 3.1 18.3 19 32.3 38.2 32.3h29.1c18.5 0 34.1-13.1 37.9-30.5 12.2-3.7 21.2-15.1 21.2-28.5V381c-.1-16.2-13.4-29.6-29.8-29.6z"/></g></svg> + </button> + {% else %} + <button + class="rc3-header__additional-btn btn btn-icon p-2" + value="default" + title="switch to eyecandy theme" + name="theme" + > + <!-- icon bulb --> + <svg width="1.25rem" height="1.25rem" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500" xml:space="preserve"><style>.st0{display:none}.st1{display:inline}.st2{fill:none;stroke:#000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10}</style><g id="light"><path d="M250.76 86.54c-2.12 0-21.29.32-41.59 11.46-19.26 10.57-42.88 32.92-46 79.43-.54 8 5.54 14.95 13.53 15.48.33.02.66.03.99.03 7.62 0 13.99-5.96 14.51-13.57 1.79-26.63 12.09-45.36 30.62-55.69 13.84-7.71 27.92-8.06 27.97-8.06 8-.02 14.52-6.54 14.52-14.54-.01-8.01-6.53-14.54-14.55-14.54z"/><path d="M250.22 38.14c-76.64 0-138.99 62.35-138.99 138.99 0 26.44 7.48 52.19 21.63 74.48a139.018 139.018 0 0 0 54.06 49.25v13.96c0 11.79 9.59 21.38 21.38 21.38h85.08c11.79 0 21.38-9.59 21.38-21.38V300.2a139.15 139.15 0 0 0 53.17-49.25c13.92-22.17 21.27-47.69 21.27-73.82 0-76.64-62.35-138.99-138.98-138.99zm35.54 243.5v25.55h-69.84v-25.11l-8.8-3.76c-40.64-17.38-66.9-57.1-66.9-101.19 0-60.65 49.34-109.99 109.99-109.99 60.65 0 109.99 49.34 109.99 109.99 0 43.56-25.82 83.09-65.79 100.7l-8.65 3.81zM294.4 351.41h-83.38c-16.4 0-29.75 13.34-29.75 29.74v19.14c0 11.58 6.73 21.75 16.56 26.65 3.07 18.32 19.04 32.32 38.21 32.32h29.07c18.53 0 34.07-13.08 37.86-30.49 12.23-3.69 21.16-15.06 21.16-28.48v-19.14c.01-16.4-13.33-29.74-29.73-29.74zm.66 29.75v19.14c0 .36-.3.66-.66.66h-83.38c-.36 0-.66-.3-.66-.66v-19.14c0-.36.3-.66.66-.66h83.38c.36 0 .66.29.66.66z"/></g></svg> + </button> + {% endif %} + </form> +{%- endmacro %} diff --git a/src/plainui/jinja2/plainui/fahrplan.html b/src/plainui/jinja2/plainui/fahrplan.html index b19b897ebfde5956429a81db85261a33a575644a..b18609bfdce5231a38ea375e6331569c9f0b44a9 100644 --- a/src/plainui/jinja2/plainui/fahrplan.html +++ b/src/plainui/jinja2/plainui/fahrplan.html @@ -36,7 +36,9 @@ <div class="row justify-content-md-left"> <button type="submit" name="set" value="fmy" class="m-2 btn btn-transparent {{ 'active' if my_fahrplan else ''}}">{{ _("My Fahrplan") }}</button> <button type="submit" name="set" value="fday" class="m-2 btn btn-transparent {{ 'active' if show_day_filters else ''}}">{{ _("by day") }}</button> + <!-- no tracks at rc3 2021 <button type="submit" name="set" value="ftrack" class="m-2 btn btn-transparent {{ 'active' if show_track_filters else ''}}">{{ _("by track") }}</button> + --> <button type="submit" name="set" value="kofficial" class="m-2 btn btn-transparent {{ 'active' if kind == 'official' else ''}}">{{ _("curated only") }}</button> <button type="submit" name="set" value="kassembly" class="m-2 btn btn-transparent {{ 'active' if kind == 'assembly' else ''}}">{{ _("assembly only") }}</button> <button type="submit" name="set" value="ksos" class="m-2 btn btn-transparent {{ 'active' if kind == 'sos' else ''}}">{{ _("selforganized only") }}</button> diff --git a/src/plainui/jinja2/plainui/header.html b/src/plainui/jinja2/plainui/header.html index a0200de140538a03bc6071683aeea7fefcf2b180..644ee8de071b9ebc3449061610b944df652fd8f1 100644 --- a/src/plainui/jinja2/plainui/header.html +++ b/src/plainui/jinja2/plainui/header.html @@ -24,16 +24,16 @@ <div class="rc3-header__additional"> <div class="d-inline-block"> <div class="d-flex justify-content-between"> - <a + <a class="rc3-header-link ml-3" href="{{ url('plainui:fahrplan') }}" title="{{ _("plan") }}" > {{ _("plan") }} </a> - <a + <a class="rc3-header-link ml-3 text-nowrap" - href="{{ url('plainui:personal_message') }}" + href="{{ url('plainui:personal_message') }}" title="{{ _("chat") }}" > {{ _("chat") }} @@ -44,16 +44,16 @@ </span> {% endif %} </a> - <a + <a class="rc3-header-link ml-3" title="{{ _("board") }}" href="{{ url('plainui:board') }}" > {{ _("board") }} </a> - <a + <a class="rc3-header-link ml-3" - href="{{ url('plainui:userprofile') }}" + href="{{ url('plainui:userprofile') }}" title="{{ _('profile') }}" > {{ _('profile') }} @@ -72,6 +72,7 @@ {{ hbtns.bulb() }} {{ hbtns.heart() }} --> + {{ hbtns.themeswitcher() }} {% if fav_info %} {{ hbtns.fav(fav_info['id'], fav_info['type'], fav_info['is']) }} {% endif %} diff --git a/src/plainui/jinja2/plainui/landing.html b/src/plainui/jinja2/plainui/landing.html index fe9df0406536cdc1c4467e1b18302a3e4207db0e..327606fcd520a811a1864d9e1c0e818e0ec0f1ef 100644 --- a/src/plainui/jinja2/plainui/landing.html +++ b/src/plainui/jinja2/plainui/landing.html @@ -75,7 +75,16 @@ {{ _("login") }} </a> </div> - + <div class="text-center m-3"> + <a + href="{{ url('plainui:public_fahrplan' ) }}" + title="{{ _("fahrplan") }}" + class="rc3-header-link p-2" + target="_blank" + > + {{ _("fahrplan") }} + </a> + </div> <div class="text-center m-3"> <a href="https://tickets.events.ccc.de/RC3-21/" @@ -87,7 +96,7 @@ {{ _("ticket") }} </a> </div> - <div class="text-center m-3"> + <div class="text-center m-3"> <a href="https://merch.rc3.world/" title="{{ _("merch") }}" diff --git a/src/plainui/jinja2/plainui/report_content.html b/src/plainui/jinja2/plainui/report_content.html index b8dc7d15f542cc33ee488558bdd4849b1fee5abb..eb7618368bad10d2804b08949acd023c4b0c401d 100644 --- a/src/plainui/jinja2/plainui/report_content.html +++ b/src/plainui/jinja2/plainui/report_content.html @@ -5,6 +5,10 @@ {% block content %} {{ titleMacro.title(_("Help, there is a Problem...")) }} + {{ markdownMacro.markdown(markdown=page.rendered_body|safe) }} + + <hr class="rc3-spacer"> + <form method="POST" id="report_content" class="border p-0 bg-opaque mt-11 mb-8{% if form.errors %} border-danger{% endif %}"> <h2 class="text-center bg-white text-dark m-0 px-3 py-1">{{_("Report Content")}}</h2> <div class="p-3"> @@ -40,7 +44,4 @@ <hr class="rc3-spacer"> - {{ markdownMacro.markdown(markdown=page.rendered_body|safe) }} - - <hr class="rc3-spacer"> {% endblock %} diff --git a/src/plainui/locale/de/LC_MESSAGES/django.po b/src/plainui/locale/de/LC_MESSAGES/django.po index a33b8ea6c32fa2674b8e1183f9557e1f1798fbcc..bf877ff2176df217ae4b2d2250dcfb870652f7c7 100644 --- a/src/plainui/locale/de/LC_MESSAGES/django.po +++ b/src/plainui/locale/de/LC_MESSAGES/django.po @@ -225,8 +225,8 @@ msgstr "Sprache" msgid "Room" msgstr "Raum" -msgid "Temporary Room for Selforganized Session" -msgstr "Temporärer Raum für Self-organized Session" +msgid "Temporary BBB-Room for Selforganized Session" +msgstr "Temporärer BBB-Raum für Self-organized Session" msgid "Host" msgstr "Host" diff --git a/src/plainui/locale/en/LC_MESSAGES/django.po b/src/plainui/locale/en/LC_MESSAGES/django.po index 88d5677cf17d77a8c9f852cdda65e279f41d33c1..35358c713520a6d8e5e93e4667eec8c2a86e449e 100644 --- a/src/plainui/locale/en/LC_MESSAGES/django.po +++ b/src/plainui/locale/en/LC_MESSAGES/django.po @@ -221,7 +221,7 @@ msgstr "" msgid "Room" msgstr "" -msgid "Temporary Room for Selforganized Session" +msgid "Temporary BBB-Room for Selforganized Session" msgstr "" msgid "Host" diff --git a/src/plainui/styles/components/_header.scss b/src/plainui/styles/components/_header.scss index 63dcc2963d97a0e109464c5f61cb345234a49679..ae416f977be0acfd1b5a9a3b4160b51e8a4f10bd 100644 --- a/src/plainui/styles/components/_header.scss +++ b/src/plainui/styles/components/_header.scss @@ -95,10 +95,6 @@ height: 20px; width: 20px; } - - &:last-of-type { - padding-right: 0 !important; - } } &-lang { diff --git a/src/plainui/tests.py b/src/plainui/tests.py index e6f4fb3a2d7626a361aca4f4c520ebd726d2ed11..662951af687e77f382703df2929954363a4da398 100644 --- a/src/plainui/tests.py +++ b/src/plainui/tests.py @@ -445,6 +445,43 @@ class ViewsTest(TestCase): self.assertFalse(self.user.receive_video) self.assertSetsMessage(resp, 'Updated Profile') + def test_ModifyThemeView_get(self): + self.assertNeedsLogin(reverse('plainui:search')) + resp = self.client.get(reverse('plainui:search'), follow=False) + self.assertRedirects(resp, reverse('plainui:index')) + + def test_ModifyThemeView_post(self): + self.assertNeedsLogin(reverse('plainui:modify_theme'), post=True) + + # setting theme works + resp = self.client.post(reverse('plainui:modify_theme'), { + 'theme': 'distractfree', + 'next': reverse('plainui:landing'), + }) + self.assertRedirects(resp, reverse('plainui:landing')) + self.user.refresh_from_db() + self.assertEqual(self.user.theme, 'distractfree') + self.assertEqual(self.client.session['theme'], 'distractfree') + + # invalid dst redirects to index + resp = self.client.post(reverse('plainui:modify_theme'), { + 'theme': 'distractfree_nobg', + 'next': 'https://www.google.de/', + }) + self.assertRedirects(resp, reverse('plainui:index')) + self.user.refresh_from_db() + self.assertEqual(self.user.theme, 'distractfree_nobg') + self.assertEqual(self.client.session['theme'], 'distractfree_nobg') + + # invalid theme does not change anything, next defaults to index + resp = self.client.post(reverse('plainui:modify_theme'), { + 'theme': 'doesnotexist', + }) + self.assertRedirects(resp, reverse('plainui:index')) + self.user.refresh_from_db() + self.assertEqual(self.user.theme, 'distractfree_nobg') + self.assertEqual(self.client.session['theme'], 'distractfree_nobg') + @override_settings(LANGUAGE_CODE='en', PRETIX_SECRET_KEY='^v^', PRETIX_ISSUER='tickets.events.ccc.de') @freeze_time(datetime(2020, 12, 28, 1, 0, 0, tzinfo=utc)) def test_RedeemTokenView(self): diff --git a/src/plainui/urls.py b/src/plainui/urls.py index a59e255c55a8cf0a8e506fafb4064a346ccacf87..58d162a34b7f7441de8cb8130e3824ceb58fab2e 100644 --- a/src/plainui/urls.py +++ b/src/plainui/urls.py @@ -41,6 +41,7 @@ urlpatterns = [ path('modify_favorites', views.ModifyFavoritesView.as_view(), name='modify_favorites'), path('modify_language', views.ModifyLanguageView.as_view(), name='modify_language'), path('modify_personal_calendar', views.ModifyPersonalCalendarView.as_view(), name='modify_personal_calendar'), + path('modify_theme', views.ModifyThemeView.as_view(), name='modify_theme'), path('index', views.IndexView.as_view(), name='index'), path('pm/inbox', views.PersonalMessageListView.as_view(), name='personal_message'), path('pm/outbox', views.PersonalMessageListView.as_view(sent=True), name='personal_message_outbox'), diff --git a/src/plainui/views.py b/src/plainui/views.py index 0c75f89635a61c68e9152f62f1b53d0e4f53af12..21ed14a56a87b126d4e9f52ae810f797ad6f6d0c 100644 --- a/src/plainui/views.py +++ b/src/plainui/views.py @@ -439,6 +439,28 @@ class ProfileView(ConferenceRequiredMixin, UpdateView): return resp +class ModifyThemeView(ConferenceRequiredMixin, View): + def get(self, request, **kwargs): + return redirect(reverse('plainui:index')) + + def post(self, request): + redirect_to = request.POST.get('next') or reverse('plainui:index') + url_is_safe = url_has_allowed_host_and_scheme( + url=redirect_to, + allowed_hosts=[self.request.get_host()], + require_https=self.request.is_secure(), + ) + if not url_is_safe: + redirect_to = reverse('plainui:index') + + new_theme = request.POST['theme'] + if new_theme in PlatformUser.Theme.values: + self.request.user.theme = new_theme + self.request.user.save(update_fields=['theme']) + self.request.session['theme'] = new_theme + return redirect(redirect_to) + + class ManageBadgeView(ConferenceRequiredMixin, UpdateView): template_name = 'plainui/manage_badges.html' form_class = RedeemBadgeForm