new data model: migrate review
This commit is contained in:
parent
e8b0b85f37
commit
940f612fb5
2 changed files with 63 additions and 20 deletions
|
@ -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:
|
||||||
|
|
|
@ -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.'))
|
||||||
|
|
Loading…
Add table
Reference in a new issue