Blorg-Backend/blogHandler.py

142 lines
6.3 KiB
Python

import os
import datetime
import psycopg2
from orgparse import loads
import userHandler
import orgHandler
import dbHandler
blogDir: str = "./blogs"
debug: bool = True
def debugPrint(msg: str) -> None:
if debug:
print("(BLOG HANDLER) PRINT: " + msg)
def checkIDExistence(dbConnection: psycopg2.extensions.connection, blogID: int) -> bool:
return dbHandler.checkFieldValueExistence(dbConnection, "blogs", "id", blogID)
def getBlogCardRange(dbConnection: psycopg2.extensions.connection, rangeStart: int, rangeEnd: int, latestRecords = True) -> dict:
records = dbHandler.getRowRangeByID(dbConnection, "blogs", rangeStart, rangeEnd, latestRecords)
recordsDictionary = {}
for index, record in enumerate(records):
datePostedStr = record[3].strftime("%G-%m-%d %X")
# 0 index reserved for success/message status
recordsDictionary[index+1] = {
"blogID": record[0],
"authorInfo": {
"ID": record[1],
"username": userHandler.getUserInfoByID(dbConnection, record[1], "username"),
"firstName": userHandler.getUserInfoByID(dbConnection, record[1], "firstname"),
"lastName": userHandler.getUserInfoByID(dbConnection, record[1], "lastname")
},
"categoryID": record[2],
"datePosted": datePostedStr,
"title": record[4],
"description": record[5]
}
return recordsDictionary
def getBlogTitle(blogID: int) -> str:
debugPrint("Attempting to retrieve blog title of blog ID " + str(blogID))
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) -> tuple:
debugPrint("Attempting to retrieve blog description of blog ID " + str(blogID))
try:
fileData = open(blogDir + "/" + str(blogID) + "/" + str(blogID) + ".org", 'r')
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, False)
return (shortDescription, True)
except Exception as error:
debugPrint("Error getting blog description! Unexpected error: " + repr(error) + ".")
def getBlogContentsHTML(blogID: int) -> str:
try:
debugPrint("Attempting to retrieve blog contents of blogID " + str(blogID) + "...")
FullBlogDir = blogDir + "/" + str(blogID)
HTMLFileData = open(FullBlogDir + "/" + str(blogID) + ".html", 'r')
HTMLFileContents = HTMLFileData.read()
HTMLFileData.close()
return HTMLFileContents
except Exception as error:
msg = "Retrieve blog contents of blogID " + str(blogID) + " failed! Unexpected error: " + repr(error) + "."
debugPrint(msg)
return msg
# Returns new Blog ID
def createBlogEntry(dbConnection: psycopg2.extensions.connection, userID: int, categoryID: int) -> int:
datePosted = datetime.datetime.now()
datePostedStr = datePosted.strftime("%G-%m-%d %X")
debugPrint("Now creating new user with following attributes : userID = " + str(userID) + ", categoryID = " + str(categoryID) + ", datePosted = " + datePostedStr)
newRow = dbHandler.insertRow(dbConnection,
'blogs',
['authorID', 'categoryID', 'datePosted' ],
[userID, categoryID, datePostedStr])
return newRow[0]
def generateBlogTitle(dbConnection: psycopg2.extensions.connection, blogID: int) -> tuple:
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)[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:
orgParsedOut = orgHandler.orgToHTML(orgRawIn)
if orgParsedOut:
blogID = createBlogEntry(dbConnection, userID, 1)
newBlogDir = blogDir + "/" + str(blogID)
debugPrint("Attempting to create new blog directory " + newBlogDir + "...")
os.mkdir(newBlogDir)
debugPrint("Attempting to write new blog file " + newBlogDir + ".org...")
orgFileData = open(newBlogDir + "/" + str(blogID) + ".org", 'w')
orgFileData.write(orgRawIn)
orgFileData.close()
debugPrint("Attempting to write new blog file " + blogDir + "/" + str(blogID) + "/" + str(blogID) + ".html...")
HTMLFileData = open(newBlogDir + "/" + str(blogID) + ".html", 'w')
orgFileData = open(newBlogDir + "/" + str(blogID) + ".org", 'r')
HTMLFileData.write(generateBlogHTMLContents(dbConnection, orgParsedOut, userID, blogID))
HTMLFileData.close()
orgFileData.close()
generateBlogTitle(dbConnection, blogID)
generateBlogDescription(dbConnection, blogID)
return blogID
else:
return False
except Exception as error:
debugPrint("Create blog failed! Unexpected error: " + repr(error) + ".")
return False