# Generated by Django 3.0.7 on 2021-01-01 21:09 from django.db.models.fields.reverse_related import ManyToOneRel from django.db.models import Q from django.db import migrations 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) print('-----') print(rating, review) for field in review._meta.get_fields(): if isinstance(field, ManyToOneRel) or field.name in ['status_ptr', 'id', 'remote_id']: continue value = getattr(review, field.name) try: setattr(rating, field.name, value) except TypeError: getattr(rating, field.name).set(value.all()) rating.save() # move related models away from old review related_models = [ (r.remote_field.name, r.related_model.__name__) for r in \ review._meta.related_objects] for (related_field, related_model_name) in related_models: related_model = app_registry.get_model('bookwyrm', related_model_name) related_objs = related_model.objects.using(db_alias).filter( **{related_field: review}) for related_obj in related_objs: print('related_obj', related_obj) print('field', related_field) try: print(rating) print('before', getattr(related_obj, related_field)) setattr(related_obj, related_field, rating) related_obj.save() print('after', getattr(related_obj, related_field)) except TypeError: getattr(related_obj, related_field).add(rating) getattr(related_obj, related_field).remove(review) review.delete() class Migration(migrations.Migration): dependencies = [ ('bookwyrm', '0030_reviewrating'), ] operations = [ migrations.RunPython(convert_review_rating), ]