switch to local file storage instead of object storage

This commit is contained in:
2022-02-18 14:18:29 -08:00
parent 45e8ef4dd9
commit 65e724c0aa
10 changed files with 202 additions and 224 deletions

View File

@ -49,7 +49,7 @@ class AudioRssFeed(RSSFeed):
return f'{MP3_URL}{item.mp3}'
def item_enclosure_length(self, item):
return item.image.size
return(item.mp3.size)
def item_enclosure_mime_type(self, item):
return "audio/mpeg"

View File

@ -0,0 +1,30 @@
# Generated by Django 3.2.10 on 2022-02-18 21:38
import audio.models
import django.core.files.storage
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('audio', '0024_auto_20211107_0710'),
]
operations = [
migrations.AlterField(
model_name='episode',
name='image',
field=models.ImageField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(location='/home/trent/trentpalmerdotorg/media/audio/images'), upload_to=audio.models.slugify_file_name),
),
migrations.AlterField(
model_name='episode',
name='mp3',
field=models.FileField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(location='/home/trent/trentpalmerdotorg/media/audio/mp3'), upload_to=audio.models.slugify_file_name),
),
migrations.AlterField(
model_name='feed',
name='image',
field=models.ImageField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(location='/home/trent/trentpalmerdotorg/media/audio/images'), upload_to=audio.models.slugify_file_name),
),
]

View File

@ -3,9 +3,10 @@ from django.conf import settings
from tp.models import UUIDAsIDModel
from django.contrib.auth.models import User
from django.utils.text import slugify
from tp.storage_backends import PublicImageStorage, PublicMP3Storage
from django.core.files.storage import FileSystemStorage
from .choices import LICENSE_CHOICES, get_license_info
import string, random
import string
import random
def rand_slug():
@ -15,7 +16,7 @@ def rand_slug():
def slugify_file_name(instance, filename):
fname, dot, extension = filename.rpartition('.')
slug = slugify(fname)
return f'{slug}.{extension}'
return f"{slug}.{extension}"
class EpisodeAndFeed(UUIDAsIDModel):
@ -27,7 +28,7 @@ class EpisodeAndFeed(UUIDAsIDModel):
description = models.TextField(null=False)
image = models.ImageField(
storage=PublicImageStorage(),
storage=FileSystemStorage(location=settings.IMAGE_ROOT),
upload_to=slugify_file_name,
null=True, blank=True)
@ -95,6 +96,6 @@ class Episode(EpisodeAndFeed):
episode_number = models.IntegerField(null=True)
mp3 = models.FileField(
storage=PublicMP3Storage(),
storage=FileSystemStorage(location=settings.MP3_ROOT),
upload_to=slugify_file_name,
null=True, blank=True)

View File

@ -263,7 +263,6 @@ class TestEditFeedViewTestCase(TestCase):
self.assertEquals(feed_a.original_image_url, "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg")
self.assertEquals(feed_a.image_license, 1)
self.assertEquals(feed_a.image_license_jurisdiction, "in the USA")
self.assertEquals(feed_a.image, 'bicycle.jpg')
self.assertEquals(feed_a.image_license_url, "https://en.wikipedia.org/wiki/Public_domain")
self.assertEquals(feed_a.image_license_name, 'Public Domain')
self.assertEquals(feed_a.license_url, "https://en.wikipedia.org/wiki/Public_domain")
@ -320,7 +319,6 @@ class TestEditFeedViewTestCase(TestCase):
self.assertEquals(feed_a.original_image_url, "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg")
self.assertEquals(feed_a.image_license, 1)
self.assertEquals(feed_a.image_license_jurisdiction, "in the USA")
self.assertEquals(feed_a.image, 'bicycle.jpg')
self.assertEquals(feed_a.image_license_url, "https://en.wikipedia.org/wiki/Public_domain")
self.assertEquals(feed_a.image_license_name, 'Public Domain')
self.assertEquals(feed_a.license_url, "https://en.wikipedia.org/wiki/Public_domain")

View File

@ -131,7 +131,6 @@ class TestNewEpisodeViewTestCase(TestCase):
self.assertEquals(str(episode_a.pub_date), pub_date)
self.assertEquals(episode_a.episode_number, 3)
self.assertEquals(episode_a.description, 'learn how to ride a bicycle')
self.assertEquals(episode_a.mp3, 'mark-twain-taming-the-bicycle.mp3')
self.assertEquals(episode_a.image_title, 'A Penny Farthing')
self.assertEquals(episode_a.image_attribution, 'Agnieszka Kwiecień')
self.assertEquals(
@ -143,7 +142,6 @@ class TestNewEpisodeViewTestCase(TestCase):
)
self.assertEquals(episode_a.image_license, 1)
self.assertEquals(episode_a.image_license_jurisdiction, 'in the USA')
self.assertEquals(episode_a.image, 'bicycle.jpg')
self.assertEquals(episode_a.image_license_name, 'Public Domain')
self.assertEquals(
episode_a.image_license_url, 'https://en.wikipedia.org/wiki/Public_domain'

View File

@ -115,7 +115,6 @@ class TestNewFeedViewTestCase(TestCase):
self.assertEquals(feed_a.original_image_url, "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg")
self.assertEquals(feed_a.image_license, 1)
self.assertEquals(feed_a.image_license_jurisdiction, "in the USA")
self.assertEquals(feed_a.image, 'bicycle.jpg')
self.assertEquals(feed_a.image_license_url, "https://en.wikipedia.org/wiki/Public_domain")
self.assertEquals(feed_a.image_license_name, 'Public Domain')
self.assertEquals(feed_a.license_url, "https://en.wikipedia.org/wiki/Public_domain")

View File

@ -11,179 +11,182 @@ from .string_test_string import get_ep_description
class TestRssTestCase(TestCase):
def test_rss(self):
feed_a = Feed.objects.get(title='Caesar-Pompey Civil War')
kw_args = {'slug': feed_a.slug}
response = self.client.get(reverse('audio:rss', kwargs=kw_args))
feed_a = Feed.objects.get(title="Caesar-Pompey Civil War")
kw_args = {"slug": feed_a.slug}
response = self.client.get(reverse("audio:rss", kwargs=kw_args))
self.assertEquals(response.status_code, 200)
self.assertEquals(len(response.templates), 0)
self.assertEquals(
response.request['PATH_INFO'],
f'/rss/{feed_a.slug}.xml'
)
self.assertEquals(response.request["PATH_INFO"], f"/rss/{feed_a.slug}.xml")
rss = ET.fromstring(response.content)
self.assertEquals(rss.attrib['version'], '2.0')
rss_children = [t.tag for t in rss.findall('*')]
self.assertEquals(rss_children, ['channel'])
channel = rss.find('channel')
channel_children = [t.tag for t in channel.findall('*')]
self.assertEquals(channel_children, [
'title', 'link', 'description',
'{http://www.w3.org/2005/Atom}link',
'language', 'lastBuildDate', 'image',
'item', 'item'
])
channel_title = channel.find('title')
self.assertEquals(channel_title.text, 'Caesar-Pompey Civil War')
cdt = channel.find('description').text
self.assertEquals(cdt, 'Civil War between Pompey and Caesar.')
channel_link = channel.find('link')
self.assertEquals(channel_link.text[-75:], reverse(
'audio:feed', kwargs={'pk': feed_a.pk, 'slug': feed_a.slug})
self.assertEquals(rss.attrib["version"], "2.0")
rss_children = [t.tag for t in rss.findall("*")]
self.assertEquals(rss_children, ["channel"])
channel = rss.find("channel")
channel_children = [t.tag for t in channel.findall("*")]
self.assertEquals(
channel_children,
[
"title",
"link",
"description",
"{http://www.w3.org/2005/Atom}link",
"language",
"lastBuildDate",
"image",
"item",
"item",
],
)
cdlang = channel.find('language').text
self.assertEquals(cdlang, 'en-us')
channel_title = channel.find("title")
self.assertEquals(channel_title.text, "Caesar-Pompey Civil War")
cdt = channel.find("description").text
self.assertEquals(cdt, "Civil War between Pompey and Caesar.")
channel_link = channel.find("link")
self.assertEquals(
channel_link.text[-75:],
reverse("audio:feed", kwargs={"pk": feed_a.pk, "slug": feed_a.slug}),
)
cdlang = channel.find("language").text
self.assertEquals(cdlang, "en-us")
latest_post = str(date.today() - timedelta(days=7))
cdlbd = parser.parse(channel.find('lastBuildDate').text)
cdlbd_string = cdlbd.strftime('%Y-%m-%d')
cdlbd = parser.parse(channel.find("lastBuildDate").text)
cdlbd_string = cdlbd.strftime("%Y-%m-%d")
self.assertEquals(latest_post, cdlbd_string)
f_image = channel.find('image')
f_image_children = [t.tag for t in f_image.findall('*')]
self.assertEquals(f_image_children, [
'url', 'title', 'link', 'description'
])
f_image_url = f_image.find('url').text
self.assertEquals(f_image_url, f'{IMAGES_URL}{feed_a.image}')
f_image_title = f_image.find('title').text
f_image = channel.find("image")
f_image_children = [t.tag for t in f_image.findall("*")]
self.assertEquals(f_image_children, ["url", "title", "link", "description"])
f_image_url = f_image.find("url").text
self.assertEquals(f_image_url, f"{IMAGES_URL}{feed_a.image}")
f_image_title = f_image.find("title").text
self.assertEquals(f_image_title, feed_a.title)
f_image_link = f_image.find('link').text
f_image_link = f_image.find("link").text
self.assertEquals(f_image_link, f"testserver/feed/{feed_a.pk}/{feed_a.slug}")
f_image_description = f_image.find("description").text
self.assertEquals(
f_image_link,
f'testserver/feed/{feed_a.pk}/{feed_a.slug}'
f_image_description,
'<p>Photo <a href="https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg">A Penny Farthing</a> by <a href="https://commons.wikimedia.org/wiki/User:Nova">Agnieszka Kwiecień</a> is licensed <a href="https://en.wikipedia.org/wiki/Public_domain">Public Domain</a> in the USA.</p>',
)
f_image_description = f_image.find('description').text
self.assertEquals(
f_image_description, '<p>Photo <a href="https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg">A Penny Farthing</a> by <a href="https://commons.wikimedia.org/wiki/User:Nova">Agnieszka Kwiecień</a> is licensed <a href="https://en.wikipedia.org/wiki/Public_domain">Public Domain</a> in the USA.</p>'
)
episodes = [t for t in channel.findall('item')]
episodes = [t for t in channel.findall("item")]
for i, ep in enumerate(episodes):
ep_children = [t.tag for t in ep.findall('*')]
self.assertEquals(ep_children, [
'title', 'link', 'description',
'pubDate', 'guid', 'enclosure', 'image'
])
ep_children = [t.tag for t in ep.findall("*")]
self.assertEquals(
ep_children,
[
"title",
"link",
"description",
"pubDate",
"guid",
"enclosure",
"image",
],
)
episode = Episode.objects.get(feed=feed_a, episode_number=i + 1)
ep_title = ep.find('title').text
self.assertEquals(ep_title, f'{episode.episode_number}: {episode.title}')
ep_link = ep.find('link').text
ep_title = ep.find("title").text
self.assertEquals(ep_title, f"{episode.episode_number}: {episode.title}")
ep_link = ep.find("link").text
self.assertEquals(
ep_link,
f'http://testserver/episode/{episode.pk}/{episode.slug}'
ep_link, f"http://testserver/episode/{episode.pk}/{episode.slug}"
)
ep_desc = ep.find('description').text
self.assertEquals(
ep_desc,
get_ep_description(feed_a, episode)
)
ep_pub_date = parser.parse(ep.find('pubDate').text).strftime('%Y-%m-%d')
ep_desc = ep.find("description").text
self.assertEquals(ep_desc, get_ep_description(feed_a, episode))
ep_pub_date = parser.parse(ep.find("pubDate").text).strftime("%Y-%m-%d")
self.assertEquals(ep_pub_date, str(episode.pub_date))
ep_guid = ep.find('guid').text
ep_guid = ep.find("guid").text
self.assertEquals(
ep_guid,
f'http://testserver/episode/{episode.pk}/{episode.slug}'
ep_guid, f"http://testserver/episode/{episode.pk}/{episode.slug}"
)
ep_enclosure = ep.find('enclosure')
self.assertEquals(ep_enclosure.keys(), ['length', 'type', 'url'])
self.assertEquals(
ep_enclosure.attrib['length'], str(episode.image.size)
)
self.assertEquals(ep_enclosure.attrib['type'], 'audio/mpeg')
self.assertEquals(
ep_enclosure.attrib['url'], f'{MP3_URL}{episode.mp3}'
)
ep_image = ep.find('image')
epim_children = [t.tag for t in ep_image.findall('*')]
self.assertEquals(
epim_children, ['url', 'title', 'link', 'description']
)
epim_url = ep_image.find('url').text
self.assertEquals(epim_url, f'{IMAGES_URL}{episode.image.name}')
epim_title = ep_image.find('title').text
ep_enclosure = ep.find("enclosure")
self.assertEquals(ep_enclosure.keys(), ["length", "type", "url"])
self.assertEquals(ep_enclosure.attrib["length"], str(episode.mp3.size))
self.assertEquals(ep_enclosure.attrib["type"], "audio/mpeg")
self.assertEquals(ep_enclosure.attrib["url"], f"{MP3_URL}{episode.mp3}")
ep_image = ep.find("image")
epim_children = [t.tag for t in ep_image.findall("*")]
self.assertEquals(epim_children, ["url", "title", "link", "description"])
epim_url = ep_image.find("url").text
self.assertEquals(epim_url, f"{IMAGES_URL}{episode.image.name}")
epim_title = ep_image.find("title").text
self.assertEquals(epim_title, episode.title)
epim_link = ep_image.find('link').text
epim_link = ep_image.find("link").text
self.assertEquals(
epim_link,
f'testserver/episode/{episode.pk}/{episode.slug}'
epim_link, f"testserver/episode/{episode.pk}/{episode.slug}"
)
epim_desc = ep_image.find('description').text
self.assertEquals(epim_desc, f'Image for: {episode.title}')
epim_desc = ep_image.find("description").text
self.assertEquals(epim_desc, f"Image for: {episode.title}")
def setUp(self):
user_a = User.objects.create(username='user_a')
user_a.set_password('password_user_a')
user_a = User.objects.create(username="user_a")
user_a.set_password("password_user_a")
user_a.save()
Account.objects.create(user=user_a)
self.client.login(username='user_a', password='password_user_a')
with open('bicycle.jpg', 'rb') as image_f:
self.client.post(reverse('audio:new_feed'), {
'title': "Caesar-Pompey Civil War",
'author': "Gaius Julius Caesar",
'ebook_title': "Caesar's De Bello Gallico & Other Commentaries",
'ebook_url': "https://gutenberg.org/ebooks/10657",
'author_url': "https://gutenberg.org/ebooks/author/3621",
'translator': 'McDevitte, W. A. (William Alexander)',
'translator_url': 'https://gutenberg.org/ebooks/author/37952',
'intro_author': 'De Quincey, Thomas',
'intro_author_url': 'https://gutenberg.org/ebooks/author/797',
'license': 1,
'license_jurisdiction': 'in the USA',
'description': "Civil War between Pompey and Caesar.",
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})
feed_a = Feed.objects.get(title='Caesar-Pompey Civil War')
kw_args = {'feed_pk': feed_a.pk, 'feed_title_slug': feed_a.slug}
self.client.login(username="user_a", password="password_user_a")
with open("bicycle.jpg", "rb") as image_f:
self.client.post(
reverse("audio:new_feed"),
{
"title": "Caesar-Pompey Civil War",
"author": "Gaius Julius Caesar",
"ebook_title": "Caesar's De Bello Gallico & Other Commentaries",
"ebook_url": "https://gutenberg.org/ebooks/10657",
"author_url": "https://gutenberg.org/ebooks/author/3621",
"translator": "McDevitte, W. A. (William Alexander)",
"translator_url": "https://gutenberg.org/ebooks/author/37952",
"intro_author": "De Quincey, Thomas",
"intro_author_url": "https://gutenberg.org/ebooks/author/797",
"license": 1,
"license_jurisdiction": "in the USA",
"description": "Civil War between Pompey and Caesar.",
"image_title": "A Penny Farthing",
"image_attribution": "Agnieszka Kwiecień",
"image_attribution_url": "https://commons.wikimedia.org/wiki/User:Nova",
"original_image_url": "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg",
"image_license": 1,
"image_license_jurisdiction": "in the USA",
"image": image_f,
},
)
feed_a = Feed.objects.get(title="Caesar-Pompey Civil War")
kw_args = {"feed_pk": feed_a.pk, "feed_title_slug": feed_a.slug}
with (open("bicycle.jpg", "rb") as image_f, open("Mark Twain Taming The Bicycle.mp3", "rb") as mp3_f):
self.client.post(
reverse("audio:new_episode", kwargs=kw_args),
{
"title": "Caesar-Pompey Civil War Book I",
"author": "Gaius Julius Caesar",
"pub_date": str(date.today() - timedelta(days=8)),
"episode_number": 1,
"description": "Caesar confronts Afranius and Petreius",
"mp3": mp3_f,
"image_title": "A Penny Farthing",
"image_attribution": "Agnieszka Kwiecień",
"image_attribution_url": "https://commons.wikimedia.org/wiki/User:Nova",
"original_image_url": "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg",
"image_license": 1,
"image_license_jurisdiction": "in the USA",
"image": image_f,
},
)
with (
open('bicycle.jpg', 'rb') as image_f,
open('Mark Twain Taming The Bicycle.mp3', 'rb') as mp3_f
open("bicycle.jpg", "rb") as image_f,
open("Mark Twain Taming The Bicycle.mp3", "rb") as mp3_f,
):
self.client.post(reverse('audio:new_episode', kwargs=kw_args), {
'title': "Caesar-Pompey Civil War Book I",
'author': "Gaius Julius Caesar",
'pub_date': str(date.today() - timedelta(days=8)),
'episode_number': 1,
'description': 'Caesar confronts Afranius and Petreius',
'mp3': mp3_f,
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})
with (
open('bicycle.jpg', 'rb') as image_f,
open('Mark Twain Taming The Bicycle.mp3', 'rb') as mp3_f
):
self.client.post(reverse('audio:new_episode', kwargs=kw_args), {
'title': "Caesar-Pompey Civil War Book II",
'author': "Gaius Julius Caesar",
'pub_date': str(date.today() - timedelta(days=7)),
'episode_number': 2,
'description': 'Trebonius confronts Domitius',
'mp3': mp3_f,
'image_title': 'A Penny Farthing',
'image_attribution': 'Agnieszka Kwiecień',
'image_attribution_url': 'https://commons.wikimedia.org/wiki/User:Nova',
'original_image_url': 'https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg',
'image_license': 1,
'image_license_jurisdiction': 'in the USA',
'image': image_f,
})
self.client.post(
reverse("audio:new_episode", kwargs=kw_args),
{
"title": "Caesar-Pompey Civil War Book II",
"author": "Gaius Julius Caesar",
"pub_date": str(date.today() - timedelta(days=7)),
"episode_number": 2,
"description": "Trebonius confronts Domitius",
"mp3": mp3_f,
"image_title": "A Penny Farthing",
"image_attribution": "Agnieszka Kwiecień",
"image_attribution_url": "https://commons.wikimedia.org/wiki/User:Nova",
"original_image_url": "https://commons.wikimedia.org/wiki/File:Ordinary_bicycle01.jpg",
"image_license": 1,
"image_license_jurisdiction": "in the USA",
"image": image_f,
},
)