0001-misc-add-distance-template-tag-32262.patch
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 |
- |