use client id to avoid self-flocking
This commit is contained in:
parent
f1ccf681be
commit
3bdd4be474
15
model.py
15
model.py
@ -2,7 +2,7 @@
|
|||||||
Object-Document Map for bike model
|
Object-Document Map for bike model
|
||||||
"""
|
"""
|
||||||
from mongoengine import Document, DateTimeField, GeoPointField, \
|
from mongoengine import Document, DateTimeField, GeoPointField, \
|
||||||
FloatField, connection
|
FloatField, StringField, connection
|
||||||
import bson
|
import bson
|
||||||
import datetime
|
import datetime
|
||||||
from LatLon23 import LatLon, Latitude, Longitude
|
from LatLon23 import LatLon, Latitude, Longitude
|
||||||
@ -54,6 +54,7 @@ class Bike(Document):
|
|||||||
speed = FloatField(default=0)
|
speed = FloatField(default=0)
|
||||||
bearing = FloatField(default=0)
|
bearing = FloatField(default=0)
|
||||||
last_update = DateTimeField(default=datetime.datetime.utcnow)
|
last_update = DateTimeField(default=datetime.datetime.utcnow)
|
||||||
|
client_id = StringField(required=True)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(Document, self).__init__(*args, **kwargs)
|
super(Document, self).__init__(*args, **kwargs)
|
||||||
@ -121,7 +122,9 @@ class Bike(Document):
|
|||||||
'coordinates': self.point},
|
'coordinates': self.point},
|
||||||
'$maxDistance': local_radius}},
|
'$maxDistance': local_radius}},
|
||||||
'last_update': {
|
'last_update': {
|
||||||
'$gte': datetime.datetime.now() - datetime.timedelta(seconds=min_age)},
|
'$gte': (datetime.datetime.now()
|
||||||
|
- datetime.timedelta(seconds=min_age))},
|
||||||
|
'client_id': {'$ne': self.client_id},
|
||||||
'_id': {'$ne': bson.objectid.ObjectId(self.id)}})]
|
'_id': {'$ne': bson.objectid.ObjectId(self.id)}})]
|
||||||
|
|
||||||
local_ids = set([bike['_id'] for bike in local])
|
local_ids = set([bike['_id'] for bike in local])
|
||||||
@ -134,14 +137,18 @@ class Bike(Document):
|
|||||||
{'$geometry': {'type': 'Point',
|
{'$geometry': {'type': 'Point',
|
||||||
'coordinates': self.destination},
|
'coordinates': self.destination},
|
||||||
'$maxDistance': destination_radius}},
|
'$maxDistance': destination_radius}},
|
||||||
|
'client_id': {'$ne': self.client_id},
|
||||||
|
'_id': {'$ne': bson.objectid.ObjectId(self.id)},
|
||||||
'last_update': {
|
'last_update': {
|
||||||
'$gte': datetime.datetime.now() - datetime.timedelta(seconds=min_age)}
|
'$gte': (datetime.datetime.now()
|
||||||
})]
|
- datetime.timedelta(seconds=min_age))}
|
||||||
|
})]
|
||||||
remote_ids = set([bike['_id'] for bike in remote])
|
remote_ids = set([bike['_id'] for bike in remote])
|
||||||
|
|
||||||
# intersect them!
|
# intersect them!
|
||||||
flock_ids = local_ids.intersection(remote_ids)
|
flock_ids = local_ids.intersection(remote_ids)
|
||||||
|
|
||||||
|
# return bikes, not bike ids
|
||||||
return (bike for bike in local if bike['_id'] in flock_ids)
|
return (bike for bike in local if bike['_id'] in flock_ids)
|
||||||
|
|
||||||
def flock_data(self):
|
def flock_data(self):
|
||||||
|
|||||||
17
server.py
17
server.py
@ -11,15 +11,17 @@ db = MongoEngine(app)
|
|||||||
# TODO: at registration give current location
|
# TODO: at registration give current location
|
||||||
@app.route("/register/")
|
@app.route("/register/")
|
||||||
def register():
|
def register():
|
||||||
dest_lat = request.args.get('dest_lat', None)
|
|
||||||
dest_lon = request.args.get('dest_lon', None)
|
dest_lon = request.args.get('dest_lon', None)
|
||||||
|
dest_lat = request.args.get('dest_lat', None)
|
||||||
|
client_id = request.args.get('client_id', None)
|
||||||
|
|
||||||
assert dest_lat is not None and dest_lon is not None
|
assert dest_lat is not None and dest_lon is not None and client_id is not None
|
||||||
|
|
||||||
dest = (float(dest_lon), float(dest_lat))
|
dest = (float(dest_lon), float(dest_lat))
|
||||||
|
|
||||||
bike = Bike(point=(0, 0),
|
bike = Bike(point=(0, 0),
|
||||||
destination=dest)
|
destination=dest,
|
||||||
|
client_id=client_id)
|
||||||
|
|
||||||
bike.save()
|
bike.save()
|
||||||
|
|
||||||
@ -36,12 +38,13 @@ def update(bike_id):
|
|||||||
lon = float(request.args.get('lon', None))
|
lon = float(request.args.get('lon', None))
|
||||||
speed = float(request.args.get('speed', None))
|
speed = float(request.args.get('speed', None))
|
||||||
bearing = float(request.args.get('bearing', None))
|
bearing = float(request.args.get('bearing', None))
|
||||||
|
client_id = request.args.get('client_id', None)
|
||||||
|
|
||||||
local_altruism = float(request.args.get('local_altruism', 0.1))
|
# TODO: maybe client tunes these?
|
||||||
dest_altruism = float(request.args.get('dest_altruism', 0.2))
|
# local_altruism = float(request.args.get('local_altruism', 0.1))
|
||||||
|
# dest_altruism = float(request.args.get('dest_altruism', 0.2))
|
||||||
|
|
||||||
|
bike.update(lat, lon, speed, bearing, client_id)
|
||||||
bike.update(lat, lon, speed, bearing)
|
|
||||||
|
|
||||||
return jsonify(last_update=bike.last_update.isoformat(),
|
return jsonify(last_update=bike.last_update.isoformat(),
|
||||||
**bike.flock_data())
|
**bike.flock_data())
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user