Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions integreat_cms/cms/templates/pois/poi_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{% load i18n %}
{% load rules %}
{% load static %}
{% load sort_tags %}
{% load content_filters %}
{% block content %}
{% get_current_language as LANGUAGE_CODE %}
Expand Down Expand Up @@ -62,14 +63,19 @@ <h1 class="heading">
</form>
<table class="w-full mt-4 rounded border border-gray-200 shadow bg-white">
<thead>
{% translate "Street" as street_label %}
{% translate "Postal Code" as postcode_label %}
{% translate "City" as city_label %}
{% translate "Country" as country_label %}
{% translate "Category" as category_label %}
<tr class="border-b border-gray-200">
<th class="py-3 pl-4 pr-2 min">
{% if perms.cms.change_poi %}
<input form="bulk-action-form" type="checkbox" id="bulk-select-all" />
{% endif %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Title in" %} {{ language.translated_name }}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link title_label "translations__title" %}
</th>
{% if backend_language and backend_language != language %}
<th class="text-sm text-left uppercase py-3 pr-2">
Expand All @@ -93,20 +99,20 @@ <h1 class="heading">
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Publication status" %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Street" %}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link street_label "address" %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Postal Code" %}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link postcode_label "postcode" %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "City" %}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link city_label "city" %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Country" %}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link country_label "country" %}
</th>
<th class="text-sm text-left uppercase py-3 pr-2">
{% translate "Category" %}
<th class="whitespace-nowrap text-sm text-left uppercase py-3 pr-2">
{% sort_link category_label "category" %}
</th>
<th class="text-sm text-right uppercase py-3 pr-4 min">
{% translate "Options" %}
Expand Down
5 changes: 4 additions & 1 deletion integreat_cms/cms/templatetags/sort_tags.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django import template
from django.template.context import RequestContext
from django.utils.html import escape
from django.utils.http import urlencode
from django.utils.safestring import mark_safe

Expand Down Expand Up @@ -31,7 +32,9 @@ def sort_link(context: RequestContext, label: str, field: str) -> str:

url = f"?{urlencode(params, doseq=True)}"

return mark_safe(f'<a href="{url}" class="hover:underline">{label}{arrow}</a>')
return mark_safe(
f'<a href="{url}" class="hover:underline">{escape(label)}{arrow}</a>'
)


@register.inclusion_tag("_sortable_table_header.html", takes_context=True)
Expand Down
20 changes: 19 additions & 1 deletion integreat_cms/cms/views/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.conf import settings
from django.contrib.auth.mixins import UserPassesTestMixin
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Min
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic.base import ContextMixin, TemplateResponseMixin
Expand Down Expand Up @@ -237,5 +238,22 @@ def get_filtered_sorted_queryset(self, queryset: QuerySet) -> QuerySet:
if order_by:
# queryset.order_by([]) would override default ordering and result in an unordered queryset
# so we only use order_by if "sort" is not empty
return queryset.order_by(*order_by)
annotations = {}
final_order = []
for f in order_by:
bare = f.lstrip("-")
descending = f.startswith("-")
if "__" in bare:
# Sorting by a relational field via JOIN produces duplicate rows.
# Use Min annotation instead, which collapses via GROUP BY.
annotation_name = f"_sort_{bare.replace('__', '_')}"
annotations[annotation_name] = Min(bare)
final_order.append(
f"-{annotation_name}" if descending else annotation_name
)
else:
final_order.append(f)
if annotations:
queryset = queryset.annotate(**annotations)
queryset = queryset.order_by(*final_order)
return queryset
10 changes: 10 additions & 0 deletions integreat_cms/cms/views/pois/poi_list_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,15 @@ class POIListView(
#: The translation model of this list view (used to determine whether machine translations are permitted)
translation_model = POITranslation
model = POI
table_fields = [
("translations__title", _("Title")),
(None, _("Publication status")),
("address", _("Street")),
("postcode", _("Postal Code")),
("city", _("City")),
("country", _("Country")),
("category", _("Category")),
]

def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
r"""
Expand Down Expand Up @@ -105,5 +114,6 @@ def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
"source_language": region.get_source_language(language.slug),
"content_type": "locations",
"is_archive": self.archived,
"title_label": "{} {}".format(_("Title in"), language.translated_name),
},
)
13 changes: 8 additions & 5 deletions integreat_cms/locale/de/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ msgid "CMS"
msgstr "CMS"

#: cms/constants/administrative_division.py cms/templates/pois/poi_list.html
#: cms/views/pois/poi_list_view.py
msgid "City"
msgstr "Stadt"

Expand Down Expand Up @@ -1941,7 +1942,7 @@ msgstr "{} hier eingeben"
#: cms/templates/content_versions.html cms/templates/events/event_form.html
#: cms/templates/events/event_list.html cms/templates/pages/page_form.html
#: cms/templates/pages/pages_page_tree.html cms/templates/pois/poi_form.html
#: cms/templates/pois/poi_list.html
#: cms/templates/pois/poi_list.html cms/views/pois/poi_list_view.py
msgid "Publication status"
msgstr "Veröffentlichungsstatus"

Expand Down Expand Up @@ -2071,6 +2072,7 @@ msgstr "Alle Kategorien"
#: cms/templates/feedback/admin_feedback_list.html
#: cms/templates/feedback/region_feedback_list.html
#: cms/templates/pois/poi_list.html cms/views/feedback/feedback_resource.py
#: cms/views/pois/poi_list_view.py
msgid "Category"
msgstr "Kategorie"

Expand Down Expand Up @@ -3664,7 +3666,7 @@ msgstr "Ob die Seite explizit archiviert ist oder nicht"
#: cms/templates/events/event_form.html cms/templates/events/event_list.html
#: cms/templates/pages/_generic_page_tree_header.html
#: cms/templates/pages/page_form.html cms/templates/pois/poi_form.html
#: cms/templates/pois/poi_list.html
#: cms/templates/pois/poi_list.html cms/views/pois/poi_list_view.py
msgid "Title in"
msgstr "Titel auf"

Expand Down Expand Up @@ -7649,6 +7651,7 @@ msgstr "Keine Änderungen vorgenommen."

#: cms/templates/pages/_page_xliff_import_diff.html
#: cms/templates/push_notifications/push_notification_list.html
#: cms/views/pois/poi_list_view.py
msgid "Title"
msgstr "Titel"

Expand Down Expand Up @@ -8280,15 +8283,15 @@ msgid ""
msgstr ""
"Sie können Orte nur in der Standard-Sprache (%(default_language)s) anlegen."

#: cms/templates/pois/poi_list.html
#: cms/templates/pois/poi_list.html cms/views/pois/poi_list_view.py
msgid "Street"
msgstr "Straße"

#: cms/templates/pois/poi_list.html
#: cms/templates/pois/poi_list.html cms/views/pois/poi_list_view.py
msgid "Postal Code"
msgstr "Postleitzahl"

#: cms/templates/pois/poi_list.html
#: cms/templates/pois/poi_list.html cms/views/pois/poi_list_view.py
msgid "Country"
msgstr "Land"

Expand Down
Loading