I can't do this.

Maybe I should step away and keep my frustration inside and try to be a better person, a more reliable person. But I just. How do I fix this? What is the issue?
This commit is contained in:
Matthias Portzel 2022-01-05 21:24:55 -08:00
parent e03a98cda7
commit c503bb6127
2 changed files with 6 additions and 140 deletions

View File

@ -1,138 +1,4 @@
import os.path
import uuid
import subprocess
import base64
import magic
from django.shortcuts import render
from django.utils.crypto import constant_time_compare
from django.http import HttpResponse
from whispermaphone import settings
from .models import Thought, ThoughtForm, ALLOWED_MEDIA_TYPES
from .pagination import get_all_pages, get_page_slug
def check_authenticated(request):
try:
auth = request.headers["Authorization"].split()
if auth[0].lower() == "basic":
username, password = base64.b64decode(auth[1]).split(b":")
if password == bytes(settings.PASSWORD, "utf-8"):
return True
except (KeyError, ValueError, IndexError):
pass
return False
from django.http import HttpRequest
def index(request):
authenticated = check_authenticated(request)
try:
highlighted_uuid = uuid.UUID(request.GET.get("show", ""))
except ValueError:
highlighted_uuid = ""
# Figure out what page we're viewing
pages = get_all_pages()
# First item in pages should be listed first
requested_page = pages[0]
requested_slug = request.GET.get("page", default=requested_page.slug)
# show=uuid takes priority over page
if highlighted_uuid:
try:
highlighted_thought = Thought.objects.get(uuid=highlighted_uuid)
requested_slug = get_page_slug(highlighted_thought)
except Thought.DoesNotExist:
pass
if requested_page.slug != requested_slug:
for p in pages:
if p.slug == requested_slug:
requested_page = p
thoughts = requested_page.get_all_entries()
return render(request, "whispermaphone/index.html", {
"thoughts": thoughts,
"highlighted": highlighted_uuid,
"authenticated": authenticated,
"pages": pages,
"current_page": requested_slug,
"first_page": requested_page == pages[0] # if you're viewing the first page
})
def post(request):
if not check_authenticated(request):
res = HttpResponse(status=401)
res.headers["WWW-Authenticate"] = 'Basic realm="Poster"'
return res
if request.method == "POST":
# We post in hours, so we need to convert back to minutes for saving
# We can pass errors since form.is_valid catches most of them
# We just need to convert hours to minutes first, because otherwise it errors on non-integer values
if "timezone_offset" in request.POST:
values = request.POST.copy()
try:
values["timezone_offset"] = - float(values["timezone_offset"]) * 60
except ValueError:
pass
thought_form = ThoughtForm(values, request.FILES, instance=Thought())
if not thought_form.is_valid():
errors = thought_form.errors.as_data()
# Media formatting errors
try:
problem_field = list(errors.keys())[0]
message = list(errors.values())[0][0].messages[0]
# error_line = f"{problem_field[0].upper()}{problem_field[1:]}: {message}"
error_line = f"{message}"
except:
error_line = f"An unknown error occurred processing your request: {errors}"
return render(request, "whispermaphone/post.html", {
"form": thought_form,
"form_error": error_line
}, status=400)
# Create a thought object we can work with
# But don't save it the DB yet
thought = thought_form.save(commit=False)
# Do media processing (already validated)
if "media" in request.FILES:
chunk = next(thought.media.chunks(chunk_size=2048))
media_type = magic.from_buffer(chunk, mime="True")
thought.media.name = f"{thought.uuid}.{ALLOWED_MEDIA_TYPES[media_type]}"
if media_type == "audio/x-m4a":
# This is a hack-fix because I want to be able to upload audio
# In the future, this should be refactored to convert file types
# using ffmpeg.js on the client side (so there are 0 security concerns)
# and then the backend just has to check a 3 item whitelist
thought.save() # Save so that we have a file to work with
subprocess.run(["ffmpeg",
"-i", thought.media.path,
"-codec:a", "aac", "-vn",
os.path.join(settings.MEDIA_ROOT, f"{thought.uuid}.aac")
], check=True)
os.remove(os.path.join(settings.MEDIA_ROOT, f"{thought.uuid}.m4a")) # Remove the original file
thought.media.name = f"{thought.uuid}.aac" # Update the file in the DB
# Save for real
thought.save()
return render(request, "whispermaphone/post.html", {"form": ThoughtForm()})
def about(request):
return render(request, "whispermaphone/about.html", {
"authenticated": check_authenticated(request)
})
return HttpRequest("I'm done. The website's broken and I'm not smart enough to fix it. It's still available over Gemini I think.")

View File

@ -10,8 +10,8 @@ from haystack.forms import SearchForm
urlpatterns = [
path("", views.index, name="index"),
path("about", views.about, name="about"),
path("post", views.post, name="post"),
path("feed", MainFeed()),
path("search", SearchView(form_class=SearchForm), name="thoughts_search")
# path("about", views.about, name="about"),
# path("post", views.post, name="post"),
# path("feed", MainFeed()),
# path("search", SearchView(form_class=SearchForm), name="thoughts_search")
] + (static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) if settings.DEBUG else [])