diff --git a/.gitignore b/.gitignore
index 2b24304..41645d9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ venv
secret.txt
app/local_settings.py
geo/GeoLite2-City.mmdb
+data/
diff --git a/app/event/management/commands/extract_urls.py b/app/event/management/commands/extract_urls.py
new file mode 100644
index 0000000..6215887
--- /dev/null
+++ b/app/event/management/commands/extract_urls.py
@@ -0,0 +1,40 @@
+import csv
+import re
+import sys
+import ox
+
+from django.core.management.base import BaseCommand
+from django.conf import settings
+
+from ... import models
+
+
+class Command(BaseCommand):
+ help = 'extract urls'
+ args = ''
+
+ def add_arguments(self, parser):
+ parser.add_argument('--debug', action='store_true', dest='debug',
+ default=False, help='debug something')
+
+ def handle(self, **options):
+ urls = set()
+ for event in models.Event.objects.all():
+ for url in re.compile('href="(.*?)"').findall(event.body):
+ urls.add(url)
+ for url in re.compile('src="(.*?)"').findall(event.body):
+ urls.add(url)
+
+ writer = csv.writer(sys.stdout)
+ writer.writerow(['url', 'pandora', 'archive'])
+ for url in sorted(urls):
+ url = ox.decode_html(url)
+ if url[0] in ('/', '#'):
+ continue
+ if 'youtube' in url or 'vimeo' in url:
+ p = 'y'
+ else:
+ p = ''
+ writer.writerow([url, p, 'https://web.archive.org/web/*/' + url])
+
+
diff --git a/app/event/migrations/0007_alter_event_options.py b/app/event/migrations/0007_alter_event_options.py
new file mode 100644
index 0000000..05bec62
--- /dev/null
+++ b/app/event/migrations/0007_alter_event_options.py
@@ -0,0 +1,17 @@
+# Generated by Django 4.0.4 on 2022-04-22 17:11
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('event', '0006_event_media_caption'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='event',
+ options={'ordering': ('position', 'date')},
+ ),
+ ]
diff --git a/app/media/__init__.py b/app/media/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/media/admin.py b/app/media/admin.py
new file mode 100644
index 0000000..e66dfa6
--- /dev/null
+++ b/app/media/admin.py
@@ -0,0 +1,10 @@
+from django.contrib import admin
+
+from . import models
+
+
+@admin.decorators.register(models.Image)
+class ImageAdmin(admin.ModelAdmin):
+ search_fields = ['file']
+ list_display = ('image_tag', 'file')
+ readonly_fields = ('image_tag', 'get_absolute_url')
diff --git a/app/media/apps.py b/app/media/apps.py
new file mode 100644
index 0000000..955fd9e
--- /dev/null
+++ b/app/media/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class MediaConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'app.media'
diff --git a/app/media/migrations/0001_initial.py b/app/media/migrations/0001_initial.py
new file mode 100644
index 0000000..71264e0
--- /dev/null
+++ b/app/media/migrations/0001_initial.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-04-22 17:11
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Image',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('created', models.DateTimeField(auto_now_add=True)),
+ ('modified', models.DateTimeField(auto_now=True)),
+ ('file', models.ImageField(blank=True, null=True, upload_to='image')),
+ ],
+ ),
+ ]
diff --git a/app/media/migrations/__init__.py b/app/media/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/media/models.py b/app/media/models.py
new file mode 100644
index 0000000..8062e11
--- /dev/null
+++ b/app/media/models.py
@@ -0,0 +1,25 @@
+from django.db import models
+from django.urls import reverse
+
+
+class Image(models.Model):
+ created = models.DateTimeField(auto_now_add=True)
+ modified = models.DateTimeField(auto_now=True)
+
+ file = models.ImageField(upload_to='image', null=True, blank=True)
+
+ def get_absolute_url(self):
+ return self.file.url
+ get_absolute_url.short_description = 'URL'
+
+ def image_tag(self):
+ from django.utils.html import mark_safe
+ return mark_safe('' % self.get_absolute_url())
+ image_tag.short_description = 'Preview'
+
+ def __str__(self):
+ if self.file:
+ name = self.file.name.split('/')[-1]
+ else:
+ name = 'None'
+ return name
diff --git a/app/media/tests.py b/app/media/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/app/media/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/app/media/views.py b/app/media/views.py
new file mode 100644
index 0000000..91ea44a
--- /dev/null
+++ b/app/media/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/app/settings.py b/app/settings.py
index 6552122..175e39c 100755
--- a/app/settings.py
+++ b/app/settings.py
@@ -41,6 +41,7 @@ INSTALLED_APPS = [
'app.user',
'app.page',
'app.event',
+ 'app.media',
]
@@ -129,6 +130,7 @@ USE_TZ = True
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'www' / 'static'
MEDIA_ROOT = BASE_DIR / 'data' / 'media'
+MEDIA_URL = '/media/'
TITLE = 'Example Timeline'
URL_PREFIX = ''
diff --git a/app/urls.py b/app/urls.py
index 4e9dd1a..433950e 100755
--- a/app/urls.py
+++ b/app/urls.py
@@ -16,7 +16,7 @@ Including another URLconf
from django.contrib import admin
from django.urls import path
from django.conf import settings
-
+from django.conf.urls.static import static
from .event import views as event_views
@@ -25,4 +25,5 @@ urlpatterns = [
path(settings.URL_PREFIX + 'events/', event_views.events, name='event'),
path(settings.URL_PREFIX + 'events/', event_views.events, name='events'),
path(settings.URL_PREFIX + '', event_views.timeline, name='timeline'),
-]
+] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+