moviewyrm/bookwyrm/migrations/0031_auto_20210101_2109.py

61 lines
2.5 KiB
Python

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