beaconmeasurement quest backened implementation

This commit is contained in:
Laura Klünder 2024-12-27 19:21:39 +01:00
parent 87b7f00740
commit fd291858dd
3 changed files with 61 additions and 9 deletions

View file

@ -309,13 +309,6 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
_('Can not add redirecting slug “%s”: it is already used elsewhere.') % slug
)
def clean_data(self):
data = self.cleaned_data['data']
if not data.wifi:
raise ValidationError(_('WiFi scan data is missing.'))
data.wifi = [[item for item in scan if item.ssid] for scan in data.wifi]
return data
def clean(self):
if self.is_json:
for name, field in self.missing_fields:
@ -325,6 +318,15 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
if not self.cleaned_data.get('geometry'):
raise ValidationError('Missing geometry.')
data = self.cleaned_data['data']
if self.cleaned_data['fill_quest']:
if self.cleaned_data['data'].wifi:
raise ValidationError(_('Why is there WiFi scan data if this is a fill quest?'))
else:
if not self.cleaned_data['data'].wifi:
raise ValidationError(_('WiFi scan data is missing.'))
self.cleaned_data['data'].wifi = [[item for item in scan if item.ssid] for scan in data.wifi]
super().clean()
def _save_m2m(self):

View file

@ -6,8 +6,9 @@ from django.utils.translation import gettext_lazy as _
from shapely import Point
from shapely.geometry import mapping
from c3nav.mapdata.models.geometry.space import RangingBeacon
from c3nav.mapdata.models.geometry.space import RangingBeacon, BeaconMeasurement
from c3nav.mapdata.quests.base import ChangeSetModelForm, register_quest, Quest
from c3nav.routing.schemas import BeaconMeasurementDataSchema
class RangingBeaconAltitudeQuestForm(ChangeSetModelForm):
@ -103,3 +104,49 @@ class RangingBeaconBSSIDsQuest(Quest):
@classmethod
def _qs_for_request(cls, request):
return RangingBeacon.qs_for_request(request).filter(import_tag__startswith="noc:", wifi_bssids=[])
class BeaconMeasurementQuestForm(ChangeSetModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["data"].widget = HiddenInput()
def clean_bssids(self):
data = self.cleaned_data["data"]
if not data:
raise ValidationError(_("Need at least one scan."))
return data
class Meta:
model = BeaconMeasurement
fields = ("data", )
@property
def changeset_title(self):
return f'Beacon Measurement Quest: {self.instance.title}'
@register_quest
@dataclass
class BeaconMeasurementQuest(Quest):
quest_type = "beacon_measurement"
quest_type_label = _('Wifi/BLE Positioning')
quest_type_icon = "wifi"
form_class = BeaconMeasurementQuestForm
obj: BeaconMeasurement
@property
def quest_description(self) -> list[str]:
return [
_("Please stand as close to the given location as possible. "
"Feel free to close this window again to double-check."),
_("When you're ready, please click the button below and wait for measurements to arrive."),
]
@property
def point(self) -> Point:
return mapping(self.obj.geometry)
@classmethod
def _qs_for_request(cls, request):
return BeaconMeasurement.qs_for_request(request).filter(data=BeaconMeasurementDataSchema())

View file

@ -114,4 +114,7 @@ class LocateIBeaconPeerSchema(BaseSchema):
class BeaconMeasurementDataSchema(BaseSchema):
wifi: list[list[LocateWifiPeerSchema]] = []
ibeacon: list[list[LocateIBeaconPeerSchema]] = []
ibeacon: list[list[LocateIBeaconPeerSchema]] = []
def __bool__(self):
return bool(self.wifi or self.ibeacon)