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:
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
title = orgHandler.checkAndRetrieveMetadata(fileData, "TITLE")
fileData.close()
if title:
return title
except Exception as 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))
try:
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
orgRoot = loads(fileData.read())
fileData.readline()
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:
debugPrint("No valid description found, will generate a placeholder from the text itself...")
firstText = orgRoot[1].body
shortDescription = (firstText[:60] + "...") if len(firstText) > 60 else firstText
return shortDescription
return (shortDescription, False)
return (shortDescription, True)
except Exception as 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))
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):
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...")
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()
orgFileData.close()
generateBlogTitle(dbConnection, blogID)
generateBlogDescription(dbConnection, blogID)

View File

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

View File

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