passive api name collecting from users that have consented to it

This commit is contained in:
Laura Klünder 2024-12-28 22:16:25 +01:00
parent 183a7ec4c9
commit 6dafb009fc
3 changed files with 36 additions and 1 deletions

View file

@ -44,6 +44,7 @@ class UserPermissions(models.Model):
nonpublic_themes = models.BooleanField(default=False, verbose_name=_('show non-public themes in theme selector')) nonpublic_themes = models.BooleanField(default=False, verbose_name=_('show non-public themes in theme selector'))
quests: list[str] = SchemaField(schema=list[str], default=list) quests: list[str] = SchemaField(schema=list[str], default=list)
impolite_quests = models.BooleanField(default=False, verbose_name=_('dont say thanks after completing a quest')) impolite_quests = models.BooleanField(default=False, verbose_name=_('dont say thanks after completing a quest'))
passive_ap_name_scanning = models.BooleanField(default=False, verbose_name=_('passive ap name scanning'))
class Meta: class Meta:
verbose_name = _('User Permissions') verbose_name = _('User Permissions')

View file

@ -54,3 +54,27 @@ def delete_map_cache_key(self, cache_key):
if hasattr(cache, 'keys'): if hasattr(cache, 'keys'):
for key in cache.keys(f'*{cache_key}*'): for key in cache.keys(f'*{cache_key}*'):
cache.delete(key) cache.delete(key)
@app.task(bind=True, max_retries=10)
def update_ap_names_bssid_mapping(self, map_name, user):
from c3nav.mapdata.models.geometry.space import RangingBeacon
todo = []
for beacon in RangingBeacon.objects.filter(ap_name__in=map_name.keys(),
beacon_type=RangingBeacon.BeaconType.EVENT_WIFI):
print(beacon, "add ssids", set(map_name[beacon.ap_name]))
if set(map_name[beacon.ap_name]) - set(beacon.addresses):
todo.append((beacon, list(set(beacon.addresses) | set(map_name[beacon.ap_name]))))
if todo:
from c3nav.editor.models import ChangeSet
from c3nav.editor.views.base import within_changeset
changeset = ChangeSet()
changeset.author = user
with within_changeset(changeset=changeset, user=user) as locked_changeset:
for beacon, addresses in todo:
beacon.addresses = addresses
beacon.save()
with changeset.lock_to_edit() as locked_changeset:
locked_changeset.title = 'passive update bssids'
locked_changeset.apply(user)

View file

@ -8,6 +8,7 @@ from pydantic_extra_types.mac_address import MacAddress
from c3nav.api.auth import auth_responses from c3nav.api.auth import auth_responses
from c3nav.api.schema import BaseSchema from c3nav.api.schema import BaseSchema
from c3nav.editor.models import ChangeSet
from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.schemas.models import CustomLocationSchema from c3nav.mapdata.schemas.models import CustomLocationSchema
from c3nav.mapdata.utils.cache.stats import increment_cache_key from c3nav.mapdata.utils.cache.stats import increment_cache_key
@ -40,7 +41,7 @@ class PositioningResult(BaseSchema):
description="determine position based on wireless measurements " description="determine position based on wireless measurements "
"(including ranging, if available)", "(including ranging, if available)",
response={200: PositioningResult, **auth_responses}) response={200: PositioningResult, **auth_responses})
def get_position(request, parameters: LocateRequestSchema): def get_position(request, parameters: LocateRequestSchema, update_ap_names_bssid_mapping=None):
try: try:
location = Locator.load().locate(parameters.wifi_peers, location = Locator.load().locate(parameters.wifi_peers,
permissions=AccessPermission.get_for_request(request)) permissions=AccessPermission.get_for_request(request))
@ -51,6 +52,15 @@ def get_position(request, parameters: LocateRequestSchema):
# todo: validation error, seriously? this shouldn't happen anyways # todo: validation error, seriously? this shouldn't happen anyways
raise raise
if request.user_permissions.passive_ap_name_scanning:
bssid_mapping = {}
for peer in parameters.wifi_peers:
if not peer.ap_name:
continue
bssid_mapping.setdefault(peer.ap_name, set()).add(peer.bssid)
if bssid_mapping:
update_ap_names_bssid_mapping.delay(map_name=bssid_mapping, user=request.user)
return { return {
"location": location "location": location
} }