def get_exceptions(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 'uid' in args: try: uid = str(int(args['uid'])) except: return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'not a valid uid.') else: uid = user['uid'] if 'label_id' in args: sdb = Retry(SimpleDB, RETRY_LIMIT, ['select', 'put_attributes', 'get_attributes'], AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY) try: exceptions = sdb.select(AWS_SDB_EXCEPTIONS_DOMAIN, 'select excluded, post_id from %s where label_id="%s" and creator in ("%s", "%s", "admin")' %(AWS_SDB_EXCEPTIONS_DOMAIN, args['label_id'], user['uid'], uid) ) post_list = {} for i in exceptions: post_list[i['post_id']] = i['excluded'] return json_ok(env, start_response, post_list) except: raise start_response('503 Service Unavailable',[]) return ['Temporarily not available'] if 'post_id' not in args: return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'post_id or label_id should be passed.') sdb = Retry(SimpleDB, RETRY_LIMIT, ['select', 'put_attributes', 'get_attributes'], AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY) try: post_list = {} post_id = '' for i in args['post_id'].split(','): post_id = post_id + ',"%s"' %i post_id = post_id.strip(',') exceptions = sdb.select(AWS_SDB_EXCEPTIONS_DOMAIN, 'select excluded, post_id, label_id from %s where post_id in (%s) and creator in ("%s", "%s", "admin")' %(AWS_SDB_EXCEPTIONS_DOMAIN, post_id, user['uid'], uid) ) for i in exceptions: post_list[i['post_id']] = {'excluded' : i['excluded'], 'label_id' : i['label_id']} return json_ok(env, start_response, post_list) except: raise start_response('503 Service Unavailable',[]) return ['Temporarily not available']
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']
def get_labels(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 'obj_id' not in args: return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'obj_id is not passed.') 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.') shared = 'global' if 'uid' in args: try: uid = str(int(args['uid'])) if uid != str(user['uid']): shared = 'shared' else: shared = 'personal' except: return json_error(env, start_response, ERROR_CODES.BAD_PARAMTER, 'uid is not valid.') obj_id = obj_id + ':' + str(user['uid']) else: uid = str(user['uid']) 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 * from %s where obj_id in ('%s', '%s') and owned in ('%s', '%s', 'admin', 'owner')" %(AWS_SDB_LABELS_DOMAIN, obj_id.split(':')[0], user['uid'], user['uid'], uid)) easy_labels = {} for i in labels: for j in i: if j not in ['obj_id', 'owned']: shared_status, name, nick, parent, rule, color = _decode_label(i[j]) if (i['owned']=='admin') or (i['owned'] == user['uid']) or (shared_status == 'shared') or ((i['owned'] == 'owner') and admin) or (i['obj_id'] == user['uid']): easy_labels[j] = {'parent' : parent, 'name' : name, 'owner' : i['owned'], 'obj_id' : i.name, 'nick': nick, 'shared' : shared_status, 'rule' : rule, 'color' : color} return json_ok(env, start_response, easy_labels) except: raise start_response('503 Service Unavailable',[]) return ['Temporarily not available']
def _get_labels(obj_id, uid, admin, view_uid=None): if view_uid is None: view_uid = uid elif view_uid == uid: shared = 'personal' obj_id = obj_id + ':' + str(uid) else: shared = 'shared' obj_id = obj_id + ':' + str(uid) 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 * from %s where obj_id in ('%s', '%s') and owned in ('%s', '%s', 'admin', 'owner')" %(AWS_SDB_LABELS_DOMAIN, obj_id.split(':')[0], uid, uid, view_uid)) easy_labels = {} for i in labels: for j in i: if j not in ['obj_id', 'owned']: shared_status, name, nick, parent, rule, color = _decode_label(i[j]) if (i['owned']=='admin') or (i['owned'] == uid) or (shared_status == 'shared') or ((i['owned'] == 'owner') and admin) or (i['obj_id'] == uid): easy_labels[j] = {'parent' : parent, 'name' : name, 'owner' : i['owned'], 'obj_id' : i.name, 'nick': nick, 'shared' : shared_status, 'rule' : rule, 'color' : color} except: raise return easy_labels
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']