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 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()
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})
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()
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 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()
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_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)
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)
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()
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)
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})
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)
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)
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({})
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)})
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 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_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]})
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 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)
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)
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)
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 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 })