Skip to content

Commit

Permalink
SIO-1600 Django 1.7 migrations serialize choices for EnumFields
Browse files Browse the repository at this point in the history
Change-Id: I363b0d323236f24ca10d8e778a614e6a3991c1d0
  • Loading branch information
SzymonPajzert authored and Gerrit Code Review committed Dec 16, 2016
1 parent cb6d483 commit eb41020
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 6 deletions.
5 changes: 5 additions & 0 deletions oioioi/base/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,11 @@ def _generate_choices(self):
for item in self.registry.entries:
yield item

def deconstruct(self):
name, path, args, kwargs = super(EnumField, self).deconstruct()
kwargs.pop('choices', None)
return name, path, args, kwargs


class PhoneNumberField(models.CharField):
"""A ``CharField`` designed to store phone numbers."""
Expand Down
27 changes: 21 additions & 6 deletions oioioi/base/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,17 +549,32 @@ def test_dotted_name_field_module_loading(self):
self.assertIn('oioioi.base.tests.test_dotted_field_classes',
sys.modules)

def test_enum_field(self):
registry = EnumRegistry()
field = EnumField(registry)
registry.register('OK', 'OK')
registry.register('OK', 'Should be ignored (duplicate)')
registry.register('ERR', 'Error')

class TestEnumField(unittest.TestCase):
def setUp(self):
self.registry = EnumRegistry()
self.registry.register('OK', 'OK')
self.registry.register('OK', 'Should be ignored (duplicate)')
self.registry.register('ERR', 'Error')

def test_basic_usage(self):
field = EnumField(self.registry)
self.assertEqual(sorted(list(field.choices)),
[('ERR', 'Error'), ('OK', 'OK')])
with self.assertRaises(ValidationError):
field.validate('FOO', None)

def test_serialization(self):
"""Test if choices aren't serialized by migration."""
first_field = EnumField(self.registry)
first_serialized = first_field.deconstruct()

self.registry.register('MAYBE', "You tell me if it's wrong or not")
second_field = EnumField(self.registry)
second_serialized = second_field.deconstruct()

self.assertEqual(first_serialized, second_serialized)


class TestExecute(unittest.TestCase):
def test_echo(self):
Expand Down
24 changes: 24 additions & 0 deletions oioioi/contests/migrations/0007_auto_20161214_1411.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('contests', '0006_contestattachment_pub_date'),
]

operations = [
migrations.AlterField(
model_name='contest',
name='contact_email',
field=models.EmailField(help_text='Address of contest owners. Sent emails related to this contest (i.e. submission confirmations) will have the return address set to this value. Defaults to system admins address if left empty.', max_length=254, verbose_name='contact email', blank=True),
),
migrations.AlterField(
model_name='probleminstance',
name='submissions_limit',
field=models.IntegerField(default=10, verbose_name='submissions limit'),
),
]
19 changes: 19 additions & 0 deletions oioioi/oi/migrations/0003_auto_20161214_1411.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('oi', '0002_auto_20160412_1720'),
]

operations = [
migrations.AlterField(
model_name='school',
name='email',
field=models.EmailField(max_length=254, verbose_name='email', blank=True),
),
]
31 changes: 31 additions & 0 deletions oioioi/problems/migrations/0007_auto_20161214_1411.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
import re
import django.core.validators


class Migration(migrations.Migration):

dependencies = [
('problems', '0006_default_values_for_problem'),
]

operations = [
migrations.AlterField(
model_name='problem',
name='short_name',
field=models.CharField(max_length=30, verbose_name='short name', validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')]),
),
migrations.AlterField(
model_name='problempackage',
name='problem_name',
field=models.CharField(blank=True, max_length=30, null=True, verbose_name='problem name', validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')]),
),
migrations.AlterField(
model_name='tag',
name='name',
field=models.CharField(unique=True, max_length=20, verbose_name='name', validators=[django.core.validators.MinLengthValidator(3), django.core.validators.MaxLengthValidator(20), django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')]),
),
]
20 changes: 20 additions & 0 deletions oioioi/programs/migrations/0004_auto_20161214_1411.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models
import oioioi.programs.models


class Migration(migrations.Migration):

dependencies = [
('programs', '0003_auto_20150420_2002'),
]

operations = [
migrations.AlterField(
model_name='test',
name='memory_limit',
field=models.IntegerField(blank=True, null=True, verbose_name='memory limit (KiB)', validators=[oioioi.programs.models.validate_memory_limit]),
),
]
18 changes: 18 additions & 0 deletions oioioi/submitsqueue/migrations/0002_auto_20161214_1411.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('submitsqueue', '0001_initial'),
]

operations = [
migrations.AlterModelOptions(
name='queuedsubmit',
options={'ordering': ['pk'], 'verbose_name': 'Queued submission', 'verbose_name_plural': 'Queued submissions'},
),
]

0 comments on commit eb41020

Please sign in to comment.