Exemple #1
0
def club_user_login_view(request):
    """
    商家用户登录
    由于不需要商户的 "其他信息", 所以, 前端值传递 code 也是可以的
    URL[POST]: /weixin/club/login/
    """
    post_data = get_data_from_request(request)
    account = post_data['account']
    password = post_data['password']
    code = post_data.get('code')

    if code:
        user, session_key = WxminiAuthManager.sync_wx_mini_user_info_for_club(
            code)
    # 使用form表单携带账户和密码进行登录
    else:
        return json_http_error('缺少参数')

    # 如果之前这个用户登录过踪踪用户端, 那么, 这个 UserInfo 表对象也是有的
    user_info = get_user_info_by_user_id_db(user.id)
    user_extra_info = json.loads(user_info.extra_info)
    user_extra_info.update({'is_club': 1})
    user_info.extra_info = json.dumps(user_extra_info)
    user_info.save()

    club_user_info = club_user_login(account, password, user_info)

    if not club_user_info:
        return json_http_error(u'用户名或密码错误')

    wx_mini_request_login(request, user, session_key)
    return json_http_success({
        'club_id': club_user_info.club.id,
        "sessionid": request.session.session_key
    })
Exemple #2
0
def post_footprint_view(request):
    """
    发布踪踪动态
    URL[POST]: /footprint/create/
    :param request:
    :return:
    """
    post_data = get_data_from_request(request)
    latitude = post_data.get('lat')
    longitude = post_data.get('lon')
    location = post_data.get('location')
    content = post_data['content']
    if content and not is_content_valid(content):
        return json_http_error('请注意用词')
    image_list = post_data['image_list']
    if isinstance(image_list, str):
        image_list = json.loads(image_list)
    for image in image_list:
        logging.info('{}{}'.format(image, type(image)))
        if not is_image_valid(image):
            return json_http_error('请文明发言')
    hide = bool(int(post_data.get('hide', 0)))
    footprint = create_footprint_db(request.user, content, latitude, longitude,
                                    location, image_list, hide)
    if latitude and longitude:
        add_user_location(footprint.id, longitude, latitude)
    return json_http_success()
Exemple #3
0
def login_and_get_session_id_view(request):
    """
    使用小程序的登录然后返回session_id,目前支持两种登录方式:
    1、使用微信的code后台服务器验证方式
    2、使用春雨的用户名和账户验证
    URL[POST]: /weixin/get_session_id/
    :param request: {code, encryptedData, iv}
    """
    # 使用code方式进行登录
    post_data = get_data_from_request(request)
    code = post_data.get('code')
    encrypted_data = post_data.get('encryptedData')
    iv = post_data.get('iv')
    if code:
        user, session_key = WxminiAuthManager.sync_wx_mini_user_info(
            code, encrypted_data, iv)

    # 使用form表单携带账户和密码进行登录
    else:
        return json_http_error('缺少参数')

    # 用户登录返回session信息
    if not user:
        return json_http_error('invalid user')
    wx_mini_request_login(request, user, session_key)
    return json_http_success({"sessionid": request.session.session_key})
Exemple #4
0
def post_content_view(request):
    """
    发送信息
    URL[POST]: /chat/post_content/
    :param request: conversation_id, content_type, content
    """
    data = get_data_from_request(request)
    receiver_id = int(data.get('receiver_id'))
    conversation_id = data.get('conversation_id')
    if not receiver_id and not conversation_id:
        return json_http_error('参数错误')
    conversation_id = conversation_id or get_conversation_id_by_user_ids(
        [receiver_id, request.user.id])
    content = data['content_json']
    if content['type'] == 'image':
        if not is_image_valid(content['url']):
            return json_http_error('请文明发言!')
    elif content['type'] == 'text':
        if not is_content_valid(content['text']):
            return json_http_error('请文明发言!')
    content_str = json.dumps(content)
    chat_record = create_chat_record_db(conversation_id, content_str,
                                        request.user.id)
    # 发推送、更新badge、
    ConversationMessageManager.add_message(receiver_id, request.user.id,
                                           conversation_id, content)
    return json_http_success()
Exemple #5
0
def club_user_get_session_id_view(request):
    """
    商家用户使用 code 去换取 sessionid
    URL[POST]: /weixin/club/get_session_id/
    """
    post_data = get_data_from_request(request)
    code = post_data.get('code')

    if code:
        user, session_key = WxminiAuthManager.sync_wx_mini_user_info_for_club(
            code)
    else:
        return json_http_error('缺少参数')

    user_info = get_user_info_by_user_id_db(user.id)
    club_user_info = get_club_user_info_by_user_info(user_info)
    wx_mini_request_login(request, user, session_key)

    if not club_user_info.exists():
        return json_http_success({"sessionid": request.session.session_key})

    if club_user_info.count() > 1:
        return json_http_error(u'多用户商户错误')

    return json_http_success({
        'club_id': club_user_info[0].club.id,
        "sessionid": request.session.session_key
    })
Exemple #6
0
def set_my_profile_view(request):
    """
    设置我的资料接口
    URL[POST]: /user_info/my_profile/edit/
    :param request: sex, avatar, location, nickname, birthday, signature, wechat_no, show_wechat_no
    :return:
    """
    post_data = get_data_from_request(request)

    sex = post_data.get('sex')
    avatar = post_data.get('avatar')
    location = post_data.get('location')
    nickname = post_data.get('nickname')
    if nickname and not is_content_valid(nickname):
        return json_http_error(u'nickname 不合法')
    if avatar and not is_image_valid(avatar):
        return json_http_error(u'avatar 不合法')
    birthday = post_data.get('birthday')
    wechat_no = post_data.get('wechat_no')
    show_wechat_no = post_data.get('show_wechat_no')
    if show_wechat_no is not None:
        show_wechat_no = bool(int(show_wechat_no))
    signature = post_data.get('signature')
    if birthday:
        birthday = str_to_datetime(birthday)
    user_info = update_my_profile_db(request.user, sex, avatar, location,
                                     nickname, wechat_no, show_wechat_no,
                                     signature, birthday)
    return json_http_success() if user_info else json_http_error()
Exemple #7
0
def get_next_explore_post_view(request):
    """
    获取信息流的下一个:
    1. 信息流包含: 普通信息(足迹, 求助帖) + 优惠券信息
    2. [3, 9, 20, 30] 这四个位置是优惠券, 如果没有足够的普通信息, 都填充优惠券就可以了
    3. 0~10km、10~30km、30~100km、100km 及以上

    GET: /footprint/next_explore_post/

    一共有四种返回类型: text, image_text, coupon_template, help
    """
    lon = float(request.GET.get('lon', 0))
    lat = float(request.GET.get('lat', 0))

    user_info = get_user_info_by_user_id_db(request.user.id)
    current_date = datetime_to_str(datetime.datetime.now(),
                                   date_format=FORMAT_DATE_WITHOUT_SEPARATOR)
    next_explore_times = int(
        ExploreSurplusTimesManager.get_times(current_date, user_info.id)) + 1

    if next_explore_times > ExploreSurplusTimesManager.EXPLORE_DAY_LIMIT:
        return json_http_error(u'今天的次数已经用完了')

    # 增加一次探索次数
    ExploreSurplusTimesManager.add_times(current_date, user_info.id)

    # 随机返回一张优惠券, 但是, 注意位置 (获取不到优惠券, 返回用户足迹吧)
    if next_explore_times in [3, 9, 20, 30]:
        coupon_template = get_next_explore_template(next_explore_times)
        if coupon_template:
            # 返回的信息里面带有 type, 前端识别不同的 type 去展示
            return json_http_success(
                build_coupon_template_info(coupon_template))
        else:
            footprint = get_next_explore_footprint(next_explore_times, lon,
                                                   lat, request.user)
            if footprint:
                return json_http_success(
                    build_footprint_info_for_explore(request.user, footprint))
            return json_http_error(u'没有更多的探索啦')
    else:
        # 如果不是优惠券的位置, 返回足迹
        footprint = get_next_explore_footprint(next_explore_times, lon, lat,
                                               request.user)
        if footprint:
            return json_http_success(
                build_footprint_info_for_explore(request.user, footprint))
        # 如果获取不到足迹, 再尝试返回优惠券
        coupon_template = get_next_explore_template(next_explore_times,
                                                    ignore_index=True)
        if coupon_template:
            return json_http_success(
                build_coupon_template_info(coupon_template))
        # 如果优惠券也获取不到
        return json_http_error(u'没有更多的探索啦')
Exemple #8
0
def get_club_info_view(request):
    """
    获取俱乐部信息
    URL[GET]: /commercial/get_club_info/
    :param request:
    :return: {
        club_info: {
            id, name, avatar, address,
        }
        activities_info: [
            {
                activity_id, distance, title, created_time, activity_time, images_list,
                total_quota, participants: [
                    {
                        user_id, avatar
                    },
                ]
            },

        ]

    }
    """
    club_id = int(request.GET['club_id'])
    club = get_club_by_id_db(club_id)
    if not club:
        return json_http_error('id错误')
    club_info = build_club_info(club)
    return json_http_success(club_info)
Exemple #9
0
def activity_detail_view(request):
    """
    获取活动详细信息
    URL[GET]: /commercial/get_activity_detail/
    :return: {
        top_image,
        title,
        club_name,
        avatar,
        telephone,
        introduction,
        image_list,
        detail,
        address,
        time_detail,
        description,
        total_quota,
        participants: [{user_id, avatar}]
    }
    """
    activity_id = request.GET['activity_id']
    activity = get_commercial_activity_by_id_db(activity_id)
    if not activity:
        return json_http_error('id错误')
    result = build_activity_detail(activity, request.user.id)
    return json_http_success(result)
Exemple #10
0
def comment_footprint_view(request):
    """
    URL[POST]: /footprint/comment/
    评论footprint,目前只能评论主贴
    :param request:
    :return:
    """
    post_data = get_data_from_request(request)
    footprint_id = post_data['footprint_id']
    comment = post_data['comment']
    if not is_content_valid(comment):
        return json_http_error('请注意用词')
    success = create_comment_db(request.user, footprint_id, comment)
    if success:
        comment_num = update_comment_num_db(footprint_id)
        return json_http_success({'comment_num': comment_num})
    return json_http_error()
Exemple #11
0
def club_consume_user_coupon_info_view(request):
    """
    商户消耗用户优惠券详情
    URL[GET]: /commercial/consume_user_coupon_info/
    """
    club_id = int(request.GET['club_id'])
    consume_result = build_club_consume_user_coupon_info(club_id)
    if not consume_result:
        return json_http_error(u'找不到商家信息')
    return json_http_success(consume_result)
Exemple #12
0
def post_footprint_view(request):
    """
    发布踪踪动态
    求助帖的发布与 V1 的帖子不同之处只有一点: 需要传递商家 id
    URL[POST]: /footprint/create/
    :param request:
    :return:
    """
    post_data = get_data_from_request(request)
    latitude = post_data.get('lat')
    longitude = post_data.get('lon')
    location = post_data.get('location')
    content = post_data['content']
    if content and not is_content_valid(content):
        return json_http_error('请注意用词')
    image_list = post_data['image_list']
    if isinstance(image_list, str):
        image_list = json.loads(image_list)
    for image in image_list:
        logging.info('{}{}'.format(image, type(image)))
        if not is_image_valid(image):
            return json_http_error('请文明发言')
    hide = bool(int(post_data.get('hide', 0)))

    # @zhanghu 在这里校验下是不是帮助贴
    club = get_club_by_id_db(int(post_data.get('club_id', 0)))
    if not club:
        footprint = create_footprint_db(request.user, content, latitude,
                                        longitude, location, image_list, hide,
                                        PostType.NOTE, 0)
    else:
        # 找到金额最大的优惠券模板, 或者是一个普适券(注意, 如果找不到优惠券, 仍然降级为 NOTE 类型的足迹)
        target_template_id = get_template_id_by_club(club)
        post_type = PostType.HELP if target_template_id > 0 else PostType.NOTE
        footprint = create_footprint_db(request.user, content, latitude,
                                        longitude, location, image_list, hide,
                                        post_type, target_template_id)

    if latitude and longitude:
        add_user_location(footprint.id, longitude, latitude)
    return json_http_success({'footprint_id': footprint.id})
Exemple #13
0
def get_user_coupon_info_for_charge_off_view(request):
    """
    展示用户优惠券的信息 --> 用来核销的商户查看, 所以, 只会传递 coupon_code
    URL[GET]: /commercial/user_coupon_info_for_charge_off/
    """
    club_id = int(request.GET['club_id'])
    coupon_code = request.GET['coupon_code']

    coupon_info = build_user_coupon_info_for_charge_off(club_id, coupon_code)
    if not coupon_info:
        return json_http_error(u'优惠券码错误')
    return json_http_success(coupon_info)
Exemple #14
0
def club_activity_confirm_info_view(request):
    """
    商户活动预约确认/未确认信息详情
    URL[GET]: /commercial/activity_confirm_info/
    """
    club_id = int(request.GET['club_id'])
    is_confirm = bool(int(request.GET['is_confirm']))  # 0-未确认; 1-已确认

    confirm_info = build_club_activity_confirm_info(club_id, is_confirm)
    if not confirm_info:
        return json_http_error(u'找不到商家信息')
    return json_http_success(confirm_info)
Exemple #15
0
def club_confirm_activity_participant_view(request):
    """
    商户确认用户的活动预约
    URL[POST]: /commercial/confirm_activity_participant/
    """
    post_data = get_data_from_request(request)
    activity_participant_id = post_data['activity_participant_id']

    confirm_info = club_confirm_activity_participant(activity_participant_id)
    if confirm_info:
        return json_http_error(confirm_info)
    return json_http_success({})
Exemple #16
0
def get_user_brief_profile_view(request):
    """
    获取用户小窗口简介
    1.用户个人资料
    2.用户最新一条票圈
    URL[GET]: /user_info/get_user_info/
    :param request: user_id
    """
    user_id = request.GET['user_id']
    if not user_id:
        return json_http_error('')
    return json_http_success({'user_info': get_user_brief_profile(user_id)})
Exemple #17
0
def club_charge_off_user_coupon_view(request):
    """
    商家核销用户优惠券
    URL[POST]: /commercial/club_charge_off/
    """
    post_data = get_data_from_request(request)
    coupon_code = post_data['coupon_code']
    club_id = post_data['club_id']

    user_info = get_user_info_by_user_id_db(request.user.id)

    charge_off_result = charge_off_user_coupon(coupon_code, club_id, user_info)
    if not charge_off_result:
        return json_http_success({'club_id': club_id})
    return json_http_error(charge_off_result)
Exemple #18
0
def club_user_login_view(request):
    """
    商家用户登录
    URL[POST]: /commercial/user_login/
    """
    post_data = get_data_from_request(request)
    account = post_data['account']
    password = post_data['password']

    user_info = get_user_info_by_user_id_db(request.user.id)

    club_user_info = club_user_login(account, password, user_info)
    if not club_user_info:
        return json_http_error(u'用户名或密码错误')
    return json_http_success({'club_id': club_user_info.club.id})
Exemple #19
0
def get_nearest_activity_view(request):
    """
    获取最近的活动的地址,100km以内吧
    :param request:
    :return: {'lat', 'lon'}
    """
    lat = float(request.GET.get('lat', 0))
    lon = float(request.GET.get('lon', 0))
    if not (lat and lon):
        return json_http_error('参数错误')
    members = activity_location_container.get_members_within_radius(
        lon, lat, 100, GeoUnitEnum.KM, sort=GeoSortEnum.ASC)
    if not members:
        return json_http_success()
    location = activity_location_container.get_position(members[0])[0]
    return json_http_success({'lat': location[1], 'lon': location[0]})
Exemple #20
0
def participate_activity_view(request):
    """
    用户报名活动
    URL[GET]: /commercial/subscribe_activity/
    """
    user = request.user
    post_data = get_data_from_request(request)
    activity_id = post_data['activity_id']
    name = post_data['name']
    cellphone = post_data['cellphone']
    num = int(post_data['num'])
    hint = post_data['hint']
    user_info = get_user_info_by_user_id_db(user.id)
    error_msg = participate_activity(activity_id, user_info.id, name,
                                     cellphone, num, hint)
    return json_http_success() if not error_msg else json_http_error(error_msg)
Exemple #21
0
def get_nearby_activities_view(request):
    """
    URL[GET]: https://zongz.cn//api/get_nearby_activities/?lat=28.67307&lon=121.44297
    :return: {
        user_locations: [
            {user_id, name, avatar, time, lat, lon}
        ]
        activities: [
            {activity_id, name, avatar, description, quota}
        ]
    }
    """
    lon = request.GET.get('lon')
    lat = request.GET.get('lat')
    radius = request.GET.get('radius', 7)
    if not lon or not lat:
        return json_http_error('必须传经纬度')
    result = get_nearby_activity(float(lon), float(lat), float(radius))
    return json_http_success(result)
Exemple #22
0
def get_conversation_detail_view(request):
    """
    获取聊天详情
    :param request:
    :return:
    """
    conversation_id = request.GET.get('conversation_id')
    receiver_id = request.GET.get('receiver_id')
    msg_id = int(request.GET.get('msg_id', 0))
    get_new = int(request.GET.get('get_new', 0))
    if conversation_id:
        conversation_info = get_conversation_info_by_conversation_id(conversation_id)
    elif receiver_id:
        conversation_id = get_conversation_id_by_user_ids([int(receiver_id), request.user.id])
        # 创建一个会话 id 记录, 对于用户 id 的存储, 第一个id < 第二个 id
        conversation_info, _ = get_or_create_conversation_info(conversation_id, request.user.id, int(receiver_id))
    else:
        return json_http_error('参数错误')
    result = build_conversation_list(request.user.id, conversation_id, conversation_info, msg_id, get_new)
    # 清除 badge
    ConversationMessageManager.clear_badge(request.user.id, conversation_id)
    return json_http_success(result)
Exemple #23
0
def get_conversation_detail_view(request):
    """
    获取聊天详情
    :param request:
    :return:
    """
    conversation_id = request.GET.get('conversation_id')
    receiver_id = request.GET.get('receiver_id')
    msg_id = int(request.GET.get('msg_id', 0))
    get_new = int(request.GET.get('get_new', 0))
    if conversation_id:
        conversation_info = get_conversation_info_by_conversation_id(
            conversation_id)
    elif receiver_id:
        conversation_id = get_conversation_id_by_user_ids(
            [int(receiver_id), request.user.id])
        conversation_info, _ = get_or_create_conversation_info(
            conversation_id, request.user.id, int(receiver_id))
    else:
        return json_http_error('参数错误')
    result = build_conversation_list(request.user.id, conversation_id,
                                     conversation_info, msg_id, get_new)
    return json_http_success(result)
Exemple #24
0
def donate_coupon_to_others_view(request):
    """
    用户把自己的优惠券转赠给其他人
    POST: /footprint/donate_coupon/
    """
    user = request.user
    post_data = get_data_from_request(request)
    # 转赠的目标用户
    target_user = get_user_info_by_user_id_db(post_data['user_id']).user

    template = get_coupon_template_by_id_db(post_data['template_id'])
    if get_user_coupon_count(user, template) <= 0:
        return json_http_error(u'您当前没有该商家优惠券~优惠券在信息流中获取哦~')

    user_coupon = get_user_coupon_by_template(user, template)[0]
    acquire_new_coupon(target_user,
                       template,
                       acquire_way=CouponAcquireWay.DONATE,
                       donate_user_id=user.id,
                       coupon_code=user_coupon.coupon_code)
    delete_user_coupon_by_id(user_coupon.id)

    return json_http_success({})
Exemple #25
0
def get_club_activities_info(request):
    """
    URL[GET]: /commercial/get_club_activity_info/
    :param request:
    :return:
    """
    club_id = int(request.GET['club_id'])
    page = int(request.GET.get('page', 1))
    lat = float(request.GET.get('lat', 0))
    lon = float(request.GET.get('lon', 0))
    start, end = get_page_range(page, 5)
    club = get_club_by_id_db(club_id)
    if not club:
        return json_http_error('错误')
    activities = get_commercial_activities_by_club_id_db(club_id, start, end)

    return json_http_success({
        'activity_list': [
            build_activity_brief_info(activity, request.user.id, lon, lat)
            for activity in activities
        ],
        'avatar':
        "https://zongz.cn" + club.avatar.url
    })