feat: dup report
This commit is contained in:
@@ -49,6 +49,15 @@ def create_report():
|
|||||||
active_sites = PartnerSite.query.filter_by(is_active=True).order_by(PartnerSite.name).all()
|
active_sites = PartnerSite.query.filter_by(is_active=True).order_by(PartnerSite.name).all()
|
||||||
form.reported_pt_site.choices = [(site.name, site.name) for site in active_sites]
|
form.reported_pt_site.choices = [(site.name, site.name) for site in active_sites]
|
||||||
if form.validate_on_submit():
|
if form.validate_on_submit():
|
||||||
|
# 检查是否已有针对该邮箱的活跃举报
|
||||||
|
existing_report = Report.query.filter_by(
|
||||||
|
reported_email=form.reported_email.data,
|
||||||
|
status='pending'
|
||||||
|
).first()
|
||||||
|
if existing_report:
|
||||||
|
flash(f'该邮箱已有待审核的举报 (#{existing_report.id}),请勿重复提交。', 'warning')
|
||||||
|
return render_template('create_report.html', form=form)
|
||||||
|
|
||||||
# 1. 创建 Report 对象
|
# 1. 创建 Report 对象
|
||||||
new_report = Report(
|
new_report = Report(
|
||||||
reporter_id=current_user.id,
|
reporter_id=current_user.id,
|
||||||
@@ -135,12 +144,19 @@ def report_detail(report_id):
|
|||||||
|
|
||||||
comments = report.comments.order_by(Comment.created_at.desc()).all()
|
comments = report.comments.order_by(Comment.created_at.desc()).all()
|
||||||
|
|
||||||
|
# 查找针对同一邮箱的其他举报
|
||||||
|
related_reports = Report.query.filter(
|
||||||
|
Report.reported_email == report.reported_email,
|
||||||
|
Report.id != report.id
|
||||||
|
).order_by(Report.created_at.desc()).all()
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
'admin/report_detail.html',
|
'admin/report_detail.html',
|
||||||
report=report,
|
report=report,
|
||||||
form=comment_form,
|
form=comment_form,
|
||||||
revoke_form=revoke_form,
|
revoke_form=revoke_form,
|
||||||
comments=comments
|
comments=comments,
|
||||||
|
related_reports=related_reports
|
||||||
)
|
)
|
||||||
# === 独立的举报处理视图 (仅限 Admin) ===
|
# === 独立的举报处理视图 (仅限 Admin) ===
|
||||||
# 这个视图只处理动作,不渲染页面。它接收来自详情页按钮的 POST 请求。
|
# 这个视图只处理动作,不渲染页面。它接收来自详情页按钮的 POST 请求。
|
||||||
@@ -170,9 +186,29 @@ def process_report(report_id):
|
|||||||
username=report.reported_username or None
|
username=report.reported_username or None
|
||||||
)
|
)
|
||||||
db.session.add(new_blacklist_entry)
|
db.session.add(new_blacklist_entry)
|
||||||
flash('举报已批准,并已将相关信息添加到黑名单。', 'success')
|
|
||||||
|
# 自动处理同一邮箱的其他待审核举报
|
||||||
|
other_pending = Report.query.filter(
|
||||||
|
Report.reported_email == report.reported_email,
|
||||||
|
Report.id != report.id,
|
||||||
|
Report.status == 'pending'
|
||||||
|
).all()
|
||||||
|
|
||||||
|
for other_report in other_pending:
|
||||||
|
other_report.status = 'approved'
|
||||||
|
comment = Comment(
|
||||||
|
body=f'该举报已自动批准(关联举报 #{report.id} 已确认违规)',
|
||||||
|
report=other_report,
|
||||||
|
author=current_user._get_current_object()
|
||||||
|
)
|
||||||
|
db.session.add(comment)
|
||||||
|
|
||||||
|
if other_pending:
|
||||||
|
flash(f'举报已批准,并已将相关信息添加到黑名单。同时自动处理了 {len(other_pending)} 个相关举报。', 'success')
|
||||||
|
else:
|
||||||
|
flash('举报已批准,并已将相关信息添加到黑名单。', 'success')
|
||||||
else:
|
else:
|
||||||
flash('举报状态已更新为“批准”。该举报已在黑名单中,无需重复添加。', 'info')
|
flash('举报状态已更新为"批准"。该举报已在黑名单中,无需重复添加。', 'info')
|
||||||
elif action == 'invalidate':
|
elif action == 'invalidate':
|
||||||
report.status = 'rejected'
|
report.status = 'rejected'
|
||||||
flash('举报状态已更新为“无效”。', 'success')
|
flash('举报状态已更新为“无效”。', 'success')
|
||||||
|
|||||||
@@ -59,6 +59,23 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if related_reports %}
|
||||||
|
<div class="card shadow-sm mb-4">
|
||||||
|
<div class="card-header"><h5 class="mb-0">相关举报 (同一邮箱)</h5></div>
|
||||||
|
<div class="list-group list-group-flush">
|
||||||
|
{% for r in related_reports %}
|
||||||
|
<a href="{{ url_for('main.report_detail', report_id=r.id) }}" class="list-group-item list-group-item-action">
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<span><strong>#{{ r.id }}</strong> - {{ r.reason_category | translate_reason }}</span>
|
||||||
|
<span class="badge bg-secondary">{{ r.status | translate_status }}</span>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted">{{ r.created_at.strftime('%Y-%m-%d') }} | 举报人: {{ r.reporter.username }}</small>
|
||||||
|
</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 右侧评论区 -->
|
<!-- 右侧评论区 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user