From a908b9aa3a18222f296c0e4bd67d815f48ada5af Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Wed, 13 Dec 2023 09:07:08 +0100 Subject: Migrate mailing lists to their own API endpoints Add a new model for the bot to store its mailing list state in, as opposed to the current JSON blob in the BotSetting table. Migrate the existing settings from the BotSetting table into the new model. --- .../apps/api/migrations/0093_add_mailing_lists.py | 36 +++++++++++++++++++ .../migrations/0094_migrate_mailing_listdata.py | 41 ++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 pydis_site/apps/api/migrations/0093_add_mailing_lists.py create mode 100644 pydis_site/apps/api/migrations/0094_migrate_mailing_listdata.py (limited to 'pydis_site/apps/api/migrations') diff --git a/pydis_site/apps/api/migrations/0093_add_mailing_lists.py b/pydis_site/apps/api/migrations/0093_add_mailing_lists.py new file mode 100644 index 00000000..9f210b94 --- /dev/null +++ b/pydis_site/apps/api/migrations/0093_add_mailing_lists.py @@ -0,0 +1,36 @@ +# Generated by Django 5.0 on 2023-12-17 13:31 + +import django.db.models.deletion +import pydis_site.apps.api.models.mixins +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0092_remove_redirect_filter_list'), + ] + + operations = [ + migrations.CreateModel( + name='MailingList', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='A short identifier for the mailing list.', max_length=50, unique=True)), + ], + bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model), + ), + migrations.CreateModel( + name='MailingListSeenItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('hash', models.CharField(help_text='A hash, or similar identifier, of the content that was seen.', max_length=100)), + ('list', models.ForeignKey(help_text='The mailing list from which this seen item originates.', on_delete=django.db.models.deletion.CASCADE, related_name='seen_items', to='api.mailinglist')), + ], + bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model), + ), + migrations.AddConstraint( + model_name='mailinglistseenitem', + constraint=models.UniqueConstraint(fields=('list', 'hash'), name='unique_list_and_hash'), + ), + ] diff --git a/pydis_site/apps/api/migrations/0094_migrate_mailing_listdata.py b/pydis_site/apps/api/migrations/0094_migrate_mailing_listdata.py new file mode 100644 index 00000000..50598025 --- /dev/null +++ b/pydis_site/apps/api/migrations/0094_migrate_mailing_listdata.py @@ -0,0 +1,41 @@ +# Generated by Django 5.0 on 2023-12-13 07:03 + +from django.db import migrations + + +def migrate_mailing_lists_into_new_model(apps, schema_editor): + """Move the bot's mailing list information from the BotSetting to the new MailingList model.""" + + BotSetting = apps.get_model('api', 'BotSetting') + MailingList = apps.get_model('api', 'MailingList') + MailingListSeenItem = apps.get_model('api', 'MailingListSeenItem') + try: + setting = BotSetting.objects.get(name='news') + except BotSetting.DoesNotExist: + return + + # Field format: + # { + # "pep": [ + # "644", + # "8102", + # ... + for list_name, item_hashes in setting.data.items(): + (mailing_list, _created) = MailingList.objects.get_or_create(name=list_name) + MailingListSeenItem.objects.bulk_create( + MailingListSeenItem(list=mailing_list, hash=item_hash) + for item_hash in item_hashes + ) + + setting.delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0093_add_mailing_lists'), + ] + + operations = [ + migrations.RunPython(migrate_mailing_lists_into_new_model, elidable=True) + ] -- cgit v1.2.3