def update_item(): """Saves changes to an existing item. :Returns: JSON with item ID or error message. """ user_id = login_session['user_id'] obj = request.get_json() item = obj.pop('item') item_id = item['id'] rating = int(obj.pop('rating', 0)) # Try to update the item using it's ID. try: app.q_MenuItem().filter_by(id=item_id).update(item) app.db_session.flush() except IntegrityError as e: app.db_session.rollback() return jsonify(error=e.orig.pgerror), 500 # Create or update rating if rating > 0. if rating: try: # Try update. rating_rec = app.q_Rating().filter_by(item_id=item_id, user_id=user_id).one() rating_rec.rating = rating app.db_session.flush() except NoResultFound: # Create new rating record. new_rating = MenuItemRating(rating=rating, item_id=item_id, user_id=user_id) app.db_session.add(new_rating) app.db_session.flush() # Commit changes and return item ID for reference. app.db_session.commit() return jsonify(id=item_id)
def save_rating(): """Saves a menu item rating to the database. :Returns: The status of the database submission as JSON. """ user_id = login_session['user_id'] # Retrieve and check parameters. params = request.get_json() try: item_id = params['item_id'] new_rating = params['rating'] except KeyError: return jsonify(error='Missing data in request.'), 400 try: # Find existing rating record. Throws NoResultFound if none. rec = app.q_Rating().filter_by(user_id=user_id, item_id=item_id).one() rec.rating = new_rating except NoResultFound: # Add new rating record to database. new_rec = MenuItemRating(user_id=user_id, item_id=item_id, rating=new_rating) app.db_session.add(new_rec) app.db_session.commit() return jsonify(status='ok')
def get_favorites(user_id=None, limit=3): """Returns random selection of favorited menu items (default is three). Pass a user_id as a parameter or default to the currently logged in user. Returns an error if neither exists. :arg optional user_id: ID of user. :arg optional limit: Maximum number of items to return. :returns: JSON with an 'items' key and a list of menu items. """ if 'limit' in request.args: limit = int(request.args.get('limit')) if 'user_id' in request.args: try: user_id = int(request.args.get('user_id')) except ValueError as e: return abort(400) else: user_id = login_session.get('user_id', None) if user_id is not None: recs = app.q_Rating().filter_by(user_id=user_id, rating=1) else: return abort(400) count = recs.count() # Make a list of the serializable version of each rec. recs_json = [each.item.sdict for each in recs] # Return a random sampling of the items up to the limit. return jsonify(items=sample(recs_json, min(limit, count)))
def update_item(): """Saves changes to an existing item. :Returns: JSON with item ID or error message. """ user_id = login_session["user_id"] obj = request.get_json() item = obj.pop("item") item_id = item["id"] rating = int(obj.pop("rating", 0)) # Try to update the item using it's ID. try: app.q_MenuItem().filter_by(id=item_id).update(item) app.db_session.flush() except IntegrityError as e: app.db_session.rollback() return jsonify(error=e.orig.pgerror), 500 # Create or update rating if rating > 0. if rating: try: # Try update. rating_rec = app.q_Rating().filter_by(item_id=item_id, user_id=user_id).one() rating_rec.rating = rating app.db_session.flush() except NoResultFound: # Create new rating record. new_rating = MenuItemRating(rating=rating, item_id=item_id, user_id=user_id) app.db_session.add(new_rating) app.db_session.flush() # Commit changes and return item ID for reference. app.db_session.commit() return jsonify(id=item_id)
def get_favorites(user_id=None, limit=3): """Returns random selection of favorited menu items (default is three). Pass a user_id as a parameter or default to the currently logged in user. Returns an error if neither exists. :arg optional user_id: ID of user. :arg optional limit: Maximum number of items to return. :returns: JSON with an 'items' key and a list of menu items. """ if "limit" in request.args: limit = int(request.args.get("limit")) if "user_id" in request.args: try: user_id = int(request.args.get("user_id")) except ValueError as e: return abort(400) else: user_id = login_session.get("user_id", None) if user_id is not None: recs = app.q_Rating().filter_by(user_id=user_id, rating=1) else: return abort(400) count = recs.count() # Make a list of the serializable version of each rec. recs_json = [each.item.sdict for each in recs] # Return a random sampling of the items up to the limit. return jsonify(items=sample(recs_json, min(limit, count)))
def save_rating(): """Saves a menu item rating to the database. :Returns: The status of the database submission as JSON. """ user_id = login_session["user_id"] # Retrieve and check parameters. params = request.get_json() try: item_id = params["item_id"] new_rating = params["rating"] except KeyError: return jsonify(error="Missing data in request."), 400 try: # Find existing rating record. Throws NoResultFound if none. rec = app.q_Rating().filter_by(user_id=user_id, item_id=item_id).one() rec.rating = new_rating except NoResultFound: # Add new rating record to database. new_rec = MenuItemRating(user_id=user_id, item_id=item_id, rating=new_rating) app.db_session.add(new_rec) app.db_session.commit() return jsonify(status="ok")