def get_and_update_fed_marker(cur_user_id, offset): if cur_user_id: user_scroll = UserScroll.query.filter( UserScroll.user == cur_user_id).first() if not user_scroll: user_scroll = UserScroll(cur_user_id) db.session.add(user_scroll) db.session.commit() print 'user_scroll data created' else: print 'user_scroll data found' post = Post.query.filter(Post.id == UserScroll.fed_upto).first() if post: fed_upto_time = post.timestamp else: fed_upto_time = None if offset == 0: if check_time_threshold_crossed(user_scroll.last_fed, config.HOME_FEED_UPDATE_HOURS): if check_time_threshold_crossed(user_scroll.last_fed, config.HOME_FEED_UPDATE_LIMIT_REFRESH_HOURS): user_scroll.feed_update_count = 0 print 'feed update count reset' if user_scroll.feed_update_count < config.HOME_FEED_UPDATE_LIMIT: marker, fed_upto_time = get_updated_feed_marker( cur_user_id, fed_upto_time ) if marker == None: print 'marker not updated. no rows found.' else: user_scroll.fed_upto = marker user_scroll.feed_update_count += 1 print 'feed update count : ', user_scroll.feed_update_count user_scroll.last_fed = datetime.datetime.now() db.session.commit() return fed_upto_time, user_scroll.fed_upto else: return None, None
def get_discover_list(current_user_id, offset, limit=10, day_count=0, add_super=False, exclude_users=[]): # include dirty items print 'current user is : ',current_user_id if not day_count: day_count = 0 day_count = get_day_count(current_user_id) super_inclusion = [False, True, None] count_of_dirty_sent = 0 dirty_items = [] max_id = 0 user_scroll = None if day_count < 10: super_inclusion.remove(True) dirty_items = get_dirty_items(offset, limit, day_count) dirty_items = make_resp_multitype(current_user_id, dirty_items, order_key='dirty_index', reverse_sort=False) count_of_dirty_sent = get_count_of_dirty_items_sent(offset, day_count) # recycle discover feeds recycled_items = [] recycled_upto = 0 has_threshold_crossed = False have_items_added = False if offset == 0 and current_user_id: user_scroll = UserScroll.query.filter( UserScroll.user == current_user_id).first() if user_scroll: print 'user scroll data found' max_id = user_scroll.scrolled_upto print 'max_id : ', max_id recycled_upto = user_scroll.recycled_upto has_threshold_crossed = check_user_last_visit_threshold_cross(user_scroll.last_visit) print 'thre:', has_threshold_crossed have_items_added = check_added_discover_item(user_scroll.last_visit, max_id) if not have_items_added: if has_threshold_crossed: if check_recycle_upper_limit_reached(user_scroll.last_recycled_upto, limit-len(dirty_items)): user_scroll.last_recycled_upto = 0 user_scroll.recycled_upto = 0 else: user_scroll.last_recycled_upto = \ user_scroll.recycled_upto recycled_items, recycled_upto = \ get_recycled_items(user_scroll.last_recycled_upto, super_inclusion) if len(recycled_items)>0: recycled_items = make_resp_multitype(current_user_id, recycled_items, order_key='recycled_index', reverse_sort=True) user_scroll.recycled_upto = recycled_upto if has_threshold_crossed: print 'changed last visit' user_scroll.last_visit = datetime.datetime.now() db.session.commit() else: user_scroll = UserScroll(current_user_id) db.session.add(user_scroll) db.session.commit() # fetch normal discover feeds items = db.session.execute( text("""SELECT discover_list.post, discover_list.question, discover_list.user, discover_list.id FROM discover_list WHERE discover_list.removed=false AND discover_list.display_on_day<=:day_count AND discover_list.is_super IN :super_inclusion AND discover_list.display_date <= now() ORDER BY discover_list.display_date DESC, discover_list.id DESC LIMIT :offset, :limit """), params={'super_inclusion':super_inclusion, 'day_count':day_count, 'offset':offset-count_of_dirty_sent, 'limit':limit-len(dirty_items)-len(recycled_items)} ) resp = {} for item in items: max_id = max(item[3], max_id) if item[0]: resp.update({item[0]: {'type':'post', 'show_order':item[3]}}) if item[1]: resp.update({item[1]: {'type':'question', 'show_order':item[3]}}) if item[2]: resp.update({item[2]: {'type':'user', 'show_order':item[3]}}) if user_scroll: user_scroll.scrolled_upto = max_id db.session.commit() all_other_items = make_resp_multitype(current_user_id, resp, order_key='show_order', reverse_sort=True) # merge dirty items [all_other_items.insert(dirty_item['dirty_index'], dirty_item ) for dirty_item in dirty_items] print 'dirty added :',len(dirty_items) print 'count : ', len(all_other_items) # prepend recycled items [all_other_items.insert(0, recycled_item) for recycled_item in recycled_items] print 'recycled :', len(recycled_items) print 'count : ', len(all_other_items) print day_count return all_other_items