diff --git a/viewer/helpers.py b/viewer/helpers.py new file mode 100644 index 0000000..a073401 --- /dev/null +++ b/viewer/helpers.py @@ -0,0 +1,8 @@ +def get_mediatype(mimetype: str) -> str: + """Simple media type categorization based on the given mimetype""" + if mimetype is not None: + if mimetype.startswith('image'): + return 'image' + elif mimetype.startswith('video'): + return 'video' + return 'file' diff --git a/viewer/templates/base.html b/viewer/templates/base.html new file mode 100644 index 0000000..e03a51c --- /dev/null +++ b/viewer/templates/base.html @@ -0,0 +1,37 @@ + + + + {% block head %} + + + {{ title }} + + {% endblock head %} + + + +
+
+ {% block content %} + {% endblock %} +
+
+ + + diff --git a/viewer/templates/browse.html b/viewer/templates/browse.html new file mode 100644 index 0000000..eebe1ae --- /dev/null +++ b/viewer/templates/browse.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} +{% block content %} +
+
+ Files + + {{ files|length }} + + + + + + +
+ {% for file in files %} +
+ + + + {{ file.0 }} +
+ {% endfor %} +
+{% endblock content %} diff --git a/viewer/templates/index.html b/viewer/templates/index.html new file mode 100644 index 0000000..e07255f --- /dev/null +++ b/viewer/templates/index.html @@ -0,0 +1,24 @@ +{% extends 'base.html' %} +{% block head %} + {{ block.super }} + +{% endblock head %} +{% block content %} +
+
Directories
+ {% for served_directory in directories %} +
+ + + + + {{ served_directory.path }} + +
+ {% endfor %} +
+{% endblock content %} diff --git a/viewer/templates/message.html b/viewer/templates/message.html new file mode 100644 index 0000000..d3be1c6 --- /dev/null +++ b/viewer/templates/message.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} +{% block content %} +
+
+

+ {{ title }} +

+
+
+
+ {{ message }} +
+
+
+{% endblock content %} diff --git a/viewer/urls.py b/viewer/urls.py index 2fcca0d..c6bf29a 100644 --- a/viewer/urls.py +++ b/viewer/urls.py @@ -3,5 +3,6 @@ from django.urls import path from . import views urlpatterns = [ - path('', views.index, name='index') + path('', views.index, name='index'), + path('//', views.browse, name='browse'), ] diff --git a/viewer/views.py b/viewer/views.py index e00860a..ae250e2 100644 --- a/viewer/views.py +++ b/viewer/views.py @@ -1,7 +1,39 @@ -from django.shortcuts import render +import mimetypes +import os + +from django.http import FileResponse +from django.shortcuts import render, get_object_or_404 + +from viewer.helpers import get_mediatype +from viewer.models import ServedDirectory -from django.http import HttpResponse def index(request): """Index view for the simple-viewer project.""" - return HttpResponse('Hello, World.') + directories = ServedDirectory.objects.all() + context = {'title': 'Index', + 'directories': directories} + return render(request, 'index.html', context) + + +def browse(request, directory_id): + dir = get_object_or_404(ServedDirectory, id=directory_id) + + if os.path.isdir(dir.path): + files = [ + (file, get_mediatype(mimetypes.guess_type(file)[0])) for file in os.listdir(dir.path) + ] + context = { + 'title': f'Browse - {os.path.dirname(dir.path)}', + 'files': files, + 'directory': dir + } + return render(request, 'browse.html', context) + else: + context = { + 'title': 'Invalid Directory', + 'message': 'The path this server directory points to {}.'.format( + 'exists, but is not a directory' if os.path.exists(dir.path) else 'does not exist' + ) + } + return render(request, 'message.html', context, status=500)