Merge remote-tracking branch 'origin/main' into MK/training_tab
@ -0,0 +1,2 @@
|
||||
This repository contains third-party assets. Attributions are either placed in the file itself or
|
||||
in a file `NOTICE.txt` in the respective folder.
|
||||
|
Before Width: | Height: | Size: 48 KiB |
@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><defs><style>.c{fill:#9cc;}.d{fill:#2d5955;}.e{stroke:#2d5955;stroke-width:3.2px;}.e,.f{fill:none;stroke-miterlimit:10;}.g{fill:#666;mix-blend-mode:multiply;}.f{stroke:#666;stroke-width:3.3px;}.h{opacity:.36;}.i{isolation:isolate;}.j{fill:#fff;opacity:.24;}</style></defs><g class="i"><g id="a"><circle class="f" cx="24.31" cy="24.31" r="21.69"/></g><g id="b"><circle class="e" cx="23.69" cy="23.69" r="21.69"/><polygon class="g" points="21.2 22.96 15.21 43.89 27.68 25.98 33.66 5.05 21.2 22.96"/><polygon class="c" points="14.34 43.15 26.8 25.24 20.32 22.23 14.34 43.15"/><polygon class="d" points="32.79 4.32 20.32 22.23 26.8 25.24 32.79 4.32"/><polyline class="h" points="14.34 43.15 26.8 25.24 32.79 4.32"/><circle class="j" cx="23.61" cy="23.64" r="1.55"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 873 B |
@ -0,0 +1,59 @@
|
||||
import os
|
||||
|
||||
DJANGO_LOG_LEVEL = get_var('logging', 'django_level', default='INFO')
|
||||
ROOT_LOG_LEVEL = get_var('logging', 'level', default='INFO')
|
||||
LOG_ERROR_TO_EMAIL = get_var('logging', 'email_admins', default=False)
|
||||
LOG_EMAIL_BACKEND = EMAIL_BACKEND if LOG_ERROR_TO_EMAIL else "django.core.mail.backends.console.EmailBackend"
|
||||
LOG_ERROR_INCLUDE_HTML = get_var('logging', 'error_report_include_html', default=False)
|
||||
|
||||
LOGGING = {
|
||||
"version": 1,
|
||||
"disable_existing_loggers": False,
|
||||
"filters": {
|
||||
"require_debug_false": {
|
||||
"()": "django.utils.log.RequireDebugFalse",
|
||||
},
|
||||
"require_debug_true": {
|
||||
"()": "django.utils.log.RequireDebugTrue",
|
||||
},
|
||||
},
|
||||
"formatters": {
|
||||
"simple": {
|
||||
"format": "[{asctime}: {levelname}/{name}] {message}",
|
||||
"style": "{",
|
||||
},
|
||||
"verbose": {
|
||||
"format": "[{asctime}: {levelname}/{name}] {pathname}:{lineno} {message}",
|
||||
"style": "{",
|
||||
},
|
||||
},
|
||||
"handlers": {
|
||||
"console": {
|
||||
"class": "logging.StreamHandler",
|
||||
"formatter": "simple",
|
||||
},
|
||||
"console_verbose": {
|
||||
"class": "logging.StreamHandler",
|
||||
"formatter": "verbose",
|
||||
"level": "ERROR",
|
||||
},
|
||||
"mail_admins": {
|
||||
"level": "ERROR",
|
||||
"class": "django.utils.log.AdminEmailHandler",
|
||||
"email_backend": LOG_EMAIL_BACKEND,
|
||||
"include_html": LOG_ERROR_INCLUDE_HTML,
|
||||
"filters": ["require_debug_false"],
|
||||
},
|
||||
},
|
||||
"root": {
|
||||
"handlers": ["console"],
|
||||
"level": ROOT_LOG_LEVEL,
|
||||
},
|
||||
"loggers": {
|
||||
"django": {
|
||||
"handlers": ["console", "mail_admins"],
|
||||
"level": DJANGO_LOG_LEVEL,
|
||||
"propagate": False,
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
from django.test import TestCase, RequestFactory, override_settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib import admin
|
||||
from unittest.mock import Mock, patch
|
||||
from jdav_web.views import media_unprotected, custom_admin_view
|
||||
from startpage.models import Link
|
||||
|
||||
|
||||
class ViewsTestCase(TestCase):
|
||||
def setUp(self):
|
||||
self.factory = RequestFactory()
|
||||
self.user = User.objects.create_user('testuser', 'test@example.com', 'password')
|
||||
Link.objects.create(title='Test Link', url='https://example.com')
|
||||
|
||||
@override_settings(DEBUG=True)
|
||||
def test_media_unprotected_debug_true(self):
|
||||
request = self.factory.get('/media/test.jpg')
|
||||
with patch('jdav_web.views.serve') as mock_serve:
|
||||
mock_serve.return_value = Mock()
|
||||
result = media_unprotected(request, 'test.jpg')
|
||||
mock_serve.assert_called_once()
|
||||
|
||||
def test_custom_admin_view(self):
|
||||
request = self.factory.get('/admin/')
|
||||
request.user = self.user
|
||||
with patch.object(admin.site, 'get_app_list') as mock_get_app_list:
|
||||
mock_get_app_list.return_value = []
|
||||
response = custom_admin_view(request)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
mock_get_app_list.assert_called_once_with(request)
|
||||
@ -0,0 +1,34 @@
|
||||
from django.test import TestCase, override_settings
|
||||
from unittest.mock import patch, Mock
|
||||
from mailer.mailutils import send, SENT, NOT_SENT
|
||||
|
||||
|
||||
class MailUtilsTest(TestCase):
|
||||
def setUp(self):
|
||||
self.subject = "Test Subject"
|
||||
self.content = "Test Content"
|
||||
self.sender = "sender@example.com"
|
||||
self.recipient = "recipient@example.com"
|
||||
|
||||
def test_send_with_reply_to(self):
|
||||
with patch('mailer.mailutils.mail.get_connection') as mock_connection:
|
||||
mock_conn = Mock()
|
||||
mock_connection.return_value = mock_conn
|
||||
result = send(self.subject, self.content, self.sender, self.recipient, reply_to=["reply@example.com"])
|
||||
self.assertEqual(result, SENT)
|
||||
|
||||
def test_send_with_message_id(self):
|
||||
with patch('mailer.mailutils.mail.get_connection') as mock_connection:
|
||||
mock_conn = Mock()
|
||||
mock_connection.return_value = mock_conn
|
||||
result = send(self.subject, self.content, self.sender, self.recipient, message_id="<test@example.com>")
|
||||
self.assertEqual(result, SENT)
|
||||
|
||||
def test_send_exception_handling(self):
|
||||
with patch('mailer.mailutils.mail.get_connection') as mock_connection:
|
||||
mock_conn = Mock()
|
||||
mock_conn.send_messages.side_effect = Exception("Test exception")
|
||||
mock_connection.return_value = mock_conn
|
||||
with patch('builtins.print'):
|
||||
result = send(self.subject, self.content, self.sender, self.recipient)
|
||||
self.assertEqual(result, NOT_SENT)
|
||||
@ -0,0 +1,121 @@
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.db import migrations
|
||||
from django.contrib.auth.management import create_permissions
|
||||
|
||||
STANDARD_PERMS = [
|
||||
('members', 'view_member'),
|
||||
('members', 'view_freizeit'),
|
||||
('members', 'add_global_freizeit'),
|
||||
('members', 'view_memberwaitinglist'),
|
||||
('members', 'view_memberunconfirmedproxy'),
|
||||
('mailer', 'view_message'),
|
||||
('mailer', 'add_global_message'),
|
||||
('finance', 'view_statementunsubmitted'),
|
||||
('finance', 'add_global_statementunsubmitted'),
|
||||
]
|
||||
|
||||
FINANCE_PERMS = [
|
||||
('finance', 'view_bill'),
|
||||
('finance', 'view_ledger'),
|
||||
('finance', 'add_ledger'),
|
||||
('finance', 'change_ledger'),
|
||||
('finance', 'delete_ledger'),
|
||||
('finance', 'view_statementsubmitted'),
|
||||
('finance', 'view_global_statementsubmitted'),
|
||||
('finance', 'change_global_statementsubmitted'),
|
||||
('finance', 'view_transaction'),
|
||||
('finance', 'change_transaction'),
|
||||
('finance', 'add_transaction'),
|
||||
('finance', 'delete_transaction'),
|
||||
('finance', 'process_statementsubmitted'),
|
||||
('members', 'list_global_freizeit'),
|
||||
('members', 'view_global_freizeit'),
|
||||
]
|
||||
|
||||
WAITINGLIST_PERMS = [
|
||||
('members', 'view_global_memberwaitinglist'),
|
||||
('members', 'list_global_memberwaitinglist'),
|
||||
('members', 'change_global_memberwaitinglist'),
|
||||
('members', 'delete_global_memberwaitinglist'),
|
||||
]
|
||||
|
||||
TRAINING_PERMS = [
|
||||
('members', 'change_global_member'),
|
||||
('members', 'list_global_member'),
|
||||
('members', 'view_global_member'),
|
||||
('members', 'add_global_membertraining'),
|
||||
('members', 'change_global_membertraining'),
|
||||
('members', 'list_global_membertraining'),
|
||||
('members', 'view_global_membertraining'),
|
||||
('members', 'view_trainingcategory'),
|
||||
('members', 'add_trainingcategory'),
|
||||
('members', 'change_trainingcategory'),
|
||||
('members', 'delete_trainingcategory'),
|
||||
]
|
||||
|
||||
REGISTRATION_PERMS = [
|
||||
('members', 'may_manage_all_registrations'),
|
||||
('members', 'change_memberunconfirmedproxy'),
|
||||
('members', 'delete_memberunconfirmedproxy'),
|
||||
]
|
||||
|
||||
MATERIAL_PERMS = [
|
||||
('members', 'list_global_member'),
|
||||
('material', 'view_materialpart'),
|
||||
('material', 'change_materialpart'),
|
||||
('material', 'add_materialpart'),
|
||||
('material', 'delete_materialpart'),
|
||||
('material', 'view_materialcategory'),
|
||||
('material', 'change_materialcategory'),
|
||||
('material', 'add_materialcategory'),
|
||||
('material', 'delete_materialcategory'),
|
||||
('material', 'view_ownership'),
|
||||
('material', 'change_ownership'),
|
||||
('material', 'add_ownership'),
|
||||
('material', 'delete_ownership'),
|
||||
]
|
||||
|
||||
|
||||
def ensure_group_perms(apps, schema_editor, name, perm_names):
|
||||
"""
|
||||
Ensure the group `name` has the permissions `perm_names`. If the group does not
|
||||
exist, create it with the given permissions, otherwise add the missing ones.
|
||||
|
||||
This only adds permissions, already existing ones that are not listed here are not
|
||||
removed.
|
||||
"""
|
||||
db_alias = schema_editor.connection.alias
|
||||
Group = apps.get_model("auth", "Group")
|
||||
Permission = apps.get_model("auth", "Permission")
|
||||
perms = [ Permission.objects.get(codename=codename, content_type__app_label=app_label) for app_label, codename in perm_names ]
|
||||
try:
|
||||
g = Group.objects.using(db_alias).get(name=name)
|
||||
for perm in perms:
|
||||
g.permissions.add(perm)
|
||||
g.save()
|
||||
# This case is only executed if users have manually removed one of the standard groups.
|
||||
except Group.DoesNotExist: # pragma: no cover
|
||||
g = Group.objects.using(db_alias).create(name=name)
|
||||
g.permissions.set(perms)
|
||||
g.save()
|
||||
|
||||
|
||||
def update_default_permission_groups(apps, schema_editor):
|
||||
ensure_group_perms(apps, schema_editor, "Standard", STANDARD_PERMS)
|
||||
ensure_group_perms(apps, schema_editor, "Finance", FINANCE_PERMS)
|
||||
ensure_group_perms(apps, schema_editor, "Waitinglist", WAITINGLIST_PERMS)
|
||||
ensure_group_perms(apps, schema_editor, "Trainings", TRAINING_PERMS)
|
||||
ensure_group_perms(apps, schema_editor, "Registrations", REGISTRATION_PERMS)
|
||||
ensure_group_perms(apps, schema_editor, "Material", MATERIAL_PERMS)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0010_create_default_permission_groups'),
|
||||
('members', '0042_member_ticket_no'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(update_default_permission_groups, migrations.RunPython.noop),
|
||||
]
|
||||
@ -0,0 +1,40 @@
|
||||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls static %}
|
||||
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{{ media }}
|
||||
<script src="{% static 'admin/js/cancel.js' %}" async></script>
|
||||
<script type="text/javascript" src="{% static "admin/js/vendor/jquery/jquery.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "admin/js/jquery.init.js" %}"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} invite-waiter
|
||||
{% endblock %}
|
||||
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
|
||||
› <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
|
||||
› {% translate 'Demote to waiter' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{% translate "Request registration form" %}</h2>
|
||||
<p>
|
||||
{% blocktrans %}Do you want to ask {{ member }} to upload their registration form?{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
{% if member.registration_form %}
|
||||
{% blocktrans %}Warning: {{ member }} has already uploaded a registration form.{% endblocktrans %}
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<input class="default" style="color: $default-link-color" type="submit" name="apply" value="{% translate 'Request registration form' %}">
|
||||
<a href="#" class="button cancel-link">{% translate "Cancel" %}</a>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@ -0,0 +1,48 @@
|
||||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls static %}
|
||||
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{{ media }}
|
||||
<script src="{% static 'admin/js/cancel.js' %}" async></script>
|
||||
<script type="text/javascript" src="{% static "admin/js/vendor/jquery/jquery.js" %}"></script>
|
||||
<script type="text/javascript" src="{% static "admin/js/jquery.init.js" %}"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} invite-waiter
|
||||
{% endblock %}
|
||||
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
|
||||
› <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
|
||||
› {% translate 'Demote to waiter' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>{% translate "Demote to waiter" %}</h2>
|
||||
<p>
|
||||
{% trans "Do you want to demote the following unconfirmed registrations to waiters?" %}
|
||||
</p>
|
||||
<p>
|
||||
<ul>
|
||||
{% for member in queryset %}
|
||||
<li>
|
||||
<a href="{% url 'admin:members_memberunconfirmedproxy_change' 3 %}">{{ member }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
{% if form %}
|
||||
{{form}}
|
||||
{% endif %}
|
||||
<input type="hidden" name="action" value="demote_to_waiter_action">
|
||||
<input class="default" style="color: $default-link-color" type="submit" name="apply" value="{% translate 'Demote' %}">
|
||||
<a href="#" class="button cancel-link">{% translate "Cancel" %}</a>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@ -1,8 +1,31 @@
|
||||
{% extends "startpage/base_subsite.html" %}
|
||||
{% load static %}
|
||||
{% load static common i18n %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% include "startpage/impressum_content.html" %}
|
||||
|
||||
{% block attribution %}
|
||||
<h1>{% trans "Attributions" %}</h1>
|
||||
|
||||
<p>
|
||||
{% trans "The source code of this website is licensed under" %}
|
||||
<a href="https://www.gnu.org/licenses/agpl-3.0.en.html">AGPLv3</a>.
|
||||
{% trans "Copyright © 2025 JDAV Sektion " %} {% settings_value 'SEKTION' %}
|
||||
{% trans "for the content of this website." %}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
{% trans "External assets used on this website:" %}
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
{% trans "Background image" %}:
|
||||
<a href="https://commons.wikimedia.org/wiki/File:Alps_Panorama_(4954145205).jpg">Reza</a>, <a href="https://creativecommons.org/licenses/by/2.0">CC BY 2.0</a>, via Wikimedia Commons
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
- `climber.png`:
|
||||
Paul Sherman (https://commons.wikimedia.org/wiki/File:Rock_climbing_vector.svg),
|
||||
Public Domain, via Wikimedia Commons
|
||||
|
Before Width: | Height: | Size: 48 KiB |
@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48"><defs><style>.c{fill:#9cc;}.d{fill:#2d5955;}.e{stroke:#2d5955;stroke-width:3.2px;}.e,.f{fill:none;stroke-miterlimit:10;}.g{fill:#666;mix-blend-mode:multiply;}.f{stroke:#666;stroke-width:3.3px;}.h{opacity:.36;}.i{isolation:isolate;}.j{fill:#fff;opacity:.24;}</style></defs><g class="i"><g id="a"><circle class="f" cx="24.31" cy="24.31" r="21.69"/></g><g id="b"><circle class="e" cx="23.69" cy="23.69" r="21.69"/><polygon class="g" points="21.2 22.96 15.21 43.89 27.68 25.98 33.66 5.05 21.2 22.96"/><polygon class="c" points="14.34 43.15 26.8 25.24 20.32 22.23 14.34 43.15"/><polygon class="d" points="32.79 4.32 20.32 22.23 26.8 25.24 32.79 4.32"/><polyline class="h" points="14.34 43.15 26.8 25.24 32.79 4.32"/><circle class="j" cx="23.61" cy="23.64" r="1.55"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 873 B |
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.27;fill:url(#SVGID_1_);}
|
||||
.st1{fill:none;stroke:#999999;stroke-width:3.3;stroke-miterlimit:10;}
|
||||
.st2{fill:none;stroke:#508480;stroke-width:3.2;stroke-miterlimit:10;}
|
||||
.st3{fill:none;stroke:url(#SVGID_00000121983970493329986990000017723393330248815746_);stroke-width:3.2;stroke-miterlimit:10;}
|
||||
.st4{fill:#999999;}
|
||||
.st5{fill:#BADDD9;}
|
||||
.st6{fill:#508480;}
|
||||
.st7{opacity:0.36;}
|
||||
.st8{opacity:0.24;fill:#FFFFFF;}
|
||||
</style>
|
||||
<g id="Logo_x5F_Schatten">
|
||||
<radialGradient id="SVGID_1_" cx="20.8612" cy="20.647" r="22.9444" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" style="stop-color:#FFFFFF"/>
|
||||
<stop offset="1" style="stop-color:#000000"/>
|
||||
</radialGradient>
|
||||
<circle class="st0" cx="23.6" cy="23.6" r="22.9"/>
|
||||
<circle class="st1" cx="24.3" cy="24.3" r="21.7"/>
|
||||
</g>
|
||||
<g id="LogooVordergrund">
|
||||
<circle class="st2" cx="23.7" cy="23.7" r="21.7"/>
|
||||
|
||||
<linearGradient id="SVGID_00000165954078947660943750000008230134672540192957_" gradientUnits="userSpaceOnUse" x1="3.5175" y1="12.0447" x2="43.8685" y2="35.3413">
|
||||
<stop offset="0" style="stop-color:#BADDD9;stop-opacity:0.1"/>
|
||||
<stop offset="1" style="stop-color:#508480"/>
|
||||
</linearGradient>
|
||||
|
||||
<circle style="fill:none;stroke:url(#SVGID_00000165954078947660943750000008230134672540192957_);stroke-width:3.2;stroke-miterlimit:10;" cx="23.7" cy="23.7" r="21.7"/>
|
||||
<polygon class="st4" points="21.2,23 15.2,43.9 27.7,26 33.7,5 "/>
|
||||
<polygon class="st5" points="14.3,43.2 26.8,25.2 20.3,22.2 "/>
|
||||
<polygon class="st6" points="32.8,4.3 20.3,22.2 26.8,25.2 "/>
|
||||
<polyline class="st7" points="14.3,43.2 26.8,25.2 32.8,4.3 "/>
|
||||
<circle class="st8" cx="23.6" cy="23.6" r="1.5"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 251 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="56.216759mm"
|
||||
height="56.216759mm"
|
||||
viewBox="0 0 56.216757 56.216759"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
sodipodi:docname="favicon.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.149246"
|
||||
inkscape:cx="-9.305589"
|
||||
inkscape:cy="38.618194"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1131"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs2">
|
||||
<rect
|
||||
x="182.14978"
|
||||
y="169.88068"
|
||||
width="232.517"
|
||||
height="79.842117"
|
||||
id="rect1516" />
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-29.946331,-23.342808)">
|
||||
<circle
|
||||
style="fill:#57ab27;fill-opacity:1;stroke-width:1.48706;paint-order:markers fill stroke"
|
||||
id="path1730-6-1"
|
||||
cx="58.05471"
|
||||
cy="51.451187"
|
||||
r="28.108379" />
|
||||
<path
|
||||
id="path3966-9-1"
|
||||
style="fill:#ffffff;stroke-width:1.25619;paint-order:markers fill stroke"
|
||||
inkscape:transform-center-x="-3.782124"
|
||||
inkscape:transform-center-y="-4.3700306"
|
||||
d="m 80.920792,53.466318 c -0.470466,3.311904 -13.350103,2.12902 -13.587434,2.635683 -0.679604,1.45084 3.938362,4.608269 6.042483,9.523902 1.290814,3.015588 -7.047323,-4.101451 -9.96792,-2.601752 -2.920596,1.499698 1.923956,15.743775 -1.35023,16.024675 -3.274187,0.2809 -5.545456,-15.647445 -6.494518,-16.033885 0,0 -14.24792,4.094643 -12.199826,1.483245 2.677707,-3.414185 9.25763,-4.828116 7.202174,-7.479738 -1.999671,-2.579656 -17.963879,8.442198 -19.103134,5.432682 -1.139256,-3.009516 14.035148,-8.666125 13.827521,-10.163424 -0.228782,-1.649843 -14.98569,-4.161215 -14.129021,-7.377038 0.856668,-3.215822 16.386111,0.75886 17.148239,-0.297092 0.816496,-1.131285 -6.937786,-9.696012 -4.409117,-11.776169 2.528672,-2.080158 9.745361,8.500431 10.087158,5.182534 0.123275,-1.196669 -2.960867,-14.105709 0.371765,-14.334482 3.332631,-0.228774 7.580901,13.354936 8.041922,13.749376 0.699867,0.598794 5.430215,-12.068543 8.236543,-10.279927 2.806326,1.788615 -4.56826,14.76871 -4.56889,14.956184 -8.48e-4,0.253286 17.004343,-6.237848 18.142636,-3.187729 1.13829,3.050119 -13.372314,8.616356 -13.110355,9.467028 0.306445,1.091863 10.29047,1.764021 9.820004,5.075927 z"
|
||||
sodipodi:nodetypes="ssssssssssssssssssscs" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#57ab27;fill-opacity:1;stroke-width:0.551392;paint-order:markers fill stroke"
|
||||
id="path6994"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="8"
|
||||
sodipodi:cx="55.687187"
|
||||
sodipodi:cy="56.318855"
|
||||
sodipodi:r1="10.57478"
|
||||
sodipodi:r2="5.2873902"
|
||||
sodipodi:arg1="0.47788294"
|
||||
sodipodi:arg2="0.87058202"
|
||||
inkscape:rounded="0.5"
|
||||
inkscape:randomized="0.129"
|
||||
d="m 65.047164,60.016711 c -1.043329,2.898852 -4.58494,-0.903394 -7.278213,0.616665 -2.693273,1.520059 3.29224,6.067166 0.367555,6.407593 -2.924685,0.340427 0.630911,-6.090507 -2.288698,-6.186604 -2.919608,-0.0961 -2.860116,5.86842 -5.572988,4.998628 -2.712872,-0.869792 3.356668,-2.945529 1.635993,-5.647407 -1.720675,-2.701878 -5.056026,0.874989 -6.446919,-1.853343 -1.390894,-2.728333 5.701768,1.667645 5.601562,-1.509319 -0.100206,-3.176963 -5.011127,-1.483341 -3.626569,-4.163713 1.384558,-2.680371 2.490677,3.259555 4.40284,0.852349 1.912162,-2.407207 -3.184342,-6.105625 -0.367555,-6.407593 2.816787,-0.301968 1.987545,4.704949 5.164071,4.71759 3.176526,0.01264 0.335826,-7.989334 2.697614,-6.257907 2.361789,1.731427 -0.301995,4.45675 1.239381,6.906686 1.541377,2.449936 5.616663,-1.066225 6.44692,1.853343 0.830256,2.919568 -5.402008,-1.40305 -5.601563,1.509319 -0.199555,2.912368 4.669898,1.264861 3.626569,4.163713 z"
|
||||
inkscape:transform-center-x="0.14670795"
|
||||
inkscape:transform-center-y="-0.080514039"
|
||||
transform="matrix(1.0087409,0,0,1.0087409,2.0271192,-6.9908862)" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.551392;paint-order:markers fill stroke"
|
||||
id="path6994-80"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="8"
|
||||
sodipodi:cx="55.687187"
|
||||
sodipodi:cy="56.318855"
|
||||
sodipodi:r1="10.57478"
|
||||
sodipodi:r2="5.2873902"
|
||||
sodipodi:arg1="0.47788294"
|
||||
sodipodi:arg2="0.87058202"
|
||||
inkscape:rounded="0.5"
|
||||
inkscape:randomized="0.129"
|
||||
d="m 65.047164,60.016711 c -1.043329,2.898852 -4.58494,-0.903394 -7.278213,0.616665 -2.693273,1.520059 3.29224,6.067166 0.367555,6.407593 -2.924685,0.340427 0.630911,-6.090507 -2.288698,-6.186604 -2.919608,-0.0961 -2.860116,5.86842 -5.572988,4.998628 -2.712872,-0.869792 3.356668,-2.945529 1.635993,-5.647407 -1.720675,-2.701878 -5.056026,0.874989 -6.446919,-1.853343 -1.390894,-2.728333 5.701768,1.667645 5.601562,-1.509319 -0.100206,-3.176963 -5.011127,-1.483341 -3.626569,-4.163713 1.384558,-2.680371 2.490677,3.259555 4.40284,0.852349 1.912162,-2.407207 -3.184342,-6.105625 -0.367555,-6.407593 2.816787,-0.301968 1.987545,4.704949 5.164071,4.71759 3.176526,0.01264 0.335826,-7.989334 2.697614,-6.257907 2.361789,1.731427 -0.301995,4.45675 1.239381,6.906686 1.541377,2.449936 5.616663,-1.066225 6.44692,1.853343 0.830256,2.919568 -5.402008,-1.40305 -5.601563,1.509319 -0.199555,2.912368 4.669898,1.264861 3.626569,4.163713 z"
|
||||
inkscape:transform-center-x="-0.94540916"
|
||||
inkscape:transform-center-y="0.54557406"
|
||||
transform="matrix(-0.2826781,-0.253817,0.253817,-0.2826781,60.377101,79.593343)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 894 B |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 284 B |
@ -0,0 +1,4 @@
|
||||
The files in this folder are adapted from the Django JET project
|
||||
(formerly at https://github.com/geex-arts/django-jet, now at https://github.com/assem-ch/django-jet-reboot).
|
||||
|
||||
Django JET is released under AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.en.html).
|
||||
@ -0,0 +1,4 @@
|
||||
The fonts in this directory are licensed under the Open Font License (https://openfontlicense.org/).
|
||||
|
||||
- Roboto font: https://fonts.google.com/specimen/Roboto
|
||||
- Oswald font: https://fonts.google.com/specimen/Oswald
|
||||
@ -0,0 +1,3 @@
|
||||
- `background.jpeg`:
|
||||
Reza (https://commons.wikimedia.org/wiki/File:Alps_Panorama_(4954145205).jpg),
|
||||
CC BY 2.0 <https://creativecommons.org/licenses/by/2.0>, via Wikimedia Commons
|
||||
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 348 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="56.216759mm"
|
||||
height="56.216759mm"
|
||||
viewBox="0 0 56.216757 56.216759"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
sodipodi:docname="favicon.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.149246"
|
||||
inkscape:cx="-9.305589"
|
||||
inkscape:cy="38.618194"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1131"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs2">
|
||||
<rect
|
||||
x="182.14978"
|
||||
y="169.88068"
|
||||
width="232.517"
|
||||
height="79.842117"
|
||||
id="rect1516" />
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-29.946331,-23.342808)">
|
||||
<circle
|
||||
style="fill:#57ab27;fill-opacity:1;stroke-width:1.48706;paint-order:markers fill stroke"
|
||||
id="path1730-6-1"
|
||||
cx="58.05471"
|
||||
cy="51.451187"
|
||||
r="28.108379" />
|
||||
<path
|
||||
id="path3966-9-1"
|
||||
style="fill:#ffffff;stroke-width:1.25619;paint-order:markers fill stroke"
|
||||
inkscape:transform-center-x="-3.782124"
|
||||
inkscape:transform-center-y="-4.3700306"
|
||||
d="m 80.920792,53.466318 c -0.470466,3.311904 -13.350103,2.12902 -13.587434,2.635683 -0.679604,1.45084 3.938362,4.608269 6.042483,9.523902 1.290814,3.015588 -7.047323,-4.101451 -9.96792,-2.601752 -2.920596,1.499698 1.923956,15.743775 -1.35023,16.024675 -3.274187,0.2809 -5.545456,-15.647445 -6.494518,-16.033885 0,0 -14.24792,4.094643 -12.199826,1.483245 2.677707,-3.414185 9.25763,-4.828116 7.202174,-7.479738 -1.999671,-2.579656 -17.963879,8.442198 -19.103134,5.432682 -1.139256,-3.009516 14.035148,-8.666125 13.827521,-10.163424 -0.228782,-1.649843 -14.98569,-4.161215 -14.129021,-7.377038 0.856668,-3.215822 16.386111,0.75886 17.148239,-0.297092 0.816496,-1.131285 -6.937786,-9.696012 -4.409117,-11.776169 2.528672,-2.080158 9.745361,8.500431 10.087158,5.182534 0.123275,-1.196669 -2.960867,-14.105709 0.371765,-14.334482 3.332631,-0.228774 7.580901,13.354936 8.041922,13.749376 0.699867,0.598794 5.430215,-12.068543 8.236543,-10.279927 2.806326,1.788615 -4.56826,14.76871 -4.56889,14.956184 -8.48e-4,0.253286 17.004343,-6.237848 18.142636,-3.187729 1.13829,3.050119 -13.372314,8.616356 -13.110355,9.467028 0.306445,1.091863 10.29047,1.764021 9.820004,5.075927 z"
|
||||
sodipodi:nodetypes="ssssssssssssssssssscs" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#57ab27;fill-opacity:1;stroke-width:0.551392;paint-order:markers fill stroke"
|
||||
id="path6994"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="8"
|
||||
sodipodi:cx="55.687187"
|
||||
sodipodi:cy="56.318855"
|
||||
sodipodi:r1="10.57478"
|
||||
sodipodi:r2="5.2873902"
|
||||
sodipodi:arg1="0.47788294"
|
||||
sodipodi:arg2="0.87058202"
|
||||
inkscape:rounded="0.5"
|
||||
inkscape:randomized="0.129"
|
||||
d="m 65.047164,60.016711 c -1.043329,2.898852 -4.58494,-0.903394 -7.278213,0.616665 -2.693273,1.520059 3.29224,6.067166 0.367555,6.407593 -2.924685,0.340427 0.630911,-6.090507 -2.288698,-6.186604 -2.919608,-0.0961 -2.860116,5.86842 -5.572988,4.998628 -2.712872,-0.869792 3.356668,-2.945529 1.635993,-5.647407 -1.720675,-2.701878 -5.056026,0.874989 -6.446919,-1.853343 -1.390894,-2.728333 5.701768,1.667645 5.601562,-1.509319 -0.100206,-3.176963 -5.011127,-1.483341 -3.626569,-4.163713 1.384558,-2.680371 2.490677,3.259555 4.40284,0.852349 1.912162,-2.407207 -3.184342,-6.105625 -0.367555,-6.407593 2.816787,-0.301968 1.987545,4.704949 5.164071,4.71759 3.176526,0.01264 0.335826,-7.989334 2.697614,-6.257907 2.361789,1.731427 -0.301995,4.45675 1.239381,6.906686 1.541377,2.449936 5.616663,-1.066225 6.44692,1.853343 0.830256,2.919568 -5.402008,-1.40305 -5.601563,1.509319 -0.199555,2.912368 4.669898,1.264861 3.626569,4.163713 z"
|
||||
inkscape:transform-center-x="0.14670795"
|
||||
inkscape:transform-center-y="-0.080514039"
|
||||
transform="matrix(1.0087409,0,0,1.0087409,2.0271192,-6.9908862)" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.551392;paint-order:markers fill stroke"
|
||||
id="path6994-80"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="8"
|
||||
sodipodi:cx="55.687187"
|
||||
sodipodi:cy="56.318855"
|
||||
sodipodi:r1="10.57478"
|
||||
sodipodi:r2="5.2873902"
|
||||
sodipodi:arg1="0.47788294"
|
||||
sodipodi:arg2="0.87058202"
|
||||
inkscape:rounded="0.5"
|
||||
inkscape:randomized="0.129"
|
||||
d="m 65.047164,60.016711 c -1.043329,2.898852 -4.58494,-0.903394 -7.278213,0.616665 -2.693273,1.520059 3.29224,6.067166 0.367555,6.407593 -2.924685,0.340427 0.630911,-6.090507 -2.288698,-6.186604 -2.919608,-0.0961 -2.860116,5.86842 -5.572988,4.998628 -2.712872,-0.869792 3.356668,-2.945529 1.635993,-5.647407 -1.720675,-2.701878 -5.056026,0.874989 -6.446919,-1.853343 -1.390894,-2.728333 5.701768,1.667645 5.601562,-1.509319 -0.100206,-3.176963 -5.011127,-1.483341 -3.626569,-4.163713 1.384558,-2.680371 2.490677,3.259555 4.40284,0.852349 1.912162,-2.407207 -3.184342,-6.105625 -0.367555,-6.407593 2.816787,-0.301968 1.987545,4.704949 5.164071,4.71759 3.176526,0.01264 0.335826,-7.989334 2.697614,-6.257907 2.361789,1.731427 -0.301995,4.45675 1.239381,6.906686 1.541377,2.449936 5.616663,-1.066225 6.44692,1.853343 0.830256,2.919568 -5.402008,-1.40305 -5.601563,1.509319 -0.199555,2.912368 4.669898,1.264861 3.626569,4.163713 z"
|
||||
inkscape:transform-center-x="-0.94540916"
|
||||
inkscape:transform-center-y="0.54557406"
|
||||
transform="matrix(-0.2826781,-0.253817,0.253817,-0.2826781,60.377101,79.593343)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="33.394791mm"
|
||||
height="38.402649mm"
|
||||
viewBox="0 0 33.39479 38.402649"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
sodipodi:docname="placeholder.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#">
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="mm"
|
||||
showgrid="false"
|
||||
showguides="true"
|
||||
inkscape:zoom="4.8176525"
|
||||
inkscape:cx="53.449268"
|
||||
inkscape:cy="87.179389"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1131"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1">
|
||||
<sodipodi:guide
|
||||
position="61.505519,-44.730047"
|
||||
orientation="0,-1"
|
||||
id="guide6240"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="121.55171,-27.740338"
|
||||
orientation="1,0"
|
||||
id="guide6242"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="-16.760398,-6.5643082"
|
||||
orientation="0,-1"
|
||||
id="guide6244"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="50.270998,-1.4630882"
|
||||
orientation="1,0"
|
||||
id="guide6246"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<defs
|
||||
id="defs2" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-16.876211,-15.478853)">
|
||||
<path
|
||||
id="rect5358"
|
||||
style="fill:#cdcdcd;fill-opacity:1;fill-rule:nonzero;stroke-width:0.262325;paint-order:markers fill stroke"
|
||||
d="m 28.798227,38.417392 10.670704,-0.05716 c 5.784556,-0.03099 10.802072,5.45565 10.802071,8.875741 l -1e-6,2.278154 v 4.367374 l -28.549274,2e-6 -4.845516,-2e-6 v -6.31172 c 0,-5.567546 7.738888,-9.129984 11.922018,-9.152391 z"
|
||||
sodipodi:nodetypes="sssccccsss" />
|
||||
<circle
|
||||
style="fill:#cdcdcd;fill-opacity:1;fill-rule:nonzero;stroke-width:0.718272;paint-order:markers fill stroke"
|
||||
id="path11605"
|
||||
cx="33.573605"
|
||||
cy="26.010752"
|
||||
r="8.5013752" />
|
||||
</g>
|
||||
<metadata
|
||||
id="metadata12706">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by/4.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by/4.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://creativecommons.org/ns#Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |