From b7e92a02bb4b29467c83c0668fdc70b6deb62ba7 Mon Sep 17 00:00:00 2001 From: "Mr. Senko" Date: Tue, 13 Mar 2018 23:41:02 +0200 Subject: [PATCH] Use Django's own DurationField. Fixes #183 Migrations for 'testcases': - Alter field estimated_time on testcase Migrations for 'testruns': - Alter field estimated_time on testrun Will properly convert existing field values --- .../migrations/0016_duration_field.py | 48 +++++++++++++++++++ tcms/testcases/models.py | 4 +- .../migrations/0010_duration_field.py | 48 +++++++++++++++++++ tcms/testruns/models.py | 2 +- 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 tcms/testcases/migrations/0016_duration_field.py create mode 100644 tcms/testruns/migrations/0010_duration_field.py diff --git a/tcms/testcases/migrations/0016_duration_field.py b/tcms/testcases/migrations/0016_duration_field.py new file mode 100644 index 0000000000..497293c636 --- /dev/null +++ b/tcms/testcases/migrations/0016_duration_field.py @@ -0,0 +1,48 @@ +# Generated by Django 2.0.3 on 2018-03-13 21:35 +from datetime import timedelta +from django.db import migrations, models + + +def forward(apps, schema_editor): + TestCase = apps.get_model('testcases', 'TestCase') + + for tc in TestCase.objects.all(): + tc.estimated_time_new = timedelta(seconds=tc.estimated_time) + tc.save() + + +def reverse(apps, schema_editor): + TestCase = apps.get_model('testcases', 'TestCase') + + for tc in TestCase.objects.all(): + tc.estimated_time = tc.estimated_time_new.total_seconds() + tc.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('testcases', '0015_rename_testcasebug'), + ] + + operations = [ + # add a timedelta field + migrations.AddField( + model_name='testcase', + name='estimated_time_new', + field=models.DurationField(default=timedelta(0)), + ), + # migrate the values + migrations.RunPython(forward, reverse), + # remove the integer field + migrations.RemoveField( + model_name='testcase', + name='estimated_time', + ), + # rename the new field to the old name + migrations.RenameField( + model_name='testcase', + old_name='estimated_time_new', + new_name='estimated_time', + ), + ] diff --git a/tcms/testcases/models.py b/tcms/testcases/models.py index fd542f87dc..55c1397bc8 100644 --- a/tcms/testcases/models.py +++ b/tcms/testcases/models.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from datetime import datetime +from datetime import datetime, timedelta from html2text import html2text from django.conf import settings @@ -127,7 +127,7 @@ class TestCase(TCMSActionModel): summary = models.CharField(max_length=255) requirement = models.CharField(max_length=255, blank=True, null=True) alias = models.CharField(max_length=255, blank=True) - estimated_time = models.IntegerField(db_column='estimated_time', default=0) # DurationField + estimated_time = models.DurationField(default=timedelta(0)) notes = models.TextField(blank=True, null=True) case_status = models.ForeignKey(TestCaseStatus, on_delete=models.CASCADE) diff --git a/tcms/testruns/migrations/0010_duration_field.py b/tcms/testruns/migrations/0010_duration_field.py new file mode 100644 index 0000000000..b095992a1d --- /dev/null +++ b/tcms/testruns/migrations/0010_duration_field.py @@ -0,0 +1,48 @@ +# Generated by Django 2.0.3 on 2018-03-13 21:35 +from datetime import timedelta +from django.db import migrations, models + + +def forward(apps, schema_editor): + TestRun = apps.get_model('testruns', 'TestRun') + + for tr in TestRun.objects.all(): + tr.estimated_time_new = timedelta(seconds=tr.estimated_time) + tr.save() + + +def reverse(apps, schema_editor): + TestRun = apps.get_model('testruns', 'TestRun') + + for tr in TestRun.objects.all(): + tr.estimated_time = tr.estimated_time_new.total_seconds() + tr.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('testruns', '0009_rename_testtag'), + ] + + operations = [ + # add a timedelta field + migrations.AddField( + model_name='testrun', + name='estimated_time_new', + field=models.DurationField(default=timedelta(0)), + ), + # migrate the values + migrations.RunPython(forward, reverse), + # remove the integer field + migrations.RemoveField( + model_name='testrun', + name='estimated_time', + ), + # rename the new field to the old name + migrations.RenameField( + model_name='testrun', + old_name='estimated_time_new', + new_name='estimated_time', + ), + ] diff --git a/tcms/testruns/models.py b/tcms/testruns/models.py index da4f6995c1..cc3bcb298d 100755 --- a/tcms/testruns/models.py +++ b/tcms/testruns/models.py @@ -35,7 +35,7 @@ class TestRun(TCMSActionModel): stop_date = models.DateTimeField(null=True, blank=True, db_index=True) summary = models.TextField() notes = models.TextField(blank=True) - estimated_time = models.IntegerField(default=0) # todo: DurationField + estimated_time = models.DurationField(default=datetime.timedelta(0)) plan = models.ForeignKey('testplans.TestPlan', related_name='run', on_delete=models.CASCADE)