Implement uploading blog in Base32 encoding, fix metadata retrieval functionality. Ensure title, author and optional description field is including in the HTML blog generation

This commit is contained in:
Curt Spark 2024-07-08 19:25:09 +01:00
parent ee7592f0fb
commit 3776666639
3 changed files with 36 additions and 18 deletions

View File

@ -45,24 +45,27 @@ def getBlogTitle(blogID: int) -> str:
try: try:
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r') fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
title = orgHandler.checkAndRetrieveMetadata(fileData, "TITLE") title = orgHandler.checkAndRetrieveMetadata(fileData, "TITLE")
fileData.close()
if title: if title:
return title return title
except Exception as error: except Exception as error:
debugPrint("Error getting blog title! " + repr(error)) debugPrint("Error getting blog title! " + repr(error))
def getBlogDescription(blogID: int) -> str: def getBlogDescription(blogID: int) -> tuple:
debugPrint("Attempting to retrieve blog description of blog ID " + str(blogID)) debugPrint("Attempting to retrieve blog description of blog ID " + str(blogID))
try: try:
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r') fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
orgRoot = loads(fileData.read())
fileData.readline()
shortDescription = orgHandler.checkAndRetrieveMetadata(fileData, "DESCRIPTION") shortDescription = orgHandler.checkAndRetrieveMetadata(fileData, "DESCRIPTION")
fileData.close()
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
orgRoot = loads(fileData.read())
fileData.close()
if not shortDescription: if not shortDescription:
debugPrint("No valid description found, will generate a placeholder from the text itself...") debugPrint("No valid description found, will generate a placeholder from the text itself...")
firstText = orgRoot[1].body firstText = orgRoot[1].body
shortDescription = (firstText[:60] + "...") if len(firstText) > 60 else firstText shortDescription = (firstText[:60] + "...") if len(firstText) > 60 else firstText
return shortDescription return (shortDescription, False)
return (shortDescription, True)
except Exception as error: except Exception as error:
debugPrint("Error getting blog description! Unexpected error: " + repr(error) + ".") debugPrint("Error getting blog description! Unexpected error: " + repr(error) + ".")
@ -94,7 +97,16 @@ def generateBlogTitle(dbConnection: psycopg2.extensions.connection, blogID: int)
return dbHandler.changeFieldValueByID(dbConnection, "blogs", blogID, "title", getBlogTitle(blogID)) return dbHandler.changeFieldValueByID(dbConnection, "blogs", blogID, "title", getBlogTitle(blogID))
def generateBlogDescription(dbConnection: psycopg2.extensions.connection, blogID: int) -> tuple: def generateBlogDescription(dbConnection: psycopg2.extensions.connection, blogID: int) -> tuple:
return dbHandler.changeFieldValueByID(dbConnection, "blogs", blogID, "description", getBlogDescription(blogID)) return dbHandler.changeFieldValueByID(dbConnection, "blogs", blogID, "description", getBlogDescription(blogID)[0])
def generateBlogHTMLContents(dbConnection: psycopg2.extensions.connection, orgParsed: str, userID: int, blogID: int) -> str:
generatedHTML = orgParsed
shortDescription = getBlogDescription(blogID)
if shortDescription[1]:
generatedHTML = "<p>" + shortDescription[0] + "</p>\n" + generatedHTML
generatedHTML = "<h2>" + userHandler.getUserInfoByID(dbConnection, userID, "username") + "</h2>\n" + generatedHTML
generatedHTML = "<h1>" + getBlogTitle(blogID) + "</h1>\n" + generatedHTML
return generatedHTML
def uploadBlog(dbConnection: psycopg2.extensions.connection, userID: int, orgRawIn: str): def uploadBlog(dbConnection: psycopg2.extensions.connection, userID: int, orgRawIn: str):
try: try:
@ -113,8 +125,10 @@ def uploadBlog(dbConnection: psycopg2.extensions.connection, userID: int, orgRaw
debugPrint("Attempting to write new blog file " + blogDir + "/" + str(blogID) + "/" + str(blogID) + ".html...") debugPrint("Attempting to write new blog file " + blogDir + "/" + str(blogID) + "/" + str(blogID) + ".html...")
HTMLFileData = open(newBlogDir + "/" + str(blogID) + ".html", 'w') HTMLFileData = open(newBlogDir + "/" + str(blogID) + ".html", 'w')
HTMLFileData.write(orgParsedOut) orgFileData = open(newBlogDir + "/" + str(blogID) + ".org", 'r')
HTMLFileData.write(generateBlogHTMLContents(dbConnection, orgParsedOut, userID, blogID))
HTMLFileData.close() HTMLFileData.close()
orgFileData.close()
generateBlogTitle(dbConnection, blogID) generateBlogTitle(dbConnection, blogID)
generateBlogDescription(dbConnection, blogID) generateBlogDescription(dbConnection, blogID)

View File

@ -2,6 +2,7 @@ import os
import sys import sys
import atexit import atexit
import signal import signal
import base64
from typing import Union, Annotated from typing import Union, Annotated
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
@ -284,8 +285,9 @@ class postblogCreateBody(BaseModel):
def postblogCreate(body: postblogCreateBody): def postblogCreate(body: postblogCreateBody):
try: try:
if tokenHandler.validateTokenExistence(dbConnection, body.authToken): if tokenHandler.validateTokenExistence(dbConnection, body.authToken):
decodedOrgContents = base64.b32decode(body.orgContents).decode()
userID = userHandler.getIDByAuthToken(dbConnection, body.authToken) userID = userHandler.getIDByAuthToken(dbConnection, body.authToken)
newBlog = blogHandler.uploadBlog(dbConnection, userID, body.orgContents) newBlog = blogHandler.uploadBlog(dbConnection, userID, decodedOrgContents)
if newBlog: if newBlog:
return { return {
"success": True, "success": True,

View File

@ -1,3 +1,5 @@
import os
from orgparse import loads from orgparse import loads
blogDir: str = "./blogs" blogDir: str = "./blogs"
@ -7,15 +9,14 @@ def debugPrint(msg: str) -> None:
if debug: if debug:
print("(ORG HANDLER) PRINT: " + msg) print("(ORG HANDLER) PRINT: " + msg)
def checkAndRetrieveMetadata(fileData: str, metadataName: str): def checkAndRetrieveMetadata(fileData, metadataName: str):
line = fileData.readline()
metadataFullName = "#+" + metadataName + ":" metadataFullName = "#+" + metadataName + ":"
if metadataFullName in line: for line in fileData:
linetoarray = line.split() if metadataFullName in line:
return " ".join(linetoarray[1:]) linetoarray = line.split()
else: return " ".join(linetoarray[1:])
debugPrint("Could not find " + metadataFullName + " metadata field of document!") debugPrint("Could not find " + metadataFullName + " metadata field of document!")
return False return False
def orgToHTML(orgData: str) -> str: def orgToHTML(orgData: str) -> str:
try: try:
@ -24,8 +25,9 @@ def orgToHTML(orgData: str) -> str:
for node in orgRoot[1:]: for node in orgRoot[1:]:
if node.heading: if node.heading:
headingLevel = str(node.level if node.level <= 6 else 6) headingLevel = node.level if node.level <= 6 else 6
parsedHTML += "<h" + headingLevel + ">" + node.heading + "</h" + headingLevel + ">" + "\n" headingLevel += 2
parsedHTML += "<h" + str(headingLevel) + ">" + node.heading + "</h" + str(headingLevel) + ">" + "\n"
if node.body: if node.body:
parsedHTML += node.body + "\n" parsedHTML += node.body + "\n"
return parsedHTML return parsedHTML