From f6d79879aee0e50f1b4f6839bb1d0c00a6437066 Mon Sep 17 00:00:00 2001 From: Scot Hacker Date: Mon, 25 Mar 2019 07:43:53 -0700 Subject: [PATCH] Fix MySQL migration (#57) * Use CharField, not TextField for MySQL compat. * black formatting --- todo/mail/consumers/tracker.py | 37 ++++++++++++++-------------- todo/migrations/0008_mail_tracker.py | 4 +-- todo/models.py | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/todo/mail/consumers/tracker.py b/todo/mail/consumers/tracker.py index 7d5df53..1bf36a2 100644 --- a/todo/mail/consumers/tracker.py +++ b/todo/mail/consumers/tracker.py @@ -41,13 +41,10 @@ def message_text(message): def format_task_title(format_string, message): - return format_string.format( - subject=message["subject"], - author=message["from"], - ) + return format_string.format(subject=message["subject"], author=message["from"]) -DJANGO_TODO_THREAD = re.compile(r'') +DJANGO_TODO_THREAD = re.compile(r"") def parse_references(task_list, references): @@ -61,10 +58,7 @@ def parse_references(task_list, references): continue thread_id = int(match.group(1)) - new_answer_thread = Task.objects.filter( - task_list=task_list, - pk=thread_id - ).first() + new_answer_thread = Task.objects.filter(task_list=task_list, pk=thread_id).first() if new_answer_thread is not None: answer_thread = new_answer_thread @@ -97,20 +91,26 @@ def insert_message(task_list, message, priority, task_title_format): f"[From: {message['from']}]" ) - message_id = message["message-id"] + # Due to limitations in MySQL wrt unique_together and TextField (grrr), + # we must use a CharField rather than TextField for message_id. + # In the unlikeley event that we get a VERY long inbound + # message_id, truncate it to the max_length of a MySQL CharField. + original_message_id = message["message-id"] + message_id = ( + (original_message_id[:252] + "...") + if len(original_message_id) > 255 + else original_message_id + ) message_from = message["from"] text = message_text(message) - related_messages, answer_thread = \ - parse_references(task_list, message.get("references", "")) + related_messages, answer_thread = parse_references(task_list, message.get("references", "")) # find the most relevant task to add a comment on. # among tasks in the selected task list, find the task having the # most email comments the current message references best_task = ( - Task.objects.filter( - task_list=task_list, comment__email_message_id__in=related_messages - ) + Task.objects.filter(task_list=task_list, comment__email_message_id__in=related_messages) .annotate(num_comments=Count("comment")) .order_by("-num_comments") .only("id") @@ -127,7 +127,7 @@ def insert_message(task_list, message, priority, task_title_format): best_task = Task.objects.create( priority=priority, title=format_task_title(task_title_format, message), - task_list=task_list + task_list=task_list, ) logger.info("using task: %r", best_task) @@ -139,8 +139,9 @@ def insert_message(task_list, message, priority, task_title_format): logger.info("created comment: %r", comment) -def tracker_consumer(producer, group=None, task_list_slug=None, - priority=1, task_title_format="[MAIL] {subject}"): +def tracker_consumer( + producer, group=None, task_list_slug=None, priority=1, task_title_format="[MAIL] {subject}" +): task_list = TaskList.objects.get(group__name=group, slug=task_list_slug) for message in producer: try: diff --git a/todo/migrations/0008_mail_tracker.py b/todo/migrations/0008_mail_tracker.py index ea7a484..31607d0 100644 --- a/todo/migrations/0008_mail_tracker.py +++ b/todo/migrations/0008_mail_tracker.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 14:01 +# Generated by Django 2.1.7 on 2019-03-24 22:50 from django.conf import settings from django.db import migrations, models @@ -18,7 +18,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name="comment", name="email_message_id", - field=models.TextField(blank=True, null=True), + field=models.CharField(blank=True, max_length=255, null=True), ), migrations.AlterField( model_name="comment", diff --git a/todo/models.py b/todo/models.py index b378b02..67e042f 100644 --- a/todo/models.py +++ b/todo/models.py @@ -130,7 +130,7 @@ class Comment(models.Model): task = models.ForeignKey(Task, on_delete=models.CASCADE) date = models.DateTimeField(default=datetime.datetime.now) email_from = models.CharField(max_length=320, blank=True, null=True) - email_message_id = models.TextField(blank=True, null=True) + email_message_id = models.CharField(max_length=255, blank=True, null=True) body = models.TextField(blank=True)