Projet

Général

Profil

0001-misc-add-distance-template-tag-32262.patch

Thomas Noël, 16 avril 2019 16:08

Télécharger (7,09 ko)

Voir les différences:

Subject: [PATCH] misc: add distance template tag (#32262)

 debian/control                    |  1 +
 setup.py                          |  1 +
 tests/test_formdata.py            | 11 +++++++++++
 tests/test_templates.py           | 30 ++++++++++++++++++++++++++++++
 tox.ini                           |  1 +
 wcs/qommon/templatetags/qommon.py | 29 +++++++++++++++++++++++++++++
 6 files changed, 73 insertions(+)
debian/control
17 17
    python-django-ckeditor,
18 18
    python-feedparser,
19 19
    python-imaging,
20
    python-pyproj,
20 21
    python-requests,
21 22
    python-vobject,
22 23
    python-xstatic-leaflet,
setup.py
110 110
            'gadjo>=0.53',
111 111
            'django-ckeditor<4.5.3',
112 112
            'XStatic-Leaflet',
113
            'pyproj',
113 114
        ],
114 115
        package_dir = { 'wcs': 'wcs' },
115 116
        packages = find_packages(),
tests/test_formdata.py
788 788
            assert WorkflowStatusItem.compute('=form_var_map_lon', raises=True) == 4
789 789
            assert WorkflowStatusItem.compute('{{ form_var_map_lon }}', raises=True) == '4.0'
790 790

  
791
            assert WorkflowStatusItem.compute('{{ form_var_map|distance:form_var_map|floatformat }}', raises=True) == '0'
792
            assert WorkflowStatusItem.compute('{{ form_var_map|distance:"2.1;4.1"|floatformat }}', raises=True) == '15685.4'
793
            assert WorkflowStatusItem.compute('{{ "2.1;4.1"|distance:form_var_map|floatformat }}', raises=True) == '15685.4'
794
            assert WorkflowStatusItem.compute('{{ form|distance:"1;2"|floatformat }}', raises=True) == '0'
795
            assert WorkflowStatusItem.compute('{{ form|distance:"1.1;2.1"|floatformat }}', raises=True) == '15689.1'
796
            assert WorkflowStatusItem.compute('{{ "1.1;2.1"|distance:form|floatformat }}', raises=True) == '15689.1'
797
            assert WorkflowStatusItem.compute('{{ form|distance:form_var_map|floatformat }}', raises=True) == '248515.5'
798
            assert WorkflowStatusItem.compute('{{ form_var_map|distance:form|floatformat }}', raises=True) == '248515.5'
799

  
791 800
    formdata.data['7'] = None
792 801
    formdata.store()
793 802
    pub.substitutions.reset()
......
798 807
        pub.substitutions.feed(formdef)
799 808
        with pub.substitutions.temporary_feed(formdata, force_mode=mode):
800 809
            assert WorkflowStatusItem.compute('=form_var_map', raises=True) is None
810
            assert WorkflowStatusItem.compute('{{ form_var_map|distance:"1;2"|floatformat }}', raises=True) == ''
811
            assert WorkflowStatusItem.compute('{{ "1;2"|distance:form_var_map|floatformat }}', raises=True) == ''
801 812

  
802 813
def test_lazy_conditions(pub, variable_test_data):
803 814
    condition = Condition({'type': 'django', 'value': 'form_var_foo_foo == "bar"'})
tests/test_templates.py
7 7
from quixote import cleanup
8 8
from qommon.template import Template, TemplateError
9 9
from wcs.conditions import Condition
10
from wcs.variables import LazyFormData
10 11

  
11 12
from utilities import create_temporary_pub, clean_temporary_pub
12 13

  
......
459 460
    assert not any(set(token) & set('01IiOo') for token in tokens)
460 461
    t = Template('{% if token1|token_check:token2 %}ok{% endif %}')
461 462
    assert t.render({'token1': tokens[0] + ' ', 'token2': tokens[0].lower()}) == 'ok'
463

  
464
def test_distance():
465
    t = Template('{{ "48;2"|distance:"48.1;2.1"|floatformat }}',)
466
    assert t.render() == '13387.2'
467
    t = Template('{{ coords|distance:"48.1;2.1"|floatformat }}',)
468
    assert t.render({'coords': '48;2'}) == '13387.2'
469
    t = Template('{{ "48;2"|distance:coords|floatformat }}',)
470
    assert t.render({'coords': '48.1;2.1'}) == '13387.2'
471
    t = Template('{{ c1|distance:c2|floatformat }}',)
472
    assert t.render({'c1': '48;2', 'c2': '48.1;2.1'}) == '13387.2'
473

  
474
    class MockFormData(object):
475
        formdef = None
476
        geolocations = {'base': {'lat': 48, 'lon': 2}}
477

  
478
    lazy_formdata = LazyFormData(MockFormData())
479
    for tpl in ('{{ formdata|distance:coords|floatformat }}',
480
                '{{ coords|distance:formdata|floatformat }}'):
481
        t = Template(tpl,)
482
        assert t.render({'formdata': lazy_formdata, 'coords': '48.1;2.1'}) == '13387.2'
483
        assert t.render({'formdata': lazy_formdata, 'coords': '49.1;3.1'}) == '146821.9'
484
        assert t.render({'formdata': lazy_formdata, 'coords': 'abc;def'}) == ''
485
        assert t.render({'formdata': lazy_formdata, 'coords': '42'}) == ''
486
        assert t.render({'formdata': lazy_formdata, 'coords': ''}) == ''
487
    MockFormData.geolocations = {}
488
    for tpl in ('{{ formdata|distance:coords|floatformat }}',
489
                '{{ coords|distance:formdata|floatformat }}'):
490
        t = Template(tpl,)
491
        assert t.render({'formdata': lazy_formdata, 'coords': '49.1;3.1'}) == ''
tox.ini
30 30
    python-dateutil
31 31
    pillow
32 32
    feedparser
33
    pyproj
33 34
commands =
34 35
    ./getlasso.sh
35 36
    pickle:  py.test --without-postgresql-tests {env:COVERAGE:} {posargs:tests}
wcs/qommon/templatetags/qommon.py
23 23
import string
24 24
import random
25 25

  
26
from pyproj import Geod
27

  
26 28
from django import template
27 29
from django.template import defaultfilters
28 30
from django.utils import dateparse
......
300 302
@register.filter
301 303
def token_check(token1, token2):
302 304
    return token1.strip().upper() == token2.strip().upper()
305

  
306

  
307
def get_latlon(obj):
308
    if getattr(obj, 'geoloc', None):
309
        if 'base' in obj.geoloc:
310
            return obj.geoloc['base']['lat'], obj.geoloc['base']['lon']
311
        return None, None
312
    if hasattr(obj, 'get_value'):
313
        obj = obj.get_value()  # unlazy
314
    if not obj or not isinstance(obj, basestring) or ';' not in obj:
315
        return None, None
316
    try:
317
        return float(obj.split(';')[0]), float(obj.split(';')[1])
318
    except ValueError:
319
        return None, None
320

  
321
@register.filter
322
def distance(obj1, obj2):
323
    lat1, lon1 = get_latlon(obj1)
324
    if lat1 is None or lon1 is None:
325
        return None
326
    lat2, lon2 = get_latlon(obj2)
327
    if lat2 is None or lon2 is None:
328
        return None
329
    geod = Geod(ellps='WGS84')
330
    distance = geod.inv(lon1, lat1, lon2, lat2)[2]
331
    return distance
303
-