Esempio n. 1
0
def build_conversation_list(user_id, conversation_id, conversation_info, msg_id, get_new):
    """

    :param user_id:
    :param conversation_id:
    :param conversation_info:
    :param msg_id:
    :param get_new:
    :return:
    """
    my_info = get_user_info_by_user_id_db(user_id)
    receiver_id = conversation_info.user_1_id if conversation_info.user_1_id != user_id else conversation_info.user_2_id
    receiver_info = get_user_info_by_user_id_db(receiver_id)
    query = Q(conversation_id=conversation_id)
    result = {}
    if get_new:
        query &= Q(id__gt=msg_id)
        chat_record = ChatRecord.objects.filter(query).order_by('-created_time')
    else:
        if msg_id:
            query &= Q(id__lt=msg_id)
        chat_record = ChatRecord.objects.filter(query).order_by('-created_time')[0: 21]
        result = {'has_more': len(chat_record) > 20}
        chat_record = chat_record[:20]
    result.update({
        'content_list': [{'content': json.loads(chat.content), 'is_me': user_id == chat.addresser_id,
                          'created_time': datetime_to_str(chat.created_time, FORMAT_DATETIME),
                          'msg_id': chat.id} for chat in chat_record]
    })
    result.update({'my_info': {'user_id': user_id, 'avatar': my_info.avatar},
                   'receiver_info': {'user_id': receiver_id, 'avatar': receiver_info.avatar}})
    return result
Esempio n. 2
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
    })
Esempio n. 3
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
    })
Esempio n. 4
0
def create_footprint_db(user_id, thinking, latitude, longitude, location,
                        image_list, hide, post_type, template_id):
    """
    创建痕迹
    :param user_id:
    :param thinking:
    :param latitude: 纬度
    :param longitude: 经度
    :param location: 地点名
    :param image_list: list
    :param hide: 是否隐藏自己可看
    :param post_type: 类型
    :param template_id: 模板 id
    :return: footprint
    """
    user_info = get_user_info_by_user_id_db(user_id)
    footprint = Footprint.objects.create(user=user_info.user,
                                         name=user_info.nickname,
                                         sex=user_info.sex,
                                         content=thinking,
                                         lat=latitude,
                                         lon=longitude,
                                         location=location,
                                         image_list_str=json.dumps(image_list),
                                         hide=hide,
                                         avatar=user_info.avatar,
                                         post_type=post_type,
                                         template_id=template_id)
    return footprint
Esempio n. 5
0
def create_comment_db(comment_user, footprint_id, comment):

    user_info = get_user_info_by_user_id_db(comment_user.id)

    return Comment.objects.create(flow_id=footprint_id,
                                  flow_type=FlowType.FOOTPRINT,
                                  user_id=comment_user.id,
                                  avatar=user_info.avatar,
                                  name=user_info.nickname,
                                  comment=comment)
Esempio n. 6
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'没有更多的探索啦')
Esempio n. 7
0
def get_homepage_pop_up_view(request):
    """
    获取首次进入的探索模式弹框信息
    URL[GET]: /commercial/get_homepage_pop_up/
    :return: {
        'title': banner.title,
        'description': banner.description,
        'image': banner.image
    } or {}
    """
    return homepage_pop_up_info(get_user_info_by_user_id_db(request.user.id))
Esempio n. 8
0
def build_user_coupon_list_info(user):
    """
    构造用户优惠券信息列表
    """
    coupons = UserCoupon.objects.filter(user=user).order_by('-created_time')

    # 打开优惠券信息列表, 更新缓存信息
    user_info = get_user_info_by_user_id_db(user.id)
    UserNewCouponManager.cancel_new_coupon(user_info.id)

    return [build_user_coupon_info(coupon) for coupon in coupons]
Esempio n. 9
0
def build_footprint_detail(footprint, user):
    """
    展示的痕迹详情,包括
    1、用户头像、用户名、时间、距离自己,是否关注
    2. footprint详情
    3.评论(总数): 各个评论及点赞数
    :param footprint:
    :return: {
        'followed': True or False,
        'user_info': {
            'image', 'show_time', 'latitude', 'longitude', 'place',
        }
        'footprint': {
            'content', image_list, favor_num, reply_num, forward_num, show_time
        }
        'comment_num',
        comment_list: [
            {image, nickname, show_time, distance, favor_num, user_id},
        ]
    }
    """
    user_info = get_user_info_by_user_id_db(footprint.user_id)
    user_info_data = {
        'avatar': user_info.avatar,
        'nickname': user_info.nickname,
        'user_id': footprint.user_id
    }
    foot_print_data = {
        'location': footprint.location,
        'content': footprint.content,
        'image_list': footprint.image_list,
        'favor_num': footprint.favor_num,
        'reply_num': footprint.comment_num,
        'forward_num': footprint.forward_num,
        'show_time': get_time_show(footprint.created_time),
        'favored': is_user_favored(user.id, footprint.id, FlowType.FOOTPRINT),
    }
    comment_list = get_footprint_comment_list(footprint.id, 0, 20)
    comment_data = {
        'comments': [build_comment(comment) for comment in comment_list]
    }
    result = user_info_data
    result.update(foot_print_data)
    result.update(comment_data)

    if footprint.post_type == 'help':
        from api.manager.view_manager import build_coupon_template_info
        result.update({
            'coupon_template':
            build_coupon_template_info(user, footprint.template_id)
        })

    return result
Esempio n. 10
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})
Esempio n. 11
0
def get_explore_surplus_times_view(request):
    """
    获取用户探索模式剩余的次数
    URL[GET]: /commercial/get_explore_surplus_times/
    :return int
    """
    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)

    surplus_times = ExploreSurplusTimesManager.get_explore_day_limit() \
        - ExploreSurplusTimesManager.get_times(current_date, user_info.id)

    return json_http_success(
        {"surplus_times": surplus_times if surplus_times >= 0 else 0})
Esempio n. 12
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)
Esempio n. 13
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)
Esempio n. 14
0
    def add_message(cls, to_user_id, from_user_id, conversation_id, content):
        """
        包括添加自己的消息和另外那个人的消息
        message信息包括: {conversation_id, avatar, content, created_time, has_badge}
        :param from_user_id:
        :param to_user_id:
        :param conversation_id:
        :param content:
        :return:
        """
        user_info = get_user_info_by_user_id_db(to_user_id)
        message = {
            'conversation_id': conversation_id, 'avatar': user_info.avatar, 'last_message': content, 'has_new': 1,
            'time': datetime_to_str(datetime.datetime.now(), FORMAT_DATETIME), 'username': user_info.nickname
        }
        redis.hset_pickle(cls.build_redis_key(to_user_id), conversation_id, message)

        # 更新信息
        message['has_new'] = 0
        redis.hset_pickle(cls.build_redis_key(from_user_id), conversation_id, message)
Esempio n. 15
0
def get_my_profile_view(request):
    """
    获取我的资料
    URL[GET]: /user_info/my_profile/
    :param request:
    :return:
    """
    user_info = get_user_info_by_user_id_db(request.user.id)
    result = {
        'avatar': user_info.avatar or '',
        'nickname': user_info.nickname or '',
        'birthday': datetime_to_str(user_info.birthday) if user_info.birthday else '',
        'location': user_info.location or '',
        'sex': user_info.sex,
        'wechat_no': user_info.wechat_no,
        'show_wechat_no': user_info.show_wechat_no,
        'signature': user_info.signature,
        'user_id': request.user.id,
    }
    return json_http_success(result)
Esempio n. 16
0
def acquire_new_coupon(user,
                       template,
                       acquire_way=CouponAcquireWay.DRAW,
                       donate_user_id=0,
                       coupon_code=None):
    """
    获取新的优惠券
    """
    coupon = UserCoupon.objects.create(
        user=user,
        template=template,
        acquire_way=acquire_way,
        donate_user_id=donate_user_id,
        coupon_code=coupon_code if coupon_code else random_numerical(),
        is_used=False)

    # 获取了新的优惠券之后, 更新缓存信息
    user_info = get_user_info_by_user_id_db(user.id)
    UserNewCouponManager.set_new_coupon(user_info.id)

    return coupon.id
Esempio n. 17
0
def build_user_coupon_info_for_charge_off(club_id, coupon_code):
    """
    构造用户优惠券信息 --> 核销展示使用
    """
    club = get_club_by_id_db(club_id)
    if not club:
        return None

    coupon = get_user_coupon_by_coupon_code(coupon_code)
    if not coupon:
        return None

    user_info = get_user_info_by_user_id_db(coupon.user.id)
    coupon_money = 0 if coupon.template.template_type == CouponTemplateChoices.GENERAL else coupon.template.money

    return {
        'club_info': {
            'avatar': "https://zongz.cn" + club.avatar.url,
            'name': club.name,
            'address': club.address,
            'telephone': club.telephone,
            'club_id': club.id,
        },
        'coupon_info': {
            'coupon_id': coupon.id,
            'coupon_money': coupon_money,
            'coupon_type': coupon.template.template_type,
            'coupon_name': coupon.template.name,
            'coupon_deadline': datetime_to_str(coupon.template.deadline)
        },
        'user_info': {
            'avatar':
            user_info.avatar,
            'nickname':
            user_info.nickname,
            'consume_count':
            CouponChargeOffRecord.objects.filter(
                user_id=coupon.user.id).count()
        }
    }
Esempio n. 18
0
def help_post_pop_up_view(request):
    """
    用户首次进入帮助贴的弹窗
    /footprint/user_help_post_pop_up/
    """
    user_info = get_user_info_by_user_id_db(request.user.id)
    user_info_extra = json.loads(user_info.extra_info)

    if 'first_time_help_post' not in user_info_extra:
        user_info_extra['first_time_help_post'] = True
        user_info.extra_info = json.dumps(user_info_extra)
        user_info.save()
        return json_http_success({
            "title":
            u'【掘地求胜】求助帖说明',
            "image":
            u'',
            "description":
            u'欢迎来到【掘地求胜】活动,在这里,如何您有中意的商家,'
            u'您可以向周围的小哥哥/小姐姐发送求助,索要商家优惠券。\n您只要选择商家后,点击发布TA就能看到啦~'
        })

    return json_http_success({})
Esempio n. 19
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({})
Esempio n. 20
0
def build_club_consume_infos(charge_off_records):
    """
    构造商户消耗优惠券的信息
    """
    money = 0
    consume_infos = []

    for record in charge_off_records:
        coupon = get_user_coupon_by_id(record.coupon_id)
        coupon_money = 0 if coupon.template.template_type == CouponTemplateChoices.GENERAL \
            else coupon.template.money
        consume_infos.append({
            'nickname':
            get_user_info_by_user_id_db(coupon.user_id).nickname,
            'coupon_money':
            coupon_money,
            'confirm_user':
            record.club_user.user_info.nickname,
            'confirm_time':
            datetime_to_str(record.created_time, '%m-%d %H:%M')
        })
        money += coupon_money

    return money, consume_infos