wifi_bssids → addresses

This commit is contained in:
Laura Klünder 2024-12-28 15:21:53 +01:00
parent ca6252583c
commit cfed6d9ed7
12 changed files with 70 additions and 30 deletions

View file

@ -19,7 +19,7 @@ class Command(BaseCommand):
found_beacons.setdefault(measurement["bssid"], []).append((beacon_measurement, measurement))
# 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
for bssid, measurements in found_beacons.items():

View file

@ -48,7 +48,8 @@ class Command(BaseCommand):
spaces_for_level.setdefault(space.level_id, []).append(space)
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():
@ -118,7 +119,7 @@ class Command(BaseCommand):
# build resulting object
altitude_quest = True
if not result:
result = RangingBeacon(import_tag=import_tag)
result = RangingBeacon(import_tag=import_tag, beacon_type=RangingBeacon.BeaconType.EVENT_WIFI)
else:
if result.space == new_space and distance(unwrap_geom(result.geometry), new_geometry) < 0.03:
continue

View file

@ -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'),
),
]

View file

@ -470,9 +470,10 @@ class BeaconMeasurement(SpaceGeometryMixin, models.Model):
for peer in scan:
if peer.ap_name:
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]))
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()
def save(self, *args, **kwargs):
@ -495,8 +496,8 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
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,
help_text=_("uses node's value if not set"))
addresses: list[MacAddress] = SchemaField(list[MacAddress], verbose_name=_('Mac Address / BSSIDs'), default=list,
help_text=_("uses node's value if not set"))
bluetooth_address = models.CharField(_('Bluetooth Address'), unique=True, null=True, blank=True,
max_length=17,
validators=[RegexValidator(
@ -522,7 +523,7 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
altitude = models.DecimalField(_('altitude above ground'), max_digits=6, decimal_places=2, default=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'))
altitude_quest = models.BooleanField(_('altitude quest'), default=True)
@ -551,8 +552,8 @@ class RangingBeacon(SpaceGeometryMixin, models.Model):
title = ' - '.join(segments).strip()
else:
title = f'#{self.pk}'
if self.wifi_bssids:
ssids = self.wifi_bssids[0] + (', …' if len(self.wifi_bssids) > 1 else '')
if self.addresses:
ssids = self.addresses[0] + (', …' if len(self.adresses) > 1 else '')
title += f' ({ssids})'
if self.comment:
title += f' ({self.comment})'

View file

@ -61,17 +61,17 @@ class RangingBeaconBSSIDsQuestForm(ChangeSetModelForm):
super().__init__(*args, **kwargs)
self.fields["look_for_ap"] = CharField(disabled=True, initial=self.instance.import_tag[4:],
widget=HiddenInput())
self.fields["wifi_bssids"].widget = HiddenInput()
self.fields["addresses"].widget = HiddenInput()
def clean_bssids(self):
data = self.cleaned_data["wifi_bssids"]
def clean_addresses(self):
data = self.cleaned_data["addresses"]
if not data:
raise ValidationError(_("Need at least one bssid."))
return data
class Meta:
model = RangingBeacon
fields = ("wifi_bssids", )
fields = ("addresses", )
@property
def changeset_title(self):
@ -103,7 +103,7 @@ class RangingBeaconBSSIDsQuest(Quest):
@classmethod
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):