Skip to content

Commit

Permalink
mod-model-fix
Browse files Browse the repository at this point in the history
  • Loading branch information
willyao99 committed Jan 24, 2024
1 parent 81ce5de commit 25250d2
Show file tree
Hide file tree
Showing 9 changed files with 196 additions and 21 deletions.
5 changes: 4 additions & 1 deletion admin_webapp/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
"""Provides application for development purposes."""
from .factory import create_web_app

import arxiv_db
# for table_name, table in arxiv_db.Base.metadata.tables.items():
# print(f"Table: {table_name}")
# print("-" * 50)
app = create_web_app()
# with app.app_context():
# legacy.create_all()
Empty file.
15 changes: 14 additions & 1 deletion admin_webapp/controllers/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@

from arxiv_auth.auth.decorators import scoped

from admin_webapp.models import Moderators

from arxiv_db.models import TapirUsers, Documents, EndorsementRequests, Demographics
from arxiv_db.models.associative_tables import t_arXiv_paper_owners

from admin_webapp.extensions import get_csrf, get_db
from admin_webapp.admin_log import audit_admin

logger = logging.getLogger(__file__)

# blueprint = Blueprint('ownership', __name__, url_prefix='/ownership')
Expand Down Expand Up @@ -103,3 +104,15 @@ def suspect_listing(per_page:int, page: int) -> dict:
count = session.execute(count_stmt).scalar_one()
pagination = Pagination(query=None, page=page, per_page=per_page, total=count, items=None)
return dict(pagination=pagination, count=count, users=users)


def moderator_listing() -> dict:
session = get_db(current_app).session
report_stmt = (select(Moderators))

count_stmt = (select(func.count(Moderators.user_id)))

mods = session.scalars(report_stmt)
count = session.execute(count_stmt).scalar_one()
print(count)
return dict(count=count, mods=mods)
4 changes: 3 additions & 1 deletion admin_webapp/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ def create_web_app() -> Flask:
"""Initialize and configure the admin_webapp application."""
app = Flask('admin_webapp')
app.config.from_pyfile('config.py')
session_lifetime = app.config['PERMANENT_SESSION_LIFETIME']

print(f"Session Lifetime: {session_lifetime} seconds")
# Configure Flask session (use filesystem for dev purposes)
app.config['SESSION_TYPE'] = 'filesystem'
Session(app)
Expand Down Expand Up @@ -81,7 +84,6 @@ def create_web_app() -> Flask:
legacy_init_app(app)

SQLAlchemy(app, metadata=arxiv_db.Base.metadata)

app.register_blueprint(ui.blueprint)
app.register_blueprint(ownership.blueprint)
app.register_blueprint(endorsement.blueprint)
Expand Down
146 changes: 146 additions & 0 deletions admin_webapp/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@

from sqlalchemy import Column, ForeignKey, text, PrimaryKeyConstraint
from sqlalchemy.dialects.mysql import TINYINT
from arxiv_db import Base

metadata = Base.metadata


class Moderators(Base):
# __table__ = metadata.tables['arXiv_moderators']
# __table_args__ = (
# PrimaryKeyConstraint(['user_id', 'archive','subject_class']),
# )
# __table_args__ = (
# ForeignKeyConstraint(['policy_class'], ['tapir_policy_classes.class_id'], name='0_510'),
# Index('email', 'email', unique=True),
__tablename__ = 'arXiv_moderators'

user_id = Column(ForeignKey('tapir_users.user_id'), primary_key=True)
archive = Column(ForeignKey('arXiv_categories.archive'), primary_key=True, nullable=False, server_default=text("''"))
subject_class = Column(ForeignKey('arXiv_categories.subject_class'), primary_key=True, nullable=False, server_default=text("''"))

is_public = Column(TINYINT(4), server_default=text("'0"))
no_email = Column(TINYINT(1), server_default=text("'0"))
no_web_email = Column(TINYINT(1), server_default=text("'0"))
no_reply_to = Column(TINYINT(1), server_default=text("'0"))
daily_update = Column(TINYINT(1), server_default=text("'0"))

# # TODO: set up relationship with Tapir Users?

# from sqlalchemy import BINARY, BigInteger, CHAR, Column, Date, DateTime, Enum, ForeignKeyConstraint, Index, Integer, JSON, SmallInteger, String, TIMESTAMP, Table, Text, text
# from sqlalchemy.dialects.mysql import CHAR, DECIMAL, INTEGER, MEDIUMINT, MEDIUMTEXT, SMALLINT, TINYINT, VARCHAR
# from sqlalchemy.orm import relationship


# from .. import Base

# metadata = arxiv_db.Base.metadata

# from arxiv_db.models.sqa_types import EpochIntArxivTz
# # tapir_users



# class TapirUsers(arxiv_db.Base):
# __tablename__ = 'tapir_users'
# __table_args__ = (
# ForeignKeyConstraint(['policy_class'], ['tapir_policy_classes.class_id'], name='0_510'),
# Index('email', 'email', unique=True),
# Index('first_name', 'first_name'),
# Index('flag_approved', 'flag_approved'),
# Index('flag_banned', 'flag_banned'),
# Index('flag_can_lock', 'flag_can_lock'),
# Index('flag_deleted', 'flag_deleted'),
# Index('flag_edit_users', 'flag_edit_users'),
# Index('flag_internal', 'flag_internal'),
# Index('joined_date', 'joined_date'),
# Index('joined_ip_num', 'joined_ip_num'),
# Index('last_name', 'last_name'),
# Index('policy_class', 'policy_class'),
# Index('tracking_cookie', 'tracking_cookie')
# )

# user_id = Column(INTEGER, primary_key=True)
# share_first_name = Column(INTEGER, nullable=False, server_default=text("'1'"))
# share_last_name = Column(INTEGER, nullable=False, server_default=text("'1'"))
# email = Column(String(255), nullable=False, server_default=text("''"))
# share_email = Column(INTEGER, nullable=False, server_default=text("'8'"))
# email_bouncing = Column(INTEGER, nullable=False, server_default=text("'0'"))
# policy_class = Column(SMALLINT, nullable=False, server_default=text("'0'"))
# joined_date = Column(EpochIntArxivTz, nullable=False, server_default=text("'0'"))
# joined_remote_host = Column(String(255), nullable=False, server_default=text("''"))
# flag_internal = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_edit_users = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_edit_system = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_email_verified = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_approved = Column(INTEGER, nullable=False, server_default=text("'1'"))
# flag_deleted = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_banned = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_wants_email = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_html_email = Column(INTEGER, nullable=False, server_default=text("'0'"))
# tracking_cookie = Column(String(255), nullable=False, server_default=text("''"))
# flag_allow_tex_produced = Column(INTEGER, nullable=False, server_default=text("'0'"))
# flag_can_lock = Column(INTEGER, nullable=False, server_default=text("'0'"))
# first_name = Column(String(50))
# last_name = Column(String(50))
# suffix_name = Column(String(50))
# joined_ip_num = Column(String(16))

# tapir_policy_classes = relationship('TapirPolicyClasses', back_populates='tapir_users')
# arXiv_control_holds = relationship('ControlHolds', foreign_keys='[ControlHolds.last_changed_by]', back_populates='tapir_users')
# arXiv_control_holds_ = relationship('ControlHolds', foreign_keys='[ControlHolds.placed_by]', back_populates='tapir_users_')
# arXiv_documents = relationship('Documents', back_populates='submitter')
# arXiv_moderator_api_key = relationship('ModeratorApiKey', back_populates='user')
# tapir_address = relationship('TapirAddress', back_populates='user')
# tapir_email_change_tokens = relationship('TapirEmailChangeTokens', back_populates='user')
# tapir_email_templates = relationship('TapirEmailTemplates', foreign_keys='[TapirEmailTemplates.created_by]', back_populates='tapir_users')
# tapir_email_templates_ = relationship('TapirEmailTemplates', foreign_keys='[TapirEmailTemplates.updated_by]', back_populates='tapir_users_')
# tapir_email_tokens = relationship('TapirEmailTokens', back_populates='user')
# tapir_nicknames = relationship('TapirNicknames', back_populates='user', uselist=False)
# tapir_phone = relationship('TapirPhone', back_populates='user')
# tapir_recovery_tokens = relationship('TapirRecoveryTokens', back_populates='user')
# tapir_sessions = relationship('TapirSessions', back_populates='user')
# arXiv_cross_control = relationship('CrossControl', back_populates='user')
# arXiv_endorsement_requests = relationship('EndorsementRequests', back_populates='endorsee')
# arXiv_jref_control = relationship('JrefControl', back_populates='user')
# arXiv_metadata = relationship('Metadata', back_populates='submitter')
# arXiv_show_email_requests = relationship('ShowEmailRequests', back_populates='user')
# arXiv_submission_control = relationship('SubmissionControl', back_populates='user')
# arXiv_submissions = relationship('Submissions', back_populates='submitter')
# tapir_admin_audit = relationship('TapirAdminAudit', foreign_keys='[TapirAdminAudit.admin_user]', back_populates='tapir_users')
# tapir_admin_audit_ = relationship('TapirAdminAudit', foreign_keys='[TapirAdminAudit.affected_user]', back_populates='tapir_users_')
# tapir_email_mailings = relationship('TapirEmailMailings', foreign_keys='[TapirEmailMailings.created_by]', back_populates='tapir_users')
# tapir_email_mailings_ = relationship('TapirEmailMailings', foreign_keys='[TapirEmailMailings.sent_by]', back_populates='tapir_users_')
# tapir_permanent_tokens = relationship('TapirPermanentTokens', back_populates='user')
# tapir_recovery_tokens_used = relationship('TapirRecoveryTokensUsed', back_populates='user')

# endorsee_of = relationship('Endorsements', foreign_keys='[Endorsements.endorsee_id]', back_populates='endorsee')
# endorses = relationship('Endorsements', foreign_keys='[Endorsements.endorser_id]', back_populates='endorser')

# arXiv_ownership_requests = relationship('OwnershipRequests', back_populates='user')
# arXiv_submission_category_proposal = relationship('SubmissionCategoryProposal', back_populates='user')
# arXiv_submission_flag = relationship('SubmissionFlag', back_populates='user')
# arXiv_submission_hold_reason = relationship('SubmissionHoldReason', back_populates='user')
# arXiv_submission_view_flag = relationship('SubmissionViewFlag', back_populates='user')

# owned_papers = relationship("PaperOwners", foreign_keys="[PaperOwners.user_id]", back_populates="owner")

# demographics = relationship('Demographics', foreign_keys="[Demographics.user_id]", uselist=False)

# @property
# def display_name(self):
# return f"{self.first_name} {self.last_name}"

# @property
# def nickname(self):
# """Gets user's nickname.

# This will query out to the DB if the tapir_nicknames isn't already loaded.
# Do that with `.options(loadjoin(TapirUsers.tapir_nicknames))`.
# """
# try:
# return self.tapir_nicknames.nickname
# except ValueError:
# return f"no-nick-{self.user_id}"

9 changes: 1 addition & 8 deletions admin_webapp/routes/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def auth_status() -> Response:


@blueprint.route('/protected')
@scoped()
# @scoped()
def an_example() -> Response:
"""Example of a protected page.
Expand All @@ -237,13 +237,6 @@ def an_example() -> Response:
return render_template('tapir-landing.html')
# return make_response("This is an example of a protected page.")

# @blueprint.route('/administrators')
# @scoped
# def administrators() -> Response:
# """
# Show administrators view
# """
# return render_template()

@blueprint.route('/auth/v2/dev')
def dev() -> Response:
Expand Down
13 changes: 12 additions & 1 deletion admin_webapp/routes/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from flask import Blueprint, render_template, Response, request

from admin_webapp.controllers.users import administrator_listing, administrator_edit_sys_listing, suspect_listing, user_profile
from admin_webapp.controllers.users import administrator_listing, administrator_edit_sys_listing, suspect_listing, user_profile, moderator_listing

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

Expand Down Expand Up @@ -54,3 +54,14 @@ def suspects() -> Response:
data = suspect_listing(per_page, page)
data['title'] = "Suspects"
return render_template('user/list.html', **data)

@blueprint.route('/moderators', methods=['GET'])
def moderators() -> Response:
"""
Show moderators view
No pagination
"""
args = request.args
data = moderator_listing()
data['title'] = "Moderators"
return render_template('user/moderators.html', **data)
20 changes: 11 additions & 9 deletions admin_webapp/templates/user/display.html
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,23 @@ <h1>Single User Display: not yet implemented</h1>
<td valign="top">
<span class="label">Veto Status</span>: {{ demographics.veto_status }} [<a href="[% c.uri_for('change_veto_status', user_id) %]">Change status</a>]<br />
<span class="label">Proxy?</span>: {% if demographics.flag_proxy %}Y{% else %}N{% endif %} [<a href="[% c.uri_for('flip', 'proxy', user_id) %]">flip</a>]
<span class="label">Flagged?</span>: [% IF user.ext.flag_suspect %]Y[% ELSE %]N[% END %] [<a href="[% c.uri_for('flip', 'suspect', user_id) %]">flip</a>]<br />
<span class="label">Allow TeX Produced?</span>: [% IF user.flag_allow_tex_produced %]Y[% ELSE %]N[% END %] [<a href="/admin/user/[% user.id %]/allow_tex_produced">flip</a>]<br />
<span class="label">Flagged?</span>: {% if demographics.flag_suspect %}Y{% else %}N{% endif %} [<a href="[% c.uri_for('flip', 'suspect', user_id) %]">flip</a>]<br />
<span class="label">Allow TeX Produced?</span>: {% if user.flag_allow_tex_produced %}Y{% else %}N{% endif %} [<a href="/admin/user/[% user.id %]/allow_tex_produced">flip</a>]<br />

<span class="badColor"><span class="label">Test?</span>:
[% IF user.ext.flag_group_test %]Y[% ELSE %]N[% END %]</span>
{% if demographics.flag_group_test %}Y{% else %}N{% endif %}</span>
[<a href="[% c.uri_for('flip', 'test', user_id) %]">flip</a>]<br />
<span class="label">Default Category</span>: [% user.ext.subject_class %]<br />
<span class="label">Groups</span>: cs,math,physics,q-bio,test<br />
<span class="label">Career Status</span>: [% user_status_type %]&nbsp;&nbsp;
<span class="label">Default Category</span>: {{ demographics.subject_class }}<br />
<!-- TODO: fix hardcoding Groups -->
<span class="label">Groups</span>: cs,math,physics,q-bio,test<br />
<!-- TODO: decide where to convert to rank name -->
<span class="label">Career Status</span>: {{ demographics.type }}&nbsp;&nbsp;
</td>
<td>&nbsp;</td>
<td valign="top">
<span class="label">Affiliation</span>: [% user.ext.affiliation %]<br />
<span class="label">Country</span>: [% user.ext.country %]<br />
<span class="label">URL</span>: <i>[% user.ext.url %]</i><br />
<span class="label">Affiliation</span>: {{ demographics.affiliation }}<br />
<span class="label">Country</span>: {{ demographics.country }}<br />
<span class="label">URL</span>: <i>{{ demographics.url }}</i><br />
Viewed Email addresses for <a href="">[% num_emails_requested %]</a> papers.<br /><br>
<form action="/admin/user/[% user.id %]/update_mod_public" method="get">
<input type="hidden" id="flip" name="flip" value="" />
Expand Down
5 changes: 5 additions & 0 deletions admin_webapp/templates/user/moderators.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{%- extends "base.html" -%}
{%- block content -%}
<h1>Moderators by username</h1>
<div>See also moderators by category. There are {{count}} moderators (excluding test categories)</div>
{%- endblock -%}

0 comments on commit 25250d2

Please sign in to comment.