applications: sort elements on manifest page (#63882)
gitea-wip/hobo/pipeline/head There was a failure building this commit Details
gitea/hobo/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Lauréline Guérin 2022-11-14 21:07:47 +01:00
parent 25a3dda4a4
commit cc5e852abc
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 74 additions and 20 deletions

View File

@ -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>

View File

@ -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

View File

@ -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')