From d5e9aa07caa4aa8975c008eceaab24bb7889bbd5 Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Wed, 20 Mar 2024 17:42:59 +0100 Subject: [PATCH] Issue.fixed_at and Issue.events_at: bracketless for easier qs-based updates (later/soon) --- ...er_issue_events_at_alter_issue_fixed_at.py | 21 +++++++++++++++++++ issues/migrations/0012_auto_20240320_0927.py | 21 +++++++++++++++++++ issues/models.py | 12 ++++++----- issues/utils.py | 9 ++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 issues/migrations/0011_alter_issue_events_at_alter_issue_fixed_at.py create mode 100644 issues/migrations/0012_auto_20240320_0927.py diff --git a/issues/migrations/0011_alter_issue_events_at_alter_issue_fixed_at.py b/issues/migrations/0011_alter_issue_events_at_alter_issue_fixed_at.py new file mode 100644 index 0000000..58769de --- /dev/null +++ b/issues/migrations/0011_alter_issue_events_at_alter_issue_fixed_at.py @@ -0,0 +1,21 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('issues', '0010_issue_unmute_after'), + ] + + operations = [ + migrations.AlterField( + model_name='issue', + name='events_at', + field=models.TextField(default=''), + ), + migrations.AlterField( + model_name='issue', + name='fixed_at', + field=models.TextField(default=''), + ), + ] diff --git a/issues/migrations/0012_auto_20240320_0927.py b/issues/migrations/0012_auto_20240320_0927.py new file mode 100644 index 0000000..b2534b4 --- /dev/null +++ b/issues/migrations/0012_auto_20240320_0927.py @@ -0,0 +1,21 @@ +from django.db import migrations + + +def become_bracketless(apps, schema_editor): + Issue = apps.get_model('issues', 'Issue') + + for issue in Issue.objects.all(): + issue.fixed_at = issue.fixed_at[1:-1] + issue.events_at = issue.events_at[1:-1] + issue.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('issues', '0011_alter_issue_events_at_alter_issue_fixed_at'), + ] + + operations = [ + migrations.RunPython(become_bracketless) + ] diff --git a/issues/models.py b/issues/models.py index 171b3b1..cc345e7 100644 --- a/issues/models.py +++ b/issues/models.py @@ -8,6 +8,8 @@ from django.db import models from bugsink.volume_based_condition import VolumeBasedCondition from alerts.tasks import send_unmute_alert +from .utils import parse_bracketless, serialize_bracketless + class IncongruentStateException(Exception): pass @@ -30,8 +32,8 @@ class Issue(models.Model): # it also simply means: it was "marked as resolved" after the last regression (if any) is_resolved = models.BooleanField(default=False) is_resolved_by_next_release = models.BooleanField(default=False) - fixed_at = models.TextField(blank=False, null=False, default='[]') - events_at = models.TextField(blank=False, null=False, default='[]') + fixed_at = models.TextField(blank=False, null=False, default='') + events_at = models.TextField(blank=False, null=False, default='') # fields related to muting: is_muted = models.BooleanField(default=False) @@ -72,17 +74,17 @@ class Issue(models.Model): return main_exception.get("type", "none") + ": " + main_exception.get("value", "none") def get_fixed_at(self): - return json.loads(self.fixed_at) + return parse_bracketless(self.fixed_at) def get_events_at(self): - return json.loads(self.events_at) + return parse_bracketless(self.events_at) def add_fixed_at(self, release_version): # release_version: str fixed_at = self.get_fixed_at() if release_version not in fixed_at: fixed_at.append(release_version) - self.fixed_at = json.dumps(fixed_at) + self.fixed_at = serialize_bracketless(fixed_at) def occurs_in_last_release(self): return False # TODO actually implement (and then: implement in a performant manner) diff --git a/issues/utils.py b/issues/utils.py index 16cf037..639e16a 100644 --- a/issues/utils.py +++ b/issues/utils.py @@ -1,3 +1,4 @@ +import json import hashlib from typing import List, Optional @@ -40,3 +41,11 @@ def get_hash_for_data(data): # NOTE: issue_grouper should be renamed to what it _is_ (hash is accidental, 'grouper', or 'key' maybe? issue_grouper = get_issue_grouper_for_data(data) return hashlib.md5(issue_grouper.encode()).hexdigest() + + +def parse_bracketless(s): + return json.loads(f"[{s}]") + + +def serialize_bracketless(l): + return json.dumps(l)[1:-1]