コード例 #1
0
def details():
    pagelimit = current_user.ngs_per_page
    page = request.args.get('page', 1, type=int)
    table = request.args.get('table', '', str)
    id = request.args.get('id')
    target = models_table_name_dictionary.get(table, None)
    if table == 'analysis':
        return redirect(url_for('ngs.analysis', id=id))
    if not target: abort(404)
    try:
        if table == 'sequence_round':
            id = id[1:-1].split(',')
            id = tuple(int(i) for i in id)
        else:
            id = int(id)
    except:
        abort(404)

    entry = target.query.get(id)
    if not entry: abort(404)

    if table == 'selection':
        query_result = Rounds.query.filter_by(selection_id=id).order_by(
            Rounds.id.desc()).paginate(page, pagelimit, False)

    elif table == 'round':
        query_result = SeqRound.query.filter_by(rounds_id=id).order_by(
            SeqRound.count.desc()).paginate(page, pagelimit, False)

    if table in ['selection', 'round']:
        next_url = url_for(
            'ngs.details',
            table=table,
            id=id,
            page=query_result.next_num,
        ) if query_result.has_next else None
        prev_url = url_for(
            'ngs.details',
            table=table,
            id=id,
            page=query_result.prev_num,
        ) if query_result.has_prev else None
        totalpages = query_result.total
        start, end = pagination_gaps(page, totalpages, pagelimit)
        page_url = [(i, url_for('ngs.details', table=table, page=i, id=id))
                    for i in range(start, end + 1)]
        return render_template('ngs/details.html',
                               title=f'{entry.name}-Details',
                               entry=entry,
                               table=table,
                               query_result=query_result,
                               next_url=next_url,
                               prev_url=prev_url,
                               active=page,
                               page_url=page_url)

    return render_template('ngs/details.html',
                           title=f'{entry.name}-Details',
                           entry=entry,
                           table=table)
コード例 #2
0
def user_follow_slides():
    ppt_id = request.args.get('id', 0)
    pagelimit = current_user.slide_per_page
    thumbnail = current_user.thumbnail
    page = request.args.get('page', 1, type=int)
    if ppt_id:
        slides_id = current_user.follow_ppt_update().get(str(ppt_id), [])
        if not slides_id:
            return redirect(url_for('ppt.index', table='slide', id=ppt_id))
    else:
        slides_id = [
            i for k in current_user.follow_ppt_update().values() for i in k
        ]
    entries = Slide.query.filter(Slide.id.in_(slides_id)).order_by(
        Slide.date.desc(), Slide.page.desc()).paginate(page, pagelimit, False)
    totalpages = entries.total
    start, end = pagination_gaps(page, totalpages, pagelimit, gap=15)

    next_url = url_for(
        'ppt.user_follow_slides',
        page=entries.next_num,
    ) if entries.has_next else None
    prev_url = url_for(
        'ppt.user_follow_slides',
        page=entries.prev_num,
    ) if entries.has_prev else None
    page_url = [(i, url_for(
        'ppt.user_follow_slides',
        page=i,
    )) for i in range(start, end + 1)]
    return render_template('ppt/slide_comparison.html',
                           title='PPT Updates',
                           entries=entries.items,
                           next_url=next_url,
                           prev_url=prev_url,
                           tags_list=Slide.tags_list(),
                           page_url=page_url,
                           active=page,
                           backurl=request.referrer,
                           mode="follow_ppt",
                           ppt_id=ppt_id,
                           thumbnail=thumbnail)
コード例 #3
0
def ppt_search_handler(query, field, ppt, date_from=None, date_to=None):
    """
    in the order of:
    query string, search field, ppt list
    test, ['all'], ['all','tag'], ['all']
    string, ['9'], ['all', 'title', 'body'], ['15', '16']
    """
    page = request.args.get('page', 1, int)
    pagelimit = current_user.slide_per_page
    thumbnail = current_user.thumbnail
    kwargs = {}
    for k in request.args:
        kwargs[k] = (request.args.getlist(k))

    date_from = date_from or datetime(2010, 1, 1)
    date_to = date_to or datetime.now()
    kwargs.pop('page', None)
    entries, total = Slide.search_in_id(query, field, ppt, date_from, date_to,
                                        page, pagelimit)
    start, end = pagination_gaps(page, total, pagelimit)
    next_url = url_for('main.search', page=page +
                       1, **kwargs) if total > page * pagelimit else None
    prev_url = url_for('main.search', page=page -
                       1, **kwargs) if page > 1 else None
    page_url = [(i, url_for('main.search', page=i, **kwargs))
                for i in range(start, end + 1)]

    tags_list = Slide.tags_list()

    return render_template('ppt/index.html',
                           title='Slide Search result',
                           entries=entries,
                           thumbnail=thumbnail,
                           next_url=next_url,
                           prev_url=prev_url,
                           table='slide',
                           nextcontent=None,
                           tags_list=tags_list,
                           page_url=page_url,
                           active=page,
                           id=id)
コード例 #4
0
def bookmarked():
    pagelimit = current_user.slide_per_page
    thumbnail = current_user.thumbnail
    page = request.args.get('page', 1, type=int)
    when = [(j, i) for i, j in enumerate(current_user.bookmarked_ppt)]
    if when:
        entries = Slide.query.filter(Slide.id.in_(
            current_user.bookmarked_ppt)).order_by(
                db.case(when,
                        value=Slide.id)).paginate(page, pagelimit, False)
    else:
        entries = Slide.query.filter_by(id=None).paginate(
            page, pagelimit, False)
    totalpages = entries.total

    start, end = pagination_gaps(page, totalpages, pagelimit, gap=15)

    next_url = url_for(
        'ppt.bookmarked',
        page=entries.next_num,
    ) if entries.has_next else None
    prev_url = url_for(
        'ppt.bookmarked',
        page=entries.prev_num,
    ) if entries.has_prev else None
    page_url = [(i, url_for(
        'ppt.bookmarked',
        page=i,
    )) for i in range(start, end + 1)]

    return render_template('ppt/slide_comparison.html',
                           title='PPT-Bookmark',
                           entries=entries.items,
                           next_url=next_url,
                           prev_url=prev_url,
                           tags_list=Slide.tags_list(),
                           page_url=page_url,
                           active=page,
                           backurl=request.referrer,
                           mode="bookmarked_ppt",
                           thumbnail=thumbnail)
コード例 #5
0
def browse():
    pagelimit = current_user.ngs_per_page
    table = request.args.get('table')
    id = request.args.get('id', 0, type=int)
    page = request.args.get('page', 1, type=int)
    target = models_table_name_dictionary.get(table, None)
    if target:
        if id:
            if table == 'round':
                entries = target.query.filter_by(selection_id=id).order_by(
                    target.id.desc()).paginate(page, pagelimit, False)
            elif table == 'sequence_round':
                entries = target.query.filter_by(rounds_id=id).order_by(
                    target.count.desc()).paginate(page, pagelimit, False)
                # entries = [SequenceDisplay(i.sequence,i.count,i.count/rd.totalread,rd.round_name) for i in r]
            else:
                entries = target.query.order_by(target.id.desc()).paginate(
                    page, pagelimit, False)
        else:
            if table == 'sequence_round':
                sequences = db.session.query(Sequence.id).filter(
                    db.and_(Sequence.note.isnot(None),
                            Sequence.note != '')).subquery()
                maxcounts = db.session.query(
                    SeqRound.sequence_id,
                    func.max(SeqRound.count).label('count')).filter(
                        SeqRound.sequence_id.in_(sequences)).group_by(
                            SeqRound.sequence_id).subquery()
                entries = SeqRound.query.join(
                    Sequence, SeqRound.sequence_id == Sequence.id).filter(
                        SeqRound.sequence_id == maxcounts.c.sequence_id,
                        SeqRound.count == maxcounts.c.count).order_by(
                            Sequence.date.desc()).paginate(
                                page, pagelimit, False)
            else:
                entries = target.query.order_by(target.id.desc()).paginate(
                    page, pagelimit, False)

        nextcontent = {
            'round': 'sequence_round',
            'selection': 'round'
        }.get(table)
        kwargs = {}
        if id: kwargs.update(id=id)
        totalpages = entries.total
        start, end = pagination_gaps(page, totalpages, pagelimit)

        next_url = url_for(
            'ngs.browse', table=table, page=entries.next_num, **
            kwargs) if entries.has_next else None
        prev_url = url_for(
            'ngs.browse', table=table, page=entries.prev_num, **
            kwargs) if entries.has_prev else None
        page_url = [(i, url_for('ngs.browse', table=table, page=i, **kwargs))
                    for i in range(start, end + 1)]
        return render_template('ngs/browse.html',
                               title='NGS ' + (table.capitalize() or ' '),
                               entries=entries.items,
                               next_url=next_url,
                               prev_url=prev_url,
                               table=table,
                               nextcontent=nextcontent,
                               page_url=page_url,
                               active=page)
    return render_template('ngs/browse.html',
                           title='NGS',
                           entries=[],
                           table='')
コード例 #6
0
def index():
    """
    main browsing page
    """
    pagelimit = current_user.slide_per_page
    thumbnail = current_user.thumbnail
    table = request.args.get('table', None)
    if not table:
        return redirect(url_for('ppt.index', table='project'))

    id = request.args.get('id', 0, type=int)
    page = request.args.get('page', 1, type=int)
    target = models_table_name_dictionary.get(table, None)

    tag = request.args.get('tag', None)
    if table == 'tags' and tag == None:
        return render_template(
            'ppt/index.html',
            title=(table.upper() or ' ') + '-View',
            table=table,
            entries=Slide.tags_list(500, True),
        )

    author = request.args.get('author', None)
    if table == 'authors' and author == None:
        return render_template(
            'ppt/index.html',
            title=(table.upper() or ' ') + '-View',
            table=table,
            entries=Slide.authors_list(),
        )

    if table in ['trash', 'tags', 'authors']:
        target = Slide

    tags_list = Slide.tags_list()
    if target:
        if id:
            if table == 'ppt':
                entries = target.query.filter_by(project_id=id).order_by(
                    target.date.desc()).paginate(page, pagelimit, False)
            elif table == 'slide':
                entries = target.query.filter_by(ppt_id=id).order_by(
                    target.date.desc(),
                    target.page.desc()).paginate(page, pagelimit, False)
            else:
                entries = target.query.order_by(target.date.desc()).paginate(
                    page, pagelimit, False)
        else:
            if table == 'trash':
                entries = target.query.filter_by(ppt_id=None).order_by(
                    target.date.desc(),
                    target.page.desc()).paginate(page, pagelimit, False)
            elif table == 'tags':
                table = 'slide'
                entries = target.query.filter(
                    target.tag.contains(tag)).order_by(
                        target.date.desc(),
                        target.page.desc()).paginate(page, pagelimit, False)
            elif table == 'authors':
                table = 'slide'
                author = None if author == 'Anonymous' else author
                entries = target.query.filter(
                    target.author == author).order_by(
                        target.date.desc(),
                        target.page.desc()).paginate(page, pagelimit, False)
            elif table == 'slide':
                entries = target.query.filter(target.ppt_id != None).order_by(
                    target.date.desc(),
                    target.page.desc()).paginate(page, pagelimit, False)
            else:
                entries = target.query.order_by(target.date.desc()).paginate(
                    page, pagelimit, False)
        nextcontent = {'ppt': 'slide', 'project': 'ppt'}.get(table)
        kwargs = {}
        if id:
            kwargs.update(id=id)
        totalpages = entries.total
        start, end = pagination_gaps(page, totalpages, pagelimit, gap=15)

        next_url = url_for(
            'ppt.index', table=table, page=entries.next_num, **
            kwargs) if entries.has_next else None
        prev_url = url_for(
            'ppt.index', table=table, page=entries.prev_num, **
            kwargs) if entries.has_prev else None
        page_url = [(i, url_for('ppt.index', table=table, page=i, **kwargs))
                    for i in range(start, end + 1)]
        return render_template('ppt/index.html',
                               title=(table.upper() or ' ') + '-View',
                               entries=entries.items,
                               next_url=next_url,
                               prev_url=prev_url,
                               table=table,
                               nextcontent=nextcontent,
                               tags_list=tags_list,
                               page_url=page_url,
                               active=page,
                               id=id,
                               thumbnail=thumbnail)

    return render_template('ppt/index.html',
                           title=(table.upper() or ' ') + '-View',
                           table=table,
                           tags_list=tags_list,
                           thumbnail=thumbnail)
コード例 #7
0
def ngs_serach_handler(form):
    pagelimit = current_user.ngs_per_page
    table = form.search_field.data
    target = models_table_name_dictionary.get(table)
    method = form.search_method.data
    page = request.args.get('page', 1, int)
    kwargs = dict(request.args)
    kwargs.pop('page', None)
    nextcontent = {'round': 'sequence_round', 'selection': 'round'}.get(table)
    seqdict = dict(primer='sequence',
                   known_sequence='rep_seq',
                   sequence='aptamer_seq')
    if method == 'text':
        if table == 'sequence':
            table = 'sequence_round'
            sequences = db.session.query(Sequence.id).filter(
                Sequence.note.contains(form.q.data)).subquery()
            maxcounts = db.session.query(
                SeqRound.sequence_id,
                func.max(SeqRound.count).label('count')).filter(
                    SeqRound.sequence_id.in_(sequences)).group_by(
                        SeqRound.sequence_id).subquery()
            result = SeqRound.query.join(
                Sequence, SeqRound.sequence_id == Sequence.id).filter(
                    SeqRound.sequence_id == maxcounts.c.sequence_id,
                    SeqRound.count == maxcounts.c.count).order_by(
                        Sequence.date.desc())
            result = result.paginate(page, pagelimit, False)
            total = result.total
            entries = result.items

            # subqry = db.session.query(func.max(sr.count)).filter(sr.sequence_id.in_([1,2,3,4,5]))
            # sr.query.filter(sr.sequence.in_([1,2,3,4,5],sr.count==subqry)).all()

            # subq=db.session.query(sr.sequence_id,func.max(sr.count).label('count')).filter(sr.sequence_id.in_([1,2,3,4,5])).group_by(sr.sequence_id).subquery()
            # sr.query.filter(sr.sequence_id==subq.c.sequence_id,sr.count==subq.c.count).all()

        else:
            entries, total = target.search(form.q.data, page, pagelimit)
    elif method == 'name':
        q = form.q.data
        if table == 'sequence':
            table = 'sequence_round'
            try:
                seqid = convert_string_to_id(q)
            except:
                seqid = 0
            result = SeqRound.query.filter(
                SeqRound.sequence_id == seqid).order_by(SeqRound.count.desc())
        else:
            namedict = dict(analysis="name",
                            known_sequence='sequence_name',
                            selection='selection_name',
                            round='round_name',
                            primer='name',
                            ngs_sample_group='name')
            result = target.query.filter(
                getattr(target, namedict[table]).contains(q)).order_by(
                    target.id.desc())
        result = result.paginate(page, pagelimit, False)
        total = result.total
        entries = result.items
    elif method == 'sequence':
        seq = form.q.data
        if not validate_sequence(seq):
            flash('Sequence not valid. Only ATCG is allowed.', 'warning')
            return redirect(request.referrer)
        revseq = reverse_comp(seq)
        seqdict = dict(primer='sequence',
                       known_sequence='rep_seq',
                       sequence='aptamer_seq')
        stmt = or_(
            getattr(target, seqdict[table]).contains(seq),
            getattr(target, seqdict[table]).contains(revseq))

        if table == 'sequence':
            table = 'sequence_round'
            result = SeqRound.query.filter(
                SeqRound.sequence_id.in_(
                    db.session.query(target.id).filter(stmt))).order_by(
                        SeqRound.count.desc())
        else:
            result = target.query.filter(stmt).order_by(target.id.desc())
        result = result.paginate(page, pagelimit, False)
        total = result.total
        entries = result.items

    elif method == 'distance':
        seq = form.q.data
        if not validate_sequence(seq):
            flash('Sequence not valid. Only ATCG is allowed.', 'warning')
            return redirect(request.referrer)
        taskid = current_user.launch_search(seq, table)
        target = models_table_name_dictionary.get(table)
        total = target.query.count()
        # render a template to display progress bar with task id, after done display result page.
        return render_template('ngs/task_progress.html',
                               task_id=taskid,
                               table=table,
                               total=total)
    start, end = pagination_gaps(page, total, pagelimit)
    next_url = url_for('main.search', page=page +
                       1, **kwargs) if total > page * pagelimit else None
    prev_url = url_for('main.search', page=page -
                       1, **kwargs) if page > 1 else None
    page_url = [(i, url_for('main.search', page=i, **kwargs))
                for i in range(start, end + 1)]
    return render_template('ngs/browse.html',
                           title='Search Result',
                           table=table,
                           nextcontent=nextcontent,
                           entries=entries,
                           next_url=next_url,
                           prev_url=prev_url,
                           page_url=page_url,
                           active=page)