@@ -253,3 +295,41 @@
{% endmacro %}
+{% macro render_filter_field(field_name, label, options, current_value) %}
+
+
+
+
+{% endmacro %}
+
+{% macro render_date_filter_field(field_name, label, current_value) %}
+
+
+
+
+{% endmacro %}
+
+{% macro render_collapsible_section(id, title, content) %}
+
+{% endmacro %}
+
diff --git a/eveai_app/templates/navbar.html b/eveai_app/templates/navbar.html
index d6b6801..fde2711 100644
--- a/eveai_app/templates/navbar.html
+++ b/eveai_app/templates/navbar.html
@@ -86,6 +86,7 @@
{'name': 'Add a list of URLs', 'url': '/document/add_urls', 'roles': ['Super User', 'Tenant Admin']},
{'name': 'Add Youtube Document' , 'url': '/document/add_youtube', 'roles': ['Super User', 'Tenant Admin']},
{'name': 'All Documents', 'url': '/document/documents', 'roles': ['Super User', 'Tenant Admin']},
+ {'name': 'All Document Versions', 'url': '/document/document_versions_list', 'roles': ['Super User', 'Tenant Admin']},
{'name': 'Library Operations', 'url': '/document/library_operations', 'roles': ['Super User', 'Tenant Admin']},
]) }}
{% endif %}
diff --git a/eveai_app/templates/scripts.html b/eveai_app/templates/scripts.html
index 732c509..c5fe94b 100644
--- a/eveai_app/templates/scripts.html
+++ b/eveai_app/templates/scripts.html
@@ -12,3 +12,4 @@
+
diff --git a/eveai_app/views/document_version_list_view.py b/eveai_app/views/document_version_list_view.py
new file mode 100644
index 0000000..f851ba2
--- /dev/null
+++ b/eveai_app/views/document_version_list_view.py
@@ -0,0 +1,83 @@
+from datetime import datetime
+from flask import request, render_template, session
+from sqlalchemy import desc, asc
+
+from common.models.document import DocumentVersion, Document
+from common.utils.filtered_list_view import FilteredListView
+from common.utils.view_assistants import prepare_table_for_macro
+
+
+class DocumentVersionListView(FilteredListView):
+ allowed_filters = ['file_type', 'processing', 'processing_error']
+ allowed_sorts = ['id', 'processing_started_at', 'processing_finished_at', 'processing_error']
+
+ def get_query(self):
+ return DocumentVersion.query.join(Document).filter(Document.tenant_id == session.get('tenant', {}).get('id'))
+
+ def apply_filters(self, query):
+ filters = request.args.to_dict()
+
+ if filters.get('file_type'):
+ query = query.filter(DocumentVersion.file_type == filters['file_type'])
+
+ if filters.get('processing'):
+ query = query.filter(DocumentVersion.processing == (filters['processing'] == 'true'))
+
+ if filters.get('processing_error'):
+ if filters['processing_error'] == 'true':
+ query = query.filter(DocumentVersion.processing_error.isnot(None))
+ elif filters['processing_error'] == 'false':
+ query = query.filter(DocumentVersion.processing_error.is_(None))
+
+ if filters.get('start_date'):
+ query = query.filter(
+ DocumentVersion.processing_started_at >= datetime.strptime(filters['start_date'], '%Y-%m-%d'))
+
+ if filters.get('end_date'):
+ query = query.filter(
+ DocumentVersion.processing_finished_at <= datetime.strptime(filters['end_date'], '%Y-%m-%d'))
+
+ return query
+
+ def apply_sorting(self, query):
+ sort_by = request.args.get('sort_by', 'id')
+ sort_order = request.args.get('sort_order', 'asc')
+
+ if sort_by in self.allowed_sorts:
+ column = getattr(DocumentVersion, sort_by)
+ if sort_order == 'asc':
+ query = query.order_by(asc(column))
+ elif sort_order == 'desc':
+ query = query.order_by(desc(column))
+
+ return query
+
+ def get(self):
+ query = self.get_query()
+ query = self.apply_filters(query)
+ query = self.apply_sorting(query)
+ pagination = self.paginate(query)
+
+ rows = prepare_table_for_macro(
+ pagination.items,
+ [('id', ''), ('file_type', ''), ('processing', ''),
+ ('processing_started_at', ''), ('processing_finished_at', ''),
+ ('processing_error', '')]
+ )
+
+ context = {
+ 'rows': rows,
+ 'pagination': pagination,
+ 'filters': request.args.to_dict(),
+ 'sort_by': request.args.get('sort_by', 'id'),
+ 'sort_order': request.args.get('sort_order', 'asc'),
+ 'filter_options': self.get_filter_options()
+ }
+ return render_template(self.template, **context)
+
+ def get_filter_options(self):
+ return {
+ 'file_type': [('pdf', 'PDF'), ('docx', 'DOCX')],
+ 'processing': [('true', 'Processing'), ('false', 'Not Processing')],
+ 'processing_error': [('true', 'With Errors'), ('false', 'Without Errors')]
+ }
\ No newline at end of file
diff --git a/eveai_app/views/document_views.py b/eveai_app/views/document_views.py
index e2b9611..47f84a1 100644
--- a/eveai_app/views/document_views.py
+++ b/eveai_app/views/document_views.py
@@ -24,6 +24,7 @@ from common.utils.middleware import mw_before_request
from common.utils.celery_utils import current_celery
from common.utils.nginx_utils import prefixed_url_for
from common.utils.view_assistants import form_validation_failed, prepare_table_for_macro, form_to_dict
+from .document_version_list_view import DocumentVersionListView
document_bp = Blueprint('document_bp', __name__, url_prefix='/document')
@@ -388,6 +389,15 @@ def handle_library_selection():
return redirect(prefixed_url_for('document_bp.library_operations'))
+@document_bp.route('/document_versions_list', methods=['GET'])
+@roles_accepted('Super User', 'Tenant Admin')
+def document_versions_list():
+ current_app.logger.debug('Getting document versions list')
+ view = DocumentVersionListView(DocumentVersion, 'document/document_versions_list_view.html', per_page=20)
+ current_app.logger.debug('Got document versions list')
+ return view.get()
+
+
def refresh_all_documents():
for doc in Document.query.all():
refresh_document(doc.id)