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
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 })
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 })
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
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)
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'没有更多的探索啦')
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))
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]
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
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})
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})
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)
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)
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)
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)
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
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() } }
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({})
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({})
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