Example #1
0
def consumer_retrieve_voucher(numbers, merchant_identity):
    """
    用户读取指定商家优惠券,没给出merchant_identity则读取全部
    :param numbers: 平台账号或管理员账号
    :param merchant_identity: 商家ID
    :return:
    """
    try:
        if not merchant_identity:
            return consumer_retrieve_all_voucher(numbers)

        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 80111, "invalid account"

        collection = get_mongo_collection("voucher")
        if not collection:
            g_log.error("get collection voucher failed")
            return 80113, "get collection voucher failed"
        # g_log.debug("%s", datetime.now())
        voucher = collection.find({"numbers": numbers, "merchant_identity": merchant_identity,
                                   "expire_time": {"$gte": datetime.now()}, "used": 0})
        if not voucher:
            g_log.error("consumer %s retrieve %s voucher failed", numbers, merchant_identity)
            return 80114, "consumer retrieve voucher failed"

        g_log.debug("retrieve voucher success")
        return 80100, voucher
    except Exception as e:
        g_log.error("%s", e)
        return 80115, "exception"
Example #2
0
def consumer_retrieve_all_voucher(numbers):
    """
    用户读取优惠券
    :param numbers:
    :return:
    """
    try:
        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 80116, "invalid account"

        collection = get_mongo_collection("voucher")
        if not collection:
            g_log.error("get collection voucher failed")
            return 80117, "get collection voucher failed"
        records = collection.find({"numbers": numbers, "expire_time": {"$gte": datetime.now()},
                                   "used": 0}).sort("merchant_identity")
        if not records:
            g_log.error("retrieve voucher failed")
            return 80118, "retrieve voucher failed"

        return 80100, records
    except Exception as e:
        g_log.error("%s", e)
        return 80119, "exception"
Example #3
0
def consumer_retrieve_with_numbers(numbers):
    """
    读取用户资料
    :param numbers: 用户电话号码
    :return: (20200, consumer)/成功,(>20200, "errmsg")/失败
    """
    try:
        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 20211, "invalid account"

        collection = get_mongo_collection("consumer")
        if not collection:
            g_log.error("get collection consumer failed")
            return 20212, "get collection consumer failed"
        consumer = collection.find_one({"numbers": numbers, "deleted": 0})
        if not consumer:
            g_log.debug("consumer %s not exist", numbers)
            return 20213, "consumer not exist"

        return 20200, consumer
    except Exception as e:
        g_log.error("%s", e)
        return 20214, "exception"
Example #4
0
def merchant_allow_exchange_in(**kwargs):
    """
    商家是否允许积分转入
    :param numbers: 平台账号或管理员账号
    :param merchant_identity: 商家ID
    :return:
    """
    try:
        # 检查要创建者numbers
        numbers = kwargs.get("numbers", "")
        merchant_identity = kwargs.get("merchant_identity")

        # 检查管理员和商家关系
        if not account_is_valid_consumer(numbers):
            g_log.error("invalid account, %s", numbers)
            return 60211, "invalid account"

        if merchant_is_verified(merchant_identity) != "y":
            g_log.debug("merchant %s not verified", merchant_identity)
            return 60213, "not verified"

        code, message = credit_exceed_upper(**{"merchant_identity": merchant_identity, "allow_last": "yes"})

        return 60200, "yes" if bool(message) else "no"
    except Exception as e:
        g_log.error("%s", e)
        return 60212, "exception"
Example #5
0
def confirm_voucher(**kwargs):
    """
    商家确认优惠券
    :param kwargs: {"numbers": 186889882240, "merchant_identity": "", "manager": "18688982240",
                    "voucher_identity": "a1der234", "activity_identity": "iof", "exec_confirm": 1}
    :return:
    """
    try:
        # 检查合法账号
        numbers = kwargs.get("numbers", "")
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 80111, "invalid account"

        manager = kwargs.get("manager", "")
        merchant_identity = kwargs.get("merchant_identity", "")
        merchant = user_is_merchant_manager(manager, merchant_identity)
        if not merchant:
            g_log.error("%s is not merchant %s manager", manager, merchant_identity)
            return 80312, "not manager"

        voucher_identity = kwargs.get("voucher_identity", "")
        activity_identity = kwargs.get("activity_identity", "")
        exec_confirm = kwargs.get("exec_confirm", "")
        collection = get_mongo_collection("voucher")
        if not collection:
            g_log.error("get collection voucher failed")
            return 80314, "get collection voucher failed"
        if not exec_confirm:
            voucher = collection.find_one({"_id": ObjectId(voucher_identity), "merchant_identity": merchant_identity,
                                           "activity_identity": activity_identity, "numbers": numbers})
            if not voucher:
                g_log.error("voucher %s not exist", voucher_identity)
                return 80300, "invalid"

            return 80300, "used" if voucher["used"] == 1 else "valid"

        voucher = collection.find_one_and_update({"merchant_identity": merchant_identity, "numbers": numbers,
                                                  "_id": ObjectId(voucher_identity), "used": 0}, {"$set": {"used": 1}})
        if not voucher:
            g_log.error("voucher %s not exist", voucher_identity)
            return 80315, "confirm voucher failed"

        # 更新记录入库
        collection = get_mongo_collection("voucher_record")
        if not collection:
            g_log.error("get collection voucher record failed")
            return 80316, "get collection voucher record failed"
        result = collection.insert_one({"voucher_identity": voucher_identity, "time": datetime.now(),
                                        "operator": manager})
        if not result:
            g_log.error("insert voucher record failed")

        return 80300, "yes"
    except Exception as e:
        g_log.error("%s", e)
        return 80317, "exception"
Example #6
0
def upload_token_retrieve_debug(kind, numbers, merchant_identity=""):
    """
    debug环境生成上传凭证
    指定客户头像路径c/avatar/numbers, 商家logo路径m/logo/numbers, 商家活动路径ma/poster/numbers
    :param kind: 资源类型
    :param numbers: 账号
    :return: (upload_token, key)
    """
    q = Auth(g_access_key, g_secret_key)

    kind_to_key = {"c_avatar": "c/avatar", "m_logo": "m/logo", "m_qrcode": "m/qrcode", "a_poster": "a/poster"}
    key = "%s/%s/%s" % (kind_to_key.get(kind, "dummy"), numbers, datetime.now().strftime('%b%d%y%H%M%S'))
    policy = {"scope": g_bucket_name_debug + ":" + key, "mimeLimit": "image/*"}
    upload_token = q.upload_token(g_bucket_name_debug, key=key, expires=3600, policy=policy)
    g_log.debug("debug upload token, [key:%s, policy:%s, token:%s]", key, policy, upload_token)

    # 修改资料图片路径
    if kind == "c_avatar":
        # 平台修改客户头像资料
        if not account_is_valid_consumer(numbers):
            g_log.warning("%s invalid consumer account", numbers)
            return 70111, "invalid consumer account"
        # code, message = consumer_update_with_numbers(numbers, avatar=key)
        # if code != 20400:
        #     g_log.warning("update consumer %s avatar %s failed", numbers, key)
        #     return 70112, "update consumer avatar failed"
    elif kind == "m_logo":
        # 平台修改商家logo资料
        if not account_is_valid_merchant(numbers):
            return 70113, "invalid merchant account"
        if not merchant_identity:
            return 70114, "missing merchant identity"
        # code, message = merchant_update_with_numbers(numbers, merchant_identity, logo=key)
        # if code != 30400:
        #     g_log.warning("update merchant logo %s failed", key)
        #     return 70115, "update merchant logo failed"
    elif kind == "m_qrcode":
        if not account_is_valid_merchant(numbers):
            return 70113, "invalid merchant account"
        if not merchant_identity:
            return 70114, "missing merchant identity"
    elif kind == "a_poster":
        # 平台修改活动图片资料
        if not account_is_valid_merchant(numbers):
            return 70116, "invalid merchant account"
        if not merchant_identity:
            return 70117, "missing merchant identity"
    else:
        g_log.debug("unsupported resource kind %s", kind)
        return 70118, "unsupported resource kind"

    return 70100, (upload_token, key)
Example #7
0
def upload_token_retrieve_online(kind, numbers, merchant_identity=""):
    """
    线上环境生成上传凭证
    平台回调完成,生成资源下载key,并存入平台数据库
    回调返回数据结构
    {
        "key": "key",
        "payload": {
            {"success":true,"name":"key"}
        }
    }
    :param kind: 上传的资源类型
    :param numbers: 账号
    :return:
    """
    # 7牛环境初始化
    q = Auth(g_access_key, g_secret_key)

    # 回调url
    kind_to_path = {"c_avatar": "consumer", "m_logo": "merchant", "a_poster": "activity"}
    callback_url = "%s/%s" % (g_qiniu_callback_url, kind_to_path.get(kind, "dummy"))

    # 回调post参数
    kind_to_type = {"c_avatar": "update_avatar", "m_logo": "update_logo", "a_poster": "update_poster"}
    callback_body_type = kind_to_type.get(kind, "dummy")
    callback_body = {"type": callback_body_type, "numbers": numbers, "merchant": merchant_identity, "hash": "$(etags)"}

    policy = {"callbackUrl": callback_url, "callbackBody": callback_body, "callbackBodyType": "application/json",
              "callbackFetchKey": 1, "mimeLimit": "image/*"}

    upload_token = q.upload_token(g_bucket_name, expires=3600, policy=policy)
    g_log.debug("debug upload token, [policy:%s, token:%s]", policy, upload_token)

    # 修改资料图片路径
    if kind == "c_avatar":
        # 平台修改客户头像资料
        if not account_is_valid_consumer(numbers):
            g_log.warning("%s invalid consumer account", numbers)
            return 70117, "invalid consumer account"
    elif kind == "m_logo":
        # 平台修改商家logo资料
        if not account_is_valid_merchant(numbers):
            return 70118, "invalid consumer account"
    elif kind == "a_poster":
        # 平台修改活动图片资料
        if not account_is_valid_merchant(numbers):
            return 70119, "invalid consumer account"
    else:
        g_log.debug("unsupported resource kind %s", kind)
        return 70120, "unsupported resource kind"

    return 70100, upload_token
Example #8
0
def consumer_retrieve_activity_with_numbers(numbers, mark):
    """
    读取活动资料
    :param numbers: 用户电话号码
    :return: (70200, activity)/成功,(>70200, "errmsg")/失败
    """
    try:
        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 70611, "invalid account"

        collection = get_mongo_collection("activity")
        if not collection:
            g_log.error("get collection activity failed")
            return 70613, "get collection activity failed"
	try:
		last_time = datetime.strptime(mark, '%Y-%m-%d %H:%M:%S')
        	g_log.warning("mark %s, last time %s", mark, last_time)
	except:
		last_time = datetime.now()
        	g_log.warning("2 mark %s, last time %s", mark, last_time)
        activity = collection.find({"deleted": 0, "create_time": {"$lt": last_time}, "expire_time": {"$gte": datetime.now()}}, limit=10).sort("create_time", -1)
        if not activity:
            g_log.debug("activity %s not exist", numbers)
            return 70614, "activity not exist"

        collection2 = get_mongo_collection("merchant")
        if not collection2:
            g_log.error("get collection merchant failed")
            return 70615, "get collection merchant failed"

        activity_dict = []
        # type(activity_one) = "dict"
        for activity_one in activity:
            merchant = collection2.find_one({"_id": ObjectId(activity_one["merchant_identity"])})
            activity_one["merchant"] = merchant
            activity_dict.append(activity_one)
        # activity.rewind()

        return 70600, activity_dict
    except Exception as e:
        g_log.error("%s", e)
        return 70617, "exception"
Example #9
0
def consumer_delete_with_numbers(numbers):
    """
    删除用户资料
    :param numbers: 用户电话号码
    :return: (20500, "yes")/成功,(>20500, "errmsg")/失败
    """
    try:
        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 20511, "invalid phone number"

        collection = get_mongo_collection("consumer")
        if not collection:
            g_log.error("get collection consumer failed")
            return 20512, "get collection consumer failed"
        consumer = collection.find_one_and_update({"numbers": numbers, "deleted": 0}, {"$set": {"deleted": 1}})
        if not consumer:
            g_log.error("consumer %s not exist", numbers)
            return 20513, "consumer not exist"
        return 20500, "yes"
    except Exception as e:
        g_log.error("%s", e)
        return 20514, "exception"
Example #10
0
def buy_activity(**kwargs):
    """
    购买活动
    :param kwargs: {"numbers": "18688982240", "activity_identity": "xij923f0a8m", "merchant_identity": "xij923f0a8m",
                    "spend_credit": [{"identity": "a97jiw", "quantity": 100}, ...]}
    :return: (70800, "yes")/成功,(>70800, "errmsg")/失败
    """
    try:
        # 检查要创建的用户numbers
        numbers = kwargs.get("numbers", "")
        if not account_is_valid_consumer(numbers):
            g_log.warning("not manager %s", numbers)
            return 70811, "not manager"

        merchant_identity = kwargs.get("merchant_identity", "")
        activity_identity = kwargs.get("activity_identity", "")
        spend_credit = kwargs.get("spend_credit", [])

        total_quantity = 0
        for credit in spend_credit:
            total_quantity += credit["quantity"]

        # 检查活动是否存在
        collection = get_mongo_collection("activity")
        if not collection:
            g_log.error("get collection activity failed")
            return 70812, "get collection activity failed"
        activity = collection.find_one_and_update({"merchant_identity": merchant_identity, "_id": ObjectId(activity_identity),
                                        "credit": total_quantity, "deleted": 0}, {"$inc": {"volume": 1}})
        if not activity:
            g_log.error("activity %s not exist", activity_identity)
            return 70813, "activity not exist"

        # 扣除用户积分
        flow_credit = 0
        for credit in spend_credit:
            value = {"numbers": numbers, "merchant_identity": merchant_identity,
                     "credit_identity": credit["identity"],
                     "credit": credit["quantity"]}
            g_log.debug("buy activity using credit: %s", value)
            consume_credit(**value)
            flow_credit += credit["quantity"]
        g_log.debug("consume total credit: %d", flow_credit)

        # 更新商家flow参数,用户消费减少已发行量
        code, message = merchant_credit_update(**{"numbers": numbers, "merchant_identity": merchant_identity,
                                                  "mode": "issued", "supplement": -flow_credit})
        if code != 60400:
            g_log.error("update issued credit failed")
            return 70817, "update issued credit failed"

        # 存入优惠券数据库
        collection = get_mongo_collection("voucher")
        if not collection:
            g_log.error("get collection voucher failed")
            return 70814, "get collection voucher failed"
        # TODO... 优惠券唯一识别码,二维码
        value = {"numbers": numbers, "merchant_identity": merchant_identity, "activity_identity": activity_identity,
                 "create_time": datetime.now(), "expire_time": activity["expire_time"],
                 "activity_title": activity["title"], "used": 0}
        g_log.debug("create voucher: %s", value)
        voucher = collection.insert_one(value).inserted_id
        if not voucher:
            g_log.error("create voucher failed")
            return 70815, "create voucher failed"

        return 70800, str(voucher)
    except Exception as e:
        g_log.error("%s", e)
        return 70816, "exception"
Example #11
0
def consumer_update_with_numbers(numbers, **kwargs):
    """
    更新用户资料
    :param numbers: 用户电话号码
    :param kwargs: {"numbers": "18688982240", "nickname": "trace deng", "introduce": "ego cogito ergo sum",
                    "avatar": "", "qrcode": "", "email": "*****@*****.**", "country": "RPC", "location": "magic city",
                    "sexy": "male", "age": 18}
    :return: (20400, "yes")/成功,(>20400, "errmsg")/失败
    """
    try:
        # 检查合法账号
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 20411, "invalid phone number"

        value = {}
        # 昵称不能超过16字节,超过要截取前16字节
        nickname = kwargs.get("nickname")
        if nickname:
            if len(nickname) > 32:
                g_log.warning("too long nickname %s", nickname)
                nickname = nickname[0:16]
            value["nickname"] = nickname

        # 不合理的性别当作未知处理
        sexy = kwargs.get("sexy")
        if sexy:
            value["sexy"] = sexy_string_2_number(sexy)

        age = kwargs.get("age")
        if age:
            if age > 500:
                g_log.warning("too old age %s", age)
                age = 500
            value["age"] = age

        # 个人介绍不能超过512字节,超过要截取前512字节
        introduce = kwargs.get("introduce")
        if introduce:
            if len(introduce) > 512:
                g_log.warning("too long introduce %s", introduce)
                introduce = introduce[0:512]
            value["introduce"] = introduce

        # TODO... 头像、logo、国家、地区检查
        avatar = kwargs.get("avatar")
        if avatar:
            value["avatar"] = avatar
        email = kwargs.get("email")
        if email and email_is_valid(email):
            value["email"] = email
        country = kwargs.get("country")
        if country:
            value["country"] = country
        location = kwargs.get("location")
        if location:
            value["location"] = location
        qrcode = kwargs.get("qrcode")
        if qrcode:
            value["qrcode"] = qrcode

        g_log.debug("update consumer material: %s", value)
        # 存入数据库
        collection = get_mongo_collection("consumer")
        if not collection:
            g_log.error("get collection consumer failed")
            return 20412, "get collection consumer failed"
        consumer = collection.find_one_and_update({"numbers": numbers, "deleted": 0}, {"$set": value})
        if not consumer:
            g_log.error("consumer %s exist", numbers)
            return 20413, "consumer not exist"
        return 20400, "yes"
    except Exception as e:
        g_log.error("%s", e)
        return 20415, "exception"
Example #12
0
def consumer_create(**kwargs):
    """
    增加用户资料
    :param kwargs: {"numbers": "18688982240", "nickname": "trace deng", "introduce": "ego cogito ergo sum",
                    "avatar": "", "qrcode": "", "email": "*****@*****.**", "country": "RPC", "location": "magic city",
                    "sexy": "female", "age": 18}
    :return: (20100, "yes")/成功,(>20100, "errmsg")/失败
    """
    try:
        # 检查要创建的用户numbers
        numbers = kwargs.get("numbers", "")
        if not account_is_valid_consumer(numbers):
            g_log.warning("invalid customer account %s", numbers)
            return 20111, "invalid phone number"

        # 昵称不能超过16字节,超过要截取前16字节
        nickname = kwargs.get("nickname", numbers)
        if len(nickname) > 32:
            g_log.warning("too long nickname %s", nickname)
            nickname = nickname[0:16]

        # 不合理的性别当作未知处理
        sexy = sexy_string_2_number(kwargs.get("sexy", "unknow"))

        age = kwargs.get("age", 0)
        if age > 500:
            g_log.warning("too old age %s", age)
            age = 500

        # 个人介绍不能超过512字节,超过要截取前512字节
        introduce = kwargs.get("introduce", "")
        if len(introduce) > 512:
            g_log.warning("too long introduce %s", introduce)
            introduce = introduce[0:512]

        avatar = kwargs.get("avatar", "")
        email = kwargs.get("email", "")
        if 0 == email_is_valid(email):
            email = ""

        # TODO... logo、国家、地区检查
        country = kwargs.get("country", "")
        location = kwargs.get("location", "")
        qrcode = kwargs.get("qrcode", "")

        value = {"numbers": numbers, "nickname": nickname, "avatar": avatar, "email": email, "introduce": introduce,
                 "sexy": sexy, "age": age, "country": country, "location": location, "qrcode": qrcode, "deleted": 0,
                 "create_time": datetime.now()}

        # 存入数据库
        collection = get_mongo_collection("consumer")
        if not collection:
            g_log.error("get collection consumer failed")
            return 20112, "get collection consumer failed"
        consumer = collection.find_one_and_replace({"numbers": numbers}, value, upsert=True,
                                                   return_document=ReturnDocument.AFTER)
        if not consumer:
            g_log.error("create consumer %s failed", numbers)
            return 20113, "create consumer failed"

        return 20100, "yes"
    except Exception as e:
        g_log.error("%s", e)
        return 20114, "exception"