From 2e36cfbcf64ec62d5ee10253fb8530df63f598f0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 25 Feb 2021 14:58:09 -0800 Subject: [PATCH] Creates new semi-functional migration --- bookwyrm/migrations/0033_reviewrate.py | 72 ------------------------ bookwyrm/migrations/0046_reviewrating.py | 59 +++++++++++++++++++ 2 files changed, 59 insertions(+), 72 deletions(-) delete mode 100644 bookwyrm/migrations/0033_reviewrate.py create mode 100644 bookwyrm/migrations/0046_reviewrating.py diff --git a/bookwyrm/migrations/0033_reviewrate.py b/bookwyrm/migrations/0033_reviewrate.py deleted file mode 100644 index 69c0ec57..00000000 --- a/bookwyrm/migrations/0033_reviewrate.py +++ /dev/null @@ -1,72 +0,0 @@ -# Generated by Django 3.0.7 on 2021-01-05 05:32 - -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 - -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', '0032_auto_20210104_2055'), - ] - - 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), - ] diff --git a/bookwyrm/migrations/0046_reviewrating.py b/bookwyrm/migrations/0046_reviewrating.py new file mode 100644 index 00000000..b29cdbd2 --- /dev/null +++ b/bookwyrm/migrations/0046_reviewrating.py @@ -0,0 +1,59 @@ +# Generated by Django 3.0.7 on 2021-02-25 18:36 + +from django.db import migrations, models +from django.db import connection +from django.db.models import Q +import django.db.models.deletion + +def convert_review_rating(app_registry, schema_editor): + ''' take rating type Reviews and conver them to ReviewRatings ''' + db_alias = schema_editor.connection.alias + + reviews = app_registry.get_model( + 'bookwyrm', 'Review' + ).objects.using(db_alias).filter( + Q(content__isnull=True) | Q(content='') + ) + + with connection.cursor() as cursor: + for review in reviews: + cursor.execute(''' +INSERT INTO bookwyrm_reviewrating(review_ptr_id) +SELECT status_ptr_id FROM bookwyrm_review +WHERE status_ptr_id={:d}'''.format(review.id)) + +def unconvert_review_rating(app_registry, schema_editor): + ''' undo the conversion from ratings back to reviews''' + # TODO: this does not work + db_alias = schema_editor.connection.alias + + ratings = app_registry.get_model( + 'bookwyrm', 'ReviewRating' + ).objects.using(db_alias).all() + + with connection.cursor() as cursor: + for rating in ratings: + cursor.execute(''' +INSERT INTO bookwyrm_review(status_ptr_id) +SELECT review_ptr_id FROM bookwyrm_reviewrating +WHERE review_ptr_id={:d}'''.format(rating.id)) + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0045_auto_20210210_2114'), + ] + + 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, unconvert_review_rating), + ]