Skip to content
Snippets Groups Projects
Commit 3e6b6d02 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

nice admin layout, theming, filtering, users admin

parent 5cde9aab
No related branches found
No related tags found
No related merge requests found
from dal_admin_filters import AutocompleteFilter
from django.contrib import admin
from django.utils.html import format_html
from import_export import resources
from rangefilter.filters import DateRangeFilter
from shared.admin import MarkdownxGuardedModelAdmin
......@@ -21,6 +23,11 @@ from .models import (
)
class ContractResource(resources.ModelResource):
class Meta:
model = Contract
class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
def has_module_permission(self, request):
return False
......@@ -31,8 +38,8 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
class ContractAuthorPlaceholderFilter(AutocompleteFilter):
title = "Autor"
field_name = "author"
autocomplete_url = ""
field_name = "created_by"
autocomplete_url = "users:select2_djhacker_user_autocomplete"
# END Autocompletes
......@@ -175,10 +182,23 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
super().save_model(request, obj, form, change)
list_filter = (
ContracteePlaceholderFilter,
SigneePlaceholderFilter,
"types",
"approval_state",
"legal_state",
"public_state",
"paper_form_state",
ContractAuthorPlaceholderFilter,
"issues",
("all_parties_sign_date", DateRangeFilter),
("valid_start_date", DateRangeFilter),
("valid_end_date", DateRangeFilter),
)
list_display = (
"name",
"approval_state",
"public_state",
)
# END Contracts
......@@ -209,6 +229,9 @@ class SigneeAdmin(MarkdownxGuardedModelAdmin):
readonly_fields = ("load_ares_data_button",)
list_filter = ("entity_type",)
list_display = ("name", "entity_type")
inlines = (SigneeRepresentativeInline,)
def load_ares_data_button(self, obj):
......
# Generated by Django 4.1.4 on 2023-03-10 19:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contracts', '0009_alter_contractee_address_country_and_more'),
]
operations = [
migrations.AlterField(
model_name='contractee',
name='address_country',
field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'),
),
migrations.AlterField(
model_name='signee',
name='address_country',
field=models.CharField(default='Česká Republika', max_length=256, verbose_name='Země'),
),
]
......@@ -98,6 +98,8 @@ class Signee(models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Jiná smluvní strana"
verbose_name_plural = "Ostatní smluvní strany"
......@@ -145,6 +147,8 @@ class SigneeRepresentative(RepresentativeMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Zástupce"
verbose_name_plural = "Zástupci"
......@@ -203,6 +207,8 @@ class Contractee(models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Naše smluvní strana"
verbose_name_plural = "Naše smluvní strany"
......@@ -244,6 +250,8 @@ class ContracteeRepresentative(RepresentativeMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Zástupce"
verbose_name_plural = "Zástupci"
......@@ -255,6 +263,8 @@ class ContractType(NameStrMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Typ smlouvy"
verbose_name_plural = "Typy smlouvy"
......@@ -266,6 +276,8 @@ class ContractIssue(NameStrMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Problém se smlouvou"
verbose_name_plural = "Problémy se smlouvami"
......@@ -282,11 +294,13 @@ class ContractFilingArea(NameStrMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Spisovna"
verbose_name_plural = "Spisovny"
class Contract(models.Model):
class Contract(NameStrMixin, models.Model):
# BEGIN Automatically set fields
created_by = models.ForeignKey(
......@@ -482,6 +496,8 @@ class Contract(models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Smlouva"
verbose_name_plural = "Smlouvy"
......@@ -493,20 +509,6 @@ class Contract(models.Model):
is_public=True,
).all()
def __str__(self) -> str:
result = ""
if self.approval_state == Contract.ApprovalStates.YES:
result += "SCHVÁLENÁ - "
elif self.approval_state == Contract.ApprovalStates.NO:
result += "NESCHVÁLENÁ - "
else:
result += "KE ZPRACOVÁNÍ - "
result += self.name
return result
class ContractFile(NameStrMixin, models.Model):
name = models.CharField(
......@@ -533,6 +535,8 @@ class ContractFile(NameStrMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Soubor"
verbose_name_plural = "Soubory"
......@@ -557,6 +561,8 @@ class ContracteeSignature(models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Podpis naší smluvní strany"
verbose_name_plural = "Podpisy našich smluvních stran"
......@@ -597,6 +603,8 @@ class SigneeSignature(models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Podpis jiné smluvní strany"
verbose_name_plural = "Podpisy ostatních smluvních stran"
......@@ -636,5 +644,7 @@ class ContractIntent(NameStrMixin, models.Model):
)
class Meta:
app_label = "contracts"
verbose_name = "Záměr"
verbose_name_plural = "Záměry"
......@@ -48,19 +48,23 @@ INSTALLED_APPS = [
"dal",
"dal_select2",
"dal_admin_filters",
"django_admin_index",
"ordered_model",
"shared",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"import_export",
"rangefilter",
"guardian",
"markdownx",
"pirates",
"webpack_loader",
"contracts",
"oidc",
"shared",
"users",
]
......@@ -81,7 +85,9 @@ ROOT_URLCONF = "registry.urls"
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [],
"DIRS": [
os.path.join(BASE_DIR, "registry")
],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
......@@ -179,6 +185,11 @@ WEBPACK_LOADER = {
}
## Media files
MEDIA_URL = "media/"
## Server
USE_X_FORWARDED_HOST = True
......@@ -188,6 +199,12 @@ X_FRAME_OPTIONS = "SAMEORIGIN"
SILENCED_SYSTEM_CHECKS = ["security.W019"]
## Admin
ADMIN_INDEX_AUTO_CREATE_APP_GROUP = True
ADMIN_INDEX_SHOW_REMAINING_APPS = True
## App-specific
DEFAULT_CONTRACTEE_NAME = env.str("DEFAULT_CONTRACTEE_NAME")
......
{% extends 'admin/base.html' %}
{% block extrastyle %}{{ block.super }}
<style>
:root {
--djai-tab-bg: #ff0080;
--djai-tab-bg--hover: #a91b60;
}
</style>
{% endblock %}
......@@ -13,13 +13,26 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.conf import settings
from django.contrib import admin
from django.urls import include, path
from django.urls import include, path, re_path
from django.views.static import serve
from pirates.urls import urlpatterns as pirates_urlpatterns
urlpatterns = [
path("", include("contracts.urls")),
path("", include("users.urls")),
path("markdownx/", include("markdownx.urls")),
path("oidc/", include("oidc.urls")),
path("admin/", admin.site.urls),
] + pirates_urlpatterns
if settings.DEBUG:
urlpatterns.append(
re_path(
r"^media/(?P<path>.*)$",
serve,
{"document_root": settings.MEDIA_ROOT}
),
)
dal-admin-filters==1.1.0
django==4.1.4
django-admin-index==2.0.2
django-admin-interface==0.24.2
django-admin-rangefilter==0.9.0
django-autocomplete-light==3.9.4
django-database-url==1.0.3
django-import-export==3.1.0
djhacker==0.2.3
psycopg2-binary==2.9.5
django-webpack-loader==1.8.0
......
:root {
--djai-tab-bg: #ff0080;
--djai-tab-bg--hover: #a91b60;
}
from django.contrib import admin
# Register your models here.
from shared.admin import MarkdownxGuardedModelAdmin
from .models import User
admin.site.register(User, MarkdownxGuardedModelAdmin)
......@@ -4,3 +4,4 @@ from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "users"
verbose_name = "Uživatelé"
# Generated by Django 4.1.4 on 2023-03-10 20:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='user',
options={},
),
]
......@@ -13,3 +13,8 @@ class User(pirates_models.AbstractUser):
first_name += " "
return f"{first_name}{self.last_name}"
class Meta:
app_label = "users"
verbose_name = "Uživatel"
verbose_name_plural = "Uživatelé"
import dal.autocomplete
from django.urls import path
from . import views, models
app_name = "users"
urlpatterns = [
path(
"autocomplete",
dal.autocomplete.Select2QuerySetView.as_view(model=models.User),
name="select2_djhacker_user_autocomplete",
),
]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment