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 dal_admin_filters import AutocompleteFilter
from django.contrib import admin from django.contrib import admin
from django.utils.html import format_html from django.utils.html import format_html
from import_export import resources
from rangefilter.filters import DateRangeFilter
from shared.admin import MarkdownxGuardedModelAdmin from shared.admin import MarkdownxGuardedModelAdmin
...@@ -21,6 +23,11 @@ from .models import ( ...@@ -21,6 +23,11 @@ from .models import (
) )
class ContractResource(resources.ModelResource):
class Meta:
model = Contract
class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin): class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
def has_module_permission(self, request): def has_module_permission(self, request):
return False return False
...@@ -31,8 +38,8 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin): ...@@ -31,8 +38,8 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
class ContractAuthorPlaceholderFilter(AutocompleteFilter): class ContractAuthorPlaceholderFilter(AutocompleteFilter):
title = "Autor" title = "Autor"
field_name = "author" field_name = "created_by"
autocomplete_url = "" autocomplete_url = "users:select2_djhacker_user_autocomplete"
# END Autocompletes # END Autocompletes
...@@ -175,10 +182,23 @@ class ContractAdmin(MarkdownxGuardedModelAdmin): ...@@ -175,10 +182,23 @@ class ContractAdmin(MarkdownxGuardedModelAdmin):
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
list_filter = ( list_filter = (
ContracteePlaceholderFilter, "types",
SigneePlaceholderFilter, "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 # END Contracts
...@@ -209,6 +229,9 @@ class SigneeAdmin(MarkdownxGuardedModelAdmin): ...@@ -209,6 +229,9 @@ class SigneeAdmin(MarkdownxGuardedModelAdmin):
readonly_fields = ("load_ares_data_button",) readonly_fields = ("load_ares_data_button",)
list_filter = ("entity_type",)
list_display = ("name", "entity_type")
inlines = (SigneeRepresentativeInline,) inlines = (SigneeRepresentativeInline,)
def load_ares_data_button(self, obj): 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): ...@@ -98,6 +98,8 @@ class Signee(models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Jiná smluvní strana" verbose_name = "Jiná smluvní strana"
verbose_name_plural = "Ostatní smluvní strany" verbose_name_plural = "Ostatní smluvní strany"
...@@ -145,6 +147,8 @@ class SigneeRepresentative(RepresentativeMixin, models.Model): ...@@ -145,6 +147,8 @@ class SigneeRepresentative(RepresentativeMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Zástupce" verbose_name = "Zástupce"
verbose_name_plural = "Zástupci" verbose_name_plural = "Zástupci"
...@@ -203,6 +207,8 @@ class Contractee(models.Model): ...@@ -203,6 +207,8 @@ class Contractee(models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Naše smluvní strana" verbose_name = "Naše smluvní strana"
verbose_name_plural = "Naše smluvní strany" verbose_name_plural = "Naše smluvní strany"
...@@ -244,6 +250,8 @@ class ContracteeRepresentative(RepresentativeMixin, models.Model): ...@@ -244,6 +250,8 @@ class ContracteeRepresentative(RepresentativeMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Zástupce" verbose_name = "Zástupce"
verbose_name_plural = "Zástupci" verbose_name_plural = "Zástupci"
...@@ -255,6 +263,8 @@ class ContractType(NameStrMixin, models.Model): ...@@ -255,6 +263,8 @@ class ContractType(NameStrMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Typ smlouvy" verbose_name = "Typ smlouvy"
verbose_name_plural = "Typy smlouvy" verbose_name_plural = "Typy smlouvy"
...@@ -266,6 +276,8 @@ class ContractIssue(NameStrMixin, models.Model): ...@@ -266,6 +276,8 @@ class ContractIssue(NameStrMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Problém se smlouvou" verbose_name = "Problém se smlouvou"
verbose_name_plural = "Problémy se smlouvami" verbose_name_plural = "Problémy se smlouvami"
...@@ -282,11 +294,13 @@ class ContractFilingArea(NameStrMixin, models.Model): ...@@ -282,11 +294,13 @@ class ContractFilingArea(NameStrMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Spisovna" verbose_name = "Spisovna"
verbose_name_plural = "Spisovny" verbose_name_plural = "Spisovny"
class Contract(models.Model): class Contract(NameStrMixin, models.Model):
# BEGIN Automatically set fields # BEGIN Automatically set fields
created_by = models.ForeignKey( created_by = models.ForeignKey(
...@@ -482,6 +496,8 @@ class Contract(models.Model): ...@@ -482,6 +496,8 @@ class Contract(models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Smlouva" verbose_name = "Smlouva"
verbose_name_plural = "Smlouvy" verbose_name_plural = "Smlouvy"
...@@ -493,20 +509,6 @@ class Contract(models.Model): ...@@ -493,20 +509,6 @@ class Contract(models.Model):
is_public=True, is_public=True,
).all() ).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): class ContractFile(NameStrMixin, models.Model):
name = models.CharField( name = models.CharField(
...@@ -533,6 +535,8 @@ class ContractFile(NameStrMixin, models.Model): ...@@ -533,6 +535,8 @@ class ContractFile(NameStrMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Soubor" verbose_name = "Soubor"
verbose_name_plural = "Soubory" verbose_name_plural = "Soubory"
...@@ -557,6 +561,8 @@ class ContracteeSignature(models.Model): ...@@ -557,6 +561,8 @@ class ContracteeSignature(models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Podpis naší smluvní strany" verbose_name = "Podpis naší smluvní strany"
verbose_name_plural = "Podpisy našich smluvních stran" verbose_name_plural = "Podpisy našich smluvních stran"
...@@ -597,6 +603,8 @@ class SigneeSignature(models.Model): ...@@ -597,6 +603,8 @@ class SigneeSignature(models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Podpis jiné smluvní strany" verbose_name = "Podpis jiné smluvní strany"
verbose_name_plural = "Podpisy ostatních smluvních stran" verbose_name_plural = "Podpisy ostatních smluvních stran"
...@@ -636,5 +644,7 @@ class ContractIntent(NameStrMixin, models.Model): ...@@ -636,5 +644,7 @@ class ContractIntent(NameStrMixin, models.Model):
) )
class Meta: class Meta:
app_label = "contracts"
verbose_name = "Záměr" verbose_name = "Záměr"
verbose_name_plural = "Záměry" verbose_name_plural = "Záměry"
...@@ -48,19 +48,23 @@ INSTALLED_APPS = [ ...@@ -48,19 +48,23 @@ INSTALLED_APPS = [
"dal", "dal",
"dal_select2", "dal_select2",
"dal_admin_filters", "dal_admin_filters",
"django_admin_index",
"ordered_model",
"shared",
"django.contrib.admin", "django.contrib.admin",
"django.contrib.auth", "django.contrib.auth",
"django.contrib.contenttypes", "django.contrib.contenttypes",
"django.contrib.sessions", "django.contrib.sessions",
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"import_export",
"rangefilter",
"guardian", "guardian",
"markdownx", "markdownx",
"pirates", "pirates",
"webpack_loader", "webpack_loader",
"contracts", "contracts",
"oidc", "oidc",
"shared",
"users", "users",
] ]
...@@ -81,7 +85,9 @@ ROOT_URLCONF = "registry.urls" ...@@ -81,7 +85,9 @@ ROOT_URLCONF = "registry.urls"
TEMPLATES = [ TEMPLATES = [
{ {
"BACKEND": "django.template.backends.django.DjangoTemplates", "BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [], "DIRS": [
os.path.join(BASE_DIR, "registry")
],
"APP_DIRS": True, "APP_DIRS": True,
"OPTIONS": { "OPTIONS": {
"context_processors": [ "context_processors": [
...@@ -179,6 +185,11 @@ WEBPACK_LOADER = { ...@@ -179,6 +185,11 @@ WEBPACK_LOADER = {
} }
## Media files
MEDIA_URL = "media/"
## Server ## Server
USE_X_FORWARDED_HOST = True USE_X_FORWARDED_HOST = True
...@@ -188,6 +199,12 @@ X_FRAME_OPTIONS = "SAMEORIGIN" ...@@ -188,6 +199,12 @@ X_FRAME_OPTIONS = "SAMEORIGIN"
SILENCED_SYSTEM_CHECKS = ["security.W019"] SILENCED_SYSTEM_CHECKS = ["security.W019"]
## Admin
ADMIN_INDEX_AUTO_CREATE_APP_GROUP = True
ADMIN_INDEX_SHOW_REMAINING_APPS = True
## App-specific ## App-specific
DEFAULT_CONTRACTEE_NAME = env.str("DEFAULT_CONTRACTEE_NAME") 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 ...@@ -13,13 +13,26 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path 1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.conf import settings
from django.contrib import admin 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 from pirates.urls import urlpatterns as pirates_urlpatterns
urlpatterns = [ urlpatterns = [
path("", include("contracts.urls")), path("", include("contracts.urls")),
path("", include("users.urls")),
path("markdownx/", include("markdownx.urls")), path("markdownx/", include("markdownx.urls")),
path("oidc/", include("oidc.urls")), path("oidc/", include("oidc.urls")),
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
] + pirates_urlpatterns ] + 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 dal-admin-filters==1.1.0
django==4.1.4 django==4.1.4
django-admin-index==2.0.2
django-admin-interface==0.24.2 django-admin-interface==0.24.2
django-admin-rangefilter==0.9.0
django-autocomplete-light==3.9.4 django-autocomplete-light==3.9.4
django-database-url==1.0.3 django-database-url==1.0.3
django-import-export==3.1.0
djhacker==0.2.3 djhacker==0.2.3
psycopg2-binary==2.9.5 psycopg2-binary==2.9.5
django-webpack-loader==1.8.0 django-webpack-loader==1.8.0
......
:root {
--djai-tab-bg: #ff0080;
--djai-tab-bg--hover: #a91b60;
}
from django.contrib import admin 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 ...@@ -4,3 +4,4 @@ from django.apps import AppConfig
class UsersConfig(AppConfig): class UsersConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField" default_auto_field = "django.db.models.BigAutoField"
name = "users" 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): ...@@ -13,3 +13,8 @@ class User(pirates_models.AbstractUser):
first_name += " " first_name += " "
return f"{first_name}{self.last_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