kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
110 wiersze
3.7 KiB
Python
110 wiersze
3.7 KiB
Python
|
# Generated by Django 2.2.7 on 2019-12-16 15:06
|
||
|
|
||
|
import django.contrib.postgres.search
|
||
|
import django.contrib.postgres.indexes
|
||
|
from django.db import migrations, models
|
||
|
import django.db.models.deletion
|
||
|
from django.db import connection
|
||
|
|
||
|
FIELDS = {
|
||
|
"music.Artist": {
|
||
|
"fields": [
|
||
|
'name',
|
||
|
],
|
||
|
"trigger_name": "music_artist_update_body_text"
|
||
|
},
|
||
|
"music.Track": {
|
||
|
"fields": ['title', 'copyright'],
|
||
|
"trigger_name": "music_track_update_body_text"
|
||
|
},
|
||
|
"music.Album": {
|
||
|
"fields": ['title'],
|
||
|
"trigger_name": "music_album_update_body_text"
|
||
|
},
|
||
|
}
|
||
|
|
||
|
def populate_body_text(apps, schema_editor):
|
||
|
for label, search_config in FIELDS.items():
|
||
|
model = apps.get_model(*label.split('.'))
|
||
|
print('Populating search index for {}…'.format(model.__name__))
|
||
|
vector = django.contrib.postgres.search.SearchVector(*search_config['fields'])
|
||
|
model.objects.update(body_text=vector)
|
||
|
|
||
|
def rewind(apps, schema_editor):
|
||
|
pass
|
||
|
|
||
|
def setup_triggers(apps, schema_editor):
|
||
|
cursor = connection.cursor()
|
||
|
for label, search_config in FIELDS.items():
|
||
|
model = apps.get_model(*label.split('.'))
|
||
|
table = model._meta.db_table
|
||
|
print('Creating database trigger {} on {}…'.format(search_config['trigger_name'], table))
|
||
|
sql = """
|
||
|
CREATE TRIGGER {trigger_name}
|
||
|
BEFORE INSERT OR UPDATE
|
||
|
ON {table}
|
||
|
FOR EACH ROW
|
||
|
EXECUTE PROCEDURE
|
||
|
tsvector_update_trigger(body_text, 'pg_catalog.english', {fields})
|
||
|
""".format(
|
||
|
trigger_name=search_config['trigger_name'],
|
||
|
table=table,
|
||
|
fields=', '.join(search_config['fields']),
|
||
|
)
|
||
|
print(sql)
|
||
|
cursor.execute(sql)
|
||
|
|
||
|
def rewind_triggers(apps, schema_editor):
|
||
|
cursor = connection.cursor()
|
||
|
for label, search_config in FIELDS.items():
|
||
|
model = apps.get_model(*label.split('.'))
|
||
|
table = model._meta.db_table
|
||
|
print('Dropping database trigger {} on {}…'.format(search_config['trigger_name'], table))
|
||
|
sql = """
|
||
|
DROP TRIGGER IF EXISTS {trigger_name} ON {table}
|
||
|
""".format(
|
||
|
trigger_name=search_config['trigger_name'],
|
||
|
table=table,
|
||
|
)
|
||
|
|
||
|
cursor.execute(sql)
|
||
|
|
||
|
class Migration(migrations.Migration):
|
||
|
|
||
|
dependencies = [
|
||
|
('music', '0043_album_cover_attachment'),
|
||
|
]
|
||
|
|
||
|
operations = [
|
||
|
migrations.AddField(
|
||
|
model_name='album',
|
||
|
name='body_text',
|
||
|
field=django.contrib.postgres.search.SearchVectorField(blank=True),
|
||
|
),
|
||
|
migrations.AddField(
|
||
|
model_name='artist',
|
||
|
name='body_text',
|
||
|
field=django.contrib.postgres.search.SearchVectorField(blank=True),
|
||
|
),
|
||
|
migrations.AddField(
|
||
|
model_name='track',
|
||
|
name='body_text',
|
||
|
field=django.contrib.postgres.search.SearchVectorField(blank=True),
|
||
|
),
|
||
|
migrations.AddIndex(
|
||
|
model_name='album',
|
||
|
index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_album_body_te_0ec97a_gin'),
|
||
|
),
|
||
|
migrations.AddIndex(
|
||
|
model_name='artist',
|
||
|
index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_artis_body_te_5c408d_gin'),
|
||
|
),
|
||
|
migrations.AddIndex(
|
||
|
model_name='track',
|
||
|
index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_track_body_te_da0a66_gin'),
|
||
|
),
|
||
|
|
||
|
migrations.RunPython(setup_triggers, rewind_triggers),
|
||
|
migrations.RunPython(populate_body_text, rewind),
|
||
|
]
|