fixed Wi-Fi measurements editor

This commit is contained in:
Jenny Danzmayr 2023-12-27 03:51:10 +01:00
parent 30d16c4cc9
commit ca03ea78fd
2 changed files with 29 additions and 15 deletions

View file

@ -16,6 +16,7 @@ from django.forms.widgets import HiddenInput
from django.utils.translation import get_language from django.utils.translation import get_language
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from shapely.geometry.geo import mapping from shapely.geometry.geo import mapping
from pydantic import ValidationError as PydanticValidationError
from c3nav.editor.models import ChangeSet, ChangeSetUpdate from c3nav.editor.models import ChangeSet, ChangeSetUpdate
from c3nav.mapdata.fields import GeometryField from c3nav.mapdata.fields import GeometryField
@ -221,9 +222,6 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
if 'to_node' in self.fields: if 'to_node' in self.fields:
self.fields['to_node'].widget = HiddenInput() self.fields['to_node'].widget = HiddenInput()
if 'data' in self.fields and 'data' in self.initial:
self.initial['data'] = json.dumps(self.initial['data'])
self.is_json = is_json self.is_json = is_json
self.missing_fields = tuple((name, field) for name, field in self.fields.items() self.missing_fields = tuple((name, field) for name, field in self.fields.items()
if name not in self.data and not field.required) if name not in self.data and not field.required)
@ -260,17 +258,28 @@ class EditorFormBase(I18nModelFormMixin, ModelForm):
) )
def clean_data(self): def clean_data(self):
try: if not isinstance(self.cleaned_data['data'], list):
data = json.loads(self.cleaned_data['data'])
except json.JSONDecodeError:
raise ValidationError(_('Invalid JSON.'))
if not isinstance(data, list):
raise ValidationError(_('Scan data is not a list.')) raise ValidationError(_('Scan data is not a list.'))
for item in data: data = list()
# todo: catch pydantic validation error for scan in self.cleaned_data['data']:
scan: list[dict]
scan_data = list()
for item in scan:
# The app might return results without an SSID, we ignore those
if not item.get('ssid', ''):
continue
# App version < 4.2.4 use level instead fo rssi
if 'level' in item:
item['rssi'] = item['level']
del item['level']
try:
LocateRequestPeerSchema.model_validate(item) LocateRequestPeerSchema.model_validate(item)
except PydanticValidationError as e:
raise ValidationError(str(e))
scan_data.append(item)
data.append(scan_data)
return data return data
def clean(self): def clean(self):

View file

@ -1299,17 +1299,22 @@ editor = {
$table.find('tr').addClass('old'); $table.find('tr').addClass('old');
for (i=0; i < data.length; i++) { for (i=0; i < data.length; i++) {
item = data[i]; item = data[i];
// App version < 4.2.4 use level instead fo rssi
if (item.level !== undefined) {
item.rssi = item.level;
delete item.level
}
apid = 'ap-'+item.bssid.replace(/:/g, '-'); apid = 'ap-'+item.bssid.replace(/:/g, '-');
line = $table.find('tr.'+apid); line = $table.find('tr.'+apid);
color = Math.max(0, Math.min(50, item.level+80)); color = Math.max(0, Math.min(50, item.rssi+80));
color = 'rgb('+String(250-color*5)+', '+String(color*4)+', 0)'; color = 'rgb('+String(250-color*5)+', '+String(color*4)+', 0)';
if (line.length) { if (line.length) {
line.removeClass('old').find(':last-child').text(item.level).css('color', color); line.removeClass('old').find(':last-child').text(item.rssi).css('color', color);
} else { } else {
line = $('<tr>').addClass(apid); line = $('<tr>').addClass(apid);
line.append($('<td>').text(item.bssid)); line.append($('<td>').text(item.bssid));
line.append($('<td>').text(item.ssid)); line.append($('<td>').text(item.ssid));
line.append($('<td>').text(item.level).css('color', color)); line.append($('<td>').text(item.rssi).css('color', color));
$table.append(line); $table.append(line);
} }
} }