Пример #1
0
def create_label(env, start_response, args):
    method = env['REQUEST_METHOD']
    #if method != 'POST':
    #    start_response('501 Not Implemented', [])
    #    return ['Unsupported']
    user = _validate_fb(env)
    if user is None:
        return json_error(env, start_response, ERROR_CODES.FACEBOOK_NO_SESSION)
    if ('obj_id' not in args) or ('parent' not in args) or ('name' not in args) or ('nick' not in args) or ('rule' not in args) or ('color' not in args):
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER)
    try:
        obj_id = str(int(args['obj_id']))
    except:
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'obj_id is not valid.')
    admin = _is_admin(obj_id, user)
    if admin is None:
        return json_error(env, start_response, ERROR_CODES.FACEBOOK_NO_PERMISSION, 'access to the object is denied or the object is not supported.')
    obj_type, id = _detect_obj_type(obj_id, user)
    if admin:
        if obj_type == 'profile':
            shared = 'personal'
            if ('shared' in args) and (str(args['shared']) == '1'):
                shared = 'shared'
        else:
            shared = 'global'
    elif ('personal' not in args) or (str(args['personal']) != '1'):
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'the personal view should be selected.')
    if ('personal' in args) and (str(args['personal']) == '1') and ((not admin) or (obj_type != 'profile')):
        obj_id = str(obj_id) + ':' + str(user['uid'])
        shared = 'personal'
        if ('shared' in args) and (str(args['shared']) == '1'):
            shared = 'shared'
    sdb = Retry(SimpleDB, RETRY_LIMIT, ['select', 'put_attributes', 'get_attributes'], AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY)
    #sdb = SimpleDBWRTY(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, retry_limit = RETRY_LIMIT)
    try:
        if not str(args['parent']) == '0':
            parent = sdb.get_attributes(AWS_SDB_LABELS_DOMAIN, obj_id, [args['parent']])
            if not parent.has_key(args['parent']) or parent[args['parent']] is None:
                return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER,'parent label_id is not passed.')
        label_id = hashlib.sha1(str(args['name']) + str(time.time())).hexdigest()
        if admin and (shared == 'gloabl'):
            owned = 'admin'
        elif admin:
            owned = 'owner'
        else:
            owned = user['uid']
        sdb.put_attributes(AWS_SDB_LABELS_DOMAIN, obj_id, [(label_id, SHARE_DEL + shared, True), 
                                                        (label_id, NAME_DEL + args['name'], True), 
                                                        (label_id, NICK_DEL + args['nick'], True), 
                                                        (label_id, PARENT_DEL + args['parent'], True), 
                                                        (label_id, RULE_DEL + args['rule'], True),
                                                        ('owned', owned, True),
                                                        ('obj_id', obj_id.split(':')[0], True),
                                                        (label_id, COL_DEL + args['color'], True)])
    except:
        raise
        start_response('503 Service Unavailable',[])
        return ['Temporarily not available']
    return json_ok(env, start_response, label_id)
Пример #2
0
def set_exception(env, start_response, args):
    method = env['REQUEST_METHOD']
    #if method != 'GET':
    #    start_response('501 Not Implemented', [])
    #    return ['Unsupported']
    user = _validate_fb(env)
    if user is None:
        return json_error(env, start_response, ERROR_CODES.FACEBOOK_NO_SESSION)
    if ('post_id' not in args) or ('label_id' not in args) or ('excluded' not in args):
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER)
    try:
        from_id, to_id, created_time, updated_time = _get_post_info(args['post_id'], user)
    except:
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'post_id is not valid or not accessible.')
    if from_id is None:
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'the post does not have a from_id field.')
    try:
        sdb = Retry(SimpleDB, RETRY_LIMIT, ['select', 'put_attributes', 'get_attributes'], AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY)
        labels = sdb.select(AWS_SDB_LABELS_DOMAIN, "select `%s` from %s where `%s` is not null" %(args['label_id'], AWS_SDB_LABELS_DOMAIN, args['label_id']))
        if len(labels) == 0:    
            return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'the label_id is not a valid label or is not public.')
        if labels[0].name.count(':') == 0:
            owner = 'admin'
        else:
            owner = labels[0].name.split(':')[1]
        obj_id = labels[0].name.split(':')[0]
        shared_status, name, nick, parent, rule, color = _decode_label(labels[0].values()[0])
        if str(to_id) != obj_id:
            return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'the label is not defined for this object.')
        is_admin = _is_admin(to_id, user)
        if (shared_status == 'global') and (str(user['uid']) != str(from_id)) and (not is_admin):
            return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'only the admin or the author can assign global labels.')
        if (shared_status == 'shared') and (str(user['uid']) != str(from_id)) and (creator_status != str(user['uid'])):
            return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'only the label creator or the author can assign shared labels.')
        itm = args['label_id'] + ':' + args['post_id']
        if args['excluded'] == '1':
            excluded = '1'
        else:
            excluded = '0'
        if is_admin and (shared_status == 'global'):
            creator = 'admin'
        else:
            creator = str(user['uid'])
        sdb.put_attributes(AWS_SDB_EXCEPTIONS_DOMAIN, itm, [('excluded', excluded, True),
                                                      ('label_id', args['label_id'], True),
                                                      ('post_id', args['post_id'], True),
                                                      ('creator', creator, True)])
        return json_ok(env, start_response, {})
    except:
        raise
        start_response('503 Service Unavailable',[])
        return ['Temporarily not available']
Пример #3
0
def update_label(env, start_response, args):
    method = env['REQUEST_METHOD']
    #if method != 'GET':
    #    start_response('501 Not Implemented', [])
    #    return ['Unsupported']
    user = _validate_fb(env)
    if user is None:
        return json_error(env, start_response, ERROR_CODES.FACEBOOK_NO_SESSION)
    if 'label_id' not in args:
        return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'label_id not passed.')
    sdb = Retry(SimpleDB, RETRY_LIMIT, ['delete_attributes', 'select', 'put_attributes', 'get_attributes'], AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY)
    try:
        label = sdb.select(AWS_SDB_LABELS_DOMAIN, 'select owned, `%s` from %s where `%s` in ("A:shared", "A:global", "A:personal")' %(args['label_id'], AWS_SDB_LABELS_DOMAIN, args['label_id']))
        if len(label) == 0:
            return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'label_id does not exist.')
        for i in label:
            owned = i['owned']
            con_obj_id = i.name
            obj_id = i.name.split(':')[0]
            if i.name.count(':') == 0:
                owner = 'admin'
            else:
                owner = i.name.split(':')[1]
            #original_label_value = dict([[args['label_id'],i[args['label_id']]]])
            shared_status, name, nick, parent, rule, color = _decode_label(i[args['label_id']])
            admin = _is_admin(obj_id, user)
            if admin is None:
                return json_error(env, start_response, ERROR_CODES.FACEBOOK_NO_PERMISSION, 'access to the object is denied or the object is not supported.')
            if (not admin) and (owner != str(user['uid'])):
                return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'the label does not belong to the user.')
        if 'name' in args:
             name = args['name']
        if 'nick' in args:
             nick = args['nick']
        if 'rule' in args:
             rule = args['rule']
        if 'color' in args:
             color = args['color']
        shared = shared_status
        obj_type, id = _detect_obj_type(con_obj_id.split(':')[0], user)
        if (obj_type == 'profile') and admin:
            if ('shared' in args) and (str(args['shared']) == '1'):
                shared = 'shared'
            elif ('shared' in args) and (str(args['shared']) == '0'):
                shared = 'personal'
                
        if (obj_type == 'profile') and (not admin):
            if ('shared' in args) and (str(args['shared']) == '1'):
                shared = 'shared'
            elif ('shared' in args) and (str(args['shared']) == '0'):
                shared = 'personal'
        if (obj_type != 'profile') and admin:
            if shared != 'global':
                if ('shared' in args) and (str(args['shared']) == '1'):
                    shared = 'shared'
                elif ('shared' in args) and (str(args['shared']) == '0'):
                    shared = 'personal'
        if (obj_type != 'profile') and (not admin):
            if ('shared' in args) and (str(args['shared']) == '1'):
                shared = 'shared'
            elif ('shared' in args) and (str(args['shared']) == '0'):
                shared = 'personal'

        original_label_value = dict([[args['label_id'], None]])
        #sdb.delete_attributes(AWS_SDB_LABELS_DOMAIN, con_obj_id, original_label_value)
        sdb.put_attributes(AWS_SDB_LABELS_DOMAIN, con_obj_id, [(args['label_id'], SHARE_DEL + shared, True),
                                                        (args['label_id'], NAME_DEL + name, True),
                                                        (args['label_id'], NICK_DEL + nick, True),
                                                        (args['label_id'], PARENT_DEL + parent, True),
                                                        (args['label_id'], RULE_DEL + rule, True),
                                                        ('owned', owned, True),
                                                        ('obj_id', con_obj_id.split(':')[0], True),
                                                        (args['label_id'], COL_DEL + color, True)])
        return json_ok(env, start_response, {})
    except:
        raise
        start_response('503 Service Unavailable',[])
        return ['Temporarily not available']