mirror of
https://codeberg.org/rimu/pyfedi
synced 2025-01-24 03:43:42 -08:00
bad attitude users - filter by recently active
This commit is contained in:
parent
9933b61c9d
commit
7de1fd7891
4 changed files with 92 additions and 4 deletions
|
@ -533,16 +533,18 @@ def admin_users_trash():
|
||||||
users = users.filter(User.email.ilike(f"%{search}%"))
|
users = users.filter(User.email.ilike(f"%{search}%"))
|
||||||
|
|
||||||
if type == '' or type == 'bad_rep':
|
if type == '' or type == 'bad_rep':
|
||||||
|
users = users.filter(User.last_seen > utcnow() - timedelta(days=7))
|
||||||
users = users.filter(User.reputation < -10)
|
users = users.filter(User.reputation < -10)
|
||||||
users = users.order_by(User.reputation).paginate(page=page, per_page=1000, error_out=False)
|
users = users.order_by(User.reputation).paginate(page=page, per_page=1000, error_out=False)
|
||||||
elif type == 'bad_attitude':
|
elif type == 'bad_attitude':
|
||||||
|
users = users.filter(User.last_seen > utcnow() - timedelta(days=7))
|
||||||
users = users.filter(User.attitude < 0.0)
|
users = users.filter(User.attitude < 0.0)
|
||||||
users = users.order_by(User.attitude).paginate(page=page, per_page=1000, error_out=False)
|
users = users.order_by(User.attitude).paginate(page=page, per_page=1000, error_out=False)
|
||||||
|
|
||||||
next_url = url_for('admin.admin_users_trash', page=users.next_num, search=search, local_remote=local_remote, type=type) if users.has_next else None
|
next_url = url_for('admin.admin_users_trash', page=users.next_num, search=search, local_remote=local_remote, type=type) if users.has_next else None
|
||||||
prev_url = url_for('admin.admin_users_trash', page=users.prev_num, search=search, local_remote=local_remote, type=type) if users.has_prev and page != 1 else None
|
prev_url = url_for('admin.admin_users_trash', page=users.prev_num, search=search, local_remote=local_remote, type=type) if users.has_prev and page != 1 else None
|
||||||
|
|
||||||
return render_template('admin/users.html', title=_('Problematic users'), next_url=next_url, prev_url=prev_url, users=users,
|
return render_template('admin/users_trash.html', title=_('Problematic users'), next_url=next_url, prev_url=prev_url, users=users,
|
||||||
local_remote=local_remote, search=search, type=type,
|
local_remote=local_remote, search=search, type=type,
|
||||||
moderating_communities=moderating_communities(current_user.get_id()),
|
moderating_communities=moderating_communities(current_user.get_id()),
|
||||||
joined_communities=joined_communities(current_user.get_id()),
|
joined_communities=joined_communities(current_user.get_id()),
|
||||||
|
|
|
@ -808,7 +808,10 @@ class User(UserMixin, db.Model):
|
||||||
if total_downvotes == 0: # guard against division by zero
|
if total_downvotes == 0: # guard against division by zero
|
||||||
self.attitude = 1.0
|
self.attitude = 1.0
|
||||||
else:
|
else:
|
||||||
self.attitude = (total_upvotes - total_downvotes) / (total_upvotes + total_downvotes)
|
if total_upvotes + total_downvotes > 2: # Only calculate attitude if they've done 3 or more votes as anything less than this could be an outlier and not representative of their overall attitude
|
||||||
|
self.attitude = (total_upvotes - total_downvotes) / (total_upvotes + total_downvotes)
|
||||||
|
else:
|
||||||
|
self.attitude = 1.0
|
||||||
|
|
||||||
def subscribed(self, community_id: int) -> int:
|
def subscribed(self, community_id: int) -> int:
|
||||||
if community_id is None:
|
if community_id is None:
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
<input type="search" name="search" value="{{ search }}">
|
<input type="search" name="search" value="{{ search }}">
|
||||||
<input type="radio" name="local_remote" value="local" id="local_remote_local" {{ 'checked' if local_remote == 'local' }}><label for="local_remote_local"> Local</label>
|
<input type="radio" name="local_remote" value="local" id="local_remote_local" {{ 'checked' if local_remote == 'local' }}><label for="local_remote_local"> Local</label>
|
||||||
<input type="radio" name="local_remote" value="remote" id="local_remote_remote" {{ 'checked' if local_remote == 'remote' }}><label for="local_remote_remote"> Remote</label>
|
<input type="radio" name="local_remote" value="remote" id="local_remote_remote" {{ 'checked' if local_remote == 'remote' }}><label for="local_remote_remote"> Remote</label>
|
||||||
<input type="radio" name="type" value="bad_rep" id="type_bad_rep" {{ 'checked' if type == 'bad_rep' }}><label for="type_bad_rep"> Bad rep</label>
|
|
||||||
<input type="radio" name="type" value="bad_attitude" id="type_bad_attitude" {{ 'checked' if type == 'bad_attitude' }}><label for="type_bad_attitude"> Bad attitude</label>
|
|
||||||
<input type="submit" name="submit" value="Search" class="btn btn-primary">
|
<input type="submit" name="submit" value="Search" class="btn btn-primary">
|
||||||
</form>
|
</form>
|
||||||
<table class="table table-striped mt-1">
|
<table class="table table-striped mt-1">
|
||||||
|
|
85
app/templates/admin/users_trash.html
Normal file
85
app/templates/admin/users_trash.html
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
{% if theme() and file_exists('app/templates/themes/' + theme() + '/base.html') %}
|
||||||
|
{% extends 'themes/' + theme() + '/base.html' %}
|
||||||
|
{% else %}
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% endif %} %}
|
||||||
|
{% from 'bootstrap/form.html' import render_form %}
|
||||||
|
{% set active_child = 'admin_users' %}
|
||||||
|
|
||||||
|
{% block app_content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h1>{{ _('Users') }}</h1>
|
||||||
|
<a class="btn btn-primary" href="{{ url_for('admin.admin_users_add') }}" style="float: right;">{{ _('Add local user') }}</a>
|
||||||
|
<form method="get">
|
||||||
|
<input type="search" name="search" value="{{ search }}">
|
||||||
|
<input type="radio" name="local_remote" value="local" id="local_remote_local" {{ 'checked' if local_remote == 'local' }}><label for="local_remote_local"> Local</label>
|
||||||
|
<input type="radio" name="local_remote" value="remote" id="local_remote_remote" {{ 'checked' if local_remote == 'remote' }}><label for="local_remote_remote"> Remote</label>
|
||||||
|
<input type="radio" name="type" value="bad_rep" id="type_bad_rep" {{ 'checked' if type == 'bad_rep' }}><label for="type_bad_rep"> Bad rep</label>
|
||||||
|
<input type="radio" name="type" value="bad_attitude" id="type_bad_attitude" {{ 'checked' if type == 'bad_attitude' }}><label for="type_bad_attitude"> Bad attitude</label>
|
||||||
|
<input type="submit" name="submit" value="Search" class="btn btn-primary">
|
||||||
|
</form>
|
||||||
|
<table class="table table-striped mt-1">
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Local/Remote</th>
|
||||||
|
<th>Seen</th>
|
||||||
|
<th>Attitude</th>
|
||||||
|
<th>Rep</th>
|
||||||
|
<th>Banned</th>
|
||||||
|
<th>Reports</th>
|
||||||
|
<th>IP</th>
|
||||||
|
<th>Source</th>
|
||||||
|
<th>Actions</th>
|
||||||
|
</tr>
|
||||||
|
{% for user in users.items %}
|
||||||
|
<tr>
|
||||||
|
<td><img src="{{ user.avatar_thumbnail() }}" class="community_icon rounded-circle" loading="lazy" />
|
||||||
|
{{ user.display_name() }}</td>
|
||||||
|
<td>{{ 'Local' if user.is_local() else 'Remote' }}</td>
|
||||||
|
<td>{% if request.args.get('local_remote', '') == 'local' %}
|
||||||
|
{{ moment(user.last_seen).fromNow() }}
|
||||||
|
{% else %}
|
||||||
|
{{ user.last_seen }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>{{ user.attitude * 100 if user.attitude != 1 }}</td>
|
||||||
|
<td>{{ 'R ' + str(user.reputation) if user.reputation }}</td>
|
||||||
|
<td>{{ '<span class="red">Banned</span>'|safe if user.banned }} </td>
|
||||||
|
<td>{{ user.reports if user.reports > 0 }} </td>
|
||||||
|
<td>{{ user.ip_address if user.ip_address }} </td>
|
||||||
|
<td>{{ user.referrer if user.referrer }} </td>
|
||||||
|
<td><a href="/u/{{ user.link() }}">View local</a> |
|
||||||
|
{% if not user.is_local() %}
|
||||||
|
<a href="{{ user.ap_profile_id }}">View remote</a> |
|
||||||
|
{% else %}
|
||||||
|
View remote |
|
||||||
|
{% endif %}
|
||||||
|
<a href="{{ url_for('admin.admin_user_edit', user_id=user.id) }}">Edit</a> |
|
||||||
|
<a href="{{ url_for('admin.admin_user_delete', user_id=user.id) }}" class="confirm_first">Delete</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
<nav aria-label="Pagination" class="mt-4" role="navigation">
|
||||||
|
{% if prev_url %}
|
||||||
|
<a href="{{ prev_url }}" class="btn btn-primary">
|
||||||
|
<span aria-hidden="true">←</span> {{ _('Previous page') }}
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% if next_url %}
|
||||||
|
<a href="{{ next_url }}" class="btn btn-primary">
|
||||||
|
{{ _('Next page') }} <span aria-hidden="true">→</span>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
{% include 'admin/_nav.html' %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr />
|
||||||
|
{% endblock %}
|
Loading…
Add table
Reference in a new issue