diff --git a/viewer/migrations/0005_serveddirectory_known_subdirectories.py b/viewer/migrations/0005_serveddirectory_known_subdirectories.py new file mode 100644 index 0000000..c321fd9 --- /dev/null +++ b/viewer/migrations/0005_serveddirectory_known_subdirectories.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1.2 on 2020-11-01 01:46 + +from django.db import migrations +import jsonfield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('viewer', '0004_file'), + ] + + operations = [ + migrations.AddField( + model_name='serveddirectory', + name='known_subdirectories', + field=jsonfield.fields.JSONField(default=[], verbose_name='Tracked Subdirectories JSON'), + ), + ] diff --git a/viewer/models.py b/viewer/models.py index ac5378b..a86bdd8 100644 --- a/viewer/models.py +++ b/viewer/models.py @@ -1,4 +1,3 @@ -import json import mimetypes import os import uuid @@ -43,7 +42,7 @@ class ServedDirectory(models.Model): entry = self.files.filter(filename__exact=file).first() if entry is None: # create the file entry - entry = File.create(full_path=file_path) + entry = File.create(full_path=file_path, parent=self) entry.save() else: # directory found, remember it @@ -52,7 +51,6 @@ class ServedDirectory(models.Model): # Dump subdirectories found self.known_subdirectories = directories - def __str__(self): return self.path @@ -64,13 +62,13 @@ class File(models.Model): directory = models.ForeignKey(ServedDirectory, on_delete=models.CASCADE, related_name='files') @classmethod - def create(cls, full_path: str) -> 'File': + def create(cls, full_path: str, parent: ServedDirectory) -> 'File': """Simple shortcut for creating a File database entry with just the path.""" return File( path=full_path, filename=os.path.basename(full_path), mediatype=File.get_mediatype(full_path), - directory=os.path.dirname(full_path) + directory=parent ) def get_url(self, directory: ServedDirectory) -> str: diff --git a/viewer/templates/browse.html b/viewer/templates/browse.html index e823b57..384c2a6 100644 --- a/viewer/templates/browse.html +++ b/viewer/templates/browse.html @@ -21,6 +21,11 @@ {{ files|length }} files + + + + +

diff --git a/viewer/urls.py b/viewer/urls.py index a479eec..89e1f40 100644 --- a/viewer/urls.py +++ b/viewer/urls.py @@ -7,5 +7,6 @@ urlpatterns = [ path('add/', views.add, name='add'), path('add/submit', views.submit_new, name='add_submit'), path('/', views.browse, name='browse'), - path('//', views.file, name='file') + path('//', views.file, name='file'), + path('/refresh', views.refresh, name='refresh') ] diff --git a/viewer/views.py b/viewer/views.py index 712ed85..7fc9a99 100644 --- a/viewer/views.py +++ b/viewer/views.py @@ -4,7 +4,6 @@ from django.http import FileResponse, HttpResponseRedirect from django.shortcuts import render, get_object_or_404 from django.urls import reverse -from viewer.helpers import extra_listdir from viewer.models import ServedDirectory @@ -17,29 +16,29 @@ def index(request): def browse(request, directory_id): - dir = get_object_or_404(ServedDirectory, id=directory_id) + directory = get_object_or_404(ServedDirectory, id=directory_id) - if os.path.isdir(dir.path): + if os.path.isdir(directory.path): context = { - 'title': f'Browse - {os.path.dirname(dir.path)}', - 'files': extra_listdir(dir.path), - 'directory': dir + 'title': f'Browse - {os.path.dirname(directory.path)}', + 'files': directory.files.all(), + 'directory': directory } 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' + 'exists, but is not a directory' if os.path.exists(directory.path) else 'does not exist' ) } return render(request, 'message.html', context, status=500) def file(request, directory_id, file): - dir = get_object_or_404(ServedDirectory, id=directory_id) - if os.path.isdir(dir.path): - path = os.path.join(dir.path, file) + directory = get_object_or_404(ServedDirectory, id=directory_id) + if os.path.isdir(directory.path): + path = os.path.join(directory.path, file) if os.path.exists(path): return FileResponse(open(path, 'rb')) else: @@ -51,7 +50,7 @@ def file(request, directory_id, file): 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' + 'exists, but is not a directory' if os.path.exists(directory.path) else 'does not exist' ) } return render(request, 'message.html', context, status=500) @@ -64,6 +63,13 @@ def add(request): return render(request, 'add.html', context) +def refresh(request, directory_id): + """A simple API view for refreshing a directory. May schedule new thumbnail generation.""" + directory = get_object_or_404(ServedDirectory, id=directory_id) + directory.refresh() + return HttpResponseRedirect(reverse('browse', args=(directory.id,))) + + def submit_new(request): try: s = ServedDirectory(