示例#1
0
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()
示例#2
0
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()
示例#3
0
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()
示例#4
0
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()
示例#5
0
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()
示例#6
0
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()
示例#7
0
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()
示例#8
0
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()
示例#9
0
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()
示例#10
0
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()
示例#11
0
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)
示例#12
0
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()
示例#13
0
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)
示例#14
0
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()
示例#15
0
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()
示例#16
0
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()
示例#17
0
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()
示例#18
0
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()