Beispiel #1
0
def set_version():
    results = {}

    session_permission = get_permission()

    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    data = json.loads(request.data)

    arguments = ["type", "version"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    db = dbo.get_instance()

    try:
        with db.begin_nested():
            new_ver = AppVersion(type=int(data["type"]), version=data["version"])
            db.add(new_ver)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #2
0
def charge_point_begin():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["how_much"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    session_username = session["token"]["user"]["username"]
    user = db.query(Operator). \
        filter_by(username=session_username).first()
    if not user:
        raise abort(404)

    for i in xrange(1024):
        sha256 = hashlib.sha256(str(random.getrandbits(128))).hexdigest()[:24]

        rc_found = db.query(RequestCharge).filter_by(moid=sha256)
        if not rc_found:
            break

    try:
        with db.begin_nested():
            rc = RequestCharge(user_id=user.id, how_much=data["how_much"], moid=sha256, state=0)
            db.add(rc)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #3
0
def create_office_location():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    data = json.loads(request.data)

    arguments = ["name"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    office = OfficeLocation(name=data["name"])
    try:
        with db.begin_nested():
            db.add(office)
            db.flush()
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #4
0
def add_address():
    results = {}

    session_permission = get_permission()

    if not session_permission == 0:
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    data = json.loads(request.data)
    arguments = ["parent", "extra", "code"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    db = dbo.get_instance()
    regex = re.compile("[^\s]+")
    tokens = []
    full_address = ""
    if data["parent"] == 0:
        tokens = regex.findall(data["extra"])
        if tokens.__len__() == 0:
            raise abort(404)
        full_address = " ".join(tokens)

        try:
            with db.begin_nested():
                addr = Address(address=full_address, price_code=data["code"], \
                               created_at=datetime.datetime.now(), \
                               updated_at=datetime.datetime.now())
                db.add(addr)
                db.flush()

                parent = None
                for i in xrange(tokens.__len__()):
                    if (tokens.__len__() - 1) == i:
                        afs = AddressForSearch(addr_id=addr.id, token=tokens[i], \
                                               parent=parent, is_root=False, is_leaf=True)
                        db.add(afs)
                        db.flush()
                    elif i == 0:
                        afs = AddressForSearch(addr_id=None, token=tokens[i], \
                                               parent=parent, is_root=True, is_leaf=False)
                        db.add(afs)
                        db.flush()
                        parent = afs.id
                    else:
                        afs = AddressForSearch(addr_id=None, token=tokens[i], \
                                               parent=parent, is_root=False, is_leaf=False)
                        db.add(afs)
                        db.flush()
                        parent = afs.id
        except Exception, e:
            print str(e)
            dbo.abort()
            raise abort(500)
Beispiel #5
0
def destroy_office_location():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    data = json.loads(request.data)
    data_keys = data.keys()
    arg_type = 0
    arg_data = 0
    if "name" in data_keys:
        arg_type = 1
        arg_data = data["name"]
    elif "index" in data_keys:
        arg_type = 2
        arg_data = data["index"]
    elif "idx" in data_keys:
        arg_type = 2
        arg_data = data["idx"]
    else:
        raise abort(406)

    if arg_type == 1:
        valid_row_count = db.query(OfficeLocation). \
            filter_by(name=arg_data).count()
    elif arg_type == 2:
        valid_row_count = db.query(OfficeLocation). \
            filter_by(id=arg_data).count()

    if valid_row_count == 0:
        raise abort(404)

    if arg_type == 1:
        office = db.query(OfficeLocation). \
            filter_by(name=arg_data).first()
    elif arg_type == 2:
        office = db.query(OfficeLocation). \
            filter_by(id=arg_data).first()

    try:
        with db.begin_nested():
            db.delete(office)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #6
0
def add_event():
    # 1. 권한을 체크한다. (어드민)
    # 2. title, event_start, event_end 의 인자를 검사한다.
    # 3. 해당 이벤트에 겹치는 이벤트가 있나 검사한다
    # 4. 이벤트를 추가한다
    # 5. 방금 추가된 이벤트 정보를 반환한다.
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    # 1. 권한을 체크한다. (어드민)
    session_permission = get_permission()
    if not session_permission == 0:
        # 마스터가 아니라면,
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    # 2. title, event_start, event_end 의 인자를 검사한다.
    arguments = ["title", "event_start", "event_end"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 3. 해당 이벤트에 겹치는 이벤트가 있나 검사한다
    ev_start = time.strftime("%Y-%m-%d %H:%M:%S", \
                             time.localtime(data["event_start"]))
    ev_end = time.strftime("%Y-%m-%d %H:%M:%S", \
                           time.localtime(data["event_end"]))
    valid_row_count = db.query(Event). \
        filter(or_(and_((Event.event_start <= ev_start), \
                        (Event.event_end >= ev_start)), \
                   and_((Event.event_start <= ev_end), \
                        (Event.event_end >= ev_end)))). \
        count()
    if valid_row_count > 0:
        raise abort(406)

    # 4. 이벤트를 추가한다
    try:
        with db.begin_nested():
            ev = Event(title=data["title"], \
                       event_start=ev_start, \
                       event_end=ev_end)
            db.add(ev)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #7
0
def delete_address():
    results = {}

    session_permission = get_permission()

    if not session_permission == 0:
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    data = json.loads(request.data)
    arguments = ["id"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    db = dbo.get_instance()

    afs = db.query(AddressForSearch).filter_by(id=data["id"], is_leaf=True).first()
    if not afs:
        raise abort(404)
    addr = db.query(Address).filter_by(id=afs.addr_id).first()

    try:
        with db.begin_nested():
            if addr:
                db.delete(addr)
            parent = afs.parent
            while(True):
                db.delete(afs)
                db.flush()
                if not parent:
                    break
                afs = db.query(AddressForSearch).filter_by(parent=parent).first()
                if afs:
                    break
                else:
                    afs = db.query(AddressForSearch).filter_by(id=parent).first()
                    parent = afs.parent

    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #8
0
def write_notification():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401
    session_user_id = session["token"]["user"]["id"]

    data = json.loads(request.data)

    # arguments = ["title", "content", "author_id"]
    arguments = ["title", "content"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)
        # author_id 가 실제로 admin 중에 존재하는지 체크를 굳이 하는게 필요함
        # 아니면 에러가 날 것임.
        # author_id_exist = Admin.query.get(data["author_id"])
        # if not author_id_exist:
        # valid_row_count = db.query(Admin).\
        #				filter_by(id=data["author_id"]).count()
        # valid_row_count = db.query(Operator).\
        # filter_by(id=session_user_id, is_master=True).count()
        # if valid_row_count == 0:
        # raise abort(401)
    notification = Notification(title=data["title"], content=data["content"], \
                                author_id=session_user_id)
    try:
        with db.begin_nested():
            db.add(notification)
            db.flush()
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #9
0
def update_notification(idx):
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()
    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401
    session_user_id = session["token"]["user"]["id"]

    data = json.loads(request.data)

    # arguments = ["title", "content", "author_id"]
    arguments = ["title", "content"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 글을 쓴 사람 본인이 맞는지 확인하는 루틴을 넣어야 한다.
    valid_row_count = db.query(Notification). \
        filter_by(id=idx, author_id=session_user_id).count()
    # print valid_row_count
    if valid_row_count == 0:
        raise abort(401)

    notification = db.query(Notification).filter_by(id=idx).first()
    if not notification:
        raise abort(404)

    try:
        with db.begin_nested():
            db.query(Notification).filter_by(id=notification.id).\
                    update({key: data[key] for key in data_keys})
            db.flush()
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #10
0
def reset_interest_region():
    # 1. 대상 유저와 주소를 입력받는다.
    # 2. 권한을 체크한다. (어드민 혹은 본인)
    # 3. 해당 유저가 존재하는지 여부를 검사한다
    # 4. 해당 유저가 소유한 행을 모두 삭제한다.

    results = {}
    db = dbo.get_instance()
    data = json.loads(request.data)
    # 1. 대상 유저와 주소를 입력받는다.
    arguments = ["username"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 2. 권한을 체크한다. (어드민 혹은 본인)
    session_permission = get_permission()
    session_username = session["token"]["user"]["username"]
    if not session_permission == 0:
        # 마스터가 아니라면,
        if not session_username == data["username"]:
            # 그러면서 본인도 아니라면?
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401

    # 3. 해당 유저가 존재하는지 여부를 검사한다
    user = db.query(Operator). \
        filter_by(username=data["username"]).first()
    if not user:
        raise abort(404)

    # 4. 해당 유저가 소유한 행을 모두 삭제한다.
    try:
        with db.begin_nested():
            db.query(InterestAddress).filter_by(operator_id=user.id).delete()
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #11
0
def charge_point_cancel():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["idx"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    session_permission = get_permission()
    session_user_id = session["token"]["user"]["id"]
    # session_username = session["token"]["user"]["username"]

    rc = db.query(RequestCharge).filter_by(id=data["idx"]).first()
    if not rc:
        raise abort(404)

    if session_permission == 0:
        # 프리패스
        pass
    else:
        if not (rc.user_id == session_user_id):
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401

    try:
        with db.begin_nested():
            db.query(RequestCharge).filter_by(id=rc.id).\
                update({RequestCharge.state: 2, \
                        RequestCharge.processed_at: datetime.datetime.now()})
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #12
0
def delete_event():
    # 1. 권한을 체크한다. (어드민)
    # 2. idx 의 인자를 검사한다.
    # 3. 해당 이벤트가 존재하나 검사한다.
    # 4. 이벤트를 삭제한다
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    # 1. 권한을 체크한다. (어드민)
    session_permission = get_permission()
    if not session_permission == 0:
        # 마스터가 아니라면,
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    # 2. idx 의 인자를 검사한다.
    arguments = ["idx"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 3. 해당 이벤트가 존재하나 검사한다.
    ev = db.query(Event).filter_by(id=data["idx"]).first()
    if not ev:
        raise abort(404)

    # 4. 이벤트를 삭제한다
    try:
        with db.begin_nested():
            db.delete(ev)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #13
0
def destroy_notification(idx):
    results = {}

    db = dbo.get_instance()

    # notification = Notification.query.get(idx)
    # if not notification:
    valid_row_count = db.query(Notification). \
        filter_by(id=idx).count()
    if valid_row_count == 0:
        raise abort(404)

    # notification = Notification.query.get(idx)
    notification = db.query(Notification). \
        filter_by(id=idx).first()

    try:
        with db.begin_nested():
            db.delete(notification)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #14
0
def withdraw_point_end():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["id"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    session_permission = get_permission()
    session_user_id = session["token"]["user"]["id"]
    if not session_permission == 0:
        # 마스터가 아니라면,
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401

    # 출금 요청 객체를 받아온다음.
    rw = db.query(RequestWithdraw). \
        filter_by(id=data["id"]).first()
    if not rw:
        raise abort(404)

    try:
        with db.begin_nested():
            # is_active 를 False 로 변경
            db.query(RequestWithdraw).filter_by(id=data["id"]). \
                update({RequestWithdraw.is_active: False, \
                        RequestWithdraw.processed_at: \
                            datetime.datetime.now()})
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #15
0
def withdraw_point_begin():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["money"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    session_permission = get_permission()
    session_username = session["token"]["user"]["username"]
    if session_permission == 0:
        # 마스터라면, 대상 유저명을 필요로 한다.
        if "username" not in data_keys:
            # 유저이름이 없다면
            raise abort(404)
        else:
            # 덮어쓰기 한다
            session_username = data["username"]
    else:
        # 마스터가 아니라면 무조껀 자기 자신만 지정된다
        pass

    user = db.query(Operator). \
        filter_by(username=session_username).first()
    if not user:
        raise abort(404)

    if user.point < data["money"]:
        return jsonify({"reason_text": "Not Enough Point", \
                        "reason_code": 4}), 401

    try:
        with db.begin_nested():
            # 새로운 포인트를 계산하고
            new_point = user.point - data["money"]
            db.query(Operator). \
                filter_by(username=session_username). \
                update({Operator.point: new_point})

            # 출금 요청 객체를 만들어서 Insert 한다.
            rw = RequestWithdraw(user_id=user.id, \
                                 how_much=data["money"])
            db.add(rw)
            db.flush()

            # 포인트가 감소되었다는 로그를 남기기 위해 Point 객체를 생성
            # 감소(0), 출금(3)
            p = Point(user_id=user.id, type=0,
                      reason=3, withdraw_id=rw.id, \
                      how_much=data["money"])
            db.add(p)

    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #16
0
def withdraw_point_cancel():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["id"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    session_permission = get_permission()
    session_user_id = session["token"]["user"]["id"]
    session_username = session["token"]["user"]["username"]

    # 출금 요청 객체를 받아온다음.
    rw = db.query(RequestWithdraw). \
        filter_by(id=data["id"], is_active=True).first()
    if not rw:
        raise abort(404)

    if not session_permission == 0:
        # 마스터가 아닌데
        if rw.user_id == session_user_id:
            username = session_username
        else:
            # 유저 본인도 아니다.
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401
    else:
        # 반면 마스터라면
        if "username" not in data_keys:
            # 유저이름이 없다면 404 에러를 낸다.
            raise abort(404)
        username = data["username"]

    user = db.query(Operator). \
        filter_by(username=username).first()
    if not user:
        # 있으면 안되는 일.
        # 이런일이 안 일어나게 하기 위해서 유저가 탈퇴할때의
        # 프로세스를 철저하게 한다.
        raise abort(500)

    try:
        with db.begin_nested():
            # Point 객체를 만들어서 Insert 한다.
            # 증가(1), 출금취소(6)
            p = Point(user_id=rw.user_id, type=1,
                      reason=6, withdraw_id=rw.id, \
                      how_much=rw.how_much)
            db.add(p)
            # is_active 를 False 로 변경
            db.query(RequestWithdraw).filter_by(id=data["id"]). \
                update({RequestWithdraw.is_active: False, \
                        RequestWithdraw.processed_at: \
                            datetime.datetime.now()})
            # 입금을 요청했던 유저에게 포인트를 되돌려 준다.
            new_point = user.point + rw.how_much
            db.query(Operator). \
                filter_by(username=username). \
                update({Operator.point: new_point})
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #17
0
    users = db.query(Operator).all()
    if users:
        uuids = map(lambda x : x.uuid, users)

        message = dict(type="NOTIFICATION_CREATE_MASTER_ALL", title=notification.title, \
                       content=notification.content, \
                       reg_date=unicode((time.mktime(notification.created_at.timetuple()))))
        android_push.apply_async(args = [uuids, message])

    results["notification"] = notification.serialize(exclude=["author"])

    try:
        db.commit()
    except Exception, e:
        print "EXCEPTION OCCUR DURING COMMIT : {0}".format(str(e))
        dbo.abort()
        db.rollback()
    return jsonify(results), 200


# 구현완료
@notification_blueprint.route("/notification/update/<int:idx>/", methods=["PUT"])
@login_required
def update_notification(idx):
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()
    if not session_permission == 0:
        # 마스터가 아니라면, 에러를 낸다
Beispiel #18
0
def delete_interest_region():
    # 1. 대상 유저와 주소를 입력받는다.
    # 2. 권한을 체크한다. (어드민 혹은 본인)
    # 3. 해당 유저가 존재하는지 여부를 검사한다
    # 4. 입력된 어드레스를 단어들로 쪼갠다
    # 5. 입력된 어드레스가 존재하는지 찾는다
    # 6. 입력된 유저, 어드레스가 일치하는 행을 삭제한다.
    # 7. 특정된 유저를 기준으로 해당하는 항목을 가져온다.
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    # 1. 대상 유저와 주소를 입력받는다.
    arguments = ["username"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 2. 권한을 체크한다. (어드민 혹은 본인)
    session_permission = get_permission()
    session_username = session["token"]["user"]["username"]
    if not session_permission == 0:
        # 마스터가 아니라면,
        if not session_username == data["username"]:
            # 그러면서 본인도 아니라면?
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401

    # 3. 해당 유저가 존재하는지 여부를 검사한다
    user = db.query(Operator). \
        filter_by(username=data["username"]).first()
    if not user:
        raise abort(404)

    # 4. 입력된 어드레스를 단어들로 쪼갠다
    if data.has_key("addr_id"):
        addr = db.query(Address). \
            filter_by(id=data["addr_id"]).first()
    elif data.has_key("address"):
        address = data["address"]
        address = unicode(address.replace("+", " "))

        addr_words = re.findall("[^\s]+", address)
        if addr_words.__len__() == 0:
            raise abort(400)

        # 5. 입력된 어드레스가 존재하는지 찾는다
        addr = db.query(Address)
        for word in addr_words:
            addr = addr.filter(Address.address. \
                               like("%" + word + "%"))
        addr = addr.first()
    else:
        raise abort(400)

    if not addr:
        raise abort(500)

    ia = db.query(InterestAddress)
    ia = ia.filter_by(operator_id=user.id, address_id=addr.id).first()
    # for word in addr_words:
    #    ia = ia.filter(InterestAddress.address. \
    #                   like("%" + word + "%"))
    # ia = ia.filter_by(address_id=addr.id)
    # ia = ia.first()
    if not ia:
        raise abort(404)

    # 6. 입력된 유저, 어드레스가 일치하는 행을 삭제한다.
    try:
        ia_id = ia.id
        ia_address_id = ia.address_id
        with db.begin_nested():
            db.delete(ia)
    except Exception, e:
        print str(e)
        dbo.abort()
        raise abort(500)
Beispiel #19
0
def add_interest_region():
    # 1. 대상 유저와 주소를 입력받는다.
    # 2. 권한을 체크한다. (어드민 혹은 본인)
    # 3. 해당 유저가 존재하는지 여부를 검사한다
    # 4. 들어온 afs_id 를 통해 AddressForSearch 인자를 얻어온 후
    #    해당 행이 is_leaf 나 is_root 인가를 본다.
    # 5. 특정된 유저를 기준으로 해당하는 항목을 가져온다.
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    # 1. 대상 유저와 주소를 입력받는다.
    arguments = ["username", "afs_id"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    # 2. 권한을 체크한다. (어드민 혹은 본인)
    session_permission = get_permission()
    session_username = session["token"]["user"]["username"]
    if not session_permission == 0:
        # 마스터가 아니라면,
        if not session_username == data["username"]:
            # 그러면서 본인도 아니라면?
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401

    # 3. 해당 유저가 존재하는지 여부를 검사한다
    user = db.query(Operator). \
        filter_by(username=data["username"]).first()
    if not user:
        raise abort(404)

    # 4. 들어온 afs_id 를 통해 AddressForSearch 인자를 얻어온 후
    #    해당 행이 is_leaf 나 is_root 인가를 본다.
    afs = db.query(AddressForSearch).filter_by(id=data["afs_id"]).first()
    if not afs:
        raise abort(404)

    addrs = []
    if afs.is_root:
        raise abort(403)
    elif afs.is_leaf:
        addr = db.query(Address).filter_by(id=afs.addr_id).first()
        if addr:
            addrs.append(addr)
    else:
        stack = []
        stack.append(afs)

        current_afs = None
        while True:
            if stack.__len__() == 0:
                break
            current_afs = stack.pop()
            if current_afs.is_leaf:
                addr = db.query(Address).filter_by(id=current_afs.addr_id).first()
                if addr:
                    addrs.append(addr)
            else:
                for afs_sub in db.query(AddressForSearch).filter_by(parent=current_afs.id).all():
                    stack.append(afs_sub)

    if addrs.__len__() > 0:
        try:
            with db.begin_nested():
                for addr in addrs:
                    ia = db.query(InterestAddress).filter_by(operator_id=user.id, \
                                                             address_id=addr.id).first()
                    if not ia:
                        ia = InterestAddress(operator_id=user.id, address_id=addr.id)
                        db.add(ia)
        except Exception, e:
            print str(e)
            dbo.abort()
            raise abort(500)

        try:
            db.commit()
        except Exception, e:
            print "EXCEPTION OCCUR DURING COMMIT : {0}".format(str(e))
            dbo.abort()
            db.rollback()