wifi_bssids → addresses
This commit is contained in:
parent
ca6252583c
commit
cfed6d9ed7
12 changed files with 70 additions and 30 deletions
|
@ -170,7 +170,7 @@ def beacons_lookup(request):
|
||||||
"name": node.name if node else ("Beacon #%d" % beacon.pk),
|
"name": node.name if node else ("Beacon #%d" % beacon.pk),
|
||||||
"point": mapping(beacon.geometry),
|
"point": mapping(beacon.geometry),
|
||||||
}
|
}
|
||||||
for bssid in beacon.wifi_bssids:
|
for bssid in beacon.addresses:
|
||||||
wifi_beacons[bssid] = beacon_data
|
wifi_beacons[bssid] = beacon_data
|
||||||
if beacon.ibeacon_uuid and beacon.ibeacon_major is not None and beacon.ibeacon_minor is not None:
|
if beacon.ibeacon_uuid and beacon.ibeacon_major is not None and beacon.ibeacon_minor is not None:
|
||||||
ibeacons.setdefault(
|
ibeacons.setdefault(
|
||||||
|
|
|
@ -384,12 +384,12 @@ def create_editor_form(editor_model):
|
||||||
'ordering', 'category', 'width', 'groups', 'height', 'color', 'in_legend', 'priority', 'hierarchy', 'icon_name',
|
'ordering', 'category', 'width', 'groups', 'height', 'color', 'in_legend', 'priority', 'hierarchy', 'icon_name',
|
||||||
'base_altitude', 'intermediate', 'waytype', 'access_restriction', 'edit_access_restriction', 'default_height',
|
'base_altitude', 'intermediate', 'waytype', 'access_restriction', 'edit_access_restriction', 'default_height',
|
||||||
'door_height', 'outside', 'identifyable', 'can_search', 'can_describe', 'geometry', 'single', 'altitude',
|
'door_height', 'outside', 'identifyable', 'can_search', 'can_describe', 'geometry', 'single', 'altitude',
|
||||||
'level_index', 'short_label', 'origin_space', 'target_space', 'data', "ap_name", 'comment', 'slow_down_factor',
|
"beacon_type", 'level_index', 'short_label', 'origin_space', 'target_space', 'data', "ap_name", 'comment',
|
||||||
'groundaltitude', 'node_number', 'wifi_bssids', 'bluetooth_address', 'group', 'ibeacon_uuid', 'ibeacon_major',
|
'slow_down_factor', 'groundaltitude', 'node_number', 'addresses', 'bluetooth_address', 'group',
|
||||||
'ibeacon_minor', 'uwb_address', 'extra_seconds', 'speed', 'can_report_missing', 'can_report_mistake',
|
'ibeacon_uuid', 'ibeacon_major', 'ibeacon_minor', 'uwb_address', 'extra_seconds', 'speed', 'can_report_missing',
|
||||||
'description', 'speed_up', 'description_up', 'avoid_by_default', 'report_help_text', 'enter_description',
|
'can_report_mistake', 'description', 'speed_up', 'description_up', 'avoid_by_default', 'report_help_text',
|
||||||
'level_change_description', 'base_mapdata_accessible', 'label_settings', 'label_override', 'min_zoom',
|
'enter_description', 'level_change_description', 'base_mapdata_accessible', 'label_settings', 'label_override',
|
||||||
'max_zoom', 'font_size', 'members', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois',
|
'min_zoom', 'max_zoom', 'font_size', 'members', 'allow_levels', 'allow_spaces', 'allow_areas', 'allow_pois',
|
||||||
'allow_dynamic_locations', 'left', 'top', 'right', 'bottom', 'import_tag', 'import_block_data',
|
'allow_dynamic_locations', 'left', 'top', 'right', 'bottom', 'import_tag', 'import_block_data',
|
||||||
'import_block_geom', 'public', 'default', 'dark', 'high_contrast', 'funky', 'randomize_primary_color',
|
'import_block_geom', 'public', 'default', 'dark', 'high_contrast', 'funky', 'randomize_primary_color',
|
||||||
'color_logo', 'color_css_initial', 'color_css_primary', 'color_css_secondary', 'color_css_tertiary',
|
'color_logo', 'color_css_initial', 'color_css_primary', 'color_css_secondary', 'color_css_tertiary',
|
||||||
|
|
|
@ -19,7 +19,7 @@ class Command(BaseCommand):
|
||||||
found_beacons.setdefault(measurement["bssid"], []).append((beacon_measurement, measurement))
|
found_beacons.setdefault(measurement["bssid"], []).append((beacon_measurement, measurement))
|
||||||
|
|
||||||
# put in the ones we know
|
# put in the ones we know
|
||||||
known = dict(chain(*(((bssid, r) for bssid in r.wifi_bssids) for r in RangingBeacon.objects.all())))
|
known = dict(chain(*(((bssid, r) for bssid in r.addresses) for r in RangingBeacon.objects.all())))
|
||||||
|
|
||||||
# lets go through them
|
# lets go through them
|
||||||
for bssid, measurements in found_beacons.items():
|
for bssid, measurements in found_beacons.items():
|
||||||
|
|
|
@ -48,7 +48,8 @@ class Command(BaseCommand):
|
||||||
spaces_for_level.setdefault(space.level_id, []).append(space)
|
spaces_for_level.setdefault(space.level_id, []).append(space)
|
||||||
|
|
||||||
beacons_so_far: dict[str, RangingBeacon] = {
|
beacons_so_far: dict[str, RangingBeacon] = {
|
||||||
**{m.import_tag: m for m in RangingBeacon.objects.filter(import_tag__startswith="noc:")},
|
**{m.import_tag: m for m in RangingBeacon.objects.filter(import_tag__startswith="noc:",
|
||||||
|
beacon_type=RangingBeacon.BeaconType.EVENT_WIFI)},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, item in items.items():
|
for name, item in items.items():
|
||||||
|
@ -118,7 +119,7 @@ class Command(BaseCommand):
|
||||||
# build resulting object
|
# build resulting object
|
||||||
altitude_quest = True
|
altitude_quest = True
|
||||||
if not result:
|
if not result:
|
||||||
result = RangingBeacon(import_tag=import_tag)
|
result = RangingBeacon(import_tag=import_tag, beacon_type=RangingBeacon.BeaconType.EVENT_WIFI)
|
||||||
else:
|
else:
|
||||||
if result.space == new_space and distance(unwrap_geom(result.geometry), new_geometry) < 0.03:
|
if result.space == new_space and distance(unwrap_geom(result.geometry), new_geometry) < 0.03:
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Generated by Django 5.0.8 on 2024-12-28 14:15
|
||||||
|
|
||||||
|
import django.core.serializers.json
|
||||||
|
import django_pydantic_field.compat.django
|
||||||
|
import django_pydantic_field.fields
|
||||||
|
import pydantic_extra_types.mac_address
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mapdata', '0135_rangingbeacon_beacon_type'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='rangingbeacon',
|
||||||
|
old_name='wifi_bssids',
|
||||||
|
new_name='addresses',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='rangingbeacon',
|
||||||
|
name='addresses',
|
||||||
|
field=django_pydantic_field.fields.PydanticSchemaField(config=None, default=list,
|
||||||
|
encoder=django.core.serializers.json.DjangoJSONEncoder,
|
||||||
|
help_text="uses node's value if not set",
|
||||||
|
schema=django_pydantic_field.compat.django.GenericContainer(
|
||||||
|
list,
|
||||||
|
(pydantic_extra_types.mac_address.MacAddress,)),
|
||||||
|
verbose_name='Mac Address / BSSIDs'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='rangingbeacon',
|
||||||
|
name='ap_name',
|
||||||
|
field=models.CharField(blank=True, max_length=32, null=True, verbose_name='AP name'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -470,9 +470,10 @@ class BeaconMeasurement(SpaceGeometryMixin, models.Model):
|
||||||
for peer in scan:
|
for peer in scan:
|
||||||
if peer.ap_name:
|
if peer.ap_name:
|
||||||
map_name.setdefault(peer.ap_name, []).append(peer.bssid)
|
map_name.setdefault(peer.ap_name, []).append(peer.bssid)
|
||||||
for beacon in RangingBeacon.objects.filter(ap_name__in=map_name.keys()):
|
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]))
|
print(beacon, "add ssids", set(map_name[beacon.ap_name]))
|
||||||
beacon.wifi_bssids = list(set(beacon.wifi_bssids) | set(map_name[beacon.ap_name]))
|
beacon.addresses = list(set(beacon.addresses) | set(map_name[beacon.ap_name]))
|
||||||
beacon.save()
|
beacon.save()
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
@ -495,7 +496,7 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
|
||||||
|
|
||||||
node_number = models.PositiveSmallIntegerField(_('Node Number'), unique=True, null=True, blank=True)
|
node_number = models.PositiveSmallIntegerField(_('Node Number'), unique=True, null=True, blank=True)
|
||||||
|
|
||||||
wifi_bssids: list[MacAddress] = SchemaField(list[MacAddress], verbose_name=_('WiFi BSSIDs'), default=list,
|
addresses: list[MacAddress] = SchemaField(list[MacAddress], verbose_name=_('Mac Address / BSSIDs'), default=list,
|
||||||
help_text=_("uses node's value if not set"))
|
help_text=_("uses node's value if not set"))
|
||||||
bluetooth_address = models.CharField(_('Bluetooth Address'), unique=True, null=True, blank=True,
|
bluetooth_address = models.CharField(_('Bluetooth Address'), unique=True, null=True, blank=True,
|
||||||
max_length=17,
|
max_length=17,
|
||||||
|
@ -522,7 +523,7 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
|
||||||
|
|
||||||
altitude = models.DecimalField(_('altitude above ground'), max_digits=6, decimal_places=2, default=0,
|
altitude = models.DecimalField(_('altitude above ground'), max_digits=6, decimal_places=2, default=0,
|
||||||
validators=[MinValueValidator(Decimal('0'))])
|
validators=[MinValueValidator(Decimal('0'))])
|
||||||
ap_name = models.TextField(null=True, blank=True, verbose_name=_('AP name'))
|
ap_name = models.CharField(null=True, blank=True, verbose_name=_('AP name'), max_length=32)
|
||||||
comment = models.TextField(null=True, blank=True, verbose_name=_('comment'))
|
comment = models.TextField(null=True, blank=True, verbose_name=_('comment'))
|
||||||
|
|
||||||
altitude_quest = models.BooleanField(_('altitude quest'), default=True)
|
altitude_quest = models.BooleanField(_('altitude quest'), default=True)
|
||||||
|
@ -551,8 +552,8 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
|
||||||
title = ' - '.join(segments).strip()
|
title = ' - '.join(segments).strip()
|
||||||
else:
|
else:
|
||||||
title = f'#{self.pk}'
|
title = f'#{self.pk}'
|
||||||
if self.wifi_bssids:
|
if self.addresses:
|
||||||
ssids = self.wifi_bssids[0] + (', …' if len(self.wifi_bssids) > 1 else '')
|
ssids = self.addresses[0] + (', …' if len(self.adresses) > 1 else '')
|
||||||
title += f' ({ssids})'
|
title += f' ({ssids})'
|
||||||
if self.comment:
|
if self.comment:
|
||||||
title += f' ({self.comment})'
|
title += f' ({self.comment})'
|
||||||
|
|
|
@ -61,17 +61,17 @@ class RangingBeaconBSSIDsQuestForm(ChangeSetModelForm):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.fields["look_for_ap"] = CharField(disabled=True, initial=self.instance.import_tag[4:],
|
self.fields["look_for_ap"] = CharField(disabled=True, initial=self.instance.import_tag[4:],
|
||||||
widget=HiddenInput())
|
widget=HiddenInput())
|
||||||
self.fields["wifi_bssids"].widget = HiddenInput()
|
self.fields["addresses"].widget = HiddenInput()
|
||||||
|
|
||||||
def clean_bssids(self):
|
def clean_addresses(self):
|
||||||
data = self.cleaned_data["wifi_bssids"]
|
data = self.cleaned_data["addresses"]
|
||||||
if not data:
|
if not data:
|
||||||
raise ValidationError(_("Need at least one bssid."))
|
raise ValidationError(_("Need at least one bssid."))
|
||||||
return data
|
return data
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RangingBeacon
|
model = RangingBeacon
|
||||||
fields = ("wifi_bssids", )
|
fields = ("addresses", )
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def changeset_title(self):
|
def changeset_title(self):
|
||||||
|
@ -103,7 +103,7 @@ class RangingBeaconBSSIDsQuest(Quest):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _qs_for_request(cls, request):
|
def _qs_for_request(cls, request):
|
||||||
return RangingBeacon.qs_for_request(request).filter(ap_name__isnull=False, wifi_bssids=[])
|
return RangingBeacon.qs_for_request(request).filter(ap_name__isnull=False, addresses=[])
|
||||||
|
|
||||||
|
|
||||||
class BeaconMeasurementQuestForm(ChangeSetModelForm):
|
class BeaconMeasurementQuestForm(ChangeSetModelForm):
|
||||||
|
|
|
@ -272,7 +272,7 @@ def mesh_map(request, level_id: int):
|
||||||
"geometry": mapping(beacon.geometry),
|
"geometry": mapping(beacon.geometry),
|
||||||
"properties": {
|
"properties": {
|
||||||
"node_number": beacon.node_number,
|
"node_number": beacon.node_number,
|
||||||
"wifi_bssid": (beacon.wifi_bssids + [None])[0],
|
"wifi_bssid": (beacon.addresses + [None])[0],
|
||||||
"comment": beacon.comment,
|
"comment": beacon.comment,
|
||||||
"mesh_node": None if node is None else {
|
"mesh_node": None if node is None else {
|
||||||
"address": node.address,
|
"address": node.address,
|
||||||
|
|
|
@ -197,10 +197,10 @@ class MeshNodeQuerySet(models.QuerySet):
|
||||||
for ranging_beacon in RangingBeacon.objects.filter(
|
for ranging_beacon in RangingBeacon.objects.filter(
|
||||||
Q(node_number__in=nodes_by_id.keys())
|
Q(node_number__in=nodes_by_id.keys())
|
||||||
).select_related('space'):
|
).select_related('space'):
|
||||||
if not (set(ranging_beacon.wifi_bssids) & nodes_by_bssid_keys):
|
if not (set(ranging_beacon.addresses) & nodes_by_bssid_keys):
|
||||||
continue
|
continue
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
for bssid in ranging_beacon.wifi_bssids:
|
for bssid in ranging_beacon.addresses:
|
||||||
with suppress(KeyError):
|
with suppress(KeyError):
|
||||||
nodes_by_bssid[bssid]._ranging_beacon = ranging_beacon
|
nodes_by_bssid[bssid]._ranging_beacon = ranging_beacon
|
||||||
with suppress(KeyError):
|
with suppress(KeyError):
|
||||||
|
|
|
@ -60,8 +60,8 @@ def get_nodes_and_ranging_beacons():
|
||||||
ranging_beacon = beacons[ranging_beacon_id]
|
ranging_beacon = beacons[ranging_beacon_id]
|
||||||
ranging_beacon.save = None
|
ranging_beacon.save = None
|
||||||
|
|
||||||
if not ranging_beacon.wifi_bssids:
|
if not ranging_beacon.addresses:
|
||||||
ranging_beacon.wifi_bssids = [node.address]
|
ranging_beacon.addresses = [node.address]
|
||||||
if not ranging_beacon.bluetooth_address:
|
if not ranging_beacon.bluetooth_address:
|
||||||
ranging_beacon.bluetooth_address = node.address[:-2] + hex(int(node.address[-2:], 16)+1)[2:]
|
ranging_beacon.bluetooth_address = node.address[:-2] + hex(int(node.address[-2:], 16)+1)[2:]
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ class Locator:
|
||||||
calculated = get_nodes_and_ranging_beacons()
|
calculated = get_nodes_and_ranging_beacons()
|
||||||
for beacon in calculated.beacons.values():
|
for beacon in calculated.beacons.values():
|
||||||
identifiers = []
|
identifiers = []
|
||||||
for bssid in beacon.wifi_bssids:
|
for bssid in beacon.addresses:
|
||||||
identifiers.append(TypedIdentifier(PeerType.WIFI, bssid))
|
identifiers.append(TypedIdentifier(PeerType.WIFI, bssid))
|
||||||
if beacon.ibeacon_uuid and beacon.ibeacon_major is not None and beacon.ibeacon_minor is not None:
|
if beacon.ibeacon_uuid and beacon.ibeacon_major is not None and beacon.ibeacon_minor is not None:
|
||||||
identifiers.append(
|
identifiers.append(
|
||||||
|
|
|
@ -1486,7 +1486,7 @@ c3nav = {
|
||||||
const $modal = $('#modal');
|
const $modal = $('#modal');
|
||||||
const $match_ap = $modal.find('[name=look_for_ap]');
|
const $match_ap = $modal.find('[name=look_for_ap]');
|
||||||
if ($match_ap.length) {
|
if ($match_ap.length) {
|
||||||
const $wifi_bssids = $('[name=wifi_bssids]');
|
const $addresses = $('[name=addresses]');
|
||||||
const ap_name = $match_ap.val();
|
const ap_name = $match_ap.val();
|
||||||
const found_bssids = {};
|
const found_bssids = {};
|
||||||
let scan_complete = false;
|
let scan_complete = false;
|
||||||
|
@ -1515,7 +1515,7 @@ c3nav = {
|
||||||
|
|
||||||
if (scan_complete) {
|
if (scan_complete) {
|
||||||
// todo only bssids that have count > 1
|
// todo only bssids that have count > 1
|
||||||
$wifi_bssids.val(JSON.stringify(Object.keys(found_bssids)));
|
$addresses.val(JSON.stringify(Object.keys(found_bssids)));
|
||||||
$('#modal button[type=submit]').show();
|
$('#modal button[type=submit]').show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue