This commit is contained in:
Iliyan Angelov
2025-11-26 22:32:20 +02:00
commit ed94dd22dd
150 changed files with 14058 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
{% extends 'base.html' %}
{% block title %}Одобряване на Доклад - Официален Портал{% endblock %}
{% block content %}
<div class="form-container">
<h2>Одобряване на Доклад</h2>
<div class="gov-alert gov-alert-info">
<div class="alert-icon"></div>
<div class="alert-content">
<p>Сигурни ли сте, че искате да одобрите този доклад?</p>
<p><strong>{{ object.title }}</strong></p>
<p>Това ще маркира доклада като потвърден и ще го направи видим за обществеността.</p>
</div>
</div>
<form method="post" data-loading>
{% csrf_token %}
<div class="form-actions">
<button type="submit" class="btn btn-success" data-tooltip="Докладът ще бъде маркиран като потвърден">Да, Одобрявам</button>
<a href="{% url 'moderation:report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
</div>
</form>
</div>
{% endblock %}

View File

@@ -0,0 +1,65 @@
{% extends 'base.html' %}
{% block title %}Табло за Модерация - Официален Портал{% endblock %}
{% block content %}
<div class="gov-card">
<div class="gov-card-header">
<h2>Табло за Модерация</h2>
</div>
<div class="gov-card-body">
<div class="stats-grid">
<div class="stat-card">
<h3>{{ pending_count|default:0 }}</h3>
<p>Чакащи Доклади</p>
<a href="{% url 'moderation:queue' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Преглед на Опашката</a>
</div>
<div class="stat-card">
<h3>{{ under_review_count|default:0 }}</h3>
<p>В Преглед</p>
</div>
<div class="stat-card">
<h3>{{ verified_count|default:0 }}</h3>
<p>Потвърдени Доклади</p>
</div>
<div class="stat-card">
<h3>🤖 OSINT</h3>
<p>Автоматични Доклади</p>
<a href="{% url 'osint:auto_report_list' %}" class="btn btn-sm btn-primary" style="margin-top: 1rem;">Преглед на OSINT</a>
</div>
</div>
</div>
</div>
<div class="gov-card">
<div class="gov-card-header">
<h2>Последни Доклади</h2>
</div>
<div class="gov-card-body">
{% if reports %}
<div class="reports-list">
{% for report in reports %}
<div class="report-card">
<div class="report-header">
<h3><a href="{% url 'moderation:report_detail' report.pk %}">{{ report.title }}</a></h3>
<span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span>
</div>
<div class="report-meta">
<span>{{ report.created_at|date:"d F Y, H:i" }}</span>
<span>{{ report.get_scam_type_display }}</span>
</div>
<div class="report-actions">
<a href="{% url 'moderation:report_detail' report.pk %}" class="btn btn-sm btn-primary">Преглед</a>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="empty-state">
<p>Няма доклади, чакащи преглед.</p>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,52 @@
{% extends 'base.html' %}
{% block title %}Опашка за Модерация - Официален Портал{% endblock %}
{% block content %}
<div class="gov-card">
<div class="gov-card-header">
<h2>Опашка за Модерация</h2>
</div>
<div class="gov-card-body">
{% if queue_items %}
<div class="reports-list">
{% for item in queue_items %}
<div class="queue-item">
<div class="queue-item-header">
<h3><a href="{% url 'moderation:report_detail' item.report.pk %}">{{ item.report.title }}</a></h3>
<span class="badge badge-priority-{{ item.priority }}">{{ item.get_priority_display }}</span>
</div>
<div class="queue-item-meta">
<span>Изпратено: {{ item.report.created_at|date:"d F Y, H:i" }}</span>
<span>Вид: {{ item.report.get_scam_type_display }}</span>
{% if item.assigned_to %}
<span>Назначено на: {{ item.assigned_to.username }}</span>
{% endif %}
</div>
<div class="queue-item-actions">
<a href="{% url 'moderation:report_detail' item.report.pk %}" class="btn btn-primary">Преглед</a>
</div>
</div>
{% endfor %}
</div>
<div class="pagination">
{% if page_obj.has_previous %}
<a href="?page=1" class="btn btn-secondary">Първа</a>
<a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">Предишна</a>
{% endif %}
<span class="page-info">Страница {{ page_obj.number }} от {{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">Следваща</a>
<a href="?page={{ page_obj.paginator.num_pages }}" class="btn btn-secondary">Последна</a>
{% endif %}
</div>
{% else %}
<div class="empty-state">
<p>Опашката за модерация е празна. Всички доклади са прегледани.</p>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,37 @@
{% extends 'base.html' %}
{% block title %}Отхвърляне на Доклад - Официален Портал{% endblock %}
{% block content %}
<div class="form-container">
<h2>Отхвърляне на Доклад</h2>
<div class="gov-alert gov-alert-warning">
<div class="alert-icon"></div>
<div class="alert-content">
<p>Сигурни ли сте, че искате да отхвърлите този доклад?</p>
<p><strong>{{ object.title }}</strong></p>
</div>
</div>
<form method="post" data-loading>
{% csrf_token %}
<div class="form-group">
<label for="id_reason">Причина за Отхвърляне <span style="color: var(--gov-danger);">*</span></label>
<textarea name="reason" id="id_reason" class="form-control" rows="5" placeholder="Моля, предоставете ясна и конструктивна причина за отхвърляне на доклада. Тази информация ще бъде видима за автора на доклада и ще му помогне да разбере какво трябва да подобри." required data-tooltip="Причината ще бъде видима за автора на доклада"></textarea>
<small class="form-text" style="color: var(--gov-gray); margin-top: 0.5rem;">
<strong>Важно:</strong> Причината е задължителна и ще бъде показана на потребителя. Бъдете ясни и конструктивни, за да помогнете на потребителя да разбере какво трябва да подобри.
</small>
</div>
<div class="form-group">
<label for="id_notes">Допълнителни Бележки (незадължително)</label>
<textarea name="notes" id="id_notes" class="form-control" rows="3" placeholder="Вътрешни бележки, които няма да бъдат видими за потребителя"></textarea>
<small class="form-text" style="color: var(--gov-gray);">Тези бележки са само за модератори и администратори и няма да бъдат видими за автора на доклада.</small>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-danger" data-tooltip="Докладът ще бъде отхвърлен">Да, Отхвърлям</button>
<a href="{% url 'moderation:report_detail' object.pk %}" class="btn btn-secondary">Отказ</a>
</div>
</form>
</div>
{% endblock %}

View File

@@ -0,0 +1,103 @@
{% extends 'base.html' %}
{% block title %}Преглед на Доклад - Официален Портал{% endblock %}
{% block content %}
<div class="gov-card">
<div class="gov-card-header">
<h2>{{ report.title }}</h2>
<div style="display: flex; gap: 1rem;">
<a href="{% url 'moderation:approve' report.pk %}" class="btn btn-success">Одобряване</a>
<a href="{% url 'moderation:reject' report.pk %}" class="btn btn-danger">Отхвърляне</a>
</div>
</div>
<div class="gov-card-body">
<div class="info-section">
<h3>Информация за Доклада</h3>
<div class="info-grid">
<div><strong>Статус:</strong> <span class="badge badge-{{ report.status }}">{{ report.get_status_display }}</span></div>
<div><strong>Вид:</strong> {{ report.get_scam_type_display }}</div>
<div><strong>Докладвано от:</strong> {{ report.get_reporter_display }}</div>
<div><strong>Изпратено:</strong> {{ report.created_at|date:"d F Y, H:i" }}</div>
</div>
</div>
<div class="info-section">
<h3>Описание</h3>
<p style="line-height: 1.8;">{{ report.description|linebreaks }}</p>
</div>
<div class="info-section">
<h3>Докладвани Обекти</h3>
<ul style="list-style: none; padding: 0;">
{% if report.reported_url %}
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
<strong>URL:</strong> <a href="{{ report.reported_url }}" target="_blank">{{ report.reported_url }}</a>
</li>
{% endif %}
{% if report.reported_email %}
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
<strong>Имейл:</strong> {{ report.reported_email }}
</li>
{% endif %}
{% if report.reported_phone %}
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
<strong>Телефон:</strong> {{ report.reported_phone }}
</li>
{% endif %}
{% if report.reported_company %}
<li style="padding: 0.75rem; background: var(--gov-light); margin-bottom: 0.5rem; border-radius: 6px;">
<strong>Фирма:</strong> {{ report.reported_company }}
</li>
{% endif %}
</ul>
</div>
{% if osint_results %}
<div class="info-section">
<h3>OSINT Резултати</h3>
{% for result in osint_results %}
<div class="verification-item" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px; border-left: 4px solid var(--gov-info);">
<strong>{{ result.get_data_type_display }} ({{ result.source }}):</strong>
<span>Увереност: {{ result.confidence_level }}%</span>
{% if result.is_verified %}
<span class="badge badge-verified">Потвърдено</span>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% if verifications %}
<div class="info-section">
<h3>Проверки</h3>
{% for verification in verifications %}
<div class="verification-item" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px; border-left: 4px solid var(--gov-secondary);">
<strong>{{ verification.get_verification_method_display }}:</strong>
<span>Увереност: {{ verification.confidence_score }}%</span>
{% if verification.notes %}
<p style="margin-top: 0.5rem; color: var(--gov-gray);">{{ verification.notes }}</p>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
{% if moderation_actions %}
<div class="info-section">
<h3>История на Модерацията</h3>
{% for action in moderation_actions %}
<div class="moderation-action" style="padding: 1rem; background: var(--gov-light); margin-bottom: 1rem; border-radius: 8px;">
<strong>{{ action.get_action_type_display }}</strong> от {{ action.moderator.username }}
<span style="color: var(--gov-gray); font-size: 0.9rem;">{{ action.created_at|date:"d F Y, H:i" }}</span>
{% if action.reason %}
<p style="margin-top: 0.5rem; color: var(--gov-gray);">Причина: {{ action.reason }}</p>
{% endif %}
</div>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{% endblock %}