Support separate sortable fields

Add support to sort a model column by a field
other than the one being displayed.

Fix the missing column issue in the list subtemplate.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-02-05 05:47:40 -04:00
parent bd12d587ee
commit 71c2a7773e
2 changed files with 28 additions and 14 deletions

View File

@@ -50,17 +50,19 @@
<th>{% trans 'Identifier' %}</th>
{% else %}
{% get_source_columns source=object_list only_identifier=True as source_column %}
<th>
{% if source_column.is_sortable %}
<a href="{% get_sort_field_querystring column=source_column %}">{{ source_column.label }}
{% if source_column.attribute == sort_field %}
{% if icon_sort %}{{ icon_sort.render }}{% endif %}
{% if source_column %}
<th>
{% if source_column.is_sortable %}
<a href="{% get_sort_field_querystring column=source_column %}">{{ source_column.label }}
{% if source_column.get_sort_field == sort_field %}
{% if icon_sort %}{{ icon_sort.render }}{% endif %}
{% endif %}
</a>
{% else %}
{{ source_column.label }}
{% endif %}
</a>
{% else %}
{{ source_column.label }}
{% endif %}
</th>
</th>
{% endif %}
{% endif %}
{% if not hide_columns %}
@@ -69,7 +71,7 @@
<th>
{% if column.is_sortable %}
<a href="{% get_sort_field_querystring column=column %}">{{ column.label }}
{% if column.attribute == sort_field %}
{% if column.get_sort_field == sort_field %}
{% if icon_sort %}{{ icon_sort.render }}{% endif %}
{% endif %}
</a>

View File

@@ -561,7 +561,12 @@ class SourceColumn(object):
return final_result
def __init__(self, source, attribute=None, empty_value=None, func=None, include_label=False, is_absolute_url=False, is_identifier=False, is_sortable=False, kwargs=None, label=None, order=None, views=None, widget=None):
def __init__(
self, source, attribute=None, empty_value=None, func=None,
include_label=False, is_absolute_url=False, is_identifier=False,
is_sortable=False, kwargs=None, label=None, order=None, sort_field=None,
views=None, widget=None
):
self.source = source
self._label = label
self.attribute = attribute
@@ -576,6 +581,7 @@ class SourceColumn(object):
self.__class__._registry.setdefault(source, [])
self.__class__._registry[source].append(self)
self.label = None
self.sort_field = sort_field
self.views = views or []
self.widget = widget
@@ -603,6 +609,12 @@ class SourceColumn(object):
self.label = self._label
def get_sort_field(self):
if self.sort_field:
return self.sort_field
else:
return self.attribute
def get_sort_field_querystring(self, context):
# We do this to get an mutable copy we can modify
querystring = context.request.GET.copy()
@@ -612,7 +624,7 @@ class SourceColumn(object):
TEXT_SORT_ORDER_VARIABLE_NAME, TEXT_SORT_ORDER_CHOICE_DESCENDING
)
if previous_sort_field != self.attribute:
if previous_sort_field != self.get_sort_field():
sort_order = TEXT_SORT_ORDER_CHOICE_ASCENDING
else:
if previous_sort_order == TEXT_SORT_ORDER_CHOICE_DESCENDING:
@@ -620,7 +632,7 @@ class SourceColumn(object):
else:
sort_order = TEXT_SORT_ORDER_CHOICE_DESCENDING
querystring[TEXT_SORT_FIELD_PARAMETER] = self.attribute
querystring[TEXT_SORT_FIELD_PARAMETER] = self.get_sort_field()
querystring[TEXT_SORT_ORDER_PARAMETER] = sort_order
return '?{}'.format(querystring.urlencode())