parent
c1349fd5ae
commit
f664c1ee32
|
|
@ -4,4 +4,5 @@
|
|||
15.06.2022 - 1h 30 mins
|
||||
23.06.2022 - 1h 30 mins
|
||||
07.07.2022 - 2h 30 mins
|
||||
15.07.2022 - 3h
|
||||
15.07.2022 - 3h
|
||||
24.07.2022 - 3h 30 mins
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
Copyright (c) 2016, FEINHEIT AG and individual contributors.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of FEINHEIT GmbH nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
VERSION = (0, 15, 0)
|
||||
__version__ = ".".join(map(str, VERSION))
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
import inspect
|
||||
import json
|
||||
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from django.contrib.admin.helpers import InlineAdminFormSet
|
||||
from django.contrib.admin.options import BaseModelAdmin, InlineModelAdmin
|
||||
from django.core import checks
|
||||
from js_asset import JS
|
||||
|
||||
|
||||
__all__ = ("OrderableAdmin",)
|
||||
|
||||
|
||||
class OrderableAdmin(BaseModelAdmin):
|
||||
ordering_field = "ordering"
|
||||
ordering_field_hide_input = False
|
||||
extra = 0
|
||||
|
||||
@property
|
||||
def media(self):
|
||||
if not isinstance(self, InlineModelAdmin):
|
||||
# Editable change list
|
||||
context = {
|
||||
"field": self.ordering_field,
|
||||
"fieldHideInput": self.ordering_field_hide_input,
|
||||
}
|
||||
else:
|
||||
# Find our helper.InlineAdminFormSet so that we may access
|
||||
# the formset instance and its prefix
|
||||
frame = inspect.currentframe()
|
||||
while frame: # pragma: no branch
|
||||
helper = frame.f_locals.get("self")
|
||||
if isinstance(helper, InlineAdminFormSet):
|
||||
break
|
||||
frame = frame.f_back
|
||||
del frame
|
||||
|
||||
context = {
|
||||
"field": self.ordering_field,
|
||||
"fieldHideInput": self.ordering_field_hide_input,
|
||||
"prefix": helper.formset.prefix,
|
||||
"stacked": isinstance(self, admin.StackedInline),
|
||||
"tabular": isinstance(self, admin.TabularInline),
|
||||
}
|
||||
|
||||
return super().media + forms.Media(
|
||||
css={
|
||||
"all": [
|
||||
"admin_ordering/jquery-ui.min.css",
|
||||
"admin_ordering/admin_ordering.css",
|
||||
]
|
||||
},
|
||||
js=[
|
||||
"admin/js/jquery.init.js",
|
||||
"admin_ordering/jquery-ui.min.js",
|
||||
JS(
|
||||
"admin_ordering/admin_ordering.js",
|
||||
{
|
||||
"class": "admin-ordering-context",
|
||||
"data-context": json.dumps(context),
|
||||
},
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
def check(self, **kwargs):
|
||||
errors = super().check(**kwargs)
|
||||
if "admin_ordering" not in settings.INSTALLED_APPS:
|
||||
errors.append(
|
||||
checks.Error(
|
||||
'"admin_ordering" must be in INSTALLED_APPS.',
|
||||
obj=self.__class__,
|
||||
id="admin_ordering.E001",
|
||||
)
|
||||
)
|
||||
return errors
|
||||
Binary file not shown.
|
|
@ -0,0 +1,23 @@
|
|||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-10-04 20:17+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: models.py:7
|
||||
msgid "ordering"
|
||||
msgstr "Sortierung"
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
from functools import total_ordering
|
||||
|
||||
from django.core import checks
|
||||
from django.db import models
|
||||
from django.db.models import Min
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
|
||||
@total_ordering
|
||||
class OrderableModel(models.Model):
|
||||
ordering = models.IntegerField("Kolejność", default=0)
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
ordering = ["ordering"]
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.ordering:
|
||||
min = self.__class__._default_manager.aggregate(m=Min("ordering"))[
|
||||
"m"]
|
||||
self.ordering = (min or 0) - 10
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
save.alters_data = True
|
||||
|
||||
def __lt__(self, other):
|
||||
return (
|
||||
self.ordering > other.ordering if isinstance(
|
||||
other, type(self)) else False
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def check(cls, **kwargs):
|
||||
errors = super().check(**kwargs)
|
||||
if not cls._meta.ordering:
|
||||
errors.append(
|
||||
checks.Error(
|
||||
'The ordering of "%s" is undefined.' % cls._meta.label,
|
||||
obj=cls,
|
||||
id="admin_ordering.E002",
|
||||
hint="Make the inner Meta class inherit OrderableModel.Meta.",
|
||||
)
|
||||
)
|
||||
return errors
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="50px" height="50px" viewBox="0 0 50 50" enable-background="new 0 0 50 50" xml:space="preserve">
|
||||
<rect y="10.723" fill="#CCCCCC" width="50" height="7.166"/>
|
||||
<rect y="21.443" fill="#CCCCCC" width="50" height="7.168"/>
|
||||
<rect y="32.166" fill="#CCCCCC" width="50" height="7.168"/>
|
||||
<polygon fill="#CCCCCC" points="32.111,7.111 17.888,7.111 25,0 "/>
|
||||
<polygon fill="#CCCCCC" points="17.888,42.889 32.111,42.889 25,50 "/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 607 B |
|
|
@ -0,0 +1,86 @@
|
|||
.ui-sortable-handle {
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.ui-sortable-helper {
|
||||
opacity: 0.8;
|
||||
border-top: 1px dashed #cccccc;
|
||||
border-bottom: 1px dashed #cccccc;
|
||||
}
|
||||
|
||||
.ui-sortable-helper > td,
|
||||
.ui-sortable-helper > th {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.inline-related.tabular .ui-sortable > tr {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.inline-related.tabular .ui-sortable-placeholder > td {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.admin-ordering-field {
|
||||
cursor: row-resize;
|
||||
}
|
||||
|
||||
.admin-ordering-field .admin-ordering-field-input-wrapper {
|
||||
display: table-cell;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.admin-ordering-field .admin-ordering-field-input-wrapper::before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
background-size: 14px 14px;
|
||||
background-image: url("admin_ordering-icon.svg");
|
||||
background-repeat: no-repeat;
|
||||
background-position: center center;
|
||||
vertical-align: middle;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.admin-ordering-field .admin-ordering-field-input-wrapper input {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.admin-ordering-field.admin-ordering-field-hide-input
|
||||
.admin-ordering-field-input-wrapper::before {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.admin-ordering-field.admin-ordering-field-hide-input
|
||||
.admin-ordering-field-input-wrapper
|
||||
input {
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.inline-related .admin-ordering-field {
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
.inline-related.has_original .admin-ordering-field,
|
||||
.inline-related .has_original .admin-ordering-field {
|
||||
cursor: row-resize;
|
||||
}
|
||||
|
||||
.inline-related
|
||||
.admin-ordering-field
|
||||
.admin-ordering-field-input-wrapper::before {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.inline-related.has_original
|
||||
.admin-ordering-field
|
||||
.admin-ordering-field-input-wrapper::before,
|
||||
.inline-related
|
||||
.has_original
|
||||
.admin-ordering-field
|
||||
.admin-ordering-field-input-wrapper::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
/* global django */
|
||||
django.jQuery(function ($) {
|
||||
function updatePlaceholderHeight(ui) {
|
||||
// set placeholder height equal to item height
|
||||
ui.placeholder.height(ui.item.outerHeight())
|
||||
}
|
||||
|
||||
function hideHorizontalOverflow() {
|
||||
// hide body horizontal overflow while dragging row
|
||||
$("body").css("overflow-x", "hidden")
|
||||
}
|
||||
|
||||
function autoHorizontalOverflow() {
|
||||
// reset body horizontal overflow
|
||||
$("body").css("overflow-x", "auto")
|
||||
}
|
||||
|
||||
function enforceSortableRowsCellsSize(node) {
|
||||
// enforce row cells size while sorting rows
|
||||
node.find(">tr").each(function () {
|
||||
$(this)
|
||||
.mousedown(function () {
|
||||
$(this)
|
||||
.find("td, th")
|
||||
.each(function () {
|
||||
$(this).css("width", $(this).width())
|
||||
})
|
||||
})
|
||||
.mouseup(function () {
|
||||
$(this)
|
||||
.find("td, th")
|
||||
.each(function () {
|
||||
$(this).css("width", "auto")
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
$(".admin-ordering-context:not(.activated)")
|
||||
.addClass("activated")
|
||||
.each(function () {
|
||||
var $sortable,
|
||||
$sortableHandle,
|
||||
$sortableInputWrapper =
|
||||
'<span class="admin-ordering-field-input-wrapper"></span>'
|
||||
|
||||
var data = JSON.parse(this.getAttribute("data-context"))
|
||||
var inputFieldSelector = 'input[name$="-' + data.field + '"]'
|
||||
|
||||
function updateOrdering(nodes) {
|
||||
var incOrdering = 10
|
||||
var maxOrdering = nodes.length * incOrdering
|
||||
nodes.each(function (index) {
|
||||
var row = $(this)
|
||||
var rowOrdering = data.fieldDesc
|
||||
? maxOrdering - incOrdering * index
|
||||
: incOrdering * (index + 1)
|
||||
row.find(inputFieldSelector).val(rowOrdering)
|
||||
row.removeClass("row1 row2").addClass(index % 2 ? "row2" : "row1")
|
||||
})
|
||||
}
|
||||
|
||||
if (data.field.indexOf("-") == 0) {
|
||||
data.field = data.field.substring(1)
|
||||
data.fieldDesc = true
|
||||
} else {
|
||||
data.fieldDesc = false
|
||||
}
|
||||
|
||||
if (data.tabular) {
|
||||
$sortable = $("#" + data.prefix + "-group tbody")
|
||||
$sortableHandle = $sortable.find(".field-" + data.field)
|
||||
$sortableHandle.addClass("admin-ordering-field")
|
||||
if (data.fieldHideInput) {
|
||||
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
||||
}
|
||||
$sortableHandle
|
||||
.find(inputFieldSelector + ':not([type="hidden"])')
|
||||
.wrap($sortableInputWrapper)
|
||||
$sortable.sortable({
|
||||
items: ">.has_original",
|
||||
handle: $sortableHandle,
|
||||
start: function (_event, ui) {
|
||||
hideHorizontalOverflow()
|
||||
updatePlaceholderHeight(ui)
|
||||
// fix ui item height
|
||||
ui.item.css("height", ui.item.outerHeight())
|
||||
},
|
||||
update: function (_event, _ui) {
|
||||
updateOrdering($(".dynamic-" + data.prefix))
|
||||
},
|
||||
stop: function (_event, ui) {
|
||||
autoHorizontalOverflow()
|
||||
// reset ui item height
|
||||
ui.item.css("height", "auto")
|
||||
},
|
||||
})
|
||||
|
||||
enforceSortableRowsCellsSize($sortable)
|
||||
} else if (data.stacked) {
|
||||
$sortable = $("#" + data.prefix + "-group")
|
||||
$sortableHandle = $sortable.find(".field-" + data.field)
|
||||
$sortableHandle.addClass("admin-ordering-field")
|
||||
if (data.fieldHideInput) {
|
||||
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
||||
}
|
||||
$sortableHandle
|
||||
.find(inputFieldSelector + ':not([type="hidden"])')
|
||||
.wrap($sortableInputWrapper)
|
||||
$sortable.sortable({
|
||||
items: ">.has_original,>>.has_original",
|
||||
handle: $sortableHandle,
|
||||
start: function (_event, ui) {
|
||||
hideHorizontalOverflow()
|
||||
updatePlaceholderHeight(ui)
|
||||
},
|
||||
update: function (_event, _ui) {
|
||||
updateOrdering($(".dynamic-" + data.prefix))
|
||||
},
|
||||
stop: function (_event, _ui) {
|
||||
autoHorizontalOverflow()
|
||||
},
|
||||
})
|
||||
} else {
|
||||
$sortable = $("#result_list tbody")
|
||||
$sortableHandle = $sortable.find(".field-" + data.field)
|
||||
$sortableHandle.addClass("admin-ordering-field")
|
||||
if (data.fieldHideInput) {
|
||||
$sortableHandle.addClass("admin-ordering-field-hide-input")
|
||||
}
|
||||
if (!$sortableHandle.find("input").length) {
|
||||
return
|
||||
}
|
||||
$sortableHandle
|
||||
.find(inputFieldSelector + ':not([type="hidden"])')
|
||||
.wrap($sortableInputWrapper)
|
||||
$sortable.sortable({
|
||||
handle: $sortableHandle,
|
||||
start: function (_event, ui) {
|
||||
hideHorizontalOverflow()
|
||||
updatePlaceholderHeight(ui)
|
||||
},
|
||||
update: function (_event, _ui) {
|
||||
updateOrdering($sortable.find("tr"))
|
||||
},
|
||||
stop: function (_event, _ui) {
|
||||
autoHorizontalOverflow()
|
||||
},
|
||||
})
|
||||
|
||||
enforceSortableRowsCellsSize($sortable)
|
||||
}
|
||||
|
||||
if (data.tabular || data.stacked) {
|
||||
// Yay, Django 1.9 or better!
|
||||
$(document).on("formset:added", function newForm(event, $row) {
|
||||
if (event.detail && event.detail.formsetName) {
|
||||
// Django 4.1 or better!
|
||||
if ($(event.target).hasClass("dynamic-" + data.prefix)) {
|
||||
updateOrdering($(".dynamic-" + data.prefix))
|
||||
}
|
||||
} else {
|
||||
if ($row.hasClass("dynamic-" + data.prefix)) {
|
||||
updateOrdering($(".dynamic-" + data.prefix))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
/*! jQuery UI - v1.12.1 - 2021-08-12
|
||||
* http://jqueryui.com
|
||||
* Includes: sortable.css
|
||||
* Copyright jQuery Foundation and other contributors; Licensed MIT */
|
||||
|
||||
.ui-sortable-handle{-ms-touch-action:none;touch-action:none}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,80 +1,80 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% extends 'base.html' %}
|
||||
<!---->
|
||||
{% block title %}Zarząd | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<h1 class="text-4xl">Zarząd PodlZBS</h1>
|
||||
|
||||
{% if czlonkowie %}
|
||||
<div
|
||||
class="grid lg:grid-cols-2 gap-4 text-center items-center place-items-center prose-h1:font-light prose-h3:text-xs prose-h2:text-md prose-h2:my-0 prose-h1:mb-0"
|
||||
>
|
||||
{% for member in czlonkowie %}
|
||||
<div class="prose">
|
||||
<h1>{{ member.function }}</h1>
|
||||
<h2>{{ member.name }}</h2>
|
||||
<h3>{{ member.contact }}</h3>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<span class="py-4 text-xl">Brak członków</span>
|
||||
{% endif %}
|
||||
|
||||
<div class="prose prose-h2:font-light">
|
||||
<div
|
||||
class="flex flex-col lg:flex-row flex-wrap items-center justify-around gap-6 bg-white shadow-md rounded-md p-4 mb-2"
|
||||
>
|
||||
<h1 class="text-[2.25rem] font-extrabold">Zarząd PodlZBS</h1>
|
||||
<nav>
|
||||
<ul class="flex flex-wrap justify-center lg:items-end gap-3">
|
||||
<li
|
||||
class="adm_nav-item {% if '/zarzad' == request.path %}adm_active{% endif %}"
|
||||
>
|
||||
<a href="{% url 'administration' %}">Zarząd</a>
|
||||
</li>
|
||||
<li
|
||||
class="adm_nav-item {% if 'ogloszenia' in request.path %}adm_active{% endif %}"
|
||||
>
|
||||
<a href="{% url 'administration_announcements' %}">Ogłoszenia</a>
|
||||
</li>
|
||||
<li
|
||||
class="adm_nav-item {% if 'protokolyiuchwaly' in request.path %}adm_active{% endif %}"
|
||||
>
|
||||
<a href="{% url 'administration_protocols' %}">Protokoły i Uchwały</a>
|
||||
</li>
|
||||
<li
|
||||
class="adm_nav-item {% if 'regulaminy' in request.path %}adm_active{% endif %}"
|
||||
>
|
||||
<a href="{% url 'administration_regulations' %}">Regulaminy</a>
|
||||
</li>
|
||||
<li
|
||||
class="adm_nav-item {% if 'rodo' in request.path %}adm_active{% endif %}"
|
||||
>
|
||||
<a href="{% url 'administration_rodos' %}">RODO</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<div
|
||||
class="mx-auto p-4 prose prose-h2:font-normal prose-h2:text-2xl prose-h2:text-center prose-h4:font-normal prose-h4:text-xl prose-h4:text-center"
|
||||
>
|
||||
{% block adm_content %}
|
||||
<h2 class="prose prose-h2:font-light">
|
||||
<a href="{{ statut.attachment.url }}" target="_blank">
|
||||
<h2 class="my-0 text-center">{{ statut.title }}</h2>
|
||||
<span class="my-0 text-center">{{ statut.title }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</h2>
|
||||
|
||||
<div class="flex flex-col items-center text-xl font-semibold">
|
||||
<h2 class="mb-2">Dane adresowe</h2>
|
||||
<h3
|
||||
class="flex flex-col items-center text-xl font-medium px-4 py-3 bg-blue-50 border border-blue-100 rounded-md shadow-md mb-8"
|
||||
>
|
||||
<span>Adres Podlaskiego ZBS - 15-057 Białystok</span>
|
||||
<span>ul. B. Chrobrego 5B m.33</span>
|
||||
<span>Konto: PKO SA O/B-tok 43 1240 5211 1111 0000 4919 1721</span>
|
||||
<span>NIP: 542 258 14 53 REGON 050816091</span>
|
||||
</h3>
|
||||
|
||||
<h2 class="mb-2">Członkowie</h2>
|
||||
{% if czlonkowie %}
|
||||
<div class="flex flex-col gap-4 text-center items-center place-items-center">
|
||||
{% for member in czlonkowie %}
|
||||
<h3
|
||||
class="w-screen max-w-screen-lg flex flex-col lg:flex-row-reverse justify-between items-center px-4 py-3 bg-blue-50 border border-blue-100 rounded-md shadow-md my-0"
|
||||
>
|
||||
<span class="text-2xl font-light mb-0">{{ member.function }}</span>
|
||||
<div class="text-left">
|
||||
<span class="text-3xl my-0">{{ member.name }}</span>
|
||||
<br />
|
||||
<span class="text-xs italic">{{ member.contact }}</span>
|
||||
</div>
|
||||
</h3>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<h1 class="text-3xl">Ogłoszenia</h1>
|
||||
{% for file in ogloszenia %}
|
||||
<article>
|
||||
<a
|
||||
href="{{ file.attachment.url }}"
|
||||
target="_blank"
|
||||
class="text-xl font-semibold underline"
|
||||
>
|
||||
<h2 class="mb-0">{{ file }}</h2>
|
||||
</a>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak ogłoszeń</span>
|
||||
{% endfor %}
|
||||
|
||||
<h1 class="text-3xl">Protokoły / Ustawy</h1>
|
||||
{% for file in protokoly %}
|
||||
<article>
|
||||
<a
|
||||
href="{{ file.attachment.url }}"
|
||||
target="_blank"
|
||||
class="text-xl font-semibold underline"
|
||||
>
|
||||
<h2 class="mb-0">{{ file }}</h2>
|
||||
</a>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak protokołów / ustaw</span>
|
||||
{% endfor %}
|
||||
|
||||
<h1 class="text-3xl">Regulaminy</h1>
|
||||
{% for file in regulaminy %}
|
||||
<article>
|
||||
<a
|
||||
href="{{ file.attachment.url }}"
|
||||
target="_blank"
|
||||
class="text-xl font-semibold underline"
|
||||
>
|
||||
<h2 class="mb-0">{{ file }}</h2>
|
||||
</a>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak regulaminów</span>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<h4>Brak członków</h4>
|
||||
{% endif %} {% endblock %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
{% extends 'administration.html' %}
|
||||
<!---->
|
||||
{% block title %}Zarząd - Ogłoszenia | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block adm_content %}
|
||||
<h2>Ogłoszenia zarządu</h2>
|
||||
|
||||
{% if ogloszenia %}
|
||||
<ul>
|
||||
{% for file in ogloszenia %}
|
||||
<li>
|
||||
<a href="{{ file.attachment.url }}" target="_blank">
|
||||
<h3 class="my-0">{{ file }}</h3>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h4>Brak ogłoszeń</h4>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
{% extends 'administration.html' %}
|
||||
<!---->
|
||||
{% block title %}Zarząd - Protokoły i Uchwały | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block adm_content %}
|
||||
<h2>Protokoły i Uchwały</h2>
|
||||
{% if protokoly %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Dokument</th>
|
||||
<th>Rok</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for file in protokoly %}
|
||||
<tr>
|
||||
<td>
|
||||
<a
|
||||
href="{{ file.attachment.url }}"
|
||||
target="_blank"
|
||||
class="font-semibold"
|
||||
>{{ file }}</a
|
||||
>
|
||||
<br />
|
||||
<span>{{ file.extra }}</span>
|
||||
</td>
|
||||
<td>{{ file.year }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<h4>Brak protokołów / ustaw</h4>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
{% extends 'administration.html' %}
|
||||
<!---->
|
||||
{% block title %}Zarząd - Regulaminy | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block adm_content %}
|
||||
<h2>Regulaminy</h2>
|
||||
{% if regulaminy %}
|
||||
<ul>
|
||||
{% for file in regulaminy %}
|
||||
<li>
|
||||
<a href="{{ file.attachment.url }}" target="_blank">
|
||||
<h3 class="my-0">{{ file }}</h3>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h4>Brak regulaminów</h4>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
{% extends 'administration.html' %}
|
||||
<!---->
|
||||
{% block title %}Zarząd - RODO | pdlzbs {% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block adm_content %}
|
||||
<h2>Dokumenty RODO</h2>
|
||||
{% if rodos %}
|
||||
<ul>
|
||||
{% for file in rodos %}
|
||||
<li class="prose-h3:font-normal">
|
||||
<h3 class="my-0 text-center">
|
||||
Informacje o przetwarzaniu danych osobowych zawodników przez
|
||||
<a href="{{ file.attachment.url }}" target="_blank">{{ file.who }}</a>
|
||||
</h3>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h4>Brak dokumentów</h4>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
@ -18,13 +18,13 @@
|
|||
{% tailwind_css %}
|
||||
</head>
|
||||
|
||||
<body class="antialiased flex flex-col gap-4">
|
||||
<header class="w-full bg-white shadow-lg border-b border-slate-400 pb-1">
|
||||
<body class="antialiased flex flex-col gap-4 bg-stone-50">
|
||||
<header class="w-full bg-white shadow-md border-b border-slate-400 pb-1">
|
||||
<div class="m-4 container flex flex-col lg:flex-row items-center lg:items-start justify-around mx-auto">
|
||||
<div><img class="min-w-[145px] min-h-[125px]" src="{% static 'logo.webp' %}" alt="Logo" /></div>
|
||||
<div class="self-center"><img class="min-w-[145px] min-h-[125px]" src="{% static 'logo.webp' %}" /></div>
|
||||
<div class="flex flex-col self-end">
|
||||
<div class="mb-4 mx-auto p-2 text-center">
|
||||
<span class="text-4xl">Podlaski Związek Brydża Sportowego</span>
|
||||
<h1 class="text-4xl">Podlaski Związek <br> Brydża Sportowego</h1>
|
||||
</div>
|
||||
<nav>
|
||||
<ul class="flex flex-wrap justify-center lg:items-end gap-3 text-[15px] leading-5 m-2">
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="flex flex-wrap justify-center gap-6 mt-8">
|
||||
<nav class="flex flex-wrap justify-center gap-6 mt-8">
|
||||
<div title="Cezar">
|
||||
<a href="http://www.msc.com.pl/cezar" target="_blank"><img class="max-h-12" src="{% static 'cezar.gif' %}" alt="Cezar" /></a>
|
||||
</div>
|
||||
|
|
@ -57,14 +57,14 @@
|
|||
<div title="Miejski Białostocki Klub Brydżowy">
|
||||
<a href="https://andys0101.wixsite.com/pdlzbs/mbkb" target="_self"><img src="{% static 'mbkb.webp' %}" alt="MBKB" /></a>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
<main class="container mx-auto p-4">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
<footer class="footer text-center font-light italic">
|
||||
© {% now "Y" %} Mikołaj Kubiczek
|
||||
<h6 class="mb-4">© {% now "Y" %} Mikołaj Kubiczek</h6>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
{% extends 'base.html' %} {% block title %}Kalendarz | pdlzbs{% endblock %} {%
|
||||
load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
{% for calendar in calendars %}
|
||||
<article
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% extends 'base.html' %}
|
||||
<!---->
|
||||
{% block title %}Grand Prix Białegostoku | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<article class="w-full">
|
||||
<h1 class="text-[2.25rem] font-extrabold text-center">
|
||||
|
|
|
|||
|
|
@ -1,25 +1,28 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col lg:flex-row justify-around gap-4">
|
||||
<article class="prose w-full basis-3/5 mb-10">
|
||||
<div class="flex flex-col lg:flex-row gap-8">
|
||||
<article
|
||||
class="basis-3/5 mb-auto prose max-w-full bg-white shadow-md rounded-md p-4"
|
||||
>
|
||||
<h1>Grand Prix Województwa</h1>
|
||||
{{ gpw.content | safe }}
|
||||
<div class="">{{ gpw.content | safe }}</div>
|
||||
</article>
|
||||
<div class="flex flex-col basis-2/5 not-prose">
|
||||
<div class="flex flex-col gap-4">
|
||||
<h1
|
||||
class="text-3xl pb-6 mb-4 border-b border-stone-500 border-dashed font-medium"
|
||||
class="text-[2.25rem] font-medium lg:text-right bg-white shadow-md rounded-md px-4 py-2"
|
||||
>
|
||||
Aktualności PodlZBS
|
||||
</h1>
|
||||
<hr class="border-b border-stone-300 border-dashed" />
|
||||
{% for post in posts %}
|
||||
<article
|
||||
class="prose w-full py-4 {% if forloop.first %} pt-0 {% endif %} {% if not forloop.last %} border-b border-stone-400 {% endif %}"
|
||||
>
|
||||
<h2 class="mb-0">{{ post.title }}</h2>
|
||||
{{ post.content | safe }}
|
||||
<article class="prose max-w-full py-4 bg-white shadow-md rounded-md p-4">
|
||||
<h2 class="text-center">{{ post.title }}</h2>
|
||||
<div>{{ post.content | safe }}</div>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Więcej wpisów nie ma</span>
|
||||
{% if not forloop.last %}
|
||||
<hr class="border-b border-stone-200" />
|
||||
{% endif %} {% empty %}
|
||||
<h2 class="py-4 text-xl text-center">Więcej wpisów nie ma</h2>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,16 +1,24 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% extends 'base.html' %}
|
||||
<!---->
|
||||
{% block title %}Liga | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<h1 class="text-[2.25rem] font-extrabold text-center mb-4">Wyniki III ligi</h1>
|
||||
{% if leagues %}
|
||||
<ul class="flex flex-col items-center gap-4">
|
||||
{% for league in leagues %}
|
||||
<a
|
||||
href="{{ league.link }}"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
class="px-4 py-3 rounded-md shadow-md border border-stone-200 bg-stone-50 hover:border-stone-200 hover:bg-stone-100 font-semibold"
|
||||
>
|
||||
Wyniki III ligi DMP {{ league.year }}-{{ league.year | add:"1" }}
|
||||
</a>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak wyników</span>
|
||||
{% endfor %} {% endblock %}
|
||||
</div>
|
||||
<li>
|
||||
<a
|
||||
href="{{ league.link }}"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
class="transition ease-in-out duration-300 inline-block px-4 py-3 rounded-md shadow-md border font-semibold {% if forloop.counter0|divisibleby:2 %}border-pink-200 bg-pink-100 hover:border-pink-300 hover:bg-pink-200 {% else %} border-rose-200 bg-rose-100 hover:border-rose-300 hover:bg-rose-200{% endif %}"
|
||||
>
|
||||
<h2>Wyniki III ligi DMP {{ league.year }}-{{ league.year | add:"1" }}</h2>
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h2 class="py-4 text-xl text-center">Brak wyników</h2>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,25 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% extends 'base.html' %}
|
||||
<!---->
|
||||
{% block title %}Składki Członkowskie | pdlzbs{% endblock %}
|
||||
<!---->
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
<h1 class="text-[2.25rem] font-extrabold text-center mb-4">
|
||||
Składki członkowskie
|
||||
</h1>
|
||||
{% if memberships %}
|
||||
<ul class="flex flex-col items-center gap-4">
|
||||
{% for membership in memberships %}
|
||||
<article class="prose py-4">
|
||||
<a href="{{ membership.attachment.url }}" target="_blank">
|
||||
<li>
|
||||
<a
|
||||
href="{{ membership.attachment.url }}"
|
||||
target="_blank"
|
||||
class="transition ease-in-out duration-300 inline-block px-4 py-3 rounded-md shadow-md border font-semibold {% if forloop.counter0|divisibleby:2 %}border-sky-200 bg-sky-100 hover:border-sky-300 hover:bg-sky-200 {% else %} border-indigo-200 bg-indigo-100 hover:border-indigo-300 hover:bg-indigo-200{% endif %}"
|
||||
>
|
||||
<h2 class="my-0">{{ membership }}</h2>
|
||||
</a>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak dokumentów</span>
|
||||
{% endfor %} {% endblock %}
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<h2 class="text-xl text-center">Brak dokumentów</h2>
|
||||
{% endif %} {% endblock %}
|
||||
|
|
|
|||
|
|
@ -1,15 +0,0 @@
|
|||
{% extends 'base.html' %} {% block title %}Strona główna | pdlzbs{% endblock %}
|
||||
{% load static tailwind_tags %} {% block content %}
|
||||
<div class="flex flex-col items-center gap-4">
|
||||
{% for rodo in rodos %}
|
||||
<article class="prose py-4">
|
||||
<h2 class="my-0 text-center">
|
||||
Informacje o przetwarzaniu danych osobowych zawodników przez
|
||||
<a href="{{ rodo.attachment.url }}" target="_blank">{{ rodo.who }}</a>
|
||||
</h2>
|
||||
</article>
|
||||
{% empty %}
|
||||
<span class="py-4 text-xl">Brak dokumentów</span>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -4,7 +4,14 @@ from .views import *
|
|||
urlpatterns = [
|
||||
path('', HomeView.as_view(), name='home'),
|
||||
path('zarzad', AdministrationView.as_view(), name='administration'),
|
||||
path('rodo', RODOView.as_view(), name='rodo'),
|
||||
path('zarzad/ogloszenia', AdministrationAnnouncementsView.as_view(),
|
||||
name='administration_announcements'),
|
||||
path('zarzad/protokolyiuchwaly', AdministrationProtocolsView.as_view(),
|
||||
name='administration_protocols'),
|
||||
path('zarzad/regulaminy', AdministrationRegulationsView.as_view(),
|
||||
name='administration_regulations'),
|
||||
path('zarzad/rodo', AdministrationRODOView.as_view(),
|
||||
name='administration_rodos'),
|
||||
path('liga', LeagueView.as_view(), name='league'),
|
||||
path('kalendarz', CalendarView.as_view(), name='calendar'),
|
||||
path('grandprix', GrandPrixView.as_view(), name='gpx'),
|
||||
|
|
|
|||
|
|
@ -35,22 +35,65 @@ class AdministrationView(TemplateView):
|
|||
|
||||
context = {
|
||||
**context,
|
||||
'czlonkowie': AdministrationMember.objects.all(),
|
||||
'statut': AdministrationStatute.objects.first(),
|
||||
'ogloszenia': AdministrationAnnouncement.objects.all(),
|
||||
'protokoly': AdministrationProtocol.objects.all(),
|
||||
'regulaminy': AdministrationRegulation.objects.all(),
|
||||
'czlonkowie': Member.objects.all(),
|
||||
'statut': Statute.objects.first(),
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class RODOView(TemplateView):
|
||||
template_name = 'rodo.html'
|
||||
class AdministrationAnnouncementsView(TemplateView):
|
||||
template_name = 'administration/announcements.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['rodos'] = RODO.objects.all()
|
||||
|
||||
context = {
|
||||
**context,
|
||||
'ogloszenia': Announcement.objects.all(),
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class AdministrationProtocolsView(TemplateView):
|
||||
template_name = 'administration/protocols.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
context = {
|
||||
**context,
|
||||
'protokoly': Protocol.objects.all(),
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class AdministrationRegulationsView(TemplateView):
|
||||
template_name = 'administration/regulations.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
context = {
|
||||
**context,
|
||||
'regulaminy': Regulation.objects.all(),
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
||||
class AdministrationRODOView(TemplateView):
|
||||
template_name = 'administration/rodos.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
context = {
|
||||
**context,
|
||||
'rodos': RODO.objects.all(),
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
|
|
|||
|
|
@ -5,9 +5,31 @@ from .models import *
|
|||
# Register your models here.
|
||||
|
||||
|
||||
@admin.register(AdministrationMember)
|
||||
class AdministrationMemberModelAdmin(OrderableAdmin, admin.ModelAdmin):
|
||||
@admin.register(Member)
|
||||
class MemberModelAdmin(OrderableAdmin, admin.ModelAdmin):
|
||||
list_display = ['__str__', 'ordering']
|
||||
list_editable = ['ordering']
|
||||
ordering_field_hide_input = True
|
||||
exclude = ['ordering']
|
||||
|
||||
|
||||
class OrderableModelAdmin(OrderableAdmin, admin.ModelAdmin):
|
||||
list_display = ['title', 'year', 'ordering']
|
||||
list_editable = ['ordering']
|
||||
ordering_field_hide_input = True
|
||||
exclude = ['ordering']
|
||||
|
||||
|
||||
@admin.register(Announcement)
|
||||
class AnnouncementModelAdmin(OrderableModelAdmin):
|
||||
list_display = ['title', 'ordering']
|
||||
|
||||
|
||||
@admin.register(Protocol)
|
||||
class ProtocolModelAdmin(OrderableModelAdmin):
|
||||
pass
|
||||
|
||||
|
||||
@admin.register(Regulation)
|
||||
class RegulationModelAdmin(OrderableModelAdmin):
|
||||
list_display = ['title', 'ordering']
|
||||
|
|
|
|||
|
|
@ -0,0 +1,90 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 21:27
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Announcement',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.IntegerField(blank=True, null=True, verbose_name='Rok')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Tytuł')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('attachment', models.FileField(upload_to='zarzad_ogloszenia', verbose_name='Plik pdf')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Ogłoszenie',
|
||||
'verbose_name_plural': 'Ogłoszenia',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Protocol',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.IntegerField(blank=True, null=True, verbose_name='Rok')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Tytuł')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('attachment', models.FileField(upload_to='zarzad_protokolyuchwaly', verbose_name='Plik pdf')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Protokół / Uchwała',
|
||||
'verbose_name_plural': 'Protokoły / Uchwały',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Regulation',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.IntegerField(blank=True, null=True, verbose_name='Rok')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Tytuł')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('attachment', models.FileField(upload_to='zarzad_regulaminy', verbose_name='Plik pdf')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Regulamin',
|
||||
'verbose_name_plural': 'Regulaminy',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Statute',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.IntegerField(blank=True, null=True, verbose_name='Rok')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Tytuł')),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('attachment', models.FileField(upload_to='zarzad_statuty', verbose_name='Plik pdf')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Statut',
|
||||
'verbose_name_plural': 'Statuty',
|
||||
},
|
||||
),
|
||||
migrations.RenameModel(
|
||||
old_name='AdministrationMember',
|
||||
new_name='Member',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='AdministrationAnnouncement',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='AdministrationProtocol',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='AdministrationRegulation',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='AdministrationStatute',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='rodo',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to='zarzad_rodo', verbose_name='Plik pdf'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 21:33
|
||||
|
||||
import db.administration.models
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0002_announcement_protocol_regulation_statute_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='announcement',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to=db.administration.models.AttachmentModel._upload_to, verbose_name='Plik pdf'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='protocol',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to=db.administration.models.AttachmentModel._upload_to, verbose_name='Plik pdf'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='regulation',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to=db.administration.models.AttachmentModel._upload_to, verbose_name='Plik pdf'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='statute',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to=db.administration.models.AttachmentModel._upload_to, verbose_name='Plik pdf'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 21:57
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0003_alter_announcement_attachment_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='announcement',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Ogłoszenie', 'verbose_name_plural': 'Ogłoszenia'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='protocol',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Protokół / Uchwała', 'verbose_name_plural': 'Protokoły / Uchwały'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='regulation',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Regulamin', 'verbose_name_plural': 'Regulaminy'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='statute',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Statut', 'verbose_name_plural': 'Statuty'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='announcement',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='ordering'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='protocol',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='ordering'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='regulation',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='ordering'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='statute',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='ordering'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 22:02
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0004_alter_announcement_options_alter_protocol_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='announcement',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='protocol',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='regulation',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='statute',
|
||||
name='ordering',
|
||||
field=models.PositiveIntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 22:41
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0005_alter_announcement_ordering_alter_member_ordering_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='announcement',
|
||||
options={'ordering': ['-year', 'ordering'], 'verbose_name': 'Ogłoszenie', 'verbose_name_plural': 'Ogłoszenia'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='protocol',
|
||||
options={'ordering': ['-year', 'ordering'], 'verbose_name': 'Protokół / Uchwała', 'verbose_name_plural': 'Protokoły / Uchwały'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='regulation',
|
||||
options={'ordering': ['-year', 'ordering'], 'verbose_name': 'Regulamin', 'verbose_name_plural': 'Regulaminy'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='statute',
|
||||
options={'ordering': ['-year', 'ordering'], 'verbose_name': 'Statut', 'verbose_name_plural': 'Statuty'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='announcement',
|
||||
name='ordering',
|
||||
field=models.IntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='ordering',
|
||||
field=models.IntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='protocol',
|
||||
name='ordering',
|
||||
field=models.IntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='regulation',
|
||||
name='ordering',
|
||||
field=models.IntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='statute',
|
||||
name='ordering',
|
||||
field=models.IntegerField(default=0, verbose_name='Kolejność'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 22:53
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0006_alter_announcement_options_alter_protocol_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='announcement',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Ogłoszenie', 'verbose_name_plural': 'Ogłoszenia'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='regulation',
|
||||
options={'ordering': ['ordering'], 'verbose_name': 'Regulamin', 'verbose_name_plural': 'Regulaminy'},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='announcement',
|
||||
name='year',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='regulation',
|
||||
name='year',
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 22:58
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0007_alter_announcement_options_alter_regulation_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='statute',
|
||||
options={'verbose_name': 'Statut', 'verbose_name_plural': 'Statut'},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='statute',
|
||||
name='created_at',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='statute',
|
||||
name='ordering',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='statute',
|
||||
name='year',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='statute',
|
||||
name='attachment',
|
||||
field=models.FileField(upload_to='zarzad_statuty', verbose_name='Plik pdf'),
|
||||
),
|
||||
]
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 4.0.5 on 2022-07-23 23:47
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('administration', '0008_alter_statute_options_remove_statute_created_at_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='protocol',
|
||||
name='extra',
|
||||
field=models.TextField(blank=True, default='', verbose_name='Dodatkowy opis'),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,55 +1,36 @@
|
|||
from django.db import models
|
||||
from admin_ordering.models import OrderableModel
|
||||
from core.utils import SingletonModel
|
||||
|
||||
# Create your models here.
|
||||
|
||||
|
||||
class AttachmentModel(models.Model):
|
||||
year = models.IntegerField('Rok', blank=True, null=True)
|
||||
class AttachmentModel(OrderableModel):
|
||||
upload_to = 'zalaczniki'
|
||||
title = models.CharField('Tytuł', max_length=250)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
class Meta:
|
||||
def _upload_to(self, filename):
|
||||
return f'zarzad_{self.upload_to}/{filename}'
|
||||
|
||||
attachment = models.FileField('Plik pdf', upload_to=_upload_to)
|
||||
|
||||
class Meta(OrderableModel.Meta):
|
||||
abstract = True
|
||||
ordering = ['-created_at']
|
||||
|
||||
|
||||
class AdministrationStatute(AttachmentModel):
|
||||
attachment = models.FileField('Plik pdf', upload_to='statutes')
|
||||
class Announcement(AttachmentModel):
|
||||
upload_to = 'ogloszenia'
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Statut'
|
||||
verbose_name_plural = 'Statuty'
|
||||
|
||||
|
||||
class AdministrationAnnouncement(AttachmentModel):
|
||||
attachment = models.FileField('Plik pdf', upload_to='announcements')
|
||||
|
||||
class Meta:
|
||||
class Meta(OrderableModel.Meta):
|
||||
verbose_name = 'Ogłoszenie'
|
||||
verbose_name_plural = 'Ogłoszenia'
|
||||
|
||||
|
||||
class AdministrationProtocol(AttachmentModel):
|
||||
attachment = models.FileField('Plik pdf', upload_to='protocols')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Protokół / Uchwała'
|
||||
verbose_name_plural = 'Protokoły / Uchwały'
|
||||
|
||||
|
||||
class AdministrationRegulation(AttachmentModel):
|
||||
attachment = models.FileField('Plik pdf', upload_to='regulations')
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Regulamin'
|
||||
verbose_name_plural = 'Regulaminy'
|
||||
|
||||
|
||||
class AdministrationMember(OrderableModel):
|
||||
class Member(OrderableModel):
|
||||
name = models.CharField('Imię i nazwisko', max_length=512)
|
||||
contact = models.CharField('Dane kontaktowe', max_length=512)
|
||||
function = models.CharField('Funkcja', max_length=512)
|
||||
|
|
@ -62,10 +43,29 @@ class AdministrationMember(OrderableModel):
|
|||
verbose_name_plural = 'Członkowie'
|
||||
|
||||
|
||||
class Protocol(AttachmentModel):
|
||||
upload_to = 'protokolyuchwaly'
|
||||
extra = models.TextField('Dodatkowy opis', default='', blank=True)
|
||||
year = models.IntegerField('Rok', blank=True, null=True)
|
||||
|
||||
class Meta(OrderableModel.Meta):
|
||||
verbose_name = 'Protokół / Uchwała'
|
||||
verbose_name_plural = 'Protokoły / Uchwały'
|
||||
ordering = ['-year', 'ordering']
|
||||
|
||||
|
||||
class Regulation(AttachmentModel):
|
||||
upload_to = 'regulaminy'
|
||||
|
||||
class Meta(OrderableModel.Meta):
|
||||
verbose_name = 'Regulamin'
|
||||
verbose_name_plural = 'Regulaminy'
|
||||
|
||||
|
||||
class RODO(models.Model):
|
||||
who = models.CharField(
|
||||
'Przez kogo przetwarzane dane osobowe?', max_length=512)
|
||||
attachment = models.FileField('Plik pdf', upload_to='rodo')
|
||||
attachment = models.FileField('Plik pdf', upload_to='zarzad_rodo')
|
||||
|
||||
def __str__(self):
|
||||
return f'RODO - {self.who}'
|
||||
|
|
@ -73,3 +73,15 @@ class RODO(models.Model):
|
|||
class Meta:
|
||||
verbose_name = 'Dokument RODO'
|
||||
verbose_name_plural = 'Dokumenty RODO'
|
||||
|
||||
|
||||
class Statute(SingletonModel):
|
||||
title = models.CharField('Tytuł', max_length=250)
|
||||
attachment = models.FileField('Plik pdf', upload_to='zarzad_statuty')
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Statut'
|
||||
verbose_name_plural = 'Statut'
|
||||
|
|
|
|||
|
|
@ -3,6 +3,5 @@ django-browser-reload
|
|||
django-tailwind
|
||||
django-tinymce
|
||||
django-filebrowser-no-grappelli
|
||||
django-admin-ordering
|
||||
django-htmlmin
|
||||
django-cleanup
|
||||
|
|
@ -1083,39 +1083,88 @@ select {
|
|||
|
||||
.nav-item > a {
|
||||
display: inline-block;
|
||||
border-radius: 0.375rem;
|
||||
border-width: 1px;
|
||||
border-color: rgb(167 243 208 / var(--tw-border-opacity));
|
||||
border-color: rgb(187 247 208 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-top-color: rgb(16 185 129 / var(--tw-border-opacity));
|
||||
border-bottom-color: rgb(34 197 94 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(209 250 229 / var(--tw-bg-opacity));
|
||||
background-color: rgb(220 252 231 / var(--tw-bg-opacity));
|
||||
padding-left: 0.5rem;
|
||||
padding-right: 0.5rem;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 0.5rem;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 0.5rem;
|
||||
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
||||
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-duration: 300ms;
|
||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.nav-item > a:hover {
|
||||
border-top-width: 4px;
|
||||
border-color: rgb(110 231 183 / var(--tw-border-opacity));
|
||||
border-bottom-width: 4px;
|
||||
border-color: rgb(134 239 172 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-top-color: rgb(5 150 105 / var(--tw-border-opacity));
|
||||
border-bottom-color: rgb(22 163 74 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(167 243 208 / var(--tw-bg-opacity));
|
||||
padding-top: 7px;
|
||||
background-color: rgb(187 247 208 / var(--tw-bg-opacity));
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
|
||||
.active > a {
|
||||
border-top-width: 4px;
|
||||
border-color: rgb(110 231 183 / var(--tw-border-opacity));
|
||||
border-bottom-width: 4px;
|
||||
border-color: rgb(134 239 172 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-top-color: rgb(5 150 105 / var(--tw-border-opacity));
|
||||
border-bottom-color: rgb(22 163 74 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(110 231 183 / var(--tw-bg-opacity));
|
||||
padding-top: 7px;
|
||||
background-color: rgb(134 239 172 / var(--tw-bg-opacity));
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
|
||||
.adm_nav-item > a {
|
||||
display: inline-block;
|
||||
border-radius: 0.375rem;
|
||||
border-width: 1px;
|
||||
border-color: rgb(191 219 254 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-bottom-color: rgb(59 130 246 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(219 234 254 / var(--tw-bg-opacity));
|
||||
padding-left: 0.5rem;
|
||||
padding-right: 0.5rem;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 0.5rem;
|
||||
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
||||
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-duration: 300ms;
|
||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.adm_nav-item > a:hover {
|
||||
border-bottom-width: 4px;
|
||||
border-color: rgb(147 197 253 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-bottom-color: rgb(37 99 235 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(191 219 254 / var(--tw-bg-opacity));
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
|
||||
.adm_active > a {
|
||||
border-bottom-width: 4px;
|
||||
border-color: rgb(147 197 253 / var(--tw-border-opacity));
|
||||
--tw-border-opacity: 1;
|
||||
border-bottom-color: rgb(37 99 235 / var(--tw-border-opacity));
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(147 197 253 / var(--tw-bg-opacity));
|
||||
padding-bottom: 7px;
|
||||
}
|
||||
|
||||
.sr-only {
|
||||
|
|
@ -1165,6 +1214,15 @@ select {
|
|||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.my-4 {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.mb-2 {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.mb-0 {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
|
@ -1181,10 +1239,34 @@ select {
|
|||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
.mb-6 {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.mb-8 {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
.mt-0 {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.mb-auto {
|
||||
margin-bottom: auto;
|
||||
}
|
||||
|
||||
.box-content {
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
.block {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.inline {
|
||||
display: inline;
|
||||
}
|
||||
|
|
@ -1209,10 +1291,6 @@ select {
|
|||
display: none;
|
||||
}
|
||||
|
||||
.h-screen {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.h-\[40px\] {
|
||||
height: 40px;
|
||||
}
|
||||
|
|
@ -1221,6 +1299,14 @@ select {
|
|||
height: 100%;
|
||||
}
|
||||
|
||||
.h-screen {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.h-auto {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.max-h-12 {
|
||||
max-height: 3rem;
|
||||
}
|
||||
|
|
@ -1229,6 +1315,10 @@ select {
|
|||
min-height: 125px;
|
||||
}
|
||||
|
||||
.w-screen {
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
|
|
@ -1241,6 +1331,18 @@ select {
|
|||
min-width: 145px;
|
||||
}
|
||||
|
||||
.max-w-screen-lg {
|
||||
max-width: 1024px;
|
||||
}
|
||||
|
||||
.max-w-full {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.grow-0 {
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
.basis-3\/5 {
|
||||
flex-basis: 60%;
|
||||
}
|
||||
|
|
@ -1249,6 +1351,18 @@ select {
|
|||
flex-basis: 40%;
|
||||
}
|
||||
|
||||
.basis-1\/2 {
|
||||
flex-basis: 50%;
|
||||
}
|
||||
|
||||
.basis-1 {
|
||||
flex-basis: 0.25rem;
|
||||
}
|
||||
|
||||
.basis-full {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
.border-collapse {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
|
@ -1281,26 +1395,42 @@ select {
|
|||
justify-content: center;
|
||||
}
|
||||
|
||||
.justify-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.justify-around {
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.gap-4 {
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.gap-3 {
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.gap-6 {
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.gap-3 {
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.gap-4 {
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.gap-8 {
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.self-end {
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.self-center {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.rounded-lg {
|
||||
border-radius: 0.5rem;
|
||||
}
|
||||
|
||||
.rounded-md {
|
||||
border-radius: 0.375rem;
|
||||
}
|
||||
|
|
@ -1337,9 +1467,44 @@ select {
|
|||
border-color: rgb(168 162 158 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.bg-gray-50 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
|
||||
.border-rose-200 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(254 205 211 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-pink-200 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(251 207 232 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-indigo-200 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(199 210 254 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-sky-200 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(186 230 253 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-blue-400 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(96 165 250 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-blue-200 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(191 219 254 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-blue-100 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(219 234 254 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.border-stone-300 {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(214 211 209 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.bg-white {
|
||||
|
|
@ -1347,22 +1512,52 @@ select {
|
|||
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-cyan-50 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(236 254 255 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-stone-50 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(250 250 249 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.p-2 {
|
||||
padding: 0.5rem;
|
||||
.bg-pink-100 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(252 231 243 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-rose-100 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(255 228 230 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-gray-50 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(249 250 251 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-sky-100 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(224 242 254 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-indigo-100 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(224 231 255 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.bg-blue-50 {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(239 246 255 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.p-4 {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.py-4 {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
.p-2 {
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.px-4 {
|
||||
|
|
@ -1375,6 +1570,16 @@ select {
|
|||
padding-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.py-4 {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
.py-2 {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.pb-1 {
|
||||
padding-bottom: 0.25rem;
|
||||
}
|
||||
|
|
@ -1387,28 +1592,45 @@ select {
|
|||
padding-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.text-left {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.text-right {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.font-serif {
|
||||
font-family: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
|
||||
}
|
||||
|
||||
.text-5xl {
|
||||
font-size: 3rem;
|
||||
}
|
||||
|
||||
.text-4xl {
|
||||
font-size: 2.25rem;
|
||||
line-height: 2.5rem;
|
||||
}
|
||||
|
||||
.text-xl {
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.75rem;
|
||||
}
|
||||
|
||||
.text-2xl {
|
||||
font-size: 1.5rem;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
.text-3xl {
|
||||
font-size: 1.875rem;
|
||||
line-height: 2.25rem;
|
||||
}
|
||||
|
||||
.text-xs {
|
||||
font-size: 0.75rem;
|
||||
line-height: 1rem;
|
||||
}
|
||||
|
||||
.text-\[15px\] {
|
||||
|
|
@ -1423,24 +1645,29 @@ select {
|
|||
font-size: 2.25rem;
|
||||
}
|
||||
|
||||
.font-semibold {
|
||||
font-weight: 600;
|
||||
.text-5xl {
|
||||
font-size: 3rem;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.font-bold {
|
||||
font-weight: 700;
|
||||
.font-medium {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.font-light {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.font-bold {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.font-extrabold {
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.font-medium {
|
||||
font-weight: 500;
|
||||
.font-semibold {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.lowercase {
|
||||
|
|
@ -1451,14 +1678,14 @@ select {
|
|||
font-style: italic;
|
||||
}
|
||||
|
||||
.leading-normal {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.leading-5 {
|
||||
line-height: 1.25rem;
|
||||
}
|
||||
|
||||
.leading-normal {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.tracking-normal {
|
||||
letter-spacing: 0em;
|
||||
}
|
||||
|
|
@ -1468,28 +1695,23 @@ select {
|
|||
color: rgb(255 255 255 / var(--tw-text-opacity));
|
||||
}
|
||||
|
||||
.underline {
|
||||
-webkit-text-decoration-line: underline;
|
||||
text-decoration-line: underline;
|
||||
}
|
||||
|
||||
.antialiased {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.shadow-lg {
|
||||
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
||||
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
}
|
||||
|
||||
.shadow-md {
|
||||
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
||||
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
}
|
||||
|
||||
.shadow-lg {
|
||||
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
||||
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
|
||||
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||
}
|
||||
|
||||
.outline {
|
||||
outline-style: solid;
|
||||
}
|
||||
|
|
@ -1503,6 +1725,18 @@ select {
|
|||
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
||||
}
|
||||
|
||||
.transition {
|
||||
transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
|
||||
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
|
||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
transition-duration: 150ms;
|
||||
}
|
||||
|
||||
.duration-300 {
|
||||
transition-duration: 300ms;
|
||||
}
|
||||
|
||||
.ease-in-out {
|
||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
|
@ -1516,46 +1750,94 @@ select {
|
|||
display: block;
|
||||
}
|
||||
|
||||
.hover\:border-stone-200:hover {
|
||||
.hover\:border-pink-300:hover {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(231 229 228 / var(--tw-border-opacity));
|
||||
border-color: rgb(249 168 212 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.hover\:bg-stone-100:hover {
|
||||
.hover\:border-rose-300:hover {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(253 164 175 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.hover\:border-sky-300:hover {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(125 211 252 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.hover\:border-indigo-300:hover {
|
||||
--tw-border-opacity: 1;
|
||||
border-color: rgb(165 180 252 / var(--tw-border-opacity));
|
||||
}
|
||||
|
||||
.hover\:bg-pink-200:hover {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(245 245 244 / var(--tw-bg-opacity));
|
||||
background-color: rgb(251 207 232 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.prose-h1\:mb-0 :is(:where(h1):not(:where([class~="not-prose"] *))) {
|
||||
margin-bottom: 0px;
|
||||
.hover\:bg-rose-200:hover {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(254 205 211 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.prose-h1\:font-light :is(:where(h1):not(:where([class~="not-prose"] *))) {
|
||||
font-weight: 300;
|
||||
.hover\:bg-sky-200:hover {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(186 230 253 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.prose-h2\:my-0 :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
.hover\:bg-indigo-200:hover {
|
||||
--tw-bg-opacity: 1;
|
||||
background-color: rgb(199 210 254 / var(--tw-bg-opacity));
|
||||
}
|
||||
|
||||
.prose-h2\:text-center :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.prose-h2\:text-3xl :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
font-size: 1.875rem;
|
||||
line-height: 2.25rem;
|
||||
}
|
||||
|
||||
.prose-h2\:text-2xl :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
font-size: 1.5rem;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
.prose-h2\:font-normal :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.prose-h2\:font-light :is(:where(h2):not(:where([class~="not-prose"] *))) {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.prose-h3\:text-xs :is(:where(h3):not(:where([class~="not-prose"] *))) {
|
||||
font-size: .75rem;
|
||||
.prose-h3\:font-normal :is(:where(h3):not(:where([class~="not-prose"] *))) {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.prose-h4\:text-center :is(:where(h4):not(:where([class~="not-prose"] *))) {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.prose-h4\:text-xl :is(:where(h4):not(:where([class~="not-prose"] *))) {
|
||||
font-size: 1.25rem;
|
||||
line-height: 1.75rem;
|
||||
}
|
||||
|
||||
.prose-h4\:font-normal :is(:where(h4):not(:where([class~="not-prose"] *))) {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@media (min-width: 1024px) {
|
||||
.lg\:grid-cols-2 {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.lg\:flex-row {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.lg\:flex-row-reverse {
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
|
||||
.lg\:items-start {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
|
@ -1563,4 +1845,8 @@ select {
|
|||
.lg\:items-end {
|
||||
align-items: flex-end;
|
||||
}
|
||||
|
||||
.lg\:text-right {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,13 +4,23 @@
|
|||
|
||||
@layer components {
|
||||
.nav-item > a {
|
||||
@apply inline-block px-2 pt-[10px] hover:pt-[7px] pb-2
|
||||
bg-emerald-100 hover:bg-emerald-200 shadow-md
|
||||
border border-emerald-200 hover:border-emerald-300 border-t-emerald-500 hover:border-t-emerald-600 hover:border-t-4;
|
||||
@apply rounded-md transition ease-in-out duration-300 inline-block px-2 pb-[10px] hover:pb-[7px] pt-2
|
||||
bg-green-100 hover:bg-green-200 shadow-md
|
||||
border border-green-200 hover:border-green-300 border-b-green-500 hover:border-b-green-600 hover:border-b-4;
|
||||
}
|
||||
|
||||
.active > a {
|
||||
@apply bg-emerald-300 border-emerald-300 border-t-4 border-t-emerald-600 pt-[7px];
|
||||
@apply bg-green-300 border-green-300 border-b-4 border-b-green-600 pb-[7px];
|
||||
}
|
||||
|
||||
.adm_nav-item > a {
|
||||
@apply rounded-md transition ease-in-out duration-300 inline-block px-2 pb-[10px] hover:pb-[7px] pt-2
|
||||
bg-blue-100 hover:bg-blue-200 shadow-md
|
||||
border border-blue-200 hover:border-blue-300 border-b-blue-500 hover:border-b-blue-600 hover:border-b-4;
|
||||
}
|
||||
|
||||
.adm_active > a {
|
||||
@apply bg-blue-300 border-blue-300 border-b-4 border-b-blue-600 pb-[7px];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,13 +18,13 @@ module.exports = {
|
|||
* Main templates directory of the project (BASE_DIR/templates).
|
||||
* Adjust the following line to match your project structure.
|
||||
*/
|
||||
"../../templates/**/*.html",
|
||||
"../../../templates/**/*.html",
|
||||
|
||||
/*
|
||||
* Templates in other django apps (BASE_DIR/<any_app_name>/templates).
|
||||
* Adjust the following line to match your project structure.
|
||||
*/
|
||||
"../../**/templates/**/*.html",
|
||||
"../../../**/templates/**/*.html",
|
||||
|
||||
/**
|
||||
* JS: If you use Tailwind CSS in JavaScript, uncomment the following lines and make sure
|
||||
|
|
@ -42,20 +42,6 @@ module.exports = {
|
|||
// '../../**/*.py'
|
||||
],
|
||||
theme: {
|
||||
fontSize: {
|
||||
xs: ".75rem",
|
||||
sm: ".875rem",
|
||||
tiny: ".875rem",
|
||||
base: "1rem",
|
||||
lg: "1.125rem",
|
||||
xl: "1.25rem",
|
||||
"2xl": "1.5rem",
|
||||
"3xl": "1.875rem",
|
||||
"4xl": "2.25rem",
|
||||
"5xl": "3rem",
|
||||
"6xl": "4rem",
|
||||
"7xl": "5rem",
|
||||
},
|
||||
extend: {},
|
||||
},
|
||||
plugins: [
|
||||
|
|
|
|||
Loading…
Reference in New Issue