mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00
80 lines
3.1 KiB
Python
80 lines
3.1 KiB
Python
# Generated by Django 5.1.1 on 2024-11-13 05:14
|
|
|
|
from django.db import migrations
|
|
from django.db import models
|
|
from django.db import transaction
|
|
from django.utils.crypto import get_random_string
|
|
|
|
|
|
def migrate_customfield_selects(apps, schema_editor):
|
|
"""
|
|
Migrate the custom field selects from a simple list of strings to a list of dictionaries with
|
|
label and id. Then update all instances of the custom field to use the new format.
|
|
"""
|
|
CustomFieldInstance = apps.get_model("documents", "CustomFieldInstance")
|
|
CustomField = apps.get_model("documents", "CustomField")
|
|
|
|
with transaction.atomic():
|
|
for custom_field in CustomField.objects.filter(
|
|
data_type="select",
|
|
): # CustomField.FieldDataType.SELECT
|
|
old_select_options = custom_field.extra_data["select_options"]
|
|
custom_field.extra_data["select_options"] = [
|
|
{"id": get_random_string(16), "label": value}
|
|
for value in old_select_options
|
|
]
|
|
custom_field.save()
|
|
|
|
for instance in CustomFieldInstance.objects.filter(field=custom_field):
|
|
if instance.value_select:
|
|
instance.value_select = custom_field.extra_data["select_options"][
|
|
int(instance.value_select)
|
|
]["id"]
|
|
instance.save()
|
|
|
|
|
|
def reverse_migrate_customfield_selects(apps, schema_editor):
|
|
"""
|
|
Reverse the migration of the custom field selects from a list of dictionaries with label and id
|
|
to a simple list of strings. Then update all instances of the custom field to use the old format,
|
|
which is just the index of the selected option.
|
|
"""
|
|
CustomFieldInstance = apps.get_model("documents", "CustomFieldInstance")
|
|
CustomField = apps.get_model("documents", "CustomField")
|
|
|
|
with transaction.atomic():
|
|
for custom_field in CustomField.objects.all():
|
|
if custom_field.data_type == "select": # CustomField.FieldDataType.SELECT
|
|
old_select_options = custom_field.extra_data["select_options"]
|
|
custom_field.extra_data["select_options"] = [
|
|
option["label"]
|
|
for option in custom_field.extra_data["select_options"]
|
|
]
|
|
custom_field.save()
|
|
|
|
for instance in CustomFieldInstance.objects.filter(field=custom_field):
|
|
instance.value_select = next(
|
|
index
|
|
for index, option in enumerate(old_select_options)
|
|
if option.get("id") == instance.value_select
|
|
)
|
|
instance.save()
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
dependencies = [
|
|
("documents", "1059_workflowactionemail_workflowactionwebhook_and_more"),
|
|
]
|
|
|
|
operations = [
|
|
migrations.AlterField(
|
|
model_name="customfieldinstance",
|
|
name="value_select",
|
|
field=models.CharField(max_length=16, null=True),
|
|
),
|
|
migrations.RunPython(
|
|
migrate_customfield_selects,
|
|
reverse_migrate_customfield_selects,
|
|
),
|
|
]
|