def test_get_feedback_count_for_user(self): count = self.insert_test_data(self.user["id"]) result = db_feedback.get_feedback_count_for_user( user_id=self.user["id"]) self.assertEqual(result, count) result = db_feedback.get_feedback_count_for_user( user_id=self.user["id"], score=1) self.assertEqual(result, 1) result = db_feedback.get_feedback_count_for_user( user_id=self.user["id"], score=-1) self.assertEqual(result, 1)
def test_dump_recording_feedback(self): # create a user with self.app.app_context(): one_id = db_user.create(1, 'test_user') user_count = db_user.get_user_count() self.assertEqual(user_count, 1) # insert a feedback record feedback = Feedback( user_id=one_id, recording_msid="d23f4719-9212-49f0-ad08-ddbfbfc50d6f", score=1) db_feedback.insert(feedback) # do a db dump and reset the db private_dump, private_ts_dump, public_dump, public_ts_dump = db_dump.dump_postgres_db( self.tempdir) self.reset_db() user_count = db_user.get_user_count() self.assertEqual(user_count, 0) self.assertEqual( db_feedback.get_feedback_count_for_user(user_id=one_id), 0) # import the dump and check the records are inserted db_dump.import_postgres_dump(private_dump, None, public_dump, None) user_count = db_user.get_user_count() self.assertEqual(user_count, 1) dumped_feedback = db_feedback.get_feedback_for_user(user_id=one_id, limit=1, offset=0) self.assertEqual(len(dumped_feedback), 1) self.assertEqual(dumped_feedback[0].user_id, feedback.user_id) self.assertEqual(dumped_feedback[0].recording_msid, feedback.recording_msid) self.assertEqual(dumped_feedback[0].score, feedback.score) # reset again, and use more threads to import self.reset_db() user_count = db_user.get_user_count() self.assertEqual(user_count, 0) dumped_feedback = [] db_dump.import_postgres_dump(private_dump, None, public_dump, None, threads=2) user_count = db_user.get_user_count() self.assertEqual(user_count, 1) dumped_feedback = db_feedback.get_feedback_for_user(user_id=one_id, limit=1, offset=0) self.assertEqual(len(dumped_feedback), 1) self.assertEqual(dumped_feedback[0].user_id, feedback.user_id) self.assertEqual(dumped_feedback[0].recording_msid, feedback.recording_msid) self.assertEqual(dumped_feedback[0].score, feedback.score)
def get_feedback_for_user(user_name): """ Get feedback given by user ``user_name``. The format for the JSON returned is defined in our :ref:`feedback-json-doc`. If the optional argument ``score`` is not given, this endpoint will return all the feedback submitted by the user. Otherwise filters the feedback to be returned by score. :param score: Optional, If 1 then returns the loved recordings, if -1 returns hated recordings. :type score: ``int`` :param count: Optional, number of feedback items to return, Default: :data:`~webserver.views.api.DEFAULT_ITEMS_PER_GET` Max: :data:`~webserver.views.api.MAX_ITEMS_PER_GET`. :type count: ``int`` :param offset: Optional, number of feedback items to skip from the beginning, for pagination. Ex. An offset of 5 means the top 5 feedback will be skipped, defaults to 0. :type offset: ``int`` :param metadata: Optional, 'true' or 'false' if this call should return the metadata for the feedback. :type metadata: ``str`` :statuscode 200: Yay, you have data! :resheader Content-Type: *application/json* """ score = _parse_int_arg('score') metadata = parse_boolean_arg('metadata') offset = get_non_negative_param('offset', default=0) count = get_non_negative_param('count', default=DEFAULT_ITEMS_PER_GET) count = min(count, MAX_ITEMS_PER_GET) user = db_user.get_by_mb_id(user_name) if user is None: raise APINotFound("Cannot find user: %s" % user_name) if score: if score not in [-1, 1]: log_raise_400("Score can have a value of 1 or -1.", request.args) feedback = db_feedback.get_feedback_for_user(user_id=user["id"], limit=count, offset=offset, score=score, metadata=metadata) total_count = db_feedback.get_feedback_count_for_user(user["id"]) feedback = [fb.to_api() for fb in feedback] return jsonify({ "feedback": feedback, "count": len(feedback), "total_count": total_count, "offset": offset })
def feedback(user_name: str): """ Show user feedback, with filter on score (love/hate). Args: musicbrainz_id (str): the MusicBrainz ID of the user Raises: NotFound if user isn't present in the database """ score = request.args.get('score', 1) try: score = int(score) except ValueError: raise BadRequest("Incorrect int argument score: %s" % request.args.get("score")) offset = request.args.get('offset', 0) try: offset = int(offset) except ValueError: raise BadRequest("Incorrect int argument offset: %s" % request.args.get("offset")) count = request.args.get("count", DEFAULT_NUMBER_OF_FEEDBACK_ITEMS_PER_CALL) try: count = int(count) except ValueError: raise BadRequest("Incorrect int argument count: %s" % request.args.get("count")) user = _get_user(user_name) user_data = { "name": user.musicbrainz_id, "id": user.id, } feedback_count = get_feedback_count_for_user(user.id, score) feedback = get_feedback_for_user(user.id, count, offset, score, True) props = { "feedback": [f.to_api() for f in feedback], "feedback_count": feedback_count, "user": user_data, "active_section": "feedback", "logged_in_user_follows_user": logged_in_user_follows_user(user), } return render_template("user/feedback.html", active_section="feedback", props=ujson.dumps(props), user=user)