Example #1
0
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
Example #2
0
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