def paper_reviews(): """List of reviews for a paper. Argument: paper_id""" grid = paper_review_grid() (paper_id, topic_id) = get_paper_and_topic_ids() # DEBUG # logger.info("paper_reviews: args(0) %r args(1) %r" % (request.args(0), request.args(1))) paper = db((db.paper.paper_id == paper_id) & (db.paper.end_date == None)).select().first() button_list = [] if auth.user_id is not None: # We let a user add a review only if it has not written one already. no_user_review = db((db.review.user_email == get_user_email()) & (db.review.paper_id == paper_id)).isempty() if no_user_review and can_review(topic_id): button_review = A(icon_add, T('Write a review'), _class='btn btn-danger', cid=request.cid, _href=URL('components', 'do_review', args=[paper_id, topic_id, 'e'])) button_list.append(button_review) elif not no_user_review: # user has a review button_your_review = A(icon_your_review, T('Your review'), _class='btn btn-success', cid=request.cid, _href=URL('components', 'do_review', args=[paper_id, topic_id, 'v'])) button_list.append(button_your_review) return dict(grid=grid, button_list=button_list)
def paper_review_grid(): """Grid of reviews for a paper. The arguments are: - paper_id - topic_id or the string "primary" """ (paper_id, topic_id) = get_paper_and_topic_ids() # DEBUG logger.info("paper_review_grid : %r %r" % (paper_id, topic_id)) q = ((db.review.paper_id == paper_id) & (db.review.topic == topic_id) & (db.review.end_date == None)) # Retrieves the edit history of reviews. def get_review_history(r): logger.info("get_review_history : %r %r %r" % (paper_id, topic_id, r)) review_history_len = db((db.review.paper_id == paper_id) & (db.review.topic == topic_id) & (db.review.user_email == r.user_email)).count() return '' if review_history_len < 2 else A(T('Review history'), cid=request.cid, _href=URL('components', 'review_history', args=[r.review_id, paper_id])) # Retrieves the version of paper reviewed, if different from current one. current_paper = db((db.paper.paper_id == paper_id) & (db.paper.end_date == None)).select().first() def get_reviewed_paper(r): if r.paper == current_paper.id: return 'Current' else: return A(T('View'), _href=URL('default', 'view_specific_paper_version', args=[r.paper])) links = [] db.review.paper.readable = False db.review.user_email.readable = False # Link to review edit history if any. links.append(dict(header='', body=lambda r: get_review_history(r))) # Link to actual version of paper reviewed, if different from current one. links.append(dict(header='Reviewed version', body=lambda r: get_reviewed_paper(r))) # edit_review_link=A(T('Edit'), cid=request.cid, _href=URL('components', 'do_review', args=[paper_id, topic_id])) grid = SQLFORM.grid(q, args=request.args[:2], fields=[db.review.grade, db.review.useful_count, db.review.review_content, db.review.review_id, db.review.paper_id, db.review.paper, db.review.user_email, db.review.start_date], links=links, orderby=~db.review.start_date, details=True, csv=False, editable=False, deletable=False, create=False, maxtextlength=48, ) return grid
def do_review(): """Shows to a user their review of a paper, allowing them to edit it or to enter it for the first time. The arguments are: - paper_id : the paper. - topic.id : the id of the topic, or the string "primary". - v / e: view, or edit. If there is a current review, then lets the user edit that instead, keeping track of the old review. """ (paper_id, topic_id) = get_paper_and_topic_ids() is_view = request.args(2) == 'v' paper = db((db.paper.paper_id == request.args(0)) & (db.paper.end_date == None)).select().first() topic = db.topic(topic_id) #logger.info("do_review paper.id %r topic.id %r is_view %r" % (paper,topic,is_view)) if paper is None or topic is None: component_fail(T('No such paper or topic.')) # Checks whether the paper is currently in the topic. paper_in_topic = db((db.paper_in_topic.paper_id == paper.paper_id) & (db.paper_in_topic.topic == topic.id) & (db.paper_in_topic.end_date == None)).select().first() if paper_in_topic is None: component_fail(T('The paper is not in the selected topic')) # Verify permissions. if not is_view and not can_review(topic.id): component_fail(T('You do not have the permission to perform reviews in this topic')) # Fishes out the current review, if any. current_review = db((db.review.user_email == get_user_email()) & (db.review.paper_id == paper.paper_id) & (db.review.topic == topic.id) & (db.review.end_date == None)).select().first() # Sets some defaults. logger.info("My user email: %r" % get_user_email()) db.review.paper.writable = False db.review.paper_id.readable = False db.review.user_email.default = get_user_email() db.review.paper_id.default = paper.paper_id db.review.paper.default = paper.id db.review.topic.default = topic.id db.review.start_date.label = T('Review date') db.review.end_date.readable = False db.review.useful_count.readable = is_view db.review.old_score.default = paper_in_topic.score # Creates the form for editing. form = SQLFORM(db.review, record=current_review, readonly=is_view) form.vars.user_email = get_user_email() form.vars.review_content = None if current_review is None else text_store_read(current_review.review_content) if form.validate(): # We must write the review as a new review. # First, we close the old review if any. now = datetime.utcnow() if current_review is not None: current_review.update_record(end_date=now) # Builds the correct review id. review_id = current_review.review_id if current_review is not None else None if review_id is None: review_id = review_utils.get_random_id() # Then, writes the current review. db.review.insert(user_email=get_user_email(), paper_id=paper.paper_id, review_id=review_id, paper=paper.id, topic=topic.id, start_date=now, end_date=None, review_content=str(text_store_write(form.vars.content)), old_score=paper_in_topic.score, grade=form.vars.grade, ) add_reviewer_to_topic(get_user_email(), topic.id) session.flash = T('Your review has been accepted.') redirect(URL('components', 'do_review', args=[paper.paper_id, topic_id, 'v'])) button_list = [] button_list.append(A(icon_reviews, T('All reviews'), cid=request.cid, _class='btn btn-success', _href=URL('components', 'paper_reviews', args=[paper.paper_id, topic_id]))) if is_view and can_review(topic.id): button_list.append(A(icon_edit, T('Edit review'), cid=request.cid, _class='btn btn-warning', _href=URL('components', 'do_review', args=[paper.paper_id, topic_id, 'e']))) # else: # button_list.append(A(icon_your_review, T('Your review'), cid=request.cid, # _class='btn btn-success', # _href=URL('components', 'do_review', args=[paper.paper_id, topic_id, 'v']))) return dict(button_list=button_list, form=form)
def paper_info(): """Returns information on a paper. Arguments: - paper_id (in path) Optional: - topic_id (in path) - id=pid (in query) where pid is the id of the paper in the version. - date=date (in query) shows the version that was active at a given date. """ (paper_id, topic_id) = get_paper_and_topic_ids() if request.vars.id is not None: paper = db(db.paper.id == id).select().first() paper_id = paper.paper_id # For consistency elif request.vars.date is not None: d = parse_date(request.vars.date) paper = db((db.paper.paper_id == paper_id) & (db.paper.start_date <= d) & ((db.paper.end_date == None) | (db.paper.end_date >= d))).select().first() else: # Selects last paper. paper = db((db.paper.paper_id == paper_id) & (db.paper.end_date == None)).select().first() # Paper topics, score, and number of reviews. all_topics = db((db.paper_in_topic.paper_id == paper_id) & (db.paper_in_topic.end_date == None) & (db.topic.id == db.paper_in_topic.topic)).select() secondary_topics=[] primary_topic_name = None primary_topic = None primary_paper_topic = None for t in all_topics: if t.paper_in_topic.is_primary: primary_topic = t.topic primary_paper_topic = t.paper_in_topic primary_topic_name = represent_paper_topic(primary_topic.name, primary_topic) else: secondary_topics.append(represent_paper_topic(t.topic.name, t.topic)) topics_els = [T('Primary topic: '), primary_topic_name] if len(secondary_topics) > 0: topics_els.append(SPAN(T(' Secondary topics:'), ' ', _class="second_span")) topics_els.append(secondary_topics[0]) for t in secondary_topics[1:]: topics_els.extend([SPAN(', '), t]) topics_span = SPAN(*topics_els) # Earliest, and latest dates. latest_version_date = represent_date(paper.start_date, paper) earliest_paper = db(db.paper.paper_id == paper_id).select(orderby=db.paper.start_date).first() first_version_date = earliest_paper.start_date # Creates the button list. button_list = [] if can_edit_paper(topic_id): button_list.append(A(icon_edit, T('Edit paper'), _class='btn btn-warning', _href=URL('default', 'edit_paper', args=[paper_id]))) return dict(paper=paper, topics=topics_span, first_version_date=first_version_date, latest_version_date=latest_version_date, abstract=text_store_read(paper.abstract), score=primary_paper_topic.score if primary_paper_topic else None, num_reviews=primary_paper_topic.num_reviews if primary_paper_topic else None, button_list=button_list, )
def do_review(): """Shows to a user their review of a paper, allowing them to edit it or to enter it for the first time. The arguments are: - paper_id : the paper. - topic.id : the id of the topic, or the string "primary". - v / e: view, or edit. If there is a current review, then lets the user edit that instead, keeping track of the old review. """ (paper_id, topic_id) = get_paper_and_topic_ids() is_view = request.args(2) == 'v' paper = db((db.paper.paper_id == request.args(0)) & (db.paper.end_date == None)).select().first() topic = db.topic(topic_id) #logger.info("do_review paper.id %r topic.id %r is_view %r" % (paper,topic,is_view)) if paper is None or topic is None: component_fail(T('No such paper or topic.')) # Checks whether the paper is currently in the topic. paper_in_topic = db((db.paper_in_topic.paper_id == paper.paper_id) & (db.paper_in_topic.topic == topic.id) & (db.paper_in_topic.end_date == None)).select().first() if paper_in_topic is None: component_fail(T('The paper is not in the selected topic')) # Verify permissions. if not is_view and not can_review(topic.id): component_fail( T('You do not have the permission to perform reviews in this topic' )) # Fishes out the current review, if any. current_review = db((db.review.user_email == get_user_email()) & (db.review.paper_id == paper.paper_id) & (db.review.topic == topic.id) & (db.review.end_date == None)).select().first() # Sets some defaults. logger.info("My user email: %r" % get_user_email()) db.review.paper.writable = False db.review.paper_id.readable = False db.review.user_email.default = get_user_email() db.review.paper_id.default = paper.paper_id db.review.paper.default = paper.id db.review.topic.default = topic.id db.review.start_date.label = T('Review date') db.review.end_date.readable = False db.review.useful_count.readable = is_view db.review.old_score.default = paper_in_topic.score # Creates the form for editing. form = SQLFORM(db.review, record=current_review, readonly=is_view) form.vars.user_email = get_user_email() form.vars.review_content = None if current_review is None else text_store_read( current_review.review_content) if form.validate(): # We must write the review as a new review. # First, we close the old review if any. now = datetime.utcnow() if current_review is not None: current_review.update_record(end_date=now) # Builds the correct review id. review_id = current_review.review_id if current_review is not None else None if review_id is None: review_id = review_utils.get_random_id() # Then, writes the current review. db.review.insert( user_email=get_user_email(), paper_id=paper.paper_id, review_id=review_id, paper=paper.id, topic=topic.id, start_date=now, end_date=None, review_content=str(text_store_write(form.vars.content)), old_score=paper_in_topic.score, grade=form.vars.grade, ) add_reviewer_to_topic(get_user_email(), topic.id) session.flash = T('Your review has been accepted.') redirect( URL('components', 'do_review', args=[paper.paper_id, topic_id, 'v'])) button_list = [] button_list.append( A(icon_reviews, T('All reviews'), cid=request.cid, _class='btn btn-success', _href=URL('components', 'paper_reviews', args=[paper.paper_id, topic_id]))) if is_view and can_review(topic.id): button_list.append( A(icon_edit, T('Edit review'), cid=request.cid, _class='btn btn-warning', _href=URL('components', 'do_review', args=[paper.paper_id, topic_id, 'e']))) # else: # button_list.append(A(icon_your_review, T('Your review'), cid=request.cid, # _class='btn btn-success', # _href=URL('components', 'do_review', args=[paper.paper_id, topic_id, 'v']))) return dict(button_list=button_list, form=form)
def paper_review_grid(): """Grid of reviews for a paper. The arguments are: - paper_id - topic_id or the string "primary" """ (paper_id, topic_id) = get_paper_and_topic_ids() # DEBUG logger.info("paper_review_grid : %r %r" % (paper_id, topic_id)) q = ((db.review.paper_id == paper_id) & (db.review.topic == topic_id) & (db.review.end_date == None)) # Retrieves the edit history of reviews. def get_review_history(r): logger.info("get_review_history : %r %r %r" % (paper_id, topic_id, r)) review_history_len = db( (db.review.paper_id == paper_id) & (db.review.topic == topic_id) & (db.review.user_email == r.user_email)).count() return '' if review_history_len < 2 else A( T('Review history'), cid=request.cid, _href=URL( 'components', 'review_history', args=[r.review_id, paper_id])) # Retrieves the version of paper reviewed, if different from current one. current_paper = db((db.paper.paper_id == paper_id) & (db.paper.end_date == None)).select().first() def get_reviewed_paper(r): if r.paper == current_paper.id: return 'Current' else: return A(T('View'), _href=URL('default', 'view_specific_paper_version', args=[r.paper])) links = [] db.review.paper.readable = False db.review.user_email.readable = False # Link to review edit history if any. links.append(dict(header='', body=lambda r: get_review_history(r))) # Link to actual version of paper reviewed, if different from current one. links.append( dict(header='Reviewed version', body=lambda r: get_reviewed_paper(r))) # edit_review_link=A(T('Edit'), cid=request.cid, _href=URL('components', 'do_review', args=[paper_id, topic_id])) grid = SQLFORM.grid( q, args=request.args[:2], fields=[ db.review.grade, db.review.useful_count, db.review.review_content, db.review.review_id, db.review.paper_id, db.review.paper, db.review.user_email, db.review.start_date ], links=links, orderby=~db.review.start_date, details=True, csv=False, editable=False, deletable=False, create=False, maxtextlength=48, ) return grid
def paper_info(): """Returns information on a paper. Arguments: - paper_id (in path) Optional: - topic_id (in path) - id=pid (in query) where pid is the id of the paper in the version. - date=date (in query) shows the version that was active at a given date. """ (paper_id, topic_id) = get_paper_and_topic_ids() if request.vars.id is not None: paper = db(db.paper.id == id).select().first() paper_id = paper.paper_id # For consistency elif request.vars.date is not None: d = parse_date(request.vars.date) paper = db((db.paper.paper_id == paper_id) & (db.paper.start_date <= d) & ((db.paper.end_date == None) | (db.paper.end_date >= d))).select().first() else: # Selects last paper. paper = db((db.paper.paper_id == paper_id) & (db.paper.end_date == None)).select().first() # Paper topics, score, and number of reviews. all_topics = db((db.paper_in_topic.paper_id == paper_id) & (db.paper_in_topic.end_date == None) & (db.topic.id == db.paper_in_topic.topic)).select() secondary_topics = [] primary_topic_name = None primary_topic = None primary_paper_topic = None for t in all_topics: if t.paper_in_topic.is_primary: primary_topic = t.topic primary_paper_topic = t.paper_in_topic primary_topic_name = represent_paper_topic(primary_topic.name, primary_topic) else: secondary_topics.append( represent_paper_topic(t.topic.name, t.topic)) topics_els = [T('Primary topic: '), primary_topic_name] if len(secondary_topics) > 0: topics_els.append( SPAN(T(' Secondary topics:'), ' ', _class="second_span")) topics_els.append(secondary_topics[0]) for t in secondary_topics[1:]: topics_els.extend([SPAN(', '), t]) topics_span = SPAN(*topics_els) # Earliest, and latest dates. latest_version_date = represent_date(paper.start_date, paper) earliest_paper = db(db.paper.paper_id == paper_id).select( orderby=db.paper.start_date).first() first_version_date = earliest_paper.start_date # Creates the button list. button_list = [] if can_edit_paper(topic_id): button_list.append( A(icon_edit, T('Edit paper'), _class='btn btn-warning', _href=URL('default', 'edit_paper', args=[paper_id]))) return dict( paper=paper, topics=topics_span, first_version_date=first_version_date, latest_version_date=latest_version_date, abstract=text_store_read(paper.abstract), score=primary_paper_topic.score if primary_paper_topic else None, num_reviews=primary_paper_topic.num_reviews if primary_paper_topic else None, button_list=button_list, )