def update_library(user, uid): """Update (add or delete) a user's library.""" helpers.ensure_users_match(user, uid) current_entries = local_valid_entries(user) for json_delta in request.form.getlist('delta'): try: delta = json.loads(json_delta) delta_type = delta['type'] artist = delta['entry']['artist'] title = delta['entry']['title'] local_id = int(delta['entry']['local_id']) except: raise helpers.BadRequest(errors.INVALID_DELTA, "not a valid library delta") key = hashlib.sha1(artist.encode('utf-8') + title.encode('utf-8') + str(local_id)).digest() if delta_type == 'PUT': if key not in current_entries: set_lib_entry(user, artist, title, local_id=local_id) elif delta_type == 'DELETE': if key in current_entries: current_entries[key].is_valid = False else: # Unknown delta type. raise helpers.BadRequest(errors.INVALID_DELTA, "not a valid library delta") # Update the user's model. g.store.flush() predict.Model(user).generate(g.store) return helpers.success()
def update_user_group(user, uid): """Join or leave a group.""" helpers.ensure_users_match(user, uid) if request.method == 'DELETE': if user.group is not None: if user.group.master == user: user.group.master = None event = GroupEvent(user.group, user, events.LEAVE, None) g.store.add(event) user.group = None return helpers.success() try: gid = int(request.form['gid']) except: raise helpers.BadRequest(errors.MISSING_FIELD, "cannot to parse group ID") group = g.store.get(Group, gid) if group is None: raise helpers.BadRequest(errors.INVALID_GROUP, "group does not exist") if user.group != group: if user.group is not None: if user.group.master == user: # The user was his old group's master. user.group.master == None event = GroupEvent(user.group, user, events.LEAVE, None) g.store.add(event) user.group = group event = GroupEvent(group, user, events.JOIN, None) g.store.add(event) return helpers.success()
def dump_library(user, uid): """Dump (create or replace) a user's library.""" helpers.ensure_users_match(user, uid) current_entries = local_valid_entries(user) next_entries = set() for json_entry in request.form.getlist('entry'): try: entry = json.loads(json_entry) artist = entry['artist'] title = entry['title'] local_id = int(entry['local_id']) except: raise helpers.BadRequest(errors.INVALID_LIBENTRY, "not a valid library entry") key = hashlib.sha1(artist.encode('utf-8') + title.encode('utf-8') + str(local_id)).digest() next_entries.add(key) if key not in current_entries: set_lib_entry(user, artist, title, local_id=local_id) # Invalidate entries that are not in the request. for key, entry in current_entries.iteritems(): if key not in next_entries: entry.is_valid = False # Update the user's model. g.store.flush() predict.Model(user).generate(g.store) return helpers.success()
def update_library(user, uid): """Update (add or delete) a user's library.""" helpers.ensure_users_match(user, uid) current_entries = local_valid_entries(user) for json_delta in request.form.getlist('delta'): try: delta = json.loads(json_delta) delta_type = delta['type'] artist = delta['entry']['artist'] title = delta['entry']['title'] local_id = int(delta['entry']['local_id']) except: raise helpers.BadRequest(errors.INVALID_DELTA, "not a valid library delta") key = hashlib.sha1( artist.encode('utf-8') + title.encode('utf-8') + str(local_id)).digest() if delta_type == 'PUT': if key not in current_entries: set_lib_entry(user, artist, title, local_id=local_id) elif delta_type == 'DELETE': if key in current_entries: current_entries[key].is_valid = False else: # Unknown delta type. raise helpers.BadRequest(errors.INVALID_DELTA, "not a valid library delta") # Update the user's model. g.store.flush() predict.Model(user).generate(g.store) return helpers.success()
def dump_library(user, uid): """Dump (create or replace) a user's library.""" helpers.ensure_users_match(user, uid) current_entries = local_valid_entries(user) next_entries = set() for json_entry in request.form.getlist('entry'): try: entry = json.loads(json_entry) artist = entry['artist'] title = entry['title'] local_id = int(entry['local_id']) except: raise helpers.BadRequest(errors.INVALID_LIBENTRY, "not a valid library entry") key = hashlib.sha1( artist.encode('utf-8') + title.encode('utf-8') + str(local_id)).digest() next_entries.add(key) if key not in current_entries: set_lib_entry(user, artist, title, local_id=local_id) # Invalidate entries that are not in the request. for key, entry in current_entries.iteritems(): if key not in next_entries: entry.is_valid = False # Update the user's model. g.store.flush() predict.Model(user).generate(g.store) return helpers.success()
def update_user_nickname(user, uid): """Assign a nickname to the user.""" helpers.ensure_users_match(user, uid) try: user.nickname = request.form['nickname'] except KeyError: raise helpers.BadRequest(errors.MISSING_FIELD, "missing nickname") return helpers.success()
def update_user_password(user, uid): """Update the user's password.""" helpers.ensure_users_match(user, uid) try: pw = request.form['password'] except KeyError: raise helpers.BadRequest(errors.MISSING_FIELD, "missing password") if not password.is_good_enough(pw): raise helpers.BadRequest(errors.INVALID_EMAIL, "password is not satisfactory") user.password = password.encrypt(pw) return helpers.success()
def get_ratings(user, uid): """Get a list of ratings for the user.""" helpers.ensure_users_match(user, uid) entries = g.store.find(LibEntry, (LibEntry.user == user) & (LibEntry.rating != None) & LibEntry.is_valid) ratings = list() for entry in entries: ratings.append({ 'artist': entry.track.artist, 'title': entry.track.title, 'local_id': entry.local_id, 'rating': entry.rating, }) return jsonify(tracks=ratings)
def add_rating(user, uid): """Set a rating for the user.""" helpers.ensure_users_match(user, uid) try: artist = request.form['artist'] title = request.form['title'] rating = max(1, min(5, int(request.form['rating']))) except KeyError: raise helpers.BadRequest(errors.MISSING_FIELD, "missing artist, title or rating") except ValueError: raise helpers.BadRequest(errors.INVALID_RATING, "rating is invalid") set_rating(user, artist, title, rating) return helpers.success()
def update_user_preference(user, uid): """Update the user's current preference.""" helpers.ensure_users_match(user, uid) try: pref = request.form['pref'] except KeyError: raise helpers.BadRequest(errors.MISSING_FIELD, "missing taste field") usertags = g.store.get(UserTags, uid) if usertags is None: usertags = UserTags(uid,unicode("[]"),unicode(pref)) g.store.add(usertags) else: usertags.preference = pref return helpers.success()
def update_user_group(user, uid): """Join or leave a group.""" helpers.ensure_users_match(user, uid) if request.method == 'DELETE': if 'gid' in request.args and int(request.args['gid']) != -1: gid = int(request.args['gid']) if user.group is not None and user.group_id == gid: leave_group(user) else: # going to notify the app that it was too late # we are not taking any other action. return helpers.late_success() else: # legacy version: always remove the user from its # actual group leave_group(user) return helpers.success() try: gid = int(request.form['gid']) except: raise helpers.BadRequest(errors.MISSING_FIELD, "cannot to parse group ID") group = g.store.get(Group, gid) if group is None: raise helpers.BadRequest(errors.INVALID_GROUP, "group does not exist") if group.password is not None: try: password = request.form['password'] except: raise helpers.BadRequest(errors.PASSWORD_EXPECTED, "password expected") if password != group.password: raise helpers.Forbidden("received an invalid group password") if user.group != group: if user.group is not None: if user.group.master == user: # The user was his old group's master. user.group.master = None event = GroupEvent(user.group, user, events.LEAVE, None) g.store.add(event) user.group = group event = GroupEvent(group, user, events.JOIN, None) g.store.add(event) return helpers.success()
def update_user_email(user, uid): """Update the user's e-mail address.""" helpers.ensure_users_match(user, uid) try: email = request.form['email'] except KeyError: raise helpers.BadRequest(errors.MISSING_FIELD, "missing e-mail address") if not mail.is_valid(email): raise helpers.BadRequest(errors.INVALID_EMAIL, "e-mail is not valid") try: user.email = email g.store.flush() except storm.exceptions.IntegrityError: # E-mail already in database. raise helpers.BadRequest(errors.EXISTING_USER, "e-mail already taken by another user") return helpers.success()