0001-applications-sort-elements-on-manifest-page-63882.patch
hobo/applications/templates/hobo/applications/manifest.html | ||
---|---|---|
28 | 28 | |
29 | 29 |
<ul class="objects-list single-links application-content"> |
30 | 30 |
{% for relation in relations %} |
31 |
{% if not relation.auto_dependency %} |
|
32 |
<li> |
|
33 |
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}> |
|
34 |
{% if relation.element.error %}<span class="tag tag-error">{{ relation.element.get_error_status_display }}</span>{% endif %} |
|
35 |
{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span> |
|
36 |
</a> |
|
37 |
{% if app.editable %}<a rel="popup" class="delete" href="{% url 'application-delete-element' app_slug=app.slug pk=relation.id %}">{% trans "remove" %}</a>{% endif %} |
|
38 |
</li> |
|
39 |
{% endif %} |
|
40 |
{% endfor %} |
|
41 |
{% for relation in relations %} |
|
42 |
{% if relation.auto_dependency %} |
|
43 |
<li class="auto-dependency"> |
|
44 |
<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> |
|
45 |
</li> |
|
46 |
{% endif %} |
|
31 |
<li {% if relation.auto_dependency %}class="auto-dependency"{% endif %}> |
|
32 |
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}> |
|
33 |
{% if relation.element.error %}<span class="tag tag-error">{{ relation.element.get_error_status_display }}</span>{% endif %} |
|
34 |
{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span> |
|
35 |
</a> |
|
36 |
{% 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 %} |
|
37 |
</li> |
|
47 | 38 |
{% endfor %} |
48 | 39 |
</ul> |
49 | 40 |
hobo/applications/views.py | ||
---|---|---|
99 | 99 |
context['types_by_service'] = {} |
100 | 100 | |
101 | 101 |
type_labels = {} |
102 |
for object_type in get_object_types(): |
|
102 |
object_types = get_object_types() |
|
103 |
types = [o['id'] for o in object_types] |
|
104 |
for object_type in object_types: |
|
103 | 105 |
type_labels[object_type['id']] = object_type['singular'] |
104 | 106 |
if object_type.get('minor'): |
105 | 107 |
continue |
... | ... | |
110 | 112 | |
111 | 113 |
for relation in context['relations']: |
112 | 114 |
relation.element.type_label = type_labels.get(relation.element.type) |
115 |
context['relations'] = sorted( |
|
116 |
context['relations'], |
|
117 |
key=lambda a: (a.auto_dependency, types.index(a.element.type), simplify(a.element.name)), |
|
118 |
) |
|
113 | 119 | |
114 | 120 |
return context |
115 | 121 |
tests/test_application.py | ||
---|---|---|
1 | 1 |
import base64 |
2 | 2 |
import io |
3 | 3 |
import json |
4 |
import random |
|
4 | 5 |
import re |
5 | 6 |
import tarfile |
6 | 7 | |
... | ... | |
379 | 380 |
app.get('/applications/manifest/test/delete/%s/' % application.relation_set.first().pk, status=404) |
380 | 381 | |
381 | 382 | |
383 |
def test_manifest_ordering(app, admin_user, settings): |
|
384 |
Wcs.objects.create(base_url='https://wcs.example.invalid', slug='foobar', title='Foobar') |
|
385 | ||
386 |
settings.KNOWN_SERVICES = { |
|
387 |
'wcs': { |
|
388 |
'foobar': { |
|
389 |
'title': 'Foobar', |
|
390 |
'url': 'https://wcs.example.invalid/', |
|
391 |
'orig': 'example.org', |
|
392 |
'secret': 'xxx', |
|
393 |
} |
|
394 |
} |
|
395 |
} |
|
396 | ||
397 |
application = Application.objects.create(name='Test', slug='test') |
|
398 |
objects = [ |
|
399 |
# type, slug, auto_dependency |
|
400 |
('forms', 'bar', True), |
|
401 |
('forms', 'foo', True), |
|
402 |
('cards', 'bar', True), |
|
403 |
('cards', 'foo', True), |
|
404 |
('workflows', 'bar', True), |
|
405 |
('workflows', 'foo', True), |
|
406 |
('forms', 'baaaar', False), |
|
407 |
('forms', 'foooo', False), |
|
408 |
('cards', 'baaaar', False), |
|
409 |
('cards', 'foooo', False), |
|
410 |
('workflows', 'baaaar', False), |
|
411 |
('workflows', 'foooo', False), |
|
412 |
] |
|
413 |
random.shuffle(objects) |
|
414 |
for _type, slug, auto_dependency in objects: |
|
415 |
element = Element.objects.create( |
|
416 |
type=_type, |
|
417 |
slug=slug, |
|
418 |
name=slug.title(), |
|
419 |
cache={}, |
|
420 |
) |
|
421 |
Relation.objects.create(application=application, element=element, auto_dependency=auto_dependency) |
|
422 | ||
423 |
login(app) |
|
424 |
with HTTMock(mocked_http): |
|
425 |
resp = app.get('/applications/manifest/test/') |
|
426 |
assert resp.pyquery('.application-content li a').text() == ( |
|
427 |
'Baaaar - Form remove ' |
|
428 |
'Foooo - Form remove ' |
|
429 |
'Baaaar - Card Model remove ' |
|
430 |
'Foooo - Card Model remove ' |
|
431 |
'Baaaar - Workflow remove ' |
|
432 |
'Foooo - Workflow remove ' |
|
433 |
'Bar - Form ' |
|
434 |
'Foo - Form ' |
|
435 |
'Bar - Card Model ' |
|
436 |
'Foo - Card Model ' |
|
437 |
'Bar - Workflow ' |
|
438 |
'Foo - Workflow' |
|
439 |
) |
|
440 | ||
441 | ||
382 | 442 |
def test_scandeps_on_unknown_element(app, admin_user, settings): |
383 | 443 |
Wcs.objects.create(base_url='https://wcs.example.invalid', slug='foobar', title='Foobar') |
384 | 444 | |
385 |
- |