new data model: migrate review

This commit is contained in:
Your Name 2022-12-19 17:50:00 -05:00
parent e8b0b85f37
commit 940f612fb5
2 changed files with 63 additions and 20 deletions

View file

@ -67,9 +67,9 @@ class Review(Content):
body = MarkdownxField() body = MarkdownxField()
@staticmethod @staticmethod
def review_item_by_user(item, user, title, body, visibility=0): def review_item_by_user(item, user, title, body, metadata={}, visibility=0):
# allow multiple reviews per item per user. # allow multiple reviews per item per user.
review = Review.objects.create(owner=user, item=item, title=title, body=body, visibility=visibility) review = Review.objects.create(owner=user, item=item, title=title, body=body, metadata=metadata, visibility=visibility)
""" """
review = Review.objects.filter(owner=user, item=item).first() review = Review.objects.filter(owner=user, item=item).first()
if title is None: if title is None:

View file

@ -3,10 +3,10 @@ from movies.models import Movie as Legacy_Movie
from music.models import Album as Legacy_Album from music.models import Album as Legacy_Album
from games.models import Game as Legacy_Game from games.models import Game as Legacy_Game
from common.models import MarkStatusEnum from common.models import MarkStatusEnum
from books.models import BookMark from books.models import BookMark, BookReview
from movies.models import MovieMark from movies.models import MovieMark, MovieReview
from music.models import AlbumMark from music.models import AlbumMark, AlbumReview
from games.models import GameMark from games.models import GameMark, GameReview
from catalog.common import * from catalog.common import *
from catalog.models import * from catalog.models import *
from catalog.sites import * from catalog.sites import *
@ -31,6 +31,10 @@ model_link = {
MovieMark: MovieLink, MovieMark: MovieLink,
AlbumMark: AlbumLink, AlbumMark: AlbumLink,
GameMark: GameLink, GameMark: GameLink,
BookReview: BookLink,
MovieReview: MovieLink,
AlbumReview: AlbumLink,
GameReview: GameLink,
} }
shelf_map = { shelf_map = {
@ -55,28 +59,55 @@ class Command(BaseCommand):
parser.add_argument('--movie', dest='types', action='append_const', const=MovieMark) parser.add_argument('--movie', dest='types', action='append_const', const=MovieMark)
parser.add_argument('--album', dest='types', action='append_const', const=AlbumMark) parser.add_argument('--album', dest='types', action='append_const', const=AlbumMark)
parser.add_argument('--game', dest='types', action='append_const', const=GameMark) parser.add_argument('--game', dest='types', action='append_const', const=GameMark)
parser.add_argument('--mark', help='migrate shelves/tags/ratings, then exit', action='store_true')
parser.add_argument('--review', help='migrate reviews, then exit', action='store_true')
parser.add_argument('--collection', help='migrate collections, then exit', action='store_true')
parser.add_argument('--id', help='id to convert; or, if using with --max-id, the min id') parser.add_argument('--id', help='id to convert; or, if using with --max-id, the min id')
parser.add_argument('--maxid', help='max id to convert') parser.add_argument('--maxid', help='max id to convert')
parser.add_argument('--failstop', help='stop on fail', action='store_true') parser.add_argument('--failstop', help='stop on fail', action='store_true')
parser.add_argument('--initshelf', help='initialize shelves for users, then exit', action='store_true') parser.add_argument('--initshelf', help='initialize shelves for users, then exit', action='store_true')
parser.add_argument('--clear', help='clear all user pieces, then exit', action='store_true') parser.add_argument('--clear', help='clear all user pieces, then exit', action='store_true')
def handle(self, *args, **options): def initshelf(self):
if options['initshelf']: print("Initialize shelves")
print("Initialize shelves") with transaction.atomic():
with transaction.atomic(): for user in tqdm(User.objects.filter(is_active=True)):
for user in tqdm(User.objects.filter(is_active=True)): user.shelf_manager.initialize()
user.shelf_manager.initialize()
return
if options['clear']: def clear(self):
print("Deleting all migrated user pieces") print("Deleting all migrated user pieces")
# Piece.objects.all().delete() # Piece.objects.all().delete()
for cls in [Review, Comment, Rating, TagMember, Tag, ShelfLogEntry, ShelfMember]: # Collection for cls in [Review, Comment, Rating, TagMember, Tag, ShelfLogEntry, ShelfMember]: # Collection
print(cls) print(cls)
cls.objects.all().delete() cls.objects.all().delete()
return
def collection(self, options):
pass
def review(self, options):
for typ in [GameReview, AlbumReview, BookReview, MovieReview]:
print(typ)
LinkModel = model_link[typ]
qs = typ.objects.all().filter(owner__is_active=True).order_by('id')
if options['id']:
if options['maxid']:
qs = qs.filter(id__gte=int(options['id']), id__lte=int(options['maxid']))
else:
qs = qs.filter(id=int(options['id']))
pg = Paginator(qs, BATCH_SIZE)
for p in tqdm(pg.page_range):
with transaction.atomic():
for entity in pg.get_page(p).object_list:
try:
item_link = LinkModel.objects.get(old_id=entity.item.id)
item = Item.objects.get(uid=item_link.new_uid)
Review.review_item_by_user(item, entity.owner, entity.title, entity.content, {'shared_link': entity.shared_link}, entity.visibility)
except Exception as e:
print(f'Convert failed for {typ} {entity.id}: {e}')
if options['failstop']:
raise(e)
def mark(self, options):
types = options['types'] or [GameMark, AlbumMark, MovieMark, BookMark] types = options['types'] or [GameMark, AlbumMark, MovieMark, BookMark]
print('Preparing cache') print('Preparing cache')
tag_cache = {f'{t.owner_id}_{t.title}': t.id for t in Tag.objects.all()} tag_cache = {f'{t.owner_id}_{t.title}': t.id for t in Tag.objects.all()}
@ -147,4 +178,16 @@ class Command(BaseCommand):
print(f'Convert failed for {typ} {entity.id}: {e}') print(f'Convert failed for {typ} {entity.id}: {e}')
if options['failstop']: if options['failstop']:
raise(e) raise(e)
def handle(self, *args, **options):
if options['initshelf']:
self.initshelf()
elif options['clear']:
self.clear()
elif options['collection']:
self.collection(options)
elif options['review']:
self.review(options)
elif options['mark']:
self.mark(options)
self.stdout.write(self.style.SUCCESS(f'Done.')) self.stdout.write(self.style.SUCCESS(f'Done.'))