applications: sort elements on manifest page (#63882)
This commit is contained in:
parent
25a3dda4a4
commit
cc5e852abc
|
@ -28,22 +28,13 @@
|
|||
|
||||
<ul class="objects-list single-links application-content">
|
||||
{% for relation in relations %}
|
||||
{% if not relation.auto_dependency %}
|
||||
<li>
|
||||
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}>
|
||||
{% if relation.element.error %}<span class="tag tag-error">{{ relation.element.get_error_status_display }}</span>{% endif %}
|
||||
{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span>
|
||||
</a>
|
||||
{% if app.editable %}<a rel="popup" class="delete" href="{% url 'application-delete-element' app_slug=app.slug pk=relation.id %}">{% trans "remove" %}</a>{% endif %}
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% for relation in relations %}
|
||||
{% if relation.auto_dependency %}
|
||||
<li class="auto-dependency">
|
||||
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}>{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span></a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li {% if relation.auto_dependency %}class="auto-dependency"{% endif %}>
|
||||
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}>
|
||||
{% if relation.element.error %}<span class="tag tag-error">{{ relation.element.get_error_status_display }}</span>{% endif %}
|
||||
{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span>
|
||||
</a>
|
||||
{% if app.editable and not relation.auto_dependency %}<a rel="popup" class="delete" href="{% url 'application-delete-element' app_slug=app.slug pk=relation.id %}">{% trans "remove" %}</a>{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
|
|
|
@ -17,9 +17,7 @@
|
|||
import dataclasses
|
||||
import io
|
||||
import json
|
||||
import re
|
||||
import tarfile
|
||||
import unicodedata
|
||||
import urllib.parse
|
||||
|
||||
from django.conf import settings
|
||||
|
@ -28,7 +26,6 @@ from django.db.models import Prefetch
|
|||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.text import slugify
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.views.generic import DetailView, FormView, ListView, TemplateView
|
||||
|
@ -100,7 +97,9 @@ class ManifestView(TemplateView):
|
|||
context['types_by_service'] = {}
|
||||
|
||||
type_labels = {}
|
||||
for object_type in get_object_types():
|
||||
object_types = get_object_types()
|
||||
types = [o['id'] for o in object_types]
|
||||
for object_type in object_types:
|
||||
type_labels[object_type['id']] = object_type['singular']
|
||||
if object_type.get('minor'):
|
||||
continue
|
||||
|
@ -111,6 +110,10 @@ class ManifestView(TemplateView):
|
|||
|
||||
for relation in context['relations']:
|
||||
relation.element.type_label = type_labels.get(relation.element.type)
|
||||
context['relations'] = sorted(
|
||||
context['relations'],
|
||||
key=lambda a: (a.auto_dependency, types.index(a.element.type), slugify(a.element.name)),
|
||||
)
|
||||
|
||||
return context
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import base64
|
||||
import io
|
||||
import json
|
||||
import random
|
||||
import re
|
||||
import tarfile
|
||||
|
||||
|
@ -381,6 +382,65 @@ def test_create_application(app, admin_user, settings, analyze):
|
|||
app.get('/applications/manifest/test/delete/%s/' % application.relation_set.first().pk, status=404)
|
||||
|
||||
|
||||
def test_manifest_ordering(app, admin_user, settings):
|
||||
Wcs.objects.create(base_url='https://wcs.example.invalid', slug='foobar', title='Foobar')
|
||||
|
||||
settings.KNOWN_SERVICES = {
|
||||
'wcs': {
|
||||
'foobar': {
|
||||
'title': 'Foobar',
|
||||
'url': 'https://wcs.example.invalid/',
|
||||
'orig': 'example.org',
|
||||
'secret': 'xxx',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
application = Application.objects.create(name='Test', slug='test')
|
||||
objects = [
|
||||
# type, slug, auto_dependency
|
||||
('forms', 'bar', True),
|
||||
('forms', 'foo', True),
|
||||
('cards', 'bar', True),
|
||||
('cards', 'foo', True),
|
||||
('workflows', 'bar', True),
|
||||
('workflows', 'foo', True),
|
||||
('forms', 'baaaar', False),
|
||||
('forms', 'foooo', False),
|
||||
('cards', 'baaaar', False),
|
||||
('cards', 'foooo', False),
|
||||
('workflows', 'baaaar', False),
|
||||
('workflows', 'foooo', False),
|
||||
]
|
||||
random.shuffle(objects)
|
||||
for _type, slug, auto_dependency in objects:
|
||||
element = Element.objects.create(
|
||||
type=_type,
|
||||
slug=slug,
|
||||
name=slug.title(),
|
||||
cache={},
|
||||
)
|
||||
Relation.objects.create(application=application, element=element, auto_dependency=auto_dependency)
|
||||
|
||||
login(app)
|
||||
with HTTMock(mocked_http):
|
||||
resp = app.get('/applications/manifest/test/')
|
||||
assert resp.pyquery('.application-content li a').text() == (
|
||||
'Baaaar - Form remove '
|
||||
'Foooo - Form remove '
|
||||
'Baaaar - Card Model remove '
|
||||
'Foooo - Card Model remove '
|
||||
'Baaaar - Workflow remove '
|
||||
'Foooo - Workflow remove '
|
||||
'Bar - Form '
|
||||
'Foo - Form '
|
||||
'Bar - Card Model '
|
||||
'Foo - Card Model '
|
||||
'Bar - Workflow '
|
||||
'Foo - Workflow'
|
||||
)
|
||||
|
||||
|
||||
def test_scandeps_on_unknown_element(app, admin_user, settings):
|
||||
Wcs.objects.create(base_url='https://wcs.example.invalid', slug='foobar', title='Foobar')
|
||||
|
||||
|
|
Loading…
Reference in New Issue