Skip to content

Commit eaa0ac2

Browse files
committed
fix(django): migrating to Django 5
Small changes to models (indexes) and some other places (timezones, and CommandParser)
1 parent 5c48081 commit eaa0ac2

13 files changed

Lines changed: 321 additions & 115 deletions

File tree

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: "3.6"
22
services:
33
database:
4-
image: mdillon/postgis:10
4+
image: postgis/postgis:17-3.5
55
volumes:
66
- database-data:/var/lib/postgresql/data
77
environment:
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.2 on 2025-04-18 15:02
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('backends', '0004_storage_streaming'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='storage',
15+
name='id',
16+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17+
),
18+
migrations.AlterField(
19+
model_name='storageauth',
20+
name='id',
21+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22+
),
23+
]

eoxserver/core/util/timetools.py

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
#-------------------------------------------------------------------------------
1+
# ------------------------------------------------------------------------------
22
#
33
# Project: EOxServer <http://eoxserver.org>
44
# Authors: Stephan Krause <stephan.krause@eox.at>
55
# Stephan Meissl <stephan.meissl@eox.at>
66
#
7-
#-------------------------------------------------------------------------------
7+
# ------------------------------------------------------------------------------
88
# Copyright (C) 2011 EOX IT Services GmbH
99
#
1010
# Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -24,20 +24,14 @@
2424
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2525
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2626
# THE SOFTWARE.
27-
#-------------------------------------------------------------------------------
27+
# ------------------------------------------------------------------------------
2828

2929
import re
30-
from datetime import datetime, timedelta
30+
from datetime import datetime, timedelta, timezone
3131

32-
from django.utils.timezone import utc, make_aware, is_aware
33-
#from django.utils.dateparse import parse_datetime, parse_date
32+
from django.utils.timezone import make_aware, is_aware
3433

35-
try:
36-
from dateutil.parser import parse
37-
HAVE_DATEUTIL = True
38-
except ImportError:
39-
from django.utils.dateparse import parse_datetime, parse_date
40-
HAVE_DATEUTIL = False
34+
from dateutil.parser import parse as parse_dateutil
4135

4236

4337
def isoformat(dt):
@@ -69,26 +63,24 @@ def parse_iso8601(value, tzinfo=None):
6963
:returns: a :class:`datetime.datetime`
7064
"""
7165

72-
tzinfo = tzinfo or utc
73-
parsers = (parse,) if HAVE_DATEUTIL else (parse_datetime, parse_date)
74-
for parser in parsers:
75-
try:
76-
temporal = parser(value)
77-
except Exception as e:
78-
raise ValueError(
79-
"Could not parse '%s' to a temporal value. "
80-
"Error was: %s" % (value, e)
81-
)
82-
if temporal:
83-
# convert to datetime if necessary
84-
if not isinstance(temporal, datetime):
85-
temporal = datetime.combine(temporal, datetime.min.time())
86-
87-
# use UTC, if the datetime is not already time-zone aware
88-
if not is_aware(temporal):
89-
temporal = make_aware(temporal, tzinfo)
90-
91-
return temporal
66+
tzinfo = tzinfo or timezone.utc
67+
try:
68+
temporal = parse_dateutil(value)
69+
except Exception as e:
70+
raise ValueError(
71+
"Could not parse '%s' to a temporal value. "
72+
"Error was: %s" % (value, e)
73+
)
74+
if temporal:
75+
# convert to datetime if necessary
76+
if not isinstance(temporal, datetime):
77+
temporal = datetime.combine(temporal, datetime.min.time())
78+
79+
# use UTC, if the datetime is not already time-zone aware
80+
if not is_aware(temporal):
81+
temporal = make_aware(temporal, tzinfo)
82+
83+
return temporal
9284

9385
raise ValueError("Could not parse '%s' to a temporal value" % value)
9486

eoxserver/resources/coverages/admin.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@
2828
# ------------------------------------------------------------------------------
2929

3030
from django.contrib.gis import admin
31-
try:
32-
from django.core.urlresolvers import reverse, NoReverseMatch
33-
except ImportError:
34-
from django.urls import reverse, NoReverseMatch
31+
32+
from django.urls import reverse, NoReverseMatch
3533
from django.utils.safestring import mark_safe
3634
from django.conf import settings
3735
from django.forms import ModelForm, TextInput
@@ -46,7 +44,6 @@
4644

4745
class FieldTypeInline(admin.StackedInline):
4846
model = models.FieldType
49-
filter_horizontal = ['nil_values']
5047
extra = 0
5148

5249
def get_queryset(self, *args, **kwargs):
@@ -169,7 +166,7 @@ class CollectionMetadataInline(admin.StackedInline):
169166
# Abstract admins
170167
# ==============================================================================
171168

172-
class EOObjectAdmin(admin.GeoModelAdmin):
169+
class EOObjectAdmin(admin.GISModelAdmin):
173170
date_hierarchy = 'inserted'
174171

175172
@property

eoxserver/resources/coverages/management/commands/__init__.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
#-------------------------------------------------------------------------------
1+
# ------------------------------------------------------------------------------
22
#
33
# Project: EOxServer <http://eoxserver.org>
44
# Authors: Stephan Krause <stephan.krause@eox.at>
55
# Stephan Meissl <stephan.meissl@eox.at>
66
# Fabian Schindler <fabian.schindler@eox.at>
77
#
8-
#-------------------------------------------------------------------------------
8+
# ------------------------------------------------------------------------------
99
# Copyright (C) 2011 EOX IT Services GmbH
1010
#
1111
# Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -25,14 +25,13 @@
2525
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2626
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2727
# THE SOFTWARE.
28-
#-------------------------------------------------------------------------------
28+
# ------------------------------------------------------------------------------
2929

3030
import logging
3131
import traceback
3232
from optparse import OptionValueError
3333

3434
import django
35-
from django.db import transaction
3635
from django.core.management.base import CommandParser
3736

3837

@@ -136,18 +135,11 @@ def print_traceback(self, e, kwargs):
136135
self.print_msg(traceback.format_exc())
137136

138137

139-
def create_parser(cmd, kwargs):
140-
if django.VERSION[0] < 2:
141-
return CommandParser(cmd, **kwargs)
142-
else:
143-
return CommandParser(**kwargs)
144-
145-
class SubParserMixIn(object):
146-
def add_subparser(self, parser, name, *args, **kwargs):
138+
class SubParserMixIn:
139+
def add_subparser(self, parser: CommandParser, name, *args, **kwargs):
147140
if not getattr(self, 'subparsers', None):
148141
self.subparsers = parser.add_subparsers(
149142
title="subcommands",
150-
parser_class=lambda **kw: create_parser(self, kw)
151143
)
152144
subparser = self.subparsers.add_parser(name, *args, **kwargs)
153145
subparser.set_defaults(subcommand=name)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
# Generated by Django 5.2 on 2025-04-18 15:02
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('coverages', '0013_raster_style'),
10+
]
11+
12+
operations = [
13+
migrations.RenameIndex(
14+
model_name='eoobject',
15+
new_name='coverages_e_begin_t_3d6a5d_idx',
16+
old_fields=('begin_time', 'end_time'),
17+
),
18+
migrations.AlterField(
19+
model_name='acquisitionstation',
20+
name='id',
21+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22+
),
23+
migrations.AlterField(
24+
model_name='acquisitionsubtype',
25+
name='id',
26+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
27+
),
28+
migrations.AlterField(
29+
model_name='allowedvaluerange',
30+
name='id',
31+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
32+
),
33+
migrations.AlterField(
34+
model_name='archivingcenter',
35+
name='id',
36+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
37+
),
38+
migrations.AlterField(
39+
model_name='arraydataitem',
40+
name='id',
41+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
42+
),
43+
migrations.AlterField(
44+
model_name='bandstatistics',
45+
name='id',
46+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
47+
),
48+
migrations.AlterField(
49+
model_name='browse',
50+
name='id',
51+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
52+
),
53+
migrations.AlterField(
54+
model_name='browsetype',
55+
name='id',
56+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
57+
),
58+
migrations.AlterField(
59+
model_name='collectionmetadata',
60+
name='id',
61+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
62+
),
63+
migrations.AlterField(
64+
model_name='collectiontype',
65+
name='id',
66+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
67+
),
68+
migrations.AlterField(
69+
model_name='coveragemetadata',
70+
name='id',
71+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
72+
),
73+
migrations.AlterField(
74+
model_name='coveragetype',
75+
name='id',
76+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
77+
),
78+
migrations.AlterField(
79+
model_name='eoobject',
80+
name='id',
81+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
82+
),
83+
migrations.AlterField(
84+
model_name='fieldtype',
85+
name='id',
86+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
87+
),
88+
migrations.AlterField(
89+
model_name='frame',
90+
name='id',
91+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
92+
),
93+
migrations.AlterField(
94+
model_name='grid',
95+
name='id',
96+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
97+
),
98+
migrations.AlterField(
99+
model_name='mask',
100+
name='id',
101+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
102+
),
103+
migrations.AlterField(
104+
model_name='masktype',
105+
name='id',
106+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
107+
),
108+
migrations.AlterField(
109+
model_name='metadataitem',
110+
name='id',
111+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
112+
),
113+
migrations.AlterField(
114+
model_name='nilvalue',
115+
name='id',
116+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
117+
),
118+
migrations.AlterField(
119+
model_name='orbitnumber',
120+
name='id',
121+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
122+
),
123+
migrations.AlterField(
124+
model_name='processingcenter',
125+
name='id',
126+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
127+
),
128+
migrations.AlterField(
129+
model_name='processingmode',
130+
name='id',
131+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
132+
),
133+
migrations.AlterField(
134+
model_name='processorname',
135+
name='id',
136+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
137+
),
138+
migrations.AlterField(
139+
model_name='productdataitem',
140+
name='id',
141+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
142+
),
143+
migrations.AlterField(
144+
model_name='productmetadata',
145+
name='id',
146+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
147+
),
148+
migrations.AlterField(
149+
model_name='productqualitydegredationtag',
150+
name='id',
151+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
152+
),
153+
migrations.AlterField(
154+
model_name='producttype',
155+
name='id',
156+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
157+
),
158+
migrations.AlterField(
159+
model_name='productversion',
160+
name='id',
161+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
162+
),
163+
migrations.AlterField(
164+
model_name='sensormode',
165+
name='id',
166+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
167+
),
168+
migrations.AlterField(
169+
model_name='swathidentifier',
170+
name='id',
171+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
172+
),
173+
migrations.AlterField(
174+
model_name='track',
175+
name='id',
176+
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
177+
),
178+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2 on 2025-04-18 15:09
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('coverages', '0014_rename_eoobject_begin_time_end_time_coverages_e_begin_t_3d6a5d_idx_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='bandstatistics',
15+
name='histogram',
16+
field=models.JSONField(blank=True, null=True),
17+
),
18+
]

0 commit comments

Comments
 (0)