diff --git a/.dockerignore b/.dockerignore index e980b6d7c..1e4723614 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,4 +9,6 @@ build .env .idea .env.example - +ENV +.venv +venv diff --git a/deployment/compose/nginx.conf b/deployment/compose/nginx.conf index 0be1bc301..0dd12a5c6 100644 --- a/deployment/compose/nginx.conf +++ b/deployment/compose/nginx.conf @@ -16,4 +16,9 @@ server { expires 1d; add_header Cache-Control "public"; } + + location /usercontent/ { + internal; + alias /var/ephios/data/private/media/; + } } diff --git a/ephios/plugins/files/__init__.py b/ephios/plugins/files/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ephios/plugins/files/admin.py b/ephios/plugins/files/admin.py new file mode 100644 index 000000000..568ace12f --- /dev/null +++ b/ephios/plugins/files/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from ephios.plugins.files.models import Document + +admin.site.register(Document) diff --git a/ephios/plugins/files/apps.py b/ephios/plugins/files/apps.py new file mode 100644 index 000000000..acb17cf11 --- /dev/null +++ b/ephios/plugins/files/apps.py @@ -0,0 +1,15 @@ +from django.utils.translation import gettext_lazy as _ + +from ephios.core.plugins import PluginConfig + + +class PluginApp(PluginConfig): + name = "ephios.plugins.files" + + class EphiosPluginMeta: + name = _("Files") + author = "Ephios Team" + description = _("This plugins allows you to upload files and link to them in events.") + + def ready(self): + from . import signals # pylint: disable=unused-import diff --git a/ephios/plugins/files/migrations/0001_initial.py b/ephios/plugins/files/migrations/0001_initial.py new file mode 100644 index 000000000..cad424828 --- /dev/null +++ b/ephios/plugins/files/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# Generated by Django 5.0.8 on 2024-09-21 12:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Document", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + ("title", models.CharField(max_length=255)), + ("file", models.FileField(upload_to="documents/")), + ], + ), + ] diff --git a/ephios/plugins/files/migrations/__init__.py b/ephios/plugins/files/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ephios/plugins/files/models.py b/ephios/plugins/files/models.py new file mode 100644 index 000000000..e57f0aa0e --- /dev/null +++ b/ephios/plugins/files/models.py @@ -0,0 +1,9 @@ +from django.db import models + + +class Document(models.Model): + title = models.CharField(max_length=255) + file = models.FileField(upload_to="documents/") + + def __str__(self): + return self.title diff --git a/ephios/plugins/files/signals.py b/ephios/plugins/files/signals.py new file mode 100644 index 000000000..e69de29bb diff --git a/ephios/plugins/files/urls.py b/ephios/plugins/files/urls.py new file mode 100644 index 000000000..c1e4ba375 --- /dev/null +++ b/ephios/plugins/files/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from ephios.plugins.files.views import DocumentView + +app_name = "files" +urlpatterns = [ + path("documents//", DocumentView.as_view(), name="document"), +] diff --git a/ephios/plugins/files/views.py b/ephios/plugins/files/views.py new file mode 100644 index 000000000..e2033c704 --- /dev/null +++ b/ephios/plugins/files/views.py @@ -0,0 +1,20 @@ +import os + +from django.conf import settings +from django.http import HttpResponse +from django.shortcuts import get_object_or_404 +from django.views import View +from guardian.mixins import LoginRequiredMixin + +from ephios.plugins.files.models import Document + + +class DocumentView(View, LoginRequiredMixin): + def get(self, request, *args, **kwargs): + document = get_object_or_404(Document, id=kwargs["pk"]) + response = HttpResponse() + response["Content-Disposition"] = ( + "attachment; filename=" + os.path.split(document.file.name)[1] + ) + response["X-Accel-Redirect"] = settings.MEDIA_URL + document.file.name + return response diff --git a/ephios/settings.py b/ephios/settings.py index 0a341d38b..51866eef2 100644 --- a/ephios/settings.py +++ b/ephios/settings.py @@ -107,6 +107,7 @@ "ephios.plugins.eventautoqualification.apps.PluginApp", "ephios.plugins.simpleresource.apps.PluginApp", "ephios.plugins.federation.apps.PluginApp", + "ephios.plugins.files.apps.PluginApp", ] PLUGINS = copy.copy(CORE_PLUGINS) for ep in metadata.entry_points(group="ephios.plugins"): @@ -224,6 +225,7 @@ # https://docs.djangoproject.com/en/3.0/howto/static-files/ STATIC_URL = env.str("STATIC_URL", default="/static/") +MEDIA_URL = env.str("MEDIA_URL", default="/usercontent/") STATICFILES_DIRS = (os.path.join(BASE_DIR, "ephios/static"),) STATICFILES_FINDERS = (