f56b088643
Base Image Build / prepare (push) Has been cancelled
Build and Push Multi-Arch Docker Image / build-and-push (push) Has been cancelled
Frontend Tests / test (push) Has been cancelled
Base Image Build / docker (amd64, ubuntu-24.04) (push) Has been cancelled
Base Image Build / docker (arm64, ubuntu-24.04-arm) (push) Has been cancelled
Base Image Build / create-manifest (push) Has been cancelled
120 lines
3.8 KiB
Python
120 lines
3.8 KiB
Python
# Generated migration to replace {time} placeholders with {starttime}
|
|
|
|
import re
|
|
from django.db import migrations
|
|
|
|
|
|
def migrate_time_placeholders(apps, schema_editor):
|
|
"""
|
|
Replace {time} with {starttime} and {time24} with {starttime24}
|
|
in all dummy EPG source custom_properties templates.
|
|
"""
|
|
EPGSource = apps.get_model('epg', 'EPGSource')
|
|
|
|
# Fields that contain templates with placeholders
|
|
template_fields = [
|
|
'title_template',
|
|
'description_template',
|
|
'upcoming_title_template',
|
|
'upcoming_description_template',
|
|
'ended_title_template',
|
|
'ended_description_template',
|
|
'channel_logo_url',
|
|
'program_poster_url',
|
|
]
|
|
|
|
# Get all dummy EPG sources
|
|
dummy_sources = EPGSource.objects.filter(source_type='dummy')
|
|
|
|
updated_count = 0
|
|
for source in dummy_sources:
|
|
if not source.custom_properties:
|
|
continue
|
|
|
|
modified = False
|
|
custom_props = source.custom_properties.copy()
|
|
|
|
for field in template_fields:
|
|
if field in custom_props and custom_props[field]:
|
|
original_value = custom_props[field]
|
|
|
|
# Replace {time24} first (before {time}) to avoid double replacement
|
|
# e.g., {time24} shouldn't become {starttime24} via {time} -> {starttime}
|
|
new_value = original_value
|
|
new_value = re.sub(r'\{time24\}', '{starttime24}', new_value)
|
|
new_value = re.sub(r'\{time\}', '{starttime}', new_value)
|
|
|
|
if new_value != original_value:
|
|
custom_props[field] = new_value
|
|
modified = True
|
|
|
|
if modified:
|
|
source.custom_properties = custom_props
|
|
source.save(update_fields=['custom_properties'])
|
|
updated_count += 1
|
|
|
|
if updated_count > 0:
|
|
print(f"Migration complete: Updated {updated_count} dummy EPG source(s) with new placeholder names.")
|
|
else:
|
|
print("No dummy EPG sources needed placeholder updates.")
|
|
|
|
|
|
def reverse_migration(apps, schema_editor):
|
|
"""
|
|
Reverse the migration by replacing {starttime} back to {time}.
|
|
"""
|
|
EPGSource = apps.get_model('epg', 'EPGSource')
|
|
|
|
template_fields = [
|
|
'title_template',
|
|
'description_template',
|
|
'upcoming_title_template',
|
|
'upcoming_description_template',
|
|
'ended_title_template',
|
|
'ended_description_template',
|
|
'channel_logo_url',
|
|
'program_poster_url',
|
|
]
|
|
|
|
dummy_sources = EPGSource.objects.filter(source_type='dummy')
|
|
|
|
updated_count = 0
|
|
for source in dummy_sources:
|
|
if not source.custom_properties:
|
|
continue
|
|
|
|
modified = False
|
|
custom_props = source.custom_properties.copy()
|
|
|
|
for field in template_fields:
|
|
if field in custom_props and custom_props[field]:
|
|
original_value = custom_props[field]
|
|
|
|
# Reverse the replacements
|
|
new_value = original_value
|
|
new_value = re.sub(r'\{starttime24\}', '{time24}', new_value)
|
|
new_value = re.sub(r'\{starttime\}', '{time}', new_value)
|
|
|
|
if new_value != original_value:
|
|
custom_props[field] = new_value
|
|
modified = True
|
|
|
|
if modified:
|
|
source.custom_properties = custom_props
|
|
source.save(update_fields=['custom_properties'])
|
|
updated_count += 1
|
|
|
|
if updated_count > 0:
|
|
print(f"Reverse migration complete: Reverted {updated_count} dummy EPG source(s) to old placeholder names.")
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('epg', '0019_alter_programdata_sub_title'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunPython(migrate_time_placeholders, reverse_migration),
|
|
]
|