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'
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'
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})
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")
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)
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
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)
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)