moviewyrm/bookwyrm/migrations/0030_reviewrating.py
Mouse Reeve 385ec4d70a Adds ReviewRating model
I can't just calling Rating because that would clash with the rating
field
2021-01-01 11:51:52 -08:00

52 lines
2 KiB
Python

# Generated by Django 3.0.7 on 2021-01-01 19:05
from django.db.models.fields.reverse_related import ManyToOneRel
from django.db.models import Q
from django.db import migrations, models
import django.db.models.deletion
from bookwyrm.management.commands.deduplicate_book_data import update_related
def convert_review_rating(app_registry, schema_editor):
''' take reviews with no content and turn them into ratings '''
db_alias = schema_editor.connection.alias
reviews = app_registry.get_model('bookwyrm', 'Review')
review_ratings = app_registry.get_model('bookwyrm', 'ReviewRating')
ratings = reviews.objects.using(db_alias).filter(
Q(content__isnull=True) | Q(content=''))
# replace the old review with the rating
for review in ratings:
rating = review_ratings.objects.create(
user=review.user, rating=review.rating, book=review.book)
for field in review._meta.get_fields():
if isinstance(field, ManyToOneRel) or field.name == 'status_ptr':
continue
value = getattr(review, field.name)
print(review, rating, field.name, value)
try:
setattr(rating, field.name, value)
except TypeError:
getattr(rating, field.name).set(value.all())
rating.save()
update_related(rating, review)
review.delete()
class Migration(migrations.Migration):
dependencies = [
('bookwyrm', '0029_auto_20201221_2014'),
]
operations = [
migrations.CreateModel(
name='ReviewRating',
fields=[
('review_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='bookwyrm.Review')),
],
options={
'abstract': False,
},
bases=('bookwyrm.review',),
),
migrations.RunPython(convert_review_rating),
]