Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion admin_webapp/controllers/ownership.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ def ownership_detail(ownership_id:int, postfn=None) -> dict:
endorsement_req = oreq.endorsement_request if oreq.endorsement_request else None
data = dict(ownership=oreq,
user=oreq.user,
nickname= oreq.user.tapir_nicknames[0].nickname,
nickname= oreq.user.nickname,
papers=oreq.documents,
audit=oreq.request_audit[0],
ownership_id=ownership_id,
Expand Down
5 changes: 3 additions & 2 deletions admin_webapp/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import logging

from flask import Flask, current_app
from flask import Flask
from flask_s3 import FlaskS3
from flask_bootstrap import Bootstrap5

Expand All @@ -21,7 +21,7 @@

import arxiv_db

from .routes import ui, ownership, endorsement, user, paper
from .routes import ui, ownership, endorsement, user, paper, tapir_session

s3 = FlaskS3()

Expand Down Expand Up @@ -84,6 +84,7 @@ def create_web_app() -> Flask:
app.register_blueprint(endorsement.blueprint)
app.register_blueprint(user.blueprint)
app.register_blueprint(paper.blueprint)
app.register_blueprint(tapir_session.blueprint)

Base(app)
auth.Auth(app)
Expand Down
64 changes: 55 additions & 9 deletions admin_webapp/routes/endorsement.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sqlalchemy import select, func
from sqlalchemy.orm import joinedload

from flask import Blueprint, render_template, Response, request, current_app, abort
from flask import Blueprint, render_template, Response, request, current_app, abort, redirect, url_for

from arxiv_db.models import EndorsementRequests, Endorsements, TapirUsers, Demographics

Expand All @@ -16,12 +16,56 @@
blueprint = Blueprint('endorsement', __name__, url_prefix='/endorsement')


@blueprint.route('/request/<int:endorsement_id>', methods=['GET'])
def request_detail(endorsement_id:int) -> Response:
"""Display a endorsement."""
data=dict(endorsement_id=endorsement_id)
return render_template('endorsement/request_detail.html', **data)
@blueprint.route('/request/<int:endorsement_req_id>', methods=['GET'])
def request_detail(endorsement_req_id:int) -> Response:
"""Display a single request for endorsement."""
session = get_db(current_app).session
stmt = (select(EndorsementRequests)
.options(joinedload(EndorsementRequests.endorsee).joinedload(TapirUsers.tapir_nicknames),
joinedload(EndorsementRequests.endorsement).joinedload(Endorsements.endorser).joinedload(TapirUsers.tapir_nicknames),
joinedload(EndorsementRequests.audit))
.filter(EndorsementRequests.request_id == endorsement_req_id)
)
endo_req = session.execute(stmt).scalar() or abort(404)
return render_template('endorsement/request_detail.html',
**dict(endorsement_req_id=endorsement_req_id,
endo_req=endo_req,
))

@blueprint.route('/request/<int:endorsement_req_id>/flip_valid', methods=['POST'])
def flip_valid(endorsement_req_id:int) -> Response:
"""Flip an endorsement_req valid column."""
session = get_db(current_app).session
stmt = (select(EndorsementRequests)
.options(joinedload(EndorsementRequests.endorsement))
.filter(EndorsementRequests.request_id == endorsement_req_id))
endo_req = session.execute(stmt).scalar() or abort(404)
endo_req.endorsement.flag_valid = not bool(endo_req.endorsement.flag_valid)
session.commit()
return redirect(url_for('endorsement.request_detail', endorsement_req_id=endorsement_req_id))


@blueprint.route('/request/<int:endorsement_req_id>/flip_score', methods=['POST'])
def flip_score(endorsement_req_id:int) -> Response:
"""Flip an endorsement_req score."""
session = get_db(current_app).session
stmt = (select(EndorsementRequests)
.options(joinedload(EndorsementRequests.endorsement))
.filter(EndorsementRequests.request_id == endorsement_req_id))
endo_req = session.execute(stmt).scalar() or abort(404)
if endo_req.endorsement.point_value > 0:
endo_req.endorsement.point_value = 0
else:
endo_req.endorsement.point_value = 10

session.commit()
return redirect(url_for('endorsement.request_detail', endorsement_req_id=endorsement_req_id))


@blueprint.route('/<int:endorsement_id>', methods=['GET'])
def detail(endorsement_id: int) -> Response:
"""Display a single endorsement."""
abort(500)

def endorsement_listing(report_type:str, per_page:int, page: int, days_back:int,
flagged:bool, not_positive:bool=False):
Expand All @@ -40,8 +84,10 @@ def endorsement_listing(report_type:str, per_page:int, page: int, days_back:int,
count_stmt = count_stmt.filter(Demographics.flag_suspect == 1)

if not_positive:
report_stmt = report_stmt.filter(EndorsementRequests.point_value <= 0)
count_stmt = count_stmt.filter(EndorsementRequests.point_value <= 0)
report_stmt = report_stmt.join(Endorsements, EndorsementRequests.request_id == Endorsements.request_id)
report_stmt = report_stmt.filter(Endorsements.point_value <= 0)
count_stmt = count_stmt.join(Endorsements, EndorsementRequests.request_id == Endorsements.request_id)
count_stmt = count_stmt.filter(Endorsements.point_value <= 0)

if report_type == 'today':
days_back = 1
Expand Down Expand Up @@ -94,7 +140,7 @@ def negative() -> Response:
page = args.get('page', default=1, type=int)
days_back = args.get('days_back', default=7, type=int)
_check_report_args(per_page, page, days_back, 0)
data = endorsement_listing('negative', per_page, page, days_back, False, not_positive=1)
data = endorsement_listing('negative', per_page, page, days_back, False, not_positive=True)
data['title'] = "Negative Endorsement Requests"
return render_template('endorsement/list.html', **data)

Expand Down
12 changes: 12 additions & 0 deletions admin_webapp/routes/tapir_session.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""arXiv session routes."""

from flask import Blueprint, render_template, Response


blueprint = Blueprint('session', __name__, url_prefix='/session')


@blueprint.route('/<int:session_id>', methods=['GET'])
def detail(session_id: int) -> Response:
"""Display a session."""
return render_template('session_display.html')
4 changes: 2 additions & 2 deletions admin_webapp/routes/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
blueprint = Blueprint('user', __name__, url_prefix='/user')


@blueprint.route('/<int:id>', methods=['GET'])
def display() -> Response:
@blueprint.route('/<int:user_id>', methods=['GET'])
def detail(user_id: int) -> Response:
"""Display a user."""
return render_template('user/display.html')
5 changes: 0 additions & 5 deletions admin_webapp/templates/endorsement/detail.html

This file was deleted.

6 changes: 3 additions & 3 deletions admin_webapp/templates/endorsement/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ <h1>{{title}}</h1>
</tr>
{%for row in endorsements%}
<tr>
<td><a href='{{url_for("endorsement.request_detail", endorsement_id=row.request_id)}}'>{{row.request_id}}</a></td>
<td><a href='{{url_for("endorsement.request_detail", endorsement_req_id=row.request_id)}}'>{{row.request_id}}</a></td>

<td>
{% if row.endorsement and row.endorsement.endorser %}
<a href='{{url_for("user.display", id=row.endorsement.endorser.user_id)}}'>
<a href='{{url_for("user.detail", user_id=row.endorsement.endorser.user_id)}}'>
{{row.endorsement.endorser.first_name}} {{row.endorsement.endorser.last_name}}</a>
{% else %}
(missing)
{% endif %}
</td>
<td><a href='{{url_for("user.display", id=row.endorsee_id)}}'>
<td><a href='{{url_for("user.detail", user_id=row.endorsee_id)}}'>
{{row.endorsee.first_name}} {{row.endorsee.last_name}}</a>
</td>
<td>
Expand Down
56 changes: 56 additions & 0 deletions admin_webapp/templates/endorsement/request_detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{%- extends "base.html" -%}

{% macro yn( value ) -%}
{%- if value -%}
<span class='badge bg-success'>Y</span>
{%- else -%}
<span class='badge bg-warning'>N</span>
{%- endif -%}
{%- endmacro %}

{% macro flipbtn( url ) %}
<form class="d-inline" action="{{url}}" method="post">
<button class="btn btn-primary btn-sm" type="submit" name="flip" value="flip">flip</button>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
</form>
{%- endmacro %}

{%block content%}
<h1>Endorsement Request</h1>

<table>
<tr><td>Category:</td><td> {{endo_req.archive}}.{{endo_req.subject_class}}</td></tr>
</table>

<div class="row">
<div class="col card">
<table>
<tr><td>Endorser:</td><td> {% if endo_req.endorsement %}<a href='{{url_for('user.detail', user_id=endo_req.endorsement.endorser_id)}}'>
{{endo_req.endorsement.endorser.nickname}}</a>{% else %}(endorsement missing){% endif %}</td></tr>
<tr><td>Valid?:</td><td> {{ yn(endo_req.endorsement.flag_valid) }} {{flipbtn(url_for('endorsement.flip_valid', endorsement_req_id=endo_req.request_id))}}</td></tr>

<tr><td>Positive?:</td><td> {{ yn( endo_req.endorsement.point_value)}} {{ flipbtn(url_for('endorsement.flip_score', endorsement_req_id=endo_req.request_id))}} </td></tr>

<tr><td>Knows Personally?:</td><td> {{ yn( endo_req.audit.flag_knows_personally ) }}</td></tr>
<tr><td> Has Seen Paper?:</td><td> {{ yn(endo_req.audit.flag_seen_paper ) }}</td></tr>
<tr><td> Type:</td><td> {% if endo_req.endorsement %}{{endo_req.endorsement.type}}{% else %}(endorsement missing){% endif %}</td></tr>
<tr><td>Points:</td><td> {{endo_req.endorsement.point_value}}</td></tr>
<tr><td>Endorsement:</td><td> {% if endo_req.endorsement %}<a href='{{url_for('endorsement.detail', endorsement_id=endo_req.endorsement.endorsement_id)}}'>{{endo_req.endorsement.endorsement_id}}</a>{% else %}(endorsement missing){% endif %}</td></tr>
</table>
</div>

<div class="col card">
<table>
<tr><td>Endorsee:</td><td> <a href='{{url_for('user.detail', user_id=endo_req.endorsee_id)}}'>
{{endo_req.endorsee.nickname}}</a></td></tr>
<tr><td>Request Id:</td><td> {{endo_req.request_id}}</td></tr>
<tr><td>Issued When:</td><td> {{endo_req.issued_when}}</td></tr>
<tr><td>Session Id:</td><td> {% if endo_req.audit %}<a href='{{url_for('session.detail', session_id=endo_req.audit.session_id)}}'>{{endo_req.audit.session_id}}</a>{% else %}(session missing){% endif %}</td></tr>
<tr><td>Remote Hostname:</td><td>{{endo_req.audit.remote_host}}</td></tr>
<tr><td>Remote Address:</td><td> {{endo_req.audit.remote_addr}}</td></tr>
<tr><td>Tracking Cookie:</td><td> {{endo_req.audit.tracking_cookie}}</td></tr>
</table>
</div>
<div>Comment:<strong>{{endo_req.audit.comment}}</strong></div>
</div>
{%endblock content%}
4 changes: 2 additions & 2 deletions admin_webapp/templates/ownership/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ <h1>{{title}}</h1>
{%for oreq in ownership_requests%}
<tr>
<td><a href='{{url_for("ownership.display", ownership_id=oreq.request_id)}}'>{{oreq.request_id}}</a></td>
<td><a href='{{url_for("user.display", id=oreq.user_id)}}'>
<td><a href='{{url_for("user.detail", user_id=oreq.user_id)}}'>
{{oreq.user.first_name}} {{oreq.user.last_name}}</a>
</td>
<td>{{oreq.workflow_status}}</td>
<td>{% if oreq.endorsement_request_id %}
<a href='{{url_for("endorsement.request_detail", request_id=oreq.endorsement_request_id)}}'>{{oreq.endorsement_request_id}}</a>
<a href='{{url_for("endorsement.request_detail", endorsement_req_id=oreq.endorsement_request_id)}}'>{{oreq.endorsement_request_id}}</a>
{%else%}None{%endif%}
</td>
</tr>
Expand Down
2 changes: 1 addition & 1 deletion admin_webapp/tests/test_end_to_end.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def test_post_login(self):
classic_cookie = cookies[classic_cookie_name]

# Verify that the domain is correct.
self.assertEqual(cookie['Domain'], '.arxiv.org', 'Domain is set')
self.assertEqual(cookie['Domain'], '.arxiv.org', 'Domain is set') # if you get .localhost.arxiv.org you probably have env var LOCALHOST_DEV set
self.assertEqual(classic_cookie['Domain'], '.arxiv.org',
'Domain is set')

Expand Down
Loading