Exemplo n.º 1
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)
Exemplo n.º 2
0
def statistic_report_of_population_in_period():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

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

    data = json.loads(request.data)

    # 만약 7을 넣으면 7일 전부터 지금까지의 신규 가입을 얻어옴.
    arguments = ["day_from"]
    data_keys = data.keys()
    for argument in arguments:
        if argument not in data_keys:
            raise abort(400)

    day_from = data["day_from"] * (-1)

    recent_joined = db.query(Operator).\
        filter(Operator.created_at >= (datetime.datetime.now() + datetime.timedelta(days=day_from))).\
        count()
    total = db.query(Operator).count()

    results["population"] = {}
    results["population"]["recent_join"] = recent_joined
    results["population"]["total"] = total

    return jsonify(results), 200
Exemplo n.º 3
0
def charge_req_log(count_from, count_to):
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)
    data_keys = data.keys()

    if not ((count_from >= 0 and count_to >= 0) and \
                    (count_from <= count_to)):
        raise abort(406)

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

    logs = db.query(RequestCharge)
    if "is_active" in data_keys:
        if data["is_active"] == True:
            logs = logs.filter_by(state=0)
        else:
            logs = logs.filter(RequestCharge.state.in_([1,2]))

    else:
        logs = logs.filter_by(is_active=True)
    logs = logs.order_by(RequestWithdraw.created_at.desc()). \
               all()[count_from - 1:count_to - 1]

    results["log"] = []
    for log in logs:
        results["log"].append(log.serialize())

    return jsonify(results), 200
Exemplo n.º 4
0
def get_point_bill():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    arguments = ["username"]
    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 not session_permission == 0:
        # 마스터가 아니라면,
        if not session_username == data["username"]:
            # 그러면서 본인도 아니라면?
            return jsonify({"reason_text": "Permission Denied", \
                            "reason_code": 2}), 401

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

    results["point"] = user.point

    return jsonify(results), 200
Exemplo n.º 5
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)
Exemplo n.º 6
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)
Exemplo n.º 7
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)
Exemplo n.º 8
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)
Exemplo n.º 9
0
def query_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. 특정된 유저를 기준으로 해당하는 항목을 가져온다.
    ias = db.query(InterestAddress). \
        join(InterestAddress.address). \
        filter(InterestAddress.operator_id == user.id). \
        order_by(InterestAddress.updated_at.desc()).all()

    results["interest_address"] = []
    for ia in ias:
        results["interest_address"].append(ia.serialize())

    return jsonify(results), 200
Exemplo n.º 10
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)
Exemplo n.º 11
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)
Exemplo n.º 12
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)
Exemplo n.º 13
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)
Exemplo n.º 14
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)
Exemplo n.º 15
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)
Exemplo n.º 16
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)
Exemplo n.º 17
0
def statistic_report_of_individual_sub_users(count_from, count_to):
    results = {}

    db = dbo.get_instance()

    if not ((count_from >= 0 and count_to >= 0) and \
                    (count_from <= count_to)):
        raise abort(406)

    session_permission = get_permission()

    if session_permission > 1:
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401
    session_user_id = session["token"]["user"]["id"]

    interval_dict = make_interval(180)

    results["statistic"] = {}
    if session_permission == 0:
        # 마스터는 모든 유저들의 통계량을 본다.
        users = db.query(Operator). \
                    filter_by(is_master=False). \
                    order_by(Operator.id.asc())[count_from - 1:count_to - 1]
    elif session_permission == 1:
        # 관리자는 자신 아래의 유저들의 통계량을 본다.
        users = db.query(Operator). \
                    join(OperatorAdminMatch, \
                         Operator.id == OperatorAdminMatch.operator_id). \
                    filter(OperatorAdminMatch.admin_id == session_user_id). \
                    order_by(Operator.id.asc()).all()[count_from - 1:count_to - 1]
    else:
        # 뭐냐 이건
        raise abort(500)

    for user in users:
        results["statistic"][user.username] = {}
        results["statistic"][user.username]["id"] = user.id
        for key in interval_dict.keys():
            key_year = key[0]
            key_mon = key[1]
            if not results["statistic"][user.username].has_key(key_year):
                results["statistic"][user.username][key_year] = {}
            if not results["statistic"][user.username][key_year].has_key(key_mon):
                results["statistic"][user.username][key_year][key_mon] = {}

            start = interval_dict[key][0]
            end = interval_dict[key][1]

            results["statistic"][user.username][key_year][key_mon] \
                ["period_start"] = start
            results["statistic"][user.username][key_year][key_mon] \
                ["period_end"] = end

            status_0 = db.query(Order). \
                filter_by(orderer_id=user.id, status=0). \
                filter(Order.created_at >= start). \
                filter(Order.created_at <= end). \
                count()
            results["statistic"][user.username][key_year][key_mon] \
                ["status_0"] = status_0

            status_1 = db.query(Order). \
                filter_by(orderer_id=user.id, status=1). \
                filter(Order.created_at >= start). \
                filter(Order.created_at <= end). \
                count()
            results["statistic"][user.username][key_year][key_mon] \
                ["status_1"] = status_1

            status_2 = db.query(Order). \
                filter_by(orderer_id=user.id, status=2). \
                filter(Order.created_at >= start). \
                filter(Order.created_at <= end). \
                count()
            results["statistic"][user.username][key_year][key_mon] \
                ["status_2"] = status_2

            status_3 = db.query(Order). \
                filter_by(orderer_id=user.id, status=3). \
                filter(Order.created_at >= start). \
                filter(Order.created_at <= end). \
                count()
            results["statistic"][user.username][key_year][key_mon] \
                ["status_3"] = status_3

    return jsonify(results), 200
Exemplo n.º 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)
Exemplo n.º 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()
Exemplo n.º 20
0
def search_interest_region():
    # 1. 대상 유저와 주소를 입력받는다.
    # 2. 권한을 체크한다. (어드민 혹은 본인)
    # 3. 해당 유저가 존재하는지 여부를 검사한다
    # 4. 입력된 어드레스를 단어들로 쪼갠다
    # 5. 입력된 단어들을 모두 가지는 어드레스 행을 가져온다

    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(404)
    #addr_ids = map(lambda x: x.id, addrs)


    #ias = db.query(InterestAddress)
    #ias = ias.filter_by(operator_id=user.id)
    #ias = ias.filter(InterestAddress.address_id.in_(addr_ids))
    #ias = ias.all()
    ias = db.query(InterestAddress).filter_by(operator_id=user.id, address_id=addr.id).all()
    if not ias:
        raise abort(404)

    # ias = db.query(InterestAddress).\
    #		filter_by(operator_id=user.id).\
    #		order_by(InterestAddress.updated_at.desc())

    results["interest_address"] = []
    for ia in ias:
        results["interest_address"].append(ia.serialize())

    return jsonify(results), 200
Exemplo n.º 21
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)
Exemplo n.º 22
0
def statistic_report_of_sub_users():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

    if session_permission > 1:
        return jsonify({"reason_text": "Permission Denied", \
                        "reason_code": 2}), 401
    session_user_id = session["token"]["user"]["id"]

    interval_dict = make_interval(180)

    results["statistic"] = {}
    if session_permission == 0:
        # 마스터는 모든 유저들의 통계량을 본다.
        users = db.query(Operator). \
            filter_by(is_master=False). \
            order_by(Operator.id.asc())
    elif session_permission == 1:
        # 관리자는 자신 아래의 유저들의 통계량을 본다.
        users = db.query(Operator). \
            join(OperatorAdminMatch, \
                 Operator.id == OperatorAdminMatch.operator_id). \
            filter(OperatorAdminMatch.admin_id == session_user_id). \
            order_by(Operator.id.asc()).all()
    else:
        # 뭐냐 이건
        raise abort(500)

    user_ids = []
    for user in users:
        user_ids.append(user.id)

    for key in interval_dict.keys():
        key_year = key[0]
        key_mon = key[1]
        if not results["statistic"].has_key(key_year):
            results["statistic"][key_year] = {}
        if not results["statistic"][key_year].has_key(key_mon):
            results["statistic"][key_year][key_mon] = {}

        start = interval_dict[key][0]
        end = interval_dict[key][1]

        results["statistic"][key_year][key_mon] \
            ["period_start"] = start
        results["statistic"][key_year][key_mon] \
            ["period_end"] = end

        # SELECT STATUS, COUNT(*)
        # FROM `order`
        # WHERE `order`.orderer_id IN(1, 2, 3, 4)
        # AND (`order`.created_at BETWEEN '2015-01-02 11:32:42' AND '2015-08-02 11:32:42')
        # GROUP BY `order`.status

        rows = db.query(Order.status, func.count(Order.status)). \
            filter(Order.orderer_id.in_(user_ids)). \
            filter(Order.created_at.between(start, end)). \
            group_by(Order.status).all()
        # filter(Order.created_at>=start).\
        # filter(Order.created_at<=end).\
        # group_by(Order.status).all()

        for state in range(4):
            results["statistic"][key_year][key_mon] \
                ["status_" + str(state)] = 0

        # print "DEBUG / rows.__len__() : " + str(rows.__len__())

        for row in rows:
            state, count = row
            # print state, count
            results["statistic"][key_year][key_mon] \
                ["status_" + str(state)] = count

    return jsonify(results), 200
Exemplo n.º 23
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)
Exemplo n.º 24
0
def get_point_log(count_from, count_to):
    # {"username":"******", "type":1, "period":{"start":1426558571, "end":1536558571}}
    # username 은 필수
    # type 과 period 는 옵션
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

    if not ((count_from >= 0 and count_to >= 0) and \
                    (count_from <= count_to)):
        raise abort(406)

    arguments = ["username", "type", "reason", "period"]
    data_keys = data.keys()
    if not ("username" in data_keys):
        raise abort(400)

    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

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

    logs = db.query(Point).filter_by(user_id=user.id)
    # data["type"] = 0, 1, 2 ....
    # 0 : 감소
    # 1 : 증가
    if "type" in data_keys:
        logs = logs.filter_by(type=data["type"])

    # 0 : Apply 를 통한 사용
    # 1 : 분배를 통한 커미션 수익
    # 2 : 충전을 통한 포인트 증가
    # 3 : 출금을 통한 포인트 감소
    if "reason" in data_keys:
        logs = logs.filter_by(type=data["reason"])

    # data["period"]["start"] = 1436558571
    # data["period"]["end"] = 1436658571
    if "period" in data_keys:
        for argument in ["start", "end"]:
            if argument not in data["period"].keys():
                raise abort(400)
        start = time.strftime("%Y-%m-%d %H:%M:%S", \
                              time.localtime(data["period"]["start"]))
        end = time.strftime("%Y-%m-%d %H:%M:%S", \
                            time.localtime(data["period"]["end"]))
        logs = logs.filter(Point.updated_at.between(start, end))

    logs = logs.order_by(Point.updated_at.desc()). \
               all()[count_from - 1:count_to - 1]

    results["log"] = []
    for log in logs:
        results["log"].append(log.serialize(exclude=["user"]))

    return jsonify(results), 200
Exemplo n.º 25
0
def statistic_report_of_individual_user_behave_relate_order():
    results = {}

    db = dbo.get_instance()

    session_permission = get_permission()

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

    interval_dict = make_interval(180)

    data = json.loads(request.data)

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

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

    results["statistic"] = {}
    results["statistic"][user.username] = {}
    for key in interval_dict.keys():
        key_year = key[0]
        key_mon = key[1]
        if not results["statistic"][user.username].has_key(key_year):
            results["statistic"][user.username][key_year] = {}
        if not results["statistic"][user.username][key_year].has_key(key_mon):
            results["statistic"][user.username][key_year][key_mon] = {}

        start = interval_dict[key][0]
        end = interval_dict[key][1]

        results["statistic"][user.username][key_year][key_mon] \
            ["period_start"] = start
        results["statistic"][user.username][key_year][key_mon] \
            ["period_end"] = end

        results["statistic"][user.username][key_year][key_mon]["create"] = 0
        results["statistic"][user.username][key_year][key_mon]["apply"] = 0
        results["statistic"][user.username][key_year][key_mon]["cancel"] = 0
        results["statistic"][user.username][key_year][key_mon]["decline"] = 0

        stat = db.query(UserBehaveLog.type, func.count(UserBehaveLog.id)).\
            filter_by(user_id=user.id).\
            filter(UserBehaveLog.created_at >= start).\
            filter(UserBehaveLog.created_at <= end).\
            group_by(UserBehaveLog.type).\
            order_by(UserBehaveLog.type.asc()).\
            all()

        for s in stat:
            if s[0] == 100:
                results["statistic"][user.username][key_year][key_mon]["create"] = s[1]
            elif s[0] == 101:
                results["statistic"][user.username][key_year][key_mon]["apply"] = s[1]
            elif s[0] == 102:
                results["statistic"][user.username][key_year][key_mon]["cancel"] = s[1]
            elif s[0] == 103:
                results["statistic"][user.username][key_year][key_mon]["decline"] = s[1]

    return jsonify(results), 200
Exemplo n.º 26
0
def withdraw_req_list():
    results = {}

    db = dbo.get_instance()

    data = json.loads(request.data)

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

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

    # SELECT request_withdraw.id AS id,
    # operator.id AS user_id,
    # operator.username AS username,
    # point.how_much AS amount,
    # request_withdraw.is_active AS active,
    # operator.bank AS bank_name,
    # operator.banking AS bank_detail,
    # request_withdraw.created_at as created_at,
    # request_withdraw.updated_at as updated_at

    # FROM request_withdraw
    # INNER JOIN operator
    # ON (request_withdraw.user_id = operator.id)
    # INNER JOIN `point`
    # ON (request_withdraw.point_id = `point`.id)

    # WHERE request_withdraw.user_id = 1
    # AND request_withdraw.is_active = 1

    # ORDER BY updated_at DESC

    # 현재처럼 짜면 SELECT 를 세번 부른다.
    # 그러므로 아래와 같이 짜야 한다
    # dbsession.query(RequestWithdraw).filter(조건).\
    # options(subqueryload(RequestWithdraw.point)).\
    # options(subqueryload(RequestWithdraw.operator))

    # reqs = db.query(RequestWithdraw)
    reqs = db.query(RequestWithdraw). \
        filter_by(user_id=session_user_id)
    # reqs = db.query(RequestWithdraw.id, Operator.id, Operator.username, \
    #		Point.how_much, RequestWithdraw.is_active, \
    #		RequestWithdraw.created_at, RequestWithdraw.updated_at).\
    #		filter_by(user_id=session_user_id)

    if data.has_key("is_active"):
        reqs = reqs.filter_by(is_active=data["is_active"])

    reqs = reqs.order_by(RequestWithdraw.created_at.desc()).all()

    results["withdraw"] = []
    for req in reqs:
        # s = {"id":req[0], "user_id":req[1], "username":req[2], \
        # "how_much":req[3], "is_active":req[4], \
        # "created_at":time.mktime(req[5].timetuple()), \
        # "updated_at":time.mktime(req[6].timetuple())}
        # results["withdraw"].append(s)
        results["withdraw"].append(req.serialize())

    return jsonify(results), 200