# 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), ]