This program provides the basic functions required to write a forum in MySQL and Python. The way the class is structured allows it to be imported and used in any application, whether it's web based, command line, Tcl/Tk or wxPython. It simply provides the helper functions to perform actions required to get, use and set different data in the database.
However, I have not included the code to create the database yet. Here's the structure: TABLE: users INTEGER: id STRING: name STRING: signature STRING: password TABLE: messages INTEGER: id LONGSTRING: content DATE: created TIME: createdtime DATE: edited TIME: editedtime INTEGER: authorid TABLE: threads INTEGER: id STRING: title STRING: messages DATETIME: edited
Create that database, set up a user account, and change the arguments in ForumBase.__init__ to the user you want the program to log on as.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 | import MySQLdb
from datetime import *
import string
class ForumBase:
def __init__(self):
self.connection = MySQLdb.connect(
host = "HOST",
user = "USER",
passwd = "PASSWORD",
db = "DATABSE")
self.cursor = self.connection.cursor()
self.userid = 1
self.users = self.Users(self)
self.threads = self.Threads(self)
self.messages = self.Messages(self)
def date(self):
return str(datetime.now()).split(" ")[0]
def time(self):
return str(str(datetime.now()).split(" ")[1]).split(".")[0]
def safe(self, input):
input = string.replace(input, "'", "\\'")
input = string.replace(input, '"', '\\"')
input = string.replace(input, ";", "\\;")
input = string.replace(input, "%", "\\%")
input = string.replace(input, "_", "\\_")
return input
class Users:
def __init__(self, parent):
self.parent = parent
def maxID(self):
self.parent.cursor.execute("SELECT max(id) FROM users")
values = self.parent.cursor.fetchall()
return values[0][0]
def userData(self, userid):
userid = int(userid)
self.parent.cursor.execute("SELECT * FROM users WHERE id='"+str(userid)+"'")
values = self.parent.cursor.fetchall()
return values[0]
def userMessageCount(self, userid):
self.parent.cursor.execute("SELECT COUNT(*) FROM messages WHERE authorid='"+str(userid)+"'")
values = self.parent.cursor.fetchall()
return values[0][0]
def newUser(self, name, password, sig):
self.parent.cursor.execute("INSERT INTO users (name, signature, password) VALUES('"+name+"', '"+sig+"', '"+password+"')")
return self.maxID()
def userSig(self, userid):
return self.userData(userid)[2]
def userName(self, userid):
return self.userData(userid)[1]
def userPass(self, userid):
return self.userData(userid)[3]
def changeSig(self, userid, sig):
sig, userid = self.parent.safe(sig), int(userid)
self.parent.cursor.execute("UPDATE users SET sig='"+sig+"' WHERE id='"+str(userid)+"'")
def idOfName(self, name):
name = self.parent.safe(name)
self.parent.cursor.execute("SELECT id FROM users WHERE name='"+name+"'")
values = self.parent.cursor.fetchall()
try: temp = values[0][0]
except: temp = 0
return temp
def changeName(self, userid, name):
name, userid = self.parent.safe(name), int(userid)
if not self.idOfName(name):
self.parent.cursor.execute("UPDATE users SET name='"+name+"' WHERE id='"+str(userid)+"'")
class Threads:
def __init__(self, parent):
self.parent = parent
def threadsWithMessage(self, messageid):
threads, regExes = [], []
regExes.append("SELECT id FROM threads WHERE messages LIKE '% "+str(messageid)+" %'") # middle message
regExes.append("SELECT id FROM threads WHERE messages LIKE '% "+str(messageid)+"'") # last message
regExes.append("SELECT id FROM threads WHERE messages='"+str(messageid)+"'") # only message
regExes.append("SELECT id FROM threads WHERE messages LIKE '"+str(messageid)+" %'") # first message
for regEx in regExes:
self.parent.cursor.execute(regEx)
newthreads = self.parent.cursor.fetchall()
for thread in newthreads:
threads.append(thread[0])
return threads
def cleanThread(self, messageid):
targetThreads = self.threadsWithMessage(messageid)
print targetThreads
def maxID(self):
self.parent.cursor.execute("SELECT max(id) FROM threads")
values = self.parent.cursor.fetchall()
return values[0][0]
def messagesInThread(self, threadid):
self.parent.cursor.execute("SELECT messages FROM threads WHERE id="+str(threadid))
values = self.parent.cursor.fetchall()
messages = values[0][0]
return messages.split(" ")
def nameOfThread(self, threadid):
self.parent.cursor.execute("SELECT title FROM threads WHERE id="+str(threadid))
values = self.parent.cursor.fetchall()
return values[0][0]
def getContentsOfThread(self, threadid, page):
name = self.nameOfThread(threadid)
temp = []
messages = self.messagesInThread(threadid)
for messageid in messages:
temp.append(self.parent.messages.contentOfMessage(messageid))
return name, temp, page
def newThread(self, title, firstmessageid):
self.parent.cursor.execute("INSERT INTO threads (title, messages, edited) VALUES ('"+title+"', "+str(firstmessageid)+", '"+self.parent.date()+" "+self.parent.time()+"')")
return self.maxID()
def addMessageToThread(self, threadid, messageid):
self.parent.cursor.execute("SELECT messages FROM threads WHERE id="+str(threadid))
values = self.parent.cursor.fetchall()
messages = values[0][0]+" "+str(messageid)
edited = str(datetime.now())
edited = edited.split(".")[0]
self.parent.cursor.execute("UPDATE threads SET messages='"+messages+"', edited='"+edited+"' WHERE id="+str(threadid))
def getThreads(self, page):
self.parent.cursor.execute("SELECT id, title FROM threads ORDER BY edited DESC")
values = self.parent.cursor.fetchall()
l, tmp = len(values), []
if (page-1)*20 > l: page = int(l/20)+1
elif page < 1: page = 1
for i in range(l): tmp.append([values[i+20*(page-1)][0], values[i+20*(page-1)][1]])
return tmp, page
class Messages:
def __init__(self, parent):
self.parent = parent
def maxID(self):
self.parent.cursor.execute("SELECT max(id) FROM messages")
values = self.parent.cursor.fetchall()
return values[0][0]
def contentOfMessage(self, messageid):
self.parent.cursor.execute("SELECT * FROM messages WHERE id="+str(messageid))
values = self.parent.cursor.fetchall()
tmp = [values[0][1], values[0][2], values[0][3], values[0][4], values[0][5], values[0][6]]
tmp.append(self.parent.users.userName(values[0][6]))
tmp.append(self.parent.users.userSig(values[0][6]))
return tmp
def newMessage(self, content):
content = self.parent.safe(content)
self.parent.cursor.execute("INSERT INTO messages (content, created, createdtime, edited, editedtime, authorid) VALUES ('"+content+"', '"+self.parent.date()+"', '"+self.parent.time()+"', '"+self.parent.date()+"', '"+self.parent.time()+"', '"+str(self.parent.userid)+"');")
return self.maxID()
def editMessage(self, messageid, newcontent):
newcontent, messageid = self.parent.safe(newcontent), int(messageid)
self.parent.cursor.execute("UPDATE messages SET content='"+newcontent+"', edited='"+self.parent.date()+"', editedtime='"+self.parent.time()+"') WHERE id='"+str(messageid))+"'"
def deleteMessage(self, messageid):
messageid = int(messageid)
self.parent.cursor.execute("SELECT COUNT(*) FROM threads WHERE messages LIKE '"+str(messageid)+" %'")
count = self.parent.cursor.fetchall()[0][0]
self.parent.cursor.execute("SELECT COUNT(*) FROM threads WHERE messages='"+str(messageid)+"'")
count = count + self.parent.cursor.fetchall()[0][0]
if count > 0:
self.parent.cursor.execute("DELETE FROM messages WHERE id=")
self.parent.threads.cleanThreads(messageid)
def cleanMessages(self):
self.parent.cursor.execute("SELECT id FROM messages ORDER BY id ASC")
values = self.parent.cursor.fetchall()
allIDs = []
for id in values:
allIDs.append(id[0])
for id in allIDs:
count = len(self.parent.threads.threadsWithMessage(id))
if count == 0: self.parent.cursor.execute("DELETE FROM messages WHERE id="+str(id))
def close(self):
self.cursor.close()
self.connection.close()
self = None
|
Because this module provides common functions for manipulating forum data, it can be used with any UI. Create another python module in the same directory and, import this one, create an instance of ForumBase, and you're ready to create a forum, whatever GUI you're using.