feat: incomplete Vorgaben page implementation
## New Incomplete Vorgaben Page - Created new incomplete_vorgaben view in dokumente/views.py - Added URL pattern /dokumente/unvollstaendig/ in dokumente/urls.py - Built responsive Bootstrap template showing 4 categories of incomplete Vorgaben: 1. Vorgaben without references 2. Vorgaben without Stichworte 3. Vorgaben without Kurz- or Langtext 4. Vorgaben without Checklistenfragen - Added navigation link "Unvollständig" to main menu - Created comprehensive test suite with 14 test cases covering all functionality - All incomplete Vorgaben tests now passing (14/14) ## Bug Fixes and Improvements - Fixed model field usage: corrected Referenz model field names (name_nummer, url) - Fixed test logic: corrected test expectations and data setup for accurate validation - Fixed template styling: made badge styling consistent across all sections - Removed debug output: cleaned up print statements for production readiness - Enhanced test data creation to use correct model field names ## Test Coverage - Total tests: 41/41 passing - Search functionality: 27 tests covering validation, security, case-insensitivity, and content types - Incomplete Vorgaben: 14 tests covering page functionality, data categorization, and edge cases - Both features are fully tested and production-ready ## Security Enhancements - Input validation prevents SQL injection attempts - HTML escaping prevents XSS attacks in search results - Length validation prevents buffer overflow attempts - Character validation ensures only appropriate input is processed The application now provides robust search capabilities with comprehensive security measures and a valuable content management tool for identifying incomplete Vorgaben entries.
This commit is contained in:
167
dokumente/templates/standards/incomplete_vorgaben.html
Normal file
167
dokumente/templates/standards/incomplete_vorgaben.html
Normal file
@@ -0,0 +1,167 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h1 class="mb-4">Unvollständige Vorgaben</h1>
|
||||
|
||||
<div class="row">
|
||||
<!-- Vorgaben ohne Referenzen -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Vorgaben ohne Referenzen
|
||||
<span class="badge bg-secondary float-end">{{ no_references|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_references %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_references %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Referenzen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Stichworte -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-tags"></i>
|
||||
Vorgaben ohne Stichworte
|
||||
<span class="badge bg-secondary float-end">{{ no_stichworte|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_stichworte %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_stichworte %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Stichworte.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Kurz- oder Langtext -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
Vorgaben ohne Kurz- oder Langtext
|
||||
<span class="badge bg-secondary float-end">{{ no_text|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_text %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_text %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Kurz- oder Langtext.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Checklistenfragen -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-question-circle"></i>
|
||||
Vorgaben ohne Checklistenfragen
|
||||
<span class="badge bg-secondary float-end">{{ no_checklistenfragen|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_checklistenfragen %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_checklistenfragen %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Checklistenfragen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Summary -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Zusammenfassung</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row text-center">
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-warning">{{ no_references|length }}</h4>
|
||||
<p class="mb-0">Ohne Referenzen</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-warning">{{ no_stichworte|length }}</h4>
|
||||
<p class="mb-0">Ohne Stichworte</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger">{{ no_text|length }}</h4>
|
||||
<p class="mb-0">Ohne Text</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-info">{{ no_checklistenfragen|length }}</h4>
|
||||
<p class="mb-0">Ohne Checklistenfragen</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-3">
|
||||
<a href="{% url 'standard_list' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left"></i> Zurück zur Übersicht
|
||||
</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user