migrate to django's native JSONField

This commit is contained in:
Laura Klünder 2022-04-03 19:40:12 +02:00
parent cde394e16e
commit 9d21f8c933
10 changed files with 480 additions and 14 deletions

View file

@ -0,0 +1,21 @@
# 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),
('api', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='token',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View file

@ -0,0 +1,37 @@
# 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', '0086_django_4_0'),
('control', '0008_userpermissions_reports'),
]
operations = [
migrations.AlterField(
model_name='userpermissions',
name='review_group_reports',
field=models.ManyToManyField(blank=True, limit_choices_to={'access_restriction': None}, to='mapdata.locationgroup', verbose_name='can review reports belonging to'),
),
migrations.AlterField(
model_name='userpermissions',
name='user',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='userspaceaccess',
name='space',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mapdata.space'),
),
migrations.AlterField(
model_name='userspaceaccess',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View file

@ -0,0 +1,47 @@
# 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),
('contenttypes', '0002_remove_content_type_name'),
('editor', '0001_squashed_2018'),
]
operations = [
migrations.AlterField(
model_name='changedobject',
name='changeset',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='editor.changeset', verbose_name='Change Set'),
),
migrations.AlterField(
model_name='changedobject',
name='content_type',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype'),
),
migrations.AlterField(
model_name='changedobject',
name='m2m_added',
field=models.JSONField(default=dict, verbose_name='added m2m values'),
),
migrations.AlterField(
model_name='changedobject',
name='m2m_removed',
field=models.JSONField(default=dict, verbose_name='removed m2m values'),
),
migrations.AlterField(
model_name='changedobject',
name='updated_fields',
field=models.JSONField(default=dict, verbose_name='updated fields'),
),
migrations.AlterField(
model_name='changeset',
name='author',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Author'),
),
]

View file

@ -9,7 +9,7 @@ from django.db.models import CharField, DecimalField, Field, TextField
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from c3nav.editor.wrappers import ModelInstanceWrapper, is_created_pk from c3nav.editor.wrappers import ModelInstanceWrapper, is_created_pk
from c3nav.mapdata.fields import I18nField, JSONField from c3nav.mapdata.fields import I18nField
from c3nav.mapdata.models.locations import LocationRedirect from c3nav.mapdata.models.locations import LocationRedirect
@ -35,9 +35,9 @@ class ChangedObject(models.Model):
created = models.DateTimeField(auto_now_add=True, verbose_name=_('created')) created = models.DateTimeField(auto_now_add=True, verbose_name=_('created'))
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
existing_object_pk = models.PositiveIntegerField(null=True, verbose_name=_('id of existing object')) existing_object_pk = models.PositiveIntegerField(null=True, verbose_name=_('id of existing object'))
updated_fields = JSONField(default={}, verbose_name=_('updated fields')) updated_fields = models.JSONField(default=dict, verbose_name=_('updated fields'))
m2m_added = JSONField(default={}, verbose_name=_('added m2m values')) m2m_added = models.JSONField(default=dict, verbose_name=_('added m2m values'))
m2m_removed = JSONField(default={}, verbose_name=_('removed m2m values')) m2m_removed = models.JSONField(default=dict, verbose_name=_('removed m2m values'))
deleted = models.BooleanField(default=False, verbose_name=_('object was deleted')) deleted = models.BooleanField(default=False, verbose_name=_('object was deleted'))
objects = ChangedObjectManager() objects = ChangedObjectManager()

View file

@ -31,7 +31,7 @@ def validate_geometry(geometry: BaseGeometry):
shapely_logger = logging.getLogger('shapely.geos') shapely_logger = logging.getLogger('shapely.geos')
class GeometryField(models.TextField): class GeometryField(models.JSONField):
default_validators = [validate_geometry] default_validators = [validate_geometry]
def __init__(self, geomtype=None, default=None, null=False): def __init__(self, geomtype=None, default=None, null=False):
@ -50,9 +50,7 @@ class GeometryField(models.TextField):
return name, path, args, kwargs return name, path, args, kwargs
def from_db_value(self, value, expression, connection): def from_db_value(self, value, expression, connection):
if value is None: return WrappedGeometry(super().from_db_value(value, expression, connection))
return value
return WrappedGeometry(json.loads(value))
def to_python(self, value): def to_python(self, value):
if value is None or value == '': if value is None or value == '':
@ -117,6 +115,7 @@ class GeometryField(models.TextField):
class JSONField(models.TextField): class JSONField(models.TextField):
# Deprecated
def from_db_value(self, value, expression, connection): def from_db_value(self, value, expression, connection):
if value is None: if value is None:
return value return value
@ -173,7 +172,7 @@ class I18nDescriptor:
setattr(instance, self.field.attname, value) 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, 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): fallback_language=settings.LANGUAGE_CODE, fallback_any=False, fallback_value=None, **kwargs):
self.i18n_max_length = max_length self.i18n_max_length = max_length
@ -182,7 +181,7 @@ class I18nField(JSONField):
self.fallback_any = fallback_any self.fallback_any = fallback_any
self.fallback_value = fallback_value self.fallback_value = fallback_value
kwargs.pop('null', None) 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): def get_default(self):
return self.default.copy() return self.default.copy()

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

View file

@ -10,7 +10,7 @@ from django.utils.text import format_lazy
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from shapely.geometry import CAP_STYLE, JOIN_STYLE, mapping 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.grid import grid
from c3nav.mapdata.models import Space from c3nav.mapdata.models import Space
from c3nav.mapdata.models.access import AccessRestrictionMixin 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, author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True,
verbose_name=_('author')) verbose_name=_('author'))
comment = models.TextField(null=True, blank=True, verbose_name=_('comment')) comment = models.TextField(null=True, blank=True, verbose_name=_('comment'))
data = JSONField(_('Measurement list')) data = models.JSONField(_('Measurement list'))
class Meta: class Meta:
verbose_name = _('Wi-Fi Measurement') verbose_name = _('Wi-Fi Measurement')

View file

@ -0,0 +1,26 @@
# 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),
('routing', '0001_routeoptions'),
]
operations = [
migrations.AlterField(
model_name='routeoptions',
name='data',
field=models.JSONField(default=dict),
),
migrations.AlterField(
model_name='routeoptions',
name='user',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL),
),
]

View file

@ -8,13 +8,12 @@ from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from c3nav.mapdata.fields import JSONField
from c3nav.mapdata.models import MapUpdate, WayType from c3nav.mapdata.models import MapUpdate, WayType
class RouteOptions(models.Model): class RouteOptions(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True) user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
data = JSONField(default={}) data = models.JSONField(default=dict)
class Meta: class Meta:
verbose_name = _('Route options') verbose_name = _('Route options')

View file

@ -0,0 +1,21 @@
# 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),
('site', '0005_siteupdate_default_related_name'),
]
operations = [
migrations.AlterField(
model_name='announcement',
name='author',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='author'),
),
]