def add(cls, **kwargs): keys = kwargs.get('keys', []) result = [] groups = cls.group_keys_by_person(keys=keys) for group in groups: movie_keys = group['movie_keys'] movies = Movie.add(keys=movie_keys) movie_ids = set([m.id for m in movies]) existed = db.session.query(Watchlist, Watchlist.movie_id).filter( Watchlist.user_id == group['user_id'], Watchlist.movie_id.in_(movie_ids)).all() result.extend([w for w, mid in existed]) movie_ids = movie_ids.difference(set([mid for w, mid in existed])) for movie_id in movie_ids: item = Watchlist(user_id=group['user_id'], movie_id=movie_id) try: db.session.add(item) db.session.commit() except IntegrityError: db.session.rollback() else: result.append(item) return result
def test_add_single_movie_with_wrong_keys(self): key = 'movie:tt0167260_imdb' with self.instance.test_request_context() as request: result = Movie.add(key=key) self.assertEqual(result, []) self.assertFalse(self.redis.exists(Movie.added_key)) self.assertFalse(self.redis.exists(key))
def test_add_already_existed_movie(self): provider = 'imdb' with self.instance.test_request_context() as request: movie = MovieFactory(mid='tt0111161') key = Movie.make_key(provider=provider, id=movie.imdb_id) self.db.session.commit() self.redis.sadd(Movie.added_key, key) result = Movie.add(keys=(key, )) self.assertEqual(len(result), 1) self.assertEqual(result[0], movie)
def add_to_watchlist(**kwargs): logger = kwargs.get('logger', None) keys = kwargs.get('keys', []) provider = 'imdb' # TODO: fix this later save_relations = kwargs.get('save_relations', False) if logger: logger.info('Adding movies to watchlist: start') result = Watchlist.add(keys=keys) if save_relations: if logger: logger.info('Adding movies to watchlist: save movies relations') movie_ids = [w.movie_id for w in result] movies = db.session.query(Movie).filter(Movie.id.in_(movie_ids)).all() for movie in movies: movie.save_poster(provider=provider, load_original=True) missing_movies = movie.save_relations() Movie.add(keys=missing_movies) if logger: logger.info('Adding movies to watchlist: end')
def test_add_single_movie(self): key = 'movie:tt0167260:imdb' related_key = '%s:related' % key genres_key = '%s:genres' % key with self.instance.test_request_context() as request: result = Movie.add(key=key) self.assertEqual(len(result), 1) self.assertTrue(isinstance(result[0], Movie)) self.assertTrue(self.redis.exists(Movie.added_key)) self.assertTrue(self.redis.sismember(Movie.added_key, key)) self.assertFalse(self.redis.exists(key)) self.assertTrue(self.redis.exists(related_key)) self.assertTrue(self.redis.exists(genres_key))
def test_add_multiple_movies_with_some_wrong_keys(self): normal_key = 'movie:tt1229238:imdb' keys = ['movie:tt0167260_imdb', 'movie:tt1229238:imdb', 'imdb:tt1272878:imdb'] with self.instance.test_request_context() as request: result = Movie.add(keys=keys) self.assertEqual(len(result), 1) self.assertTrue(self.redis.exists(Movie.added_key)) self.assertTrue(self.redis.sismember(Movie.added_key, normal_key)) related_key = '%s:related' % normal_key genres_key = '%s:genres' % normal_key self.assertFalse(self.redis.exists(normal_key)) self.assertTrue(self.redis.exists(related_key)) self.assertTrue(self.redis.exists(genres_key))
def test_add_multiple_movies(self): keys = ['movie:tt0167260:imdb', 'movie:tt1229238:imdb', 'movie:tt1272878:imdb'] with self.instance.test_request_context() as request: result = Movie.add(keys=keys) self.assertEqual(len(result), len(keys)) self.assertTrue(self.redis.exists(Movie.added_key)) for key in keys: related_key = '%s:related' % key genres_key = '%s:genres' % key self.assertTrue(self.redis.sismember(Movie.added_key, key)) self.assertFalse(self.redis.exists(key)) self.assertTrue(self.redis.exists(related_key)) self.assertTrue(self.redis.exists(genres_key))