Projet

Général

Profil

0001-applications-sort-elements-on-manifest-page-63882.patch

Lauréline Guérin, 14 novembre 2022 21:08

Télécharger (6,1 ko)

Voir les différences:

Subject: [PATCH] applications: sort elements on manifest page (#63882)

 .../templates/hobo/applications/manifest.html | 23 +++----
 hobo/applications/views.py                    |  8 ++-
 tests/test_application.py                     | 60 +++++++++++++++++++
 3 files changed, 74 insertions(+), 17 deletions(-)
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
-