Esempio n. 1
0
 def test_for_updating_movie_in_db(self, mock_request):
     mock_request.return_value = self.response_id550
     Movie.objects.create(id=550, title="Fix Me")
     Movie.save_movie_in_db(id=550)
     self.assertEqual(Movie.objects.count(), 1)
     self.assertEqual(Movie.objects.first().title,
                      self.response_id550["title"])
Esempio n. 2
0
 def test_save_movie_adds_movie_to_genre(self, mock_request):
     mock_request.return_value = self.response_id550
     mock_request.return_value = self.response_id550
     genre = Genre.objects.create(id=18, name="Drama")
     Movie.save_movie_in_db(id=550)
     self.assertEqual(Movie.objects.get(id=550).genres.count(), 1)
     self.assertEqual(
         Movie.objects.get(id=550).genres.first().name, "Drama")
Esempio n. 3
0
    def get_movie(self,
                  id,
                  min_update_level=MIN_UPDATE_LEVEL,
                  force_update=False):
        try:
            movie = Movie.get(id,
                              min_update_level=min_update_level,
                              force_update=force_update)
            movie_fields = [
                field.name for field in Movie._meta.get_fields()
                if field.related_model is None
            ]
            data = model_to_dict(movie, fields=movie_fields)
            data["genres"] = [{
                "id": genre.id,
                "name": genre.name
            } for genre in movie.genres.all()]
            data["w2w_status"] = "OK"
        except requests.exceptions.RequestException as e:
            data = {
                "w2w_status": "ERROR",
                "msg": "Connection error with TMDB."
            }
        except Movie.DoesNotExist:
            data = {
                "w2w_status": "ERROR",
                "msg": "Movie with given id does not exist."
            }

        return data
Esempio n. 4
0
    def search_movies(self, query, page=1):
        try:
            data = tmdb_request(method="POST",
                                path="search/movie",
                                params={
                                    "page": page,
                                    "query": query
                                })
            data["movies"] = data.pop("results", [])
            data["w2w_status"] = "OK"

            for movie in data["movies"]:
                try:
                    Movie.objects.get(id=movie["id"],
                                      update_level__gte=SEARCH_UPDATE_LEVEL)
                except:
                    movie["update_level"] = SEARCH_UPDATE_LEVEL
                    Movie.save_movie_in_db(id=movie["id"], data=movie)

        except requests.exceptions.RequestException:
            data = {"w2w_status": "ERROR"}

        return data
Esempio n. 5
0
def get_movie(r):

    return Movie(
        tmdb_id=r.get('id'),
        title=r.get('title'),
        release_date=r.get('release_date'),
        popularity=r.get('popularity'),
        overview=r.get('overview') or '',
        original_title=r.get('original_title'),
        original_language=r.get('original_language'),
        vote_count=r.get('vote_count'),
        vote_average=r.get('vote_average'),
        backdrop_path=r.get('backdrop_path') or '',
        poster_path=r.get('poster_path') or '',
        genres=r.get('genre_ids'),
        is_adult=r.get('adult'),
        is_video=r.get('video')
    )
Esempio n. 6
0
 def test_returns_status_error_when_movie_exception(self, mock_request):
     mock_request.return_value = self.mock_response
     mock_request.side_effect = Movie.DoesNotExist()
     data = Client().get_movie(id=550)
     self.assertIn("w2w_status", data)
     self.assertEqual(data["w2w_status"], "ERROR")
Esempio n. 7
0
 def test_propagates_request_exception(self, mock_tmdb):
     mock_tmdb.side_effect = RequestException()
     with self.assertRaises(RequestException):
         movie = Movie.get(id=1, force_update=True)
Esempio n. 8
0
 def test_calls_tmdb_request_when_force_update(self, mock_tmdb):
     Movie.objects.create(id=1, title="JAGO 2000", update_level=100)
     mock_tmdb.return_value = {"id": 1, "title": "JAGO 2000"}
     movie = Movie.get(id=1, force_update=True)
     mock_tmdb.assert_called_with(method="GET", path="movie/1")
Esempio n. 9
0
 def test_calls_tmdb_request_if_two_low_update_level(self, mock_tmdb):
     Movie.objects.create(id=1, title="JAGO 2000", update_level=0)
     mock_tmdb.return_value = {"id": 1, "title": "JAGO 2000"}
     movie = Movie.get(id=1,
                       min_update_level=MoviePopularQuery.update_level)
     mock_tmdb.assert_called_with(method="GET", path="movie/1")
Esempio n. 10
0
 def test_raises_error_movie_does_not_exist_in_tmdb(self, mock_tmdb):
     mock_tmdb.return_value = {"status_code": 34}
     with self.assertRaises(Movie.DoesNotExist):
         movie = Movie.get(id=1)
Esempio n. 11
0
 def test_saves_new_movie_in_db(self, mock_tmdb):
     mock_tmdb.return_value = {"id": 1, "title": "JAGO 2000"}
     movie = Movie.get(id=1)
     self.assertEqual(Movie.objects.count(), 1)
     self.assertEqual(movie.id, 1)
Esempio n. 12
0
 def test_raise_error_when_offline(self, mock_tmdb):
     mock_tmdb.return_value = {"id": 1, "title": "JAGO 2000"}
     with self.assertRaises(Movie.DoesNotExist):
         movie = Movie.get(id=1, offline=True)
Esempio n. 13
0
 def test_calls_tmdb_request_if_movie_does_not_exist(self, mock_tmdb):
     mock_tmdb.return_value = {"id": 1, "title": "JAGO 2000"}
     movie = Movie.get(id=1)
     mock_tmdb.assert_called_with(method="GET", path="movie/1")
Esempio n. 14
0
 def test_get_returns_correct_movie_object(self):
     Movie.objects.create(id=1)
     movie = Movie.get(id=1)
     self.assertEqual(movie.id, 1)
Esempio n. 15
0
 def test_querying_db_for_wanted_movie(self, mock_get):
     movie = Movie.get(id=1)
     self.assertTrue(mock_get.called)
Esempio n. 16
0
    def handle(self, *args, **options):
        path = options.get("path")[0]
        batch = options.get("batch")
        load_movies = options.get("movies")
        load_ratings = options.get("ratings")
        ratings_file = options.get("ratings_file")

        # Load data from the files
        self.stdout.write("Processing links.csv ...")
        links = dict()
        with open(os.path.join(path, "links.csv"), newline="") as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                try:
                    movie_id = int(row["movieId"])
                    tmdb_id = int(row["tmdbId"])
                    links[movie_id] = tmdb_id
                except ValueError:
                    pass

        if load_movies:

            self.stdout.write("Processing movies.csv ...")
            movies = list()
            with open(os.path.join(path, "movies.csv"), newline="") as csvfile:
                reader = csv.DictReader(csvfile)
                for row in reader:
                    try:
                        movie_id = links[int(row["movieId"])]
                        title = row["title"]
                        movies.append({"id": movie_id, "title": title})
                    except KeyError:
                        pass

            # Create coressponding movies in database
            self.stdout.write("Creating movies in database ...")
            movies2create = list()
            movies_id = set()
            for movie in movies:
                if movie["id"] in movies_id:
                    continue
                movies_id.add(movie["id"])
                try:
                    Movie.objects.get(id=movie["id"])
                except Movie.DoesNotExist:
                    movies2create.append(
                        Movie(id=movie["id"], title=movie["title"]))
                if len(movies2create) > batch:
                    print(" - insarting ...")
                    Movie.objects.bulk_create(movies2create)
                    movies2create = list()
            if len(movies2create) > 0:
                Movie.objects.bulk_create(movies2create)

        if load_ratings:

            User = get_user_model()

            chunk_index = 0
            for chunk in pd.read_csv(os.path.join(path, ratings_file),
                                     chunksize=100000):
                self.stdout.write("Processing ratings.csv (chunk: %d) ..." %
                                  chunk_index)

                users = dict()

                df = pd.DataFrame(chunk)
                for index, row in df.iterrows():
                    try:
                        movie_id = links[int(row["movieId"])]
                        movie = {
                            "id": movie_id,
                            "rating": float(row["rating"]),
                            "timestamp": row["timestamp"]
                        }

                        user_id = row["userId"]
                        if user_id not in users:
                            users[user_id] = list()
                        users[user_id].append(movie)
                    except KeyError:
                        pass

                # Create artificial users and their favourite movies list
                self.stdout.write("Populating database with users ...")
                users2create = list()
                new_users = list()
                for user in users:
                    try:
                        user_db = User.objects.get(
                            email="*****@*****.**" % user)
                    except User.DoesNotExist:
                        user_db = User(email="*****@*****.**" %
                                       user,
                                       is_real=False,
                                       password="******")
                        new_users.append(user)
                        users2create.append(user_db)

                    if len(users2create) > batch:
                        print(" - insarting ...")
                        User.objects.bulk_create(users2create)
                        users2create = list()
                if len(users2create) > 0:
                    User.objects.bulk_create(users2create)

                print("%d users saved." % len(new_users))

                self.stdout.write("Creating users' preferences lists ...")
                prefs2create = list()
                for user in new_users:
                    user_db = User.objects.get(
                        email="*****@*****.**" % user)
                    pref_db = PrefList(user=user_db)
                    prefs2create.append(pref_db)
                    if len(prefs2create) > batch:
                        print(" - insarting ...")
                        PrefList.objects.bulk_create(prefs2create)
                        prefs2create = list()
                if len(prefs2create) > 0:
                    PrefList.objects.bulk_create(prefs2create)

                print("%d preferences lists saved." % PrefList.objects.count())

                self.stdout.write("Populating database with preferences ...")
                prefs2create = list()
                for user in users:
                    user_db = User.objects.get(
                        email="*****@*****.**" % user)
                    preflist_db = user_db.pref
                    for pref in users[user]:
                        timestamp = datetime.datetime.fromtimestamp(
                            int(pref["timestamp"]))
                        timestamp = timezone.make_aware(
                            timestamp, timezone.get_current_timezone())
                        movie = Movie.objects.get(id=pref["id"])
                        pref_db = MoviePref(preflist=preflist_db,
                                            movie=movie,
                                            rating=self.adjust_rating(
                                                int(pref["rating"])),
                                            timestamp=timestamp)
                        prefs2create.append(pref_db)
                    if len(prefs2create) > batch:
                        print(" - insarting ...")
                        MoviePref.objects.bulk_create(prefs2create)
                        prefs2create = list()
                if len(prefs2create) > 0:
                    MoviePref.objects.bulk_create(prefs2create)

                print("%d preferences saved." % MoviePref.objects.count())

                chunk_index += 1