def test_get_with_filter(self):
        # Create 3 beacons
        self.test_create_beacons()

        # Filter by id
        page = self._persistence.get_page_by_filter(
            None, FilterParams.from_tuples("id", "1"), PagingParams())
        assert page is not None
        assert len(page.data) == 1

        # Filter by udi
        page = self._persistence.get_page_by_filter(
            None, FilterParams.from_tuples("udi", "00002"), PagingParams())
        assert page is not None
        assert len(page.data) == 1

        # Filter by udis
        page = self._persistence.get_page_by_filter(
            None, FilterParams.from_tuples("udis", '00001,00003'),
            PagingParams())
        assert page is not None
        assert len(page.data) == 2

        # Filter by udi
        page = self._persistence.get_page_by_filter(
            None, FilterParams.from_tuples("site_id", "1"), PagingParams())
        assert page is not None
        assert len(page.data) == 2
    def get_count_by_filter(self, correlation_id: Optional[str], filter: FilterParams) -> int:
        filter = filter or FilterParams()
        key = filter.get_as_nullable_string('key')

        filter_condition = {}
        if key is not None:
            filter_condition['key'] = key

        return super().get_count_by_filter(correlation_id, filter)
    def get_page_by_filter(self, correlation_id: Optional[str], filter: FilterParams, paging: PagingParams) -> DataPage:
        filter = filter or FilterParams()
        key = filter.get_as_nullable_string('key')

        filter_condition = {}
        if key is not None:
            filter_condition['key'] = key

        return super().get_page_by_filter(correlation_id, filter, paging, None, None)
예제 #4
0
    def get_count_by_filter(self, correlation_id: Optional[str],
                            filter: FilterParams):
        filter = filter or FilterParams()
        key = filter.get_as_nullable_string('key')

        filter_condition = ''
        if key is not None:
            filter_condition += "`key`='" + key + "'"

        return super().get_count_by_filter(correlation_id, filter_condition)
예제 #5
0
    def __compose_filter(self, filter_params: FilterParams):
        filter_params = filter_params or FilterParams()
        search = filter_params.get_as_nullable_string('search')
        id = filter_params.get_as_nullable_string('id')
        name = filter_params.get_as_nullable_string('name')
        login = filter_params.get_as_nullable_string('login')
        active = filter_params.get_as_nullable_boolean('active')
        from_create_time = filter_params.get_as_nullable_datetime(
            'from_create_time')
        to_create_time = filter_params.get_as_nullable_datetime(
            'to_create_time')
        deleted = filter_params.get_as_boolean_with_default('deleted', False)

        def inner(item: AccountV1):
            if search is not None and not self.__match_search(item, search):
                return False
            if id is not None and id != item.id:
                return False
            if name is not None and name != item.name:
                return False
            if login is not None and login != item.login:
                return False
            if active is not None and active != item.active:
                return False
            if from_create_time is not None and item.create_time >= from_create_time:
                return False
            if to_create_time is not None and item.create_time < to_create_time:
                return False
            if not deleted and item.deleted:
                return False
            return True

        return inner
예제 #6
0
    def get_page_by_filter(self,
                           correlation_id: Optional[str],
                           filter: FilterParams,
                           paging: PagingParams,
                           sort=None,
                           select=None):
        filter = filter or FilterParams()
        key = filter.get_as_nullable_string('key')

        filter_condition = ''
        if key is not None:
            filter_condition += "`key`='" + key + "'"

        return super().get_page_by_filter(correlation_id, filter_condition,
                                          paging, None, None)
    def calculate_position(self, correlation_id, site_id, udis):
        beacons: List[BeaconV1]
        position = None

        if udis is None or len(udis) == 0:
            return

        page = self.get_beacons(correlation_id, FilterParams.from_tuples(
            'site_id', site_id,
            'udis', udis
        ), None)
        beacons = page.data if page.data else []

        lat = 0
        lng = 0
        count = 0

        for beacon in beacons:
            if beacon['center'] != None and beacon['center']['type'] == "Point" and len(
                    beacon['center']['coordinates']) > 1:
                lng = lng + beacon['center']['coordinates'][0]
                lat = lat + beacon['center']['coordinates'][1]
                count = count + 1

        if count > 0:
            position = {"type": 'Point', "coordinates": [lng / count, lat / count]}
            return position
        return None
    def calculate_position(self, correlation_id: Optional[str], site_id: str,
                           udis: List[str]) -> Any:
        if udis is None or len(udis) == 0:
            return None

        result = self.__persistence.get_page_by_filter(
            correlation_id,
            FilterParams.from_tuples("site_id", site_id, "udis", udis), None)
        beacons = result.data

        lat = 0
        lng = 0
        count = 0
        for beacon in beacons:
            if beacon.center is not None and beacon.center[
                    'type'] == "Point" and len(
                        beacon.center['coordinates']) > 1:
                lng = lng + beacon.center['coordinates'][0]
                lat = lat + beacon.center['coordinates'][1]
                count = count + 1

        if count == 0:
            return None

        position = {"type": 'Point', "coordinates": [lng / count, lat / count]}
        return position
    def calculate_position(self, correlation_id: Optional[str], site_id: str, udis: List[str]) -> Any:
        beacons: List[BeaconV1] = []
        position = None

        if udis is None or len(udis) == 0:
            return

        page = self.get_beacons(correlation_id,
                                  FilterParams.from_tuples(
                                      'site_id', site_id,
                                      'udis', udis
                                  ), PagingParams())

        beacons = page.data or []

        lat = 0
        lng = 0
        count = 0

        for beacon in beacons:
            if beacon.center is not None and beacon.center['type'] == 'Point' and isinstance(
                    beacon.center['coordinates'], list):
                lng += beacon.center['coordinates'][0]
                lat += beacon.center['coordinates'][1]
                count += 1

        if count > 0:
            position = {
                'type': 'Point',
                'coordinates': [lng / count, lat / count]
            }

        return position or None
예제 #10
0
    def get_page_by_filter(self, correlation_id, filter, paging):
        filter = filter if filter is not None else FilterParams()
        key = filter.get_as_nullable_string("key")

        paging = paging if paging is not None else PagingParams()
        skip = paging.get_skip(0)
        take = paging.get_take(100)

        result = []
        self._lock.acquire()
        try:
            for item in self._items:
                if key is not None and key != item['key']:
                    continue

                skip -= 1
                if skip >= 0:
                    continue

                take -= 1
                if take < 0:
                    break

                result.append(item)
        finally:
            self._lock.release()

        return DataPage(result, len(result))
예제 #11
0
    def calculate_position(self, correlation_id, site_id, udis):
        if udis == None or len(udis) == 0:
            return None

        result = self._persistence.get_page_by_filter(
            correlation_id,
            FilterParams.from_tuples("site_id", site_id, "udis", udis), None)
        beacons = result.data

        lat = 0
        lng = 0
        count = 0
        for beacon in beacons:
            if beacon['center'] != None and beacon['center'][
                    'type'] == "Point" and len(
                        beacon['center']['coordinates']) > 1:
                lng = lng + beacon['center']['coordinates'][0]
                lat = lat + beacon['center']['coordinates'][1]
                count = count + 1

        if count > 0:
            position = {
                "type": 'Point',
                "coordinates": [lng / count, lat / count]
            }
            return position
        return None
예제 #12
0
    def get_page_by_filter(self, correlation_id, filter, paging):
        filter = filter or FilterParams()

        id = filter.get_as_nullable_string("id")
        site_id = filter.get_as_nullable_string("site_id")
        label = filter.get_as_nullable_string("label")
        udi = filter.get_as_nullable_string("udi")
        udis = filter.get_as_object("udis")
        if udis != None and len(udis) > 0:
            udis = udis.split(",")

        def filter_beacons(item):
            if id is not None and item.id != id:
                return False
            if site_id is not None and item.site_id != site_id:
                return False
            if label is not None and item.label != label:
                return False
            if udi is not None and item.udi != udi:
                return False
            if udis is not None and item.udi not in udis:
                return False
            return True

        return super(BeaconsMemoryPersistence,
                     self).get_page_by_filter(correlation_id,
                                              filter_beacons,
                                              paging=paging)
    def test_crud_operations(self):
        # Create 3 beacons
        self.test_create_beacons()

        # Get all beacons
        page = self._persistence.get_page_by_filter(None, FilterParams(),
                                                    PagingParams())
        assert page is not None
        assert len(page.data) == 3

        beacon1 = page.data[0]

        # Update the beacon
        beacon1['label'] = "ABC"
        beacon = self._persistence.update(None, beacon1)
        assert beacon is not None
        assert beacon1['id'] == beacon['id']
        assert "ABC" == beacon['label']

        # Get beacon by udi
        beacon = self._persistence.get_one_by_udi(None, beacon1['udi'])
        assert beacon is not None
        assert beacon['id'] == beacon1['id']

        # Delete beacon
        self._persistence.delete_by_id(None, beacon1['id'])

        # Try to get deleted beacon
        beacon = self._persistence.get_one_by_id(None, beacon1['id'])
        assert beacon is None
    def compose_filter(self, filter):
        filter = filter or FilterParams()
        id = filter.get_as_nullable_string("id")
        site_id = filter.get_as_nullable_string("site_id")
        label = filter.get_as_nullable_string('label')
        udi = filter.get_as_nullable_string('udi')
        udis = filter.get_as_object('udis')

        if type(udis) == str:
            udis = udis.split(',')

        if not (type(udis) == list):
            udis = None

        def filter_beacons(item):
            if id is not None and item.id != id:
                return False
            if site_id is not None and item.site_id != site_id:
                return False
            if label is not None and item.label != label:
                return False
            if udi is not None and item.udi != udi:
                return False
            if udis is not None:
                try:
                    udis.index(item.udi)
                except Exception as e:
                    return False
            return True

        return filter_beacons
예제 #15
0
    def get_page_by_filter(self, correlation_id: Optional[str],
                           filter: FilterParams,
                           paging: PagingParams) -> DataPage:
        filters = filter if filter is not None else FilterParams()
        key = filters.get_as_nullable_string("key")

        paging = paging if not (paging is None) else PagingParams()
        skip = paging.get_skip(0)
        take = paging.get_take(100)

        result = []
        self.__lock.acquire()
        try:
            for item in self.__items:
                if not (key is None) and key != item.key:
                    continue

                skip -= 1
                if skip >= 0: continue

                take -= 1
                if take < 0: break

                result.append(item)
        finally:
            self.__lock.release()

        return DataPage(result)
    def _get_paging_params(self, req):
        key_value_req = {}

        for key, value in req.query.items:
            if key in ['skip', 'take', 'total']:
                key_value_req[key] = value

        filter = FilterParams.from_value(key_value_req)

        return filter
    def __get_page_by_filter(self):
        result = self._controller.get_page_by_filter(
            self._get_correlation_id(),
            FilterParams(bottle.request.query.dict),
            PagingParams(bottle.request.query.get('skip'),
                         bottle.request.query.get('take'),
                         bottle.request.query.get('total')),
        )

        return self.send_result(result)
    def get_page_by_filter(self, correlation_id, filter, paging):
        filter = filter or FilterParams()
        key = filter.get_as_nullable_string('key')

        filter_condition = ''
        if key is not None:
            filter_condition += "data->key='" + key + "'"

        return super().get_page_by_filter(correlation_id, filter_condition,
                                          paging, None, None)
예제 #19
0
 def get_page_by_filter(self,
                        correlation_id,
                        filter,
                        paging,
                        sort=None,
                        select=None):
     filter = filter if filter != None else FilterParams()
     return super(DummyMongoDbPersistence,
                  self).get_page_by_filter(correlation_id, filter, paging,
                                           None, None)
 def get_page_by_filter(self,
                        correlation_id: Optional[str],
                        filter: FilterParams,
                        paging: PagingParams,
                        sort: Any = None,
                        select: Any = None) -> DataPage:
     filter = filter if filter is not None else FilterParams()
     return super(BeaconsMongoDbPersistence,
                  self).get_page_by_filter(correlation_id,
                                           self.compose_filter(filter),
                                           paging, None, None)
    def __compose_filter(self, filter_params: FilterParams) -> Callable:
        filter_params = filter_params or FilterParams()

        id = filter_params.get_as_nullable_string('id')
        site_id = filter_params.get_as_nullable_string('site_id')
        label = filter_params.get_as_nullable_string('label')
        udi = filter_params.get_as_nullable_string('udi')
        udis = filter_params.get_as_object('udis')
        if isinstance(udis, str):
            udis = udis.split(',')
        if not isinstance(udis, list):
            udis = None

        def inner(item):
            if id is not None and item.id != id:
                return False
            if site_id is not None and item.site_id != site_id:
                return False
            if label is not None and item.label != label:
                return False
            if udi is not None and item.udi != udi:
                return False
            if udis is not None and udis.count(item.udi) < 0:
                return False
            return True

        return inner
    def __compose_filter(self, filter: FilterParams) -> Callable:
        filter = filter if filter is not None else FilterParams()

        id = filter.get_as_nullable_string("id")
        site_id = filter.get_as_nullable_string("site_id")
        label = filter.get_as_nullable_string("label")
        udi = filter.get_as_nullable_string("udi")
        udis = filter.get_as_object("udis")
        if udis is not None and len(udis) > 0:
            udis = udis.split(",")

        def filter_beacons(item):
            if id is not None and item.id != id:
                return False
            if site_id is not None and item.site_id != site_id:
                return False
            if label is not None and item.label != label:
                return False
            if udi is not None and item.udi != udi:
                return False
            if udis is not None and item.udi not in udis:
                return False
            return True

        return filter_beacons
    def get_page_by_filter(self, correlation_id, filter, paging):
        filter = filter if filter != None else FilterParams()
        key = filter.get_as_nullable_string("key")

        def filter_dummy(obj):
            if key != None and obj['key'] != key:
                return False
            return True

        return super(DummyMemoryPersistence,
                     self).get_page_by_filter(correlation_id,
                                              filter_dummy,
                                              paging=paging)
예제 #24
0
    def test_crud_operations(self):
        # Create the first beacon
        beacon1 = self._controller.create_beacon(None, BEACON1)

        assert beacon1 != None
        assert beacon1['id'] == BEACON1['id']
        assert beacon1['site_id'] == BEACON1['site_id']
        assert beacon1['udi'] == BEACON1['udi']
        assert beacon1['type'] == BEACON1['type']
        assert beacon1['label'] == BEACON1['label']
        assert beacon1['center'] != None

        # Create the second beacon
        beacon2 = self._controller.create_beacon(None, BEACON2)

        assert beacon2 != None
        assert beacon2['id'] == BEACON2['id']
        assert beacon2['site_id'] == BEACON2['site_id']
        assert beacon2['udi'] == BEACON2['udi']
        assert beacon2['type'] == BEACON2['type']
        assert beacon2['label'] == BEACON2['label']
        assert beacon2['center'] != None

        # Get all beacons
        page = self._controller.get_beacons_by_filter(None, FilterParams(),
                                                      PagingParams())
        assert page != None
        assert len(page.data) == 2

        beacon1 = page.data[0]

        # Update the beacon
        beacon1['label'] = "ABC"
        beacon = self._controller.update_beacon(None, beacon1)
        assert beacon != None
        assert beacon1['id'] == beacon['id']
        assert "ABC" == beacon['label']

        # Get beacon by udi
        beacon = self._controller.get_beacon_by_udi(None, beacon1['udi'])
        assert beacon != None
        assert beacon['id'] == beacon1['id']

        # Delete beacon
        self._controller.delete_beacon_by_id(None, beacon1['id'])

        # Try to get deleted beacon
        beacon = self._controller.get_beacon_by_id(None, beacon1['id'])
        assert beacon == None
예제 #25
0
    def test_crud_operations(self):
        # Create the first beacon
        beacon1 = self._controller.create_beacon(None, BEACON1)

        assert beacon1 is not None
        assert beacon1.id == BEACON1.id
        assert beacon1.site_id == BEACON1.site_id
        assert beacon1.udi == BEACON1.udi
        assert beacon1.type == BEACON1.type
        assert beacon1.label == BEACON1.label
        assert beacon1.center is not None

        # Create the second beacon
        beacon2 = self._controller.create_beacon(None, BEACON2)

        assert beacon2 != None
        assert beacon2.id == BEACON2.id
        assert beacon2.site_id == BEACON2.site_id
        assert beacon2.udi == BEACON2.udi
        assert beacon2.type == BEACON2.type
        assert beacon2.label == BEACON2.label
        assert beacon2.center is not None

        # Get all beacons
        page = self._controller.get_beacons_by_filter(None, FilterParams(),
                                                      PagingParams())
        assert page is not None
        assert len(page.data) == 2

        beacon1 = page.data[0]

        # Update the beacon
        beacon1.label = "ABC"
        beacon = self._controller.update_beacon(None, beacon1)
        assert beacon is not None
        assert beacon1.id == beacon.id
        assert "ABC" == beacon.label

        # Get beacon by udi
        beacon = self._controller.get_beacon_by_udi(None, beacon1.udi)
        assert beacon is not None
        assert beacon.id == beacon1.id

        # Delete beacon
        self._controller.delete_beacon_by_id(None, beacon1.id)

        # Try to get deleted beacon
        beacon = self._controller.get_beacon_by_id(None, beacon1.id)
        assert beacon is None
예제 #26
0
    def test_crud_operations(self):
        # Create one dummy
        dummy1 = self._client.create(None, DUMMY1)

        assert dummy1 is not None
        assert dummy1.id is not None
        assert DUMMY1.key == dummy1.key
        assert DUMMY1.content == dummy1.content

        # Create another dummy
        dummy2 = self._client.create(None, DUMMY2)

        assert dummy2 is not None
        assert dummy2.id is not None
        assert DUMMY2.key == dummy2.key
        assert DUMMY2.content == dummy2.content

        # Get all dummies
        dummies = self._client.get_page_by_filter(None, FilterParams(),
                                                  PagingParams(0, 5, False))
        assert dummies is not None
        assert len(dummies.data) >= 2

        # Update the dummy
        dummy1.content = "Updated Content 1"
        dummy = self._client.update(None, dummy1)

        assert dummy is not None
        assert dummy1.id == dummy.id
        assert dummy1.key == dummy.key
        assert "Updated Content 1" == dummy.content

        # Delete the dummy
        self._client.delete_by_id(None, dummy1.id)

        # Try to get deleted dummy
        dummy = self._client.get_one_by_id(None, dummy1.id)
        assert dummy is None

        # Check correlation id
        result = self._client.check_correlation_id('test_cor_id')
        assert result is not None
        assert 'test_cor_id' == result
예제 #27
0
    def compose_filter(self, filter):
        filter = filter or FilterParams()
        criteria = []

        id = filter.get_as_nullable_string("id")
        if id is not None:
            criteria.append({"_id": id})
        site_id = filter.get_as_nullable_string("site_id")
        if site_id is not None:
            criteria.append({"site_id": site_id})
        label = filter.get_as_nullable_string("label")
        if label is not None:
            criteria.append({"label": label})
        udi = filter.get_as_nullable_string("udi")
        if udi is not None:
            criteria.append({"udi": udi})
        udis = filter.get_as_object("udis")
        if udis is not None and len(udis) > 0:
            udis = udis.split(",")
            criteria.append({"udi": {"$in": udis}})
        return {"$and": criteria} if len(criteria) > 0 else None
예제 #28
0
    def __compose_filter(self, filter_params: FilterParams) -> Callable:
        filter_params = filter_params or FilterParams()

        id = filter_params.get_as_nullable_string('id')
        ids = filter_params.get_as_object('ids')
        except_ids = filter_params.get_as_object('except_ids')
        roles = filter_params.get_as_object('roles')
        except_roles = filter_params.get_as_object('except_roles')

        # Process ids filter
        if isinstance(ids, str):
            ids = ids.split(',')
        if not isinstance(ids, list):
            ids = None

        # Process except ids filter
        if isinstance(except_ids, str):
            except_ids = except_ids.split(',')
        if isinstance(except_ids, list):
            except_ids = None

        # Process roles filter
        if isinstance(roles, str):
            roles = roles.split(',')
        if isinstance(roles, list):
            except_ids = None

        # Process except roles filter
        if isinstance(except_roles, str):
            except_roles = except_roles.split(',')
        if isinstance(except_roles, list):
            except_ids = None

        def inner(item):
            if id and item.id != id:
                return False
            if ids and ids.count(item.id) < 0:
                return False
            if except_ids and except_ids.count(item.id) >= 0:
                return False
            if roles and not self.__contains(roles, item.roles):
                return False
            if except_roles and self.__contains(except_roles, item.roles):
                return False

            return True

        return inner
    def __compose_filter(self, filter_params: FilterParams) -> Callable:
        filter_params = filter_params or FilterParams()

        search = filter_params.get_as_nullable_string('search')
        id = filter_params.get_as_nullable_string('id')
        code = filter_params.get_as_nullable_string('code')
        active = filter_params.get_as_nullable_boolean('active')
        deleted = filter_params.get_as_boolean_with_default('deleted', False)

        def inner(item):
            if id and item.id != id:
                return False
            if code and item.code != code:
                return False
            if active and item.active != active:
                return False
            if not deleted and item.deleted:
                return False
            if search and not self.__match_search(item, search):
                return False

            return True

        return inner
예제 #30
0
 def handler(correlation_id, args):
     filter = FilterParams.from_value(args.get("filter"))
     paging = PagingParams.from_value(args.get("paging"))
     return self._controller.get_beacons_by_filter(
         correlation_id, filter, paging)