migrate to django's native JSONField
This commit is contained in:
parent
cde394e16e
commit
9d21f8c933
10 changed files with 480 additions and 14 deletions
|
@ -31,7 +31,7 @@ def validate_geometry(geometry: BaseGeometry):
|
|||
shapely_logger = logging.getLogger('shapely.geos')
|
||||
|
||||
|
||||
class GeometryField(models.TextField):
|
||||
class GeometryField(models.JSONField):
|
||||
default_validators = [validate_geometry]
|
||||
|
||||
def __init__(self, geomtype=None, default=None, null=False):
|
||||
|
@ -50,9 +50,7 @@ class GeometryField(models.TextField):
|
|||
return name, path, args, kwargs
|
||||
|
||||
def from_db_value(self, value, expression, connection):
|
||||
if value is None:
|
||||
return value
|
||||
return WrappedGeometry(json.loads(value))
|
||||
return WrappedGeometry(super().from_db_value(value, expression, connection))
|
||||
|
||||
def to_python(self, value):
|
||||
if value is None or value == '':
|
||||
|
@ -117,6 +115,7 @@ class GeometryField(models.TextField):
|
|||
|
||||
|
||||
class JSONField(models.TextField):
|
||||
# Deprecated
|
||||
def from_db_value(self, value, expression, connection):
|
||||
if value is None:
|
||||
return value
|
||||
|
@ -173,7 +172,7 @@ class I18nDescriptor:
|
|||
setattr(instance, self.field.attname, value)
|
||||
|
||||
|
||||
class I18nField(JSONField):
|
||||
class I18nField(models.JSONField):
|
||||
def __init__(self, verbose_name=None, plural_name=None, max_length=None, default=None,
|
||||
fallback_language=settings.LANGUAGE_CODE, fallback_any=False, fallback_value=None, **kwargs):
|
||||
self.i18n_max_length = max_length
|
||||
|
@ -182,7 +181,7 @@ class I18nField(JSONField):
|
|||
self.fallback_any = fallback_any
|
||||
self.fallback_value = fallback_value
|
||||
kwargs.pop('null', None)
|
||||
super().__init__(verbose_name=verbose_name, default=(dict(default) if default else {}), null=False, **kwargs)
|
||||
super().__init__(verbose_name=verbose_name, default=(dict(default) if default else dict), null=False, **kwargs)
|
||||
|
||||
def get_default(self):
|
||||
return self.default.copy()
|
||||
|
|
316
src/c3nav/mapdata/migrations/0086_django_4_0.py
Normal file
316
src/c3nav/mapdata/migrations/0086_django_4_0.py
Normal file
|
@ -0,0 +1,316 @@
|
|||
# Generated by Django 4.0.3 on 2022-04-03 17:32
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
('mapdata', '0085_locationgroupcategory_allow_dynamic_locations'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='accesspermission',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.accessrestriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='accesspermission',
|
||||
name='token',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='mapdata.accesspermissiontoken', verbose_name='Access permission token'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='accesspermission',
|
||||
name='user',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='accessrestriction',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.accessrestrictiongroup', verbose_name='Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='altitudearea',
|
||||
name='level',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.level', verbose_name='level'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='altitudemarker',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='area',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='area',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.locationgroup', verbose_name='Location Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='area',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='area',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='area',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='building',
|
||||
name='level',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.level', verbose_name='level'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='column',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='column',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='crossdescription',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='door',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='door',
|
||||
name='level',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.level', verbose_name='level'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dynamiclocation',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dynamiclocation',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.locationgroup', verbose_name='Location Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dynamiclocation',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dynamiclocation',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='graphedge',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='graphedge',
|
||||
name='waytype',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.waytype', verbose_name='Way Type'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='graphnode',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='hole',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='leavedescription',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='level',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='level',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.locationgroup', verbose_name='Location Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='level',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='level',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='lineobstacle',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='locationgroup',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='locationgroup',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, help_text='unless location specifies otherwise', null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='locationgroup',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='locationredirect',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='mapupdate',
|
||||
name='user',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='obstacle',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='poi',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='poi',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.locationgroup', verbose_name='Location Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='poi',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='poi',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='poi',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='position',
|
||||
name='coordinates_id',
|
||||
field=models.CharField(blank=True, max_length=48, null=True, verbose_name='coordinates'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='position',
|
||||
name='owner',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='position',
|
||||
name='timeout',
|
||||
field=models.PositiveSmallIntegerField(blank=True, default=0, help_text='0 for no timeout', verbose_name='timeout (in seconds)'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='ramp',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='report',
|
||||
name='author',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='author'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='report',
|
||||
name='created_groups',
|
||||
field=models.ManyToManyField(blank=True, help_text='select all groups that apply, if any', limit_choices_to={'can_report_missing': True}, related_name='+', to='mapdata.locationgroup', verbose_name='location groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='reportupdate',
|
||||
name='author',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='author'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='reportupdate',
|
||||
name='open',
|
||||
field=models.BooleanField(null=True, verbose_name='open'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='source',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='space',
|
||||
name='access_restriction',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.accessrestriction', verbose_name='Access Restriction'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='space',
|
||||
name='groups',
|
||||
field=models.ManyToManyField(blank=True, to='mapdata.locationgroup', verbose_name='Location Groups'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='space',
|
||||
name='label_settings',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='mapdata.labelsettings', verbose_name='label settings'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='space',
|
||||
name='level',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.level', verbose_name='level'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='space',
|
||||
name='locationslug_ptr',
|
||||
field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mapdata.locationslug'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='stair',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='wifimeasurement',
|
||||
name='author',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='author'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='wifimeasurement',
|
||||
name='data',
|
||||
field=models.JSONField(verbose_name='Measurement list'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='wifimeasurement',
|
||||
name='space',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space', verbose_name='space'),
|
||||
),
|
||||
]
|
|
@ -10,7 +10,7 @@ from django.utils.text import format_lazy
|
|||
from django.utils.translation import gettext_lazy as _
|
||||
from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping
|
||||
|
||||
from c3nav.mapdata.fields import GeometryField, I18nField, JSONField
|
||||
from c3nav.mapdata.fields import GeometryField, I18nField
|
||||
from c3nav.mapdata.grid import grid
|
||||
from c3nav.mapdata.models import Space
|
||||
from c3nav.mapdata.models.access import AccessRestrictionMixin
|
||||
|
@ -384,7 +384,7 @@ class WifiMeasurement(SpaceGeometryMixin, models.Model):
|
|||
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True,
|
||||
verbose_name=_('author'))
|
||||
comment = models.TextField(null=True, blank=True, verbose_name=_('comment'))
|
||||
data = JSONField(_('Measurement list'))
|
||||
data = models.JSONField(_('Measurement list'))
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('Wi-Fi Measurement')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue