summaryrefslogtreecommitdiff
path: root/releases
diff options
context:
space:
mode:
authorSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-04-04 15:51:22 +0200
committerBaptiste Mispelon <bmispelon@gmail.com>2025-04-17 12:27:35 +0200
commit283b7c08310d2614b4b5671a4c169c6ea8482ca1 (patch)
tree956c355471760c9f3ae20733feab19e94fddbf91 /releases
parentf31081e24b5213e65046465df480a38b81c8b87a (diff)
Handled pre-releases when setting previous release as end of life.
Diffstat (limited to 'releases')
-rw-r--r--releases/models.py35
-rw-r--r--releases/tests.py23
2 files changed, 49 insertions, 9 deletions
diff --git a/releases/models.py b/releases/models.py
index 39a964fa..3edb7b8c 100644
--- a/releases/models.py
+++ b/releases/models.py
@@ -242,15 +242,8 @@ class Release(models.Model):
self.status = self.STATUS_REVERSE[status]
cache.delete(self.DEFAULT_CACHE_KEY)
super().save(*args, **kwargs)
- # Each micro release EOLs the previous one in the same series.
- if self.status == "f" and self.micro > 0 and self.is_active:
- (
- type(self)
- .objects.filter(
- major=self.major, minor=self.minor, micro=self.micro - 1, status="f"
- )
- .update(eol_date=self.date)
- )
+ if self.is_active:
+ self.set_previous_release_as_eol()
def __str__(self):
return self.version
@@ -313,3 +306,27 @@ class Release(models.Model):
regex = f"^[Dd]jango-{re.escape(version)}{re.escape(suffix)}$"
message = f"Filename {name} does not match pattern {regex}."
return RegexValidator(regex, message=message, code="invalid_name")(name)
+
+ def set_previous_release_as_eol(self):
+ """Handles setting EOL date for the previous release in the series."""
+ previous_release_kwargs = {
+ "major": self.major,
+ "minor": self.minor,
+ "micro": self.micro,
+ "status": self.status,
+ "eol_date__isnull": True,
+ }
+ if self.iteration > 1:
+ previous_release_kwargs["iteration"] = self.iteration - 1
+ elif self.status == "b":
+ previous_release_kwargs["status"] = "a"
+ elif self.status == "c":
+ previous_release_kwargs["status"] = "b"
+ elif self.status == "f" and self.micro == 0:
+ previous_release_kwargs["status"] = "c"
+ elif self.status == "f" and self.micro > 0:
+ previous_release_kwargs["micro"] = self.micro - 1
+
+ self.__class__.objects.filter(**previous_release_kwargs).update(
+ eol_date=self.date
+ )
diff --git a/releases/tests.py b/releases/tests.py
index 093189bf..f9d26aac 100644
--- a/releases/tests.py
+++ b/releases/tests.py
@@ -212,6 +212,29 @@ class ReleaseTestCase(TestCase):
with self.subTest(**params):
self.assertEqual(previous.eol_date, expected_eol_date)
+ def test_save_eol_date_pre_releases(self):
+ other_release = Release.objects.create(version="5.1.7", is_active=True)
+ today = datetime.date.today()
+ cases = [
+ ("5.2a1", "5.2a2"),
+ ("5.2a2", "5.2b1"),
+ ("5.2b1", "5.2rc1"),
+ ("5.2rc1", "5.2"),
+ ("5.2", "5.2.1"),
+ ]
+ for previous_version, next_version in cases:
+ with self.subTest(msg=f"{previous_version} -> {next_version}"):
+ previous_release, _ = Release.objects.get_or_create(
+ version=previous_version,
+ is_active=True,
+ )
+ self.assertIsNone(previous_release.eol_date)
+ Release.objects.create(version=next_version, is_active=True)
+ previous_release.refresh_from_db()
+ other_release.refresh_from_db()
+ self.assertEqual(previous_release.eol_date, today)
+ self.assertIsNone(other_release.eol_date)
+
class ReleaseUploadToTestCase(SimpleTestCase):
def test_upload_to_artifact(self):