Projet

Général

Profil

0001-misc-add-get_auto_geoloc-filter-49079.patch

Lauréline Guérin, 04 décembre 2020 10:35

Télécharger (7,45 ko)

Voir les différences:

Subject: [PATCH] misc: add |get_auto_geoloc filter (#49079)

 tests/test_formdata.py            | 63 ++++++++++++++++++++++++++-----
 wcs/qommon/templatetags/qommon.py |  5 +++
 wcs/variables.py                  | 21 ++++++++---
 3 files changed, 73 insertions(+), 16 deletions(-)
tests/test_formdata.py
927 927

  
928 928

  
929 929
def test_lazy_formdata_queryset_distance(pub, variable_test_data):
930
    # Form
930 931
    lazy_formdata = variable_test_data
931 932
    formdef = lazy_formdata._formdef
932 933
    formdef.geolocations = {'base': 'Base'}
933 934
    formdef.store()
934 935
    data_class = lazy_formdata._formdef.data_class()
936
    # Card
937
    CardDef.wipe()
938
    carddef = CardDef()
939
    carddef.name = 'items'
940
    carddef.fields = []
941
    carddef.geolocations = {'base': 'Base'}
942
    carddef.store()
943
    carddata_class = carddef.data_class()
944
    carddata_class.wipe()
945

  
946
    # create initial carddata like lazy_formdata, with same geolocations
947
    carddata = carddata_class()
948
    carddata.geolocations = {'base': {'lat': 1, 'lon': 2}}
949
    carddata.just_created()
950
    carddata.store()
951
    lazy_carddata = LazyFormData(carddata)
952

  
953
    # create objects
935 954
    for i in range(6):
936
        formdata = data_class()
937
        formdata.geolocations = {'base': {'lat': i, 'lon': i}}
938
        formdata.just_created()
939
        formdata.store()
955
        for dclass in [data_class, carddata_class]:
956
            data = dclass()
957
            data.geolocations = {'base': {'lat': i, 'lon': i}}
958
            data.just_created()
959
            data.store()
940 960
    for i in range(4):
941
        formdata = data_class()
942
        formdata.geolocations = {'base': {'lat': i + 0.5, 'lon': i + 0.5}}
943
        formdata.just_created()
944
        formdata.jump_status('finished')
945
        formdata.store()
946

  
961
        for dclass in [data_class, carddata_class]:
962
            data = dclass()
963
            data.geolocations = {'base': {'lat': i + 0.5, 'lon': i + 0.5}}
964
            data.just_created()
965
            data.jump_status('finished')
966
            data.store()
967

  
968
    # drafts
947 969
    formdata = data_class()
948 970
    formdata.status = 'draft'
971
    formdata.geolocations = {'base': {'lat': 1, 'lon': 2}}
949 972
    formdata.store()
973
    carddata = carddata_class()
974
    carddata.status = 'draft'
975
    carddata.geolocations = {'base': {'lat': 1, 'lon': 2}}
976
    carddata.store()
950 977

  
951 978
    # compute distance against map field of lazy formdata
952 979
    nearby = lazy_formdata.objects.distance_filter(200000)
953 980
    assert len(nearby) == 6
954 981
    assert set([x.number for x in nearby]) == set(['1-1', '1-3', '1-4', '1-8', '1-9', '1-10'])
982
    nearby = lazy_carddata.objects.set_geo_center(lazy_formdata).distance_filter(200000)
983
    assert len(nearby) == 6
984
    assert set([x.number for x in nearby]) == set(['1-1', '1-3', '1-4', '1-8', '1-9', '1-10'])
955 985

  
956 986
    # compute distance against geolocation
957 987
    lazy_formdata._formdata.geolocations = {'base': {'lat': 2, 'lon': 2.5}}
......
959 989
    assert len(nearby) == 6
960 990
    assert set([x.number for x in nearby]) == set(['1-1', '1-4', '1-5', '1-9', '1-10', '1-11'])
961 991
    assert bool(nearby) is True
992
    nearby = lazy_carddata.objects.set_geo_center(lazy_formdata).distance_filter(200000)
993
    assert len(nearby) == 6
994
    assert set([x.number for x in nearby]) == set(['1-1', '1-4', '1-5', '1-9', '1-10', '1-11'])
995
    assert bool(nearby) is True
996

  
962 997
    context = pub.substitutions.get_context_variables(mode='lazy')
963 998
    tmpl = Template('{{form_objects|distance_filter:200000|count}}')
964 999
    assert tmpl.render(context) == '6'
1000
    tmpl = Template('{{cards|objects:"items"|set_geo_center:form|distance_filter:200000|count}}')
1001
    assert tmpl.render(context) == '6'
965 1002

  
966 1003
    lazy_formdata._formdata.geolocations = {'base': {'lat': 7, 'lon': 7.5}}
967 1004
    nearby = lazy_formdata.objects.distance_filter(200000)
968 1005
    assert bool(nearby) is False
969 1006
    assert len(nearby) == 0
1007
    nearby = lazy_carddata.objects.set_geo_center(lazy_formdata).distance_filter(200000)
1008
    assert bool(nearby) is False
1009
    assert len(nearby) == 0
1010

  
970 1011
    tmpl = Template('{{form_objects|distance_filter:200000|count}}')
971 1012
    assert tmpl.render(context) == '0'
1013
    tmpl = Template('{{cards|objects:"items"|set_geo_center:form|distance_filter:200000|count}}')
1014
    assert tmpl.render(context) == '0'
972 1015

  
973 1016

  
974 1017
def test_lazy_formdata_queryset_filter(pub, variable_test_data):
wcs/qommon/templatetags/qommon.py
564 564
    return distance
565 565

  
566 566

  
567
@register.filter
568
def set_geo_center(queryset, lazy_formdata):
569
    return queryset.set_geo_center(lazy_formdata)
570

  
571

  
567 572
@register.filter
568 573
def distance_filter(queryset, distance=1000):
569 574
    if hasattr(distance, 'get_value'):
wcs/variables.py
35 35

  
36 36

  
37 37
class LazyFormDefObjectsManager(object):
38
    def __init__(self, formdef, formdata=None, criterias=None, order_by=None):
38
    def __init__(self, formdef, formdata=None, geoloc_center_formdata=None, criterias=None, order_by=None):
39 39
        self._formdef = formdef
40 40
        self._formdata = formdata
41
        self._geoloc_center_formdata = geoloc_center_formdata
41 42
        if criterias is None:
42 43
            criterias = [
43 44
                NotEqual('status', 'draft'),
......
57 58

  
58 59
    def _clone(self, criterias, order_by=None):
59 60
        return LazyFormDefObjectsManager(
60
                self._formdef,
61
                self._formdata,
62
                criterias,
61
                formdef=self._formdef,
62
                formdata=self._formdata,
63
                geoloc_center_formdata=self._geoloc_center_formdata,
64
                criterias=criterias,
63 65
                order_by=order_by or self._order_by)
64 66

  
65 67
    def order_by(self, attribute):
......
132 134
        criterias = [Or([Equal('status', x) for x in status_filters])]
133 135
        return self._clone(self._criterias + criterias)
134 136

  
137
    def set_geo_center(self, lazy_formdata):
138
        qs = self._clone(self._criterias)
139
        qs._geoloc_center_formdata = lazy_formdata._formdata
140
        return qs
141

  
135 142
    def distance_filter(self, distance):
136 143
        geod = Geod(ellps='WGS84')
137
        center = self._formdata.get_auto_geoloc()
144
        center = (self._geoloc_center_formdata or self._formdata).get_auto_geoloc()
138 145
        center_lon, center_lat = center['lon'], center['lat']
146

  
139 147
        def distance_check(obj):
140 148
            geoloc = obj.get_auto_geoloc()
141 149
            if not geoloc:
142 150
                return False
143 151
            # keep computed distance in object
144
            obj._distance  = geod.inv(center_lon, center_lat, geoloc['lon'], geoloc['lat'])[2]
152
            obj._distance = geod.inv(center_lon, center_lat, geoloc['lon'], geoloc['lat'])[2]
145 153
            return bool(obj._distance < distance)
154

  
146 155
        return self._clone(self._criterias + [distance_check])
147 156

  
148 157
    def filter_by(self, attribute):
149
-