Пример #1
0
def add_movie_tastes(user_id, movie_id, taste):

        taste = float(taste)
        user = User.get_by_id(user_id)
        movie = Movie.get_by_id(movie_id)
        for actor in movie.actors:
            artist = Artist.get_by_id(actor.id())
            user.add_taste_artist(artist, ACTOR_WEIGHT * taste)

        for director in movie.directors:
            artist = Artist.get_by_id(director.id())
            user.add_taste_artist(artist, DIRECTOR_WEIGHT * taste)

        for writer in movie.writers:
            artist = Artist.get_by_id(writer.id())
            user.add_taste_artist(artist, WRITER_WEIGHT * taste)

        for genre in movie.genres:
            user.add_taste_genre(genre, GENRE_WEIGHT * taste)

        user.remove_proposal()
        user.put()
        taskqueue.add(url='/api/proposal/' + user.key.id(), method='GET')


        return 'OK'
Пример #2
0
def untaste_movie(user_id, movie_id):
            movie = Movie.get_by_id(movie_id)
            user = User.get_by_id(user_id)

            for actor in movie.actors:
                artist = Artist.get_by_id(actor.id())
                taste_artist = TasteArtist.get_by_id(actor.id() + user.key.id())

                if taste_artist is not None:
                    taste_artist.update_taste(-ACTOR_WEIGHT)
                else:
                    user.add_taste_artist(artist, -ACTOR_WEIGHT)

                if taste_artist.taste == 0:
                    user.remove_taste_artist(artist)

            for director in movie.directors:
                artist = Artist.get_by_id(director.id())
                taste_artist = TasteArtist.get_by_id(director.id() + user.key.id())

                if taste_artist is not None:
                    taste_artist.update_taste(-DIRECTOR_WEIGHT)
                else:
                    user.add_taste_artist(artist, -DIRECTOR_WEIGHT)

                if taste_artist.taste == 0:
                    user.remove_taste_artist(artist)

            for writer in movie.writers:
                artist = Artist.get_by_id(writer.id())
                taste_artist = TasteArtist.get_by_id(writer.id() + user.key.id())

                if taste_artist is not None:
                    taste_artist.update_taste(-WRITER_WEIGHT)
                else:
                    user.add_taste_artist(artist, -WRITER_WEIGHT)

                if taste_artist.taste == 0:
                    user.remove_taste_artist(artist)

            for genre in movie.genres:
                taste_genre = TasteGenre.get_by_id(genre + user.key.id())

                if taste_genre is not None:
                    taste_genre.update_taste(-GENRE_WEIGHT)
                else:
                    user.add_taste_genre(genre, -GENRE_WEIGHT)

                if taste_genre.taste == 0:
                    user.remove_taste_genre(genre)

            user.remove_proposal()
            user.put()
            taskqueue.add(url='/api/proposal/' + user.key.id(), method='GET')

            return 'OK'
Пример #3
0
def get_tastes_artists_list(user, page=0):
    """
    Get a readable taste artists list.
    :param user: user
    :type user: Models.User
    :return: list of tastes
        {"code": 0, "data": {"tastes": [{"idIMDB": id,"name": name, "photo": photo_url}],
        "type": type, "userId": user_id}
    :rtype: JSON
    """
    tastes_artists_id = user.tastes_artists  # Get all taste_artists' keys

    artists = []

    for taste_artist_id in tastes_artists_id:
        taste_artist = TasteArtist.get_by_id(taste_artist_id.id())  # Get taste

        if taste_artist.taste >= 1 and taste_artist.added:
            artist_id = taste_artist.artist.id()  # Get artist id from taste
            artist = Artist.get_by_id(artist_id)  # Get artist by id

            artists.append({"idIMDB": artist_id,
                            "name": artist.name.encode('utf-8') if artist.name is not None else None,
                            "tasted": 1,
                            "photo": artist.photo})

    return jsonify(code=0, data={"userId": user.key.id(), "type": "artist", "tastes": artists})
Пример #4
0
def get_or_retrieve_by_id(id_imdb):
    """
    This function check if the id is a valid IMDb id and in this case get or retrieve the correct entity.
    :param id_imdb: a valid IMDb id
    :type id_imdb: string
    :return: A model instance
    :rtype Artist or Movie model
    """

    artist = re.compile('nm\d{7}$')
    movie = re.compile('tt\d{7}$')

    if artist.match(id_imdb):  # It is an artist's id
        artist = Artist.get_by_id(id_imdb)  # Find artist by id
        if artist is None:

            try:
                artist_key = retrieve_artist_from_id(id_imdb)  # Retrieve if is not in the datastore
            except RetrieverError as retriever_error:
                raise InternalServerError(retriever_error)

            artist = Artist.get_by_id(artist_key.id())  # Get artist by id

        return artist
    elif movie.match(id_imdb):  # It is a movie's id
        movie = Movie.get_by_id(id_imdb)  # Find movie by id
        if movie is None:

            try:
                movie_key = retrieve_movie_from_id(id_imdb)  # Retrieve if is not in the datastore
            except RetrieverError as retriever_error:
                raise InternalServerError(retriever_error)

            movie = Movie.get_by_id(movie_key.id())  # Get movie by id

        return movie
    else:
        new_movie = Movie().get_by_id(id_imdb)
        if new_movie != None:
            return new_movie
        else:
            raise InternalServerError(id_imdb + " is not a valid IMDb id or film.TV id")
Пример #5
0
 def rawGet(self, ballotID, voteID):
     vote = self.getVote(ballotID, voteID)
     if not vote:
         self.response.out.write('No such vote: ' + ballotID + '/' + voteID)
         return
     render = dict(v=vote)
     title = self.request.get('title', default_value=vote.title)
     render['title'] = title
     mbArtistid = self.request.get('artist.mbid', default_value=None)
     artistid = self.request.get('artist.id', default_value=None)
     name = self.request.get('name', default_value=vote.artist)
     artist = None
     if artistid:
         artist = Artist.get_by_id(int(artistid))
     elif mbArtistid:
         artist = Artist.gql('WHERE mbid = :1', mbArtistid).get()
     if artist:
         if artist.mbid:
             mbArtistid = artist.mbid
         name = artist.name
         render['artist'] = artist
         render['releases'] = [r for r in artist.release_set
                               if not vote.release or
                               r.key() != vote.release.key()]
     else:
         if mbArtistid:
             artist = mb.Artist(mbArtistid)
             render['mbArtist'] = artist
         render['artists'] = [a for a in Artist.gql('WHERE name = :1', name)]
         render['releases'] = [r for r in
                               Release.gql('WHERE title = :1', title)
                               if not vote.release or
                               r.key() != vote.release.key()]
     render['name'] = name
     search = dict(title=title)
     if mbArtistid:
         search['artistid'] = mbArtistid
     else:
         search['artist'] = name
     rgs = mb.ReleaseGroup.search(**search)
     if rgs:
         render['rgs'] = rgs
     elif mbArtistid:
         render['rgs'] = mb.ReleaseGroup.search(artistid=mbArtistid)
     else:
         render['mbArtists'] = mb.Artist.search(name=name)
     self.render('canon.html', **render)
Пример #6
0
def generate_artists(user, page=0):

    tastes_artists_id = user.tastes_artists  # Get all taste_artists' keys
    artists = []

    for i in range(page, len(tastes_artists_id)):
        taste_artist_id = tastes_artists_id[i]
        taste_artist = TasteArtist.get_by_id(taste_artist_id.id())  # Get taste

        if taste_artist.taste >= 1 and taste_artist.added:

            artist_id = taste_artist.artist.id()  # Get artist id from taste
            artist = Artist.get_by_id(artist_id)  # Get artist by id

            artists.append({"idIMDB": artist_id,
                            "name": artist.name.encode('utf-8') if artist.name is not None else None,
                            "tasted": 1,
                            "photo": artist.photo})

    return artists
Пример #7
0
 def get(self, id):
     artist = Artist.get_by_id(int(id))
     if artist:
         self.render('artist.html', artist=artist)
     else:
         self.response.out.write('No such artist: ' + id)
Пример #8
0
def get_tastes_list(user):
    """
    Get a readable taste artists list.
    :param user: user
    :type user: Models.User
    :return: list of tastes
        {"code": 0, "data": {"tastes": [{"idIMDB": id,"originalTitle": original_title, "poster": poster_url}],
        "type": type, "userId": user_id}
    :rtype: JSON
    """
    # TODO: improve it, replace with function...

    if user.tastesInconsistence is not True:
        logging.info("tastes in memory")
        return jsonify(code=0, data=user.tastesJson)

    logging.info("rebuiling tastes")

    tastes_artists_id = user.tastes_artists  # Get all taste_artists' keys
    artists = []

    for taste_artist_id in tastes_artists_id:
        taste_artist = TasteArtist.get_by_id(taste_artist_id.id())  # Get taste

        if taste_artist is None:
            logging.error("taste_artist is None")
            continue

        if taste_artist.taste >= 0.99 and taste_artist.added:
            artist_id = taste_artist.artist.id()  # Get artist id from taste
            artist = Artist.get_by_id(artist_id)  # Get artist by id

            artists.append({"idIMDB": artist_id,
                            "name": artist.name.encode('utf-8') if artist.name is not None else None,
                            "tasted": 1,
                            "photo": artist.photo})

    tastes_movies_id = user.tastes_movies

    movies = []

    for taste_movie_id in tastes_movies_id:
        taste_movie = TasteMovie.get_by_id(taste_movie_id.id())  # Get taste

        if taste_movie is None:
            logging.error("taste_movie is None")
            continue
        if taste_movie.taste >=1 and taste_movie.added :
            movie_id = taste_movie.movie.id()  # Get movie id from taste
            movie = Movie.get_by_id(movie_id)  # Get movie by id

            movies.append({"idIMDB": movie_id,
                       "originalTitle": movie.original_title.encode('utf-8') if movie.original_title is not None else movie.title.encode('utf-8'),
                       "title": movie.title.encode('utf-8') if movie.title is not None else movie.original_title.encode('utf-8'),
                       "tasted": 1,
                       "poster": movie.poster})

    tastes_genres_id = user.tastes_genres

    genres = []

    for taste_genre_id in tastes_genres_id:
        taste_genre = TasteGenre.get_by_id(taste_genre_id.id())  # Get taste
        if taste_genre is None:
            logging.error("taste_genre is None")
            continue

        # TODO: not use object, use a simple list
        if taste_genre.taste >= 0.99 and taste_genre.added :
            genres.append({"name": taste_genre.genre,
                           "tasted": 1})

    dataJson = {"userId": user.key.id(),
                         "type": "all",
                         "tastes": {"artists": artists,
                                    "movies": movies,
                                    "genres": genres}}

    user.tastesJson = dataJson
    user.tastesInconsistence = False
    user.put()

    return jsonify(code=0, data=dataJson)