diff --git a/contracts/admin.py b/contracts/admin.py index 34394e3b13f352aa871f4da96aa219d5918c812b..ec048b2609285001289eecbc3f19a75133948b4a 100644 --- a/contracts/admin.py +++ b/contracts/admin.py @@ -1,6 +1,5 @@ import copy -from dal_admin_filters import AutocompleteFilter from django.contrib import admin from django.utils.html import format_html from fieldsets_with_inlines import FieldsetsInlineMixin @@ -41,18 +40,6 @@ class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin): return False -# BEGIN Autocompletes - - -class ContractAuthorPlaceholderFilter(AutocompleteFilter): - title = "Autor" - field_name = "created_by" - autocomplete_url = "users:select2_djhacker_user_autocomplete" - - -# END Autocompletes - - # BEGIN Contracts @@ -67,6 +54,7 @@ class ContracteeSignatureRepresentativeInline(NestedStackedInline): class ContracteeSignatureInline(NestedStackedInline): model = ContracteeSignature + autocomplete_fields = ("contractee",) inlines = (ContracteeSignatureRepresentativeInline,) extra = 0 @@ -78,6 +66,7 @@ class SigneeSignatureRepresentativeInline(NestedStackedInline): class SigneeSignatureInline(NestedStackedInline): model = SigneeSignature + autocomplete_fields = ("signee",) inlines = (SigneeSignatureRepresentativeInline,) extra = 0 @@ -97,6 +86,11 @@ class ContractAdmin(MarkdownxGuardedModelAdmin, FieldsetsInlineMixin, NestedMode form = ContractAdminForm readonly_fields = ("created_by",) + autocomplete_fields = ( + "types", + "filing_area", + "issues", + ) fieldsets_with_inlines = [ ( @@ -207,7 +201,6 @@ class ContractAdmin(MarkdownxGuardedModelAdmin, FieldsetsInlineMixin, NestedMode "legal_state", "is_public", "paper_form_state", - ContractAuthorPlaceholderFilter, "issues", ("all_parties_sign_date", DateRangeFilter), ("valid_start_date", DateRangeFilter), @@ -221,11 +214,42 @@ class ContractAdmin(MarkdownxGuardedModelAdmin, FieldsetsInlineMixin, NestedMode ) +class ContractTypeAdmin(MarkdownxGuardedModelAdmin): + model = ContractType + ordering = ("name",) + search_fields = ("name",) + + +class ContractIssueAdmin(MarkdownxGuardedModelAdmin): + model = ContractIssue + ordering = ("name",) + search_fields = ("name",) + + +class ContractFilingAreaAdmin(MarkdownxGuardedModelAdmin): + model = ContractFilingArea + ordering = ("name",) + search_fields = ( + "name", + "person_responsible", + ) + + # END Contracts # BEGIN Signing parties +class ContracteeAdmin(MarkdownxGuardedModelAdmin): + model = Contractee + search_fields = ( + "name", + "department", + "role", + ) + ordering = ("name",) + + class SigneeAdmin(MarkdownxGuardedModelAdmin): form = SigneeAdminForm @@ -269,16 +293,12 @@ for model in ( ): admin.site.register(model, IndexHiddenModelAdmin) +admin.site.register(ContractType, ContractTypeAdmin) +admin.site.register(ContractIssue, ContractIssueAdmin) admin.site.register(ContractFile, ContractFileAdmin) +admin.site.register(ContractFilingArea, ContractFilingAreaAdmin) -for model in ( - Contractee, - ContractFilingArea, - ContractIssue, - ContractType, -): - admin.site.register(model, MarkdownxGuardedModelAdmin) - +admin.site.register(Contractee, ContracteeAdmin) admin.site.register(Signee, SigneeAdmin) admin.site.register(Contract, ContractAdmin) diff --git a/contracts/forms.py b/contracts/forms.py index 36e7719be1a8df94f6318131e1d1339467934c49..78ae1647a66d6ae5af05645d30e6ccfddb693efa 100644 --- a/contracts/forms.py +++ b/contracts/forms.py @@ -1,5 +1,3 @@ -import dal.autocomplete -import djhacker from django import forms from django.core.exceptions import ValidationError from webpack_loader.loader import WebpackLoader @@ -98,60 +96,3 @@ class SigneeAdminForm(forms.ModelForm): ) return cleaned_data - - -# BEGIN Autocompleted Contract fields - -djhacker.formfield( - Contract.primary_contract, - forms.ModelChoiceField, - widget=dal.autocomplete.ModelSelect2( - url="contracts:select2_djhacker_contract_autocomplete" - ), -) - -djhacker.formfield( - Contract.filing_area, - forms.ModelChoiceField, - widget=dal.autocomplete.ModelSelect2( - url="contracts:select2_djhacker_contract_filing_area_autocomplete" - ), -) - -djhacker.formfield( - Contract.issues, - forms.ModelMultipleChoiceField, - widget=dal.autocomplete.ModelSelect2Multiple( - url="contracts:select2_djhacker_contract_issue_autocomplete" - ), -) - -djhacker.formfield( - Contract.types, - forms.ModelMultipleChoiceField, - widget=dal.autocomplete.ModelSelect2Multiple( - url="contracts:select2_djhacker_contract_type_autocomplete" - ), -) - -# END Autocompleted Contract fields - -# BEGIN Autocompleted ContracteeSignature / SigneeSignature fields - -djhacker.formfield( - ContracteeSignature.contractee, - forms.ModelChoiceField, - widget=dal.autocomplete.ModelSelect2( - url="contracts:select2_djhacker_contractee_signature_autocomplete" - ), -) - -djhacker.formfield( - SigneeSignature.signee, - forms.ModelChoiceField, - widget=dal.autocomplete.ModelSelect2( - url="contracts:select2_djhacker_signee_signature_autocomplete" - ), -) - -# END Autocompleted ContracteeSignature / SigneeSignature fields diff --git a/contracts/migrations/0010_alter_contractee_address_country_and_more.py b/contracts/migrations/0010_alter_contractee_address_country_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..02a13a807101907d6e32bb2a3952f31d727aea1d --- /dev/null +++ b/contracts/migrations/0010_alter_contractee_address_country_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.4 on 2023-03-22 22:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contracts', '0009_alter_contractfile_file'), + ] + + 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ě'), + ), + ] diff --git a/contracts/templates/contracts/includes/contract_list.html b/contracts/templates/contracts/includes/contract_list.html index 8198aa203b414ee8b2d68f325f20600dbf100434..d9d58e6664f9436171f0606f1fa3f9aa86bbca30 100644 --- a/contracts/templates/contracts/includes/contract_list.html +++ b/contracts/templates/contracts/includes/contract_list.html @@ -12,8 +12,8 @@ <tbody> {% for contract in page %} <tr> - <td> - {% if user.can_view_confidential and not contract.is_public %} + <td{% if not contract.is_public %} class="!bg-red-100"{% endif %}> + {% if not contract.is_public %} {% include "contracts/includes/private_info_icon.html" %} {% endif %} <a @@ -21,34 +21,36 @@ href="{% url "contracts:view_contract" contract.id %}" >{{ contract.name }}</a> </td> - <td> + <td{% if not contract.is_public %} class="!bg-red-100"{% endif %}> <ul class="flex flex-wrap gap-1.5"> {% for type in contract.types.all %} <li class="flex"> - {% include "contracts/includes/tag.html" with url=type.url icon="ico--folder" content=type.name %} + {% include "contracts/includes/tag.html" with url=type.url icon="ico--folder" content=type.name public=contract.is_public %} </li> {% endfor %} </ul> </td> - <td> + <td{% if not contract.is_public %} class="!bg-red-100"{% endif %}> <i class="{% if contract.legal_state == contract.LegalStates.VALID %}ico--checkmark{% else %}ico--cross{% endif %}"></i> </td> - <td class="whitespace-nowrap">{{ contract.valid_start_date }}</td> - <td class="whitespace-nowrap"> + <td class="whitespace-nowrap{% if not contract.is_public %} !bg-red-100{% endif %}"> + {{ contract.valid_start_date }} + </td> + <td class="whitespace-nowrap{% if not contract.is_public %} !bg-red-100{% endif %}"> {% if contract.valid_end_date %} {{ contract.valid_end_date }} {% else %} <span class="text-grey-200">Neurčité</span> {% endif %} </td> - <td> + <td{% if not contract.is_public %} class="!bg-red-100"{% endif %}> <ul class="flex flex-wrap gap-1.5"> {% for signature in contract.signee_signatures.all %} <li class="flex"> {% if signature.signee.entity_type == signature.signee.EntityTypes.LEGAL_ENTITY or signature.signee.entity_type == signature.signee.EntityTypes.OTHER %} - {% include "contracts/includes/tag.html" with url=signature.signee.url icon="ico--office" content=signature.signee.name %} + {% include "contracts/includes/tag.html" with url=signature.signee.url icon="ico--office" content=signature.signee.name public=contract.is_public %} {% else %} - {% include "contracts/includes/tag.html" with url=signature.signee.url icon="ico--user" content=signature.signee.name %} + {% include "contracts/includes/tag.html" with url=signature.signee.url icon="ico--user" content=signature.signee.name public=contract.is_public %} {% endif %} </li> {% endfor %} diff --git a/contracts/templates/contracts/includes/tag.html b/contracts/templates/contracts/includes/tag.html index c5d8eff2ca98debfac129b7852ac9b2aa42b461e..1e410811e1b98e2ce46668913fbea3e2633716c8 100644 --- a/contracts/templates/contracts/includes/tag.html +++ b/contracts/templates/contracts/includes/tag.html @@ -1,4 +1,4 @@ <a - class="flex gap-2 items-baseline w-min p-1.5 rounded-sm text-ellipsis whitespace-nowrap bg-gray-200 duration-100 hover:bg-gray-300 hover:no-underline" + class="flex gap-2 items-baseline w-min p-1.5 rounded-sm text-ellipsis whitespace-nowrap {% if public is not none and not public %}bg-red-200 hover:bg-red-300{% else %}bg-gray-200 hover:bg-gray-300{% endif %} duration-100 hover:no-underline" href="{{ url }}" >{% if icon %}<i class="{{ icon }}"></i>{% endif %}{{ content }}</a> diff --git a/contracts/templates/contracts/index.html b/contracts/templates/contracts/index.html index 6f105f8b2d89f7afc1d2e289bfc00826b025b1d5..d75127940b7675fe510289929fac0249abe04264 100644 --- a/contracts/templates/contracts/index.html +++ b/contracts/templates/contracts/index.html @@ -3,12 +3,18 @@ {% block content %} <div class="prose max-w-none mb-10"> <p> - <strong>Magni cumque debitis illo molestiae vitae.</strong> Laudantium et nihil magni rem. Aliquid aperiam minima aspernatur repudiandae quidem. Voluptatem consequatur voluptas aperiam consequatur. Et et dolor libero ut in est voluptate. Libero <a href="#">beatae temporibus itaque</a> est. - Temporibus <i>voluptatum commodi delectus est</i>. Commodi et voluptatem dolor odit occaecati dolore aut. Qui dolor nihil excepturi id. Qui deleniti <i>cupiditate voluptatem aut</i> est dolores eum aliquid. Molestiae blanditiis reiciendis odio provident ipsam voluptas enim suscipit. + Registr smluv České pirátské strany slouží k evidenci i transparentnímu + informování o smlouvách uzavřených Pirátskou stranou s dalšími subjekty.<br> + Nahrávání smluv se řídí <a + href="https://wiki.pirati.cz/ao/pravidla/registr" + target="_blank" + >předpisem Pirátů</a>. V případě dotazů nás kontaktujte na e-mail <a + href="mailto:archiv@pirati.cz" + >archiv@pirati.cz</a>. </p> </div> - <div class="flex gap-6 mb-5 text-lg"> + <div class="flex gap-6 mb-7 text-lg"> <a class="flex gap-2 items-baseline hover:no-underline" href="{% url "contracts:view_contract_filing_areas" %}" @@ -50,5 +56,9 @@ </a> </div> + <h2 class="mb-7 head-alt-md font-bold"> + Všechny smlovuy + </h2> + {% include "contracts/includes/contract_list.html" with page=page paginator=paginator %} {% endblock %} diff --git a/contracts/templates/contracts/view_contract.html b/contracts/templates/contracts/view_contract.html index 8051b35d3f2def85a2180ab818d137b1997f2aa0..fbd4b7e6bb2f47d33dd58f7cb9bdf125982f2767 100644 --- a/contracts/templates/contracts/view_contract.html +++ b/contracts/templates/contracts/view_contract.html @@ -6,7 +6,16 @@ <i class="ico--file-blank text-7xl"></i> <div> <h1 class="head-alt-lg">{{ contract.name }}</h1> - <h2 class="head-alt-sm">Smlouva</h2> + <h2 class="head-alt-sm"> + {% if contract.is_public %} + Smlouva + {% else %} + <div class="flex items-center gap-2"> + {% include "contracts/includes/private_info_icon.html" %} + <span class="text-red-600">Neveřejná smlouva</span> + </div> + {% endif %} + </h2> </div> </div> @@ -122,24 +131,24 @@ {% if user.can_view_confidential %} <tr> - <td class="w-1/5 !p-2.5"> + <td class="w-1/5 !p-2.5 !bg-red-100"> <div class="flex items-center"> {% include "contracts/includes/private_info_icon.html" %} - Neveřejné soubory + <span class="text-red-600">Neveřejné soubory</span> </div> </td> - <td class="w-4/5 !pl-2.5 !py-1 !pr-1"> + <td class="w-4/5 !pl-2.5 !py-1 !pr-1 !bg-red-100"> {% with contract.get_private_files as files %} {% if files|length != 0 %} <ul class="flex gap-2"> {% for file in files %} <li> - {% include "contracts/includes/tag.html" with url=file.protected_url icon="ico--attachment" content=file.name %} + {% include "contracts/includes/tag.html" with url=file.protected_url icon="ico--attachment" content=file.name public=contract.is_public %} </li> {% endfor %} </ul> {% else %} - <span class="text-grey-200">Žádné</span> + <span class="text-red-500">Žádné</span> {% endif %} {% endwith %} </td> @@ -280,14 +289,14 @@ {% if user.can_view_confidential and contract.notes %} <tr> - <td class="w-1/5 !p-2.5"> + <td class="w-1/5 !p-2.5 !bg-red-100"> <div class="flex items-center"> {% include "contracts/includes/private_info_icon.html" %} - Interní poznámky + <span class="text-red-600">Interní poznámky</span> </div> </td> - <td class="w-4/5 !p-1.5"> - <div class="prose max-w-none"> + <td class="w-4/5 !p-1.5 !bg-red-100"> + <div class="prose max-w-none text-red-600"> {{ contract.notes|markdownify|safe }} </div> </td> @@ -316,7 +325,7 @@ {% for signature in signatures %} <li class="p-3 border border-gray-300 rounded-md"> <address class="mb-3"> - <div class="mb-1"> + <div class="mb-2"> <a class="inline-block p-1.5 mb-1 rounded-sm cursor-pointer not-italic hover:no-underline bg-gray-200 duration-100 hover:bg-gray-300" href="{{ signature.contractee.url }}" @@ -375,7 +384,7 @@ {% for signature in signatures %} <li class="p-3 border border-gray-300 rounded-md"> <address class="mb-3"> - <div class="mb-1"> + <div class="mb-2"> <a class="inline-block p-1.5 mb-1 rounded-sm cursor-pointer not-italic hover:no-underline bg-gray-200 duration-100 hover:bg-gray-300" href="{{ signature.signee.url }}" @@ -391,13 +400,19 @@ </a> </div> - <div class="mb-1"> + <div class="mb-2"> {{ signature.signee.get_entity_type_display }} + </div> + {% if user.can_view_confidential %} + <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> + {% endif %} + + <div> {% if not signature.signee.entity_has_public_address %} {% if user.can_view_confidential %} - <div class="my-2 flex items-center"> - {% include "contracts/includes/private_info_icon.html" %}<span class="text-gray-500">Máš přístup k celé adrese.</span> + <div class="flex items-center mb-3"> + {% include "contracts/includes/private_info_icon.html" %}<span class="text-red-600">Máš přístup k celé adrese.</span> </div> {% else %} <span class="text-gray-500">(zobrazujeme pouze obec)</span> @@ -416,6 +431,10 @@ {% if signature.signee.ico_number %} IČO: {{ signature.signee.ico_number }}<br> {% endif %} + + {% if user.can_view_confidential %} + </div> + {% endif %} </address> {% with contract.signee_representatives.all as representatives %} diff --git a/contracts/templates/contracts/view_signee.html b/contracts/templates/contracts/view_signee.html index 3fe8e62029755923a299fd016b3fa74de213094c..85f7d52c499be290ca500557d1114c87204284bc 100644 --- a/contracts/templates/contracts/view_signee.html +++ b/contracts/templates/contracts/view_signee.html @@ -12,7 +12,7 @@ </div> <address class="mb-8"> - <div class="mb-1"> + <div class="mb-2"> <strong>{{ signee.name }}</strong> {% if signee.department %} - {{ signee.department }} @@ -22,14 +22,19 @@ {% endif %} </div> - <div class="mb-1"> + <div class="mb-2"> {{ signee.get_entity_type_display }} + </div> + {% if user.can_view_confidential %} + <div class="border !bg-red-100 border-red-200 p-1.5 rounded-md mt-1.5 mb-2 inline-block"> + {% endif %} + + <div> {% if not signee.entity_has_public_address %} {% if user.can_view_confidential %} - <div class="my-2 flex items-center"> - {% include "contracts/includes/private_info_icon.html" %} - <span class="text-gray-500">Máš přístup k celé adrese.</span> + <div class="flex items-center mb-3"> + {% include "contracts/includes/private_info_icon.html" %}<span class="text-red-600">Máš přístup k celé adrese.</span> </div> {% else %} <span class="text-gray-500">(zobrazujeme pouze obec)</span> @@ -48,6 +53,10 @@ {% if signee.ico_number %} IČO: {{ signee.ico_number }}<br> {% endif %} + + {% if user.can_view_confidential %} + </div> + {% endif %} </address> <h2 class="text-lg font-bold mb-10"> diff --git a/contracts/urls.py b/contracts/urls.py index 2dcfbb61626df12e4c6903e18938171cc62c1311..0ba41911b3d892c0f2ed4d0c8c15753949ea824d 100644 --- a/contracts/urls.py +++ b/contracts/urls.py @@ -1,4 +1,3 @@ -import dal.autocomplete from django.urls import path from . import models, views @@ -36,46 +35,6 @@ urlpatterns = [ path("signee", views.view_signees, name="view_signees"), path("contractees/<int:id>", views.view_contractee, name="view_contractee"), path("signee/<int:id>", views.view_signee, name="view_signee"), - path( - "contracts/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.Contract), - name="select2_djhacker_contract_autocomplete", - ), - path( - "contracts/issues/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.ContractIssue), - name="select2_djhacker_contract_issue_autocomplete", - ), - path( - "contracts/filing-areas/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.ContractFilingArea), - name="select2_djhacker_contract_filing_area_autocomplete", - ), - path( - "contracts/types/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.ContractType), - name="select2_djhacker_contract_type_autocomplete", - ), - path( - "contracts/signees/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.Signee), - name="select2_djhacker_signee_autocomplete", - ), - path( - "contracts/contractees/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.Contractee), - name="select2_djhacker_contractee_autocomplete", - ), - path( - "contracts/signees/signatures/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.SigneeSignature), - name="select2_djhacker_signee_signature_autocomplete", - ), - path( - "contracts/contractees/signatures/autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.ContracteeSignature), - name="select2_djhacker_contractee_signature_autocomplete", - ), path( "ares-info-proxy/<int:ico>", views.get_ares_info, diff --git a/registry/templates/admin/base_site.html b/registry/templates/admin/base_site.html index d593e815a12d109597cc5930c19e6db9a7f778c8..6048f3e499958641437702a3e6b1284f42409b6f 100644 --- a/registry/templates/admin/base_site.html +++ b/registry/templates/admin/base_site.html @@ -1,4 +1,5 @@ {% extends 'admin/base_site.html' %} +{% load static %} {% block extrastyle %}{{ block.super }} <style> diff --git a/registry/urls.py b/registry/urls.py index c12fecc96e1c3ac179f7fcdb216051330adfaed8..dd62a4fefa07e62634762bf82825688545108c47 100644 --- a/registry/urls.py +++ b/registry/urls.py @@ -25,7 +25,6 @@ import registry.admin urlpatterns = [ path("", include("contracts.urls")), - path("", include("users.urls")), path("markdownx/", include("markdownx.urls")), path("oidc/", include("oidc.urls")), path("media/", include("media_server.urls")), diff --git a/requirements/base.txt b/requirements/base.txt index 767a0d8ffb9a418aea2c43bf7b1b4b43b2e17424..eb6b81c8c065ed5d96e9dcd97224802a0d6ab377 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,3 @@ -dal-admin-filters==1.1.0 django==4.1.4 django-admin-index==2.0.2 django-admin-interface==0.24.2 @@ -9,7 +8,6 @@ django-downloadview==2.3.0 django-fieldsets-with-inlines==0.6 django-import-export==3.1.0 django-nested-inline==0.4.6 -djhacker==0.2.3 django-ordered-model==3.7.1 psycopg2-binary==2.9.5 django-webpack-loader==1.8.0 diff --git a/shared/templates/shared/includes/base.html b/shared/templates/shared/includes/base.html index 12f7d15555997299d327b64c26742b5d29f87fa2..22bcd06070029f355b850814685dacb94a9e5ebb 100644 --- a/shared/templates/shared/includes/base.html +++ b/shared/templates/shared/includes/base.html @@ -72,17 +72,26 @@ <div v-if="show || isLgScreenSize" class="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto"> <ul class="navbar-menu text-white"> - <li class="navbar-menu__item"> - <a href="{% url "contracts:index" %}" data-href="{% url "contracts:index" %}" class="navbar-menu__link">Seznam</a> - </li> - <li class="navbar-menu__item"> - <a href="#TODO" data-href="#TODO" class="navbar-menu__link">Hledat</a> - </li> {% if user.is_staff %} <li class="navbar-menu__item"> - <a href="{% url "admin:index" %}" data-href="{% url "admin:index" %}" class="navbar-menu__link">Administrace</a> + <a + href="{% url "admin:index" %}" + data-href="{% url "admin:index" %}" + class="navbar-menu__link flex items-center gap-2" + > + <i class="ico--power text-sm"></i>Administrace + </a> </li> {% endif %} + <li class="navbar-menu__item"> + <a + href="#TODO" + data-href="#TODO" + class="navbar-menu__link flex items-center gap-2" + > + <i class="ico--search text-sm"></i>Hledat + </a> + </li> </ul> </div> diff --git a/users/urls.py b/users/urls.py deleted file mode 100644 index a86d9cdaca454b5ccdf37de10019f83baf3e5580..0000000000000000000000000000000000000000 --- a/users/urls.py +++ /dev/null @@ -1,13 +0,0 @@ -import dal.autocomplete -from django.urls import path - -from . import models, views - -app_name = "users" -urlpatterns = [ - path( - "autocomplete", - dal.autocomplete.Select2QuerySetView.as_view(model=models.User), - name="select2_djhacker_user_autocomplete", - ), -]