update db.py documentation and code to reflect newest changes
This commit is contained in:
		
							parent
							
								
									c65e459340
								
							
						
					
					
						commit
						cf16169027
					
				
							
								
								
									
										58
									
								
								src/db.py
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								src/db.py
									
									
									
									
									
								
							| @ -2,7 +2,10 @@ | |||||||
| This module contains all of the interaction with the SQLite database. It | This module contains all of the interaction with the SQLite database. It | ||||||
| doesnt hold a connection itself, rather, a connection is passed in as | doesnt hold a connection itself, rather, a connection is passed in as | ||||||
| an argument to all the functions and is maintained by CherryPy's threading | an argument to all the functions and is maintained by CherryPy's threading | ||||||
| system. This is clunky but fuck it, it works. | system. This is clunky but fuck it, it works (for now at least). | ||||||
|  | 
 | ||||||
|  | (foreword: formatting is not currently implemented but its an important | ||||||
|  |   feature needed in the final version) | ||||||
| 
 | 
 | ||||||
| All post and thread data are stored in the database without formatting. | All post and thread data are stored in the database without formatting. | ||||||
| This is questionable, as it causes formatting to be reapplied with each | This is questionable, as it causes formatting to be reapplied with each | ||||||
| @ -31,8 +34,8 @@ anon = None | |||||||
| 
 | 
 | ||||||
| def thread_get(connection, thread_id, messages=True): | def thread_get(connection, thread_id, messages=True): | ||||||
|     """ |     """ | ||||||
|     Fetch the thread_id from the database, and assign and format |     Fetch the thread_id from the database. Formatting is be handled | ||||||
|     all of its messages as requested. |     elsewhere. | ||||||
| 
 | 
 | ||||||
|     MESSAGES, if False, will omit the inclusion of a thread's messages |     MESSAGES, if False, will omit the inclusion of a thread's messages | ||||||
|     and only get its metadata, such as title, author, etc. |     and only get its metadata, such as title, author, etc. | ||||||
| @ -48,14 +51,20 @@ def thread_get(connection, thread_id, messages=True): | |||||||
|     if messages: |     if messages: | ||||||
|         c.execute("""SELECT * FROM messages WHERE thread_id = ? |         c.execute("""SELECT * FROM messages WHERE thread_id = ? | ||||||
|                      ORDER BY post_id""", (thread_id,)) |                      ORDER BY post_id""", (thread_id,)) | ||||||
|         # create a dictionary where each message is accessible by its |         # create a list where each post_id matches its list[index] | ||||||
|         # integer post_id as a key |  | ||||||
|         thread["messages"] = [schema.message(*values) for values in c.fetchall()] |         thread["messages"] = [schema.message(*values) for values in c.fetchall()] | ||||||
| 
 | 
 | ||||||
|     return thread |     return thread | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def thread_index(connection): | def thread_index(connection): | ||||||
|  |     """ | ||||||
|  |     Return a list with each thread, ordered by the date they | ||||||
|  |     were last modifed (which could be when it was submitted | ||||||
|  |     or its last reply) | ||||||
|  | 
 | ||||||
|  |     Please note that thred["messages"] is omitted. | ||||||
|  |     """ | ||||||
|     c = connection.cursor() |     c = connection.cursor() | ||||||
|     c.execute(""" |     c.execute(""" | ||||||
|     SELECT thread_id FROM threads |     SELECT thread_id FROM threads | ||||||
| @ -68,6 +77,9 @@ def thread_index(connection): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def thread_create(connection, author_id, body, title): | def thread_create(connection, author_id, body, title): | ||||||
|  |     """ | ||||||
|  |     Create a new thread and return it. | ||||||
|  |     """ | ||||||
|     validate([ |     validate([ | ||||||
|         ("body",  body), |         ("body",  body), | ||||||
|         ("title", title) |         ("title", title) | ||||||
| @ -85,20 +97,24 @@ def thread_create(connection, author_id, body, title): | |||||||
|     """, schema_values("thread", scheme)) |     """, schema_values("thread", scheme)) | ||||||
|     connection.commit() |     connection.commit() | ||||||
| 
 | 
 | ||||||
|     scheme["messages"] = { |     scheme["messages"] = [ | ||||||
|         0: thread_reply(connection, author_id, thread_id, body, time_override=now) |         thread_reply(connection, author_id, thread_id, body, time_override=now) | ||||||
|     } |     ] | ||||||
|     scheme["reply_count"] = 0 |     scheme["reply_count"] = 0 | ||||||
|     # note that thread_reply returns a schema object |     # note that thread_reply returns a schema object | ||||||
|     # after committing the new message to the database. |     # after committing the new message to the database. | ||||||
|     # here i mimic a real thread_get by including a mock |     # here i mimic a real thread_get by including a mock | ||||||
|     # message dictionary, and then setting the reply_count |     # message array, and then setting the reply_count | ||||||
|     # to reflect its new database value, so the response |     # to reflect its new database value, so the response | ||||||
|     # can be loaded as a normal thread object |     # can be loaded as a normal thread object | ||||||
|  |     # this hackery needs a bit more testing | ||||||
|     return scheme |     return scheme | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def thread_reply(connection, author_id, thread_id, body, time_override=None): | def thread_reply(connection, author_id, thread_id, body, time_override=None): | ||||||
|  |     """ | ||||||
|  |     Submit a new reply for thread_id. Return the new reply object. | ||||||
|  |     """ | ||||||
|     validate([("body", body)]) |     validate([("body", body)]) | ||||||
| 
 | 
 | ||||||
|     now = time_override or time() |     now = time_override or time() | ||||||
| @ -127,11 +143,15 @@ def thread_reply(connection, author_id, thread_id, body, time_override=None): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def message_edit_query(connection, author, thread_id, post_id): | def message_edit_query(connection, author, thread_id, post_id): | ||||||
|  |     """ | ||||||
|  |     Perform all the neccesary sanity checks required to edit a post | ||||||
|  |     and then return the requested message object without any changes. | ||||||
|  |     """ | ||||||
|     user = user_resolve(connection, author) |     user = user_resolve(connection, author) | ||||||
|     thread = thread_get(connection, thread_id) |     thread = thread_get(connection, thread_id) | ||||||
| 
 | 
 | ||||||
|     try: message = thread["messages"][post_id] |     try: message = thread["messages"][post_id] | ||||||
|     except KeyError: |     except IndexError: | ||||||
|         raise BBJParameterError("post_id out of bounds for requested thread") |         raise BBJParameterError("post_id out of bounds for requested thread") | ||||||
| 
 | 
 | ||||||
|     if not user["admin"]: |     if not user["admin"]: | ||||||
| @ -147,6 +167,10 @@ def message_edit_query(connection, author, thread_id, post_id): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def message_edit_commit(connection, author_id, thread_id, post_id, new_body): | def message_edit_commit(connection, author_id, thread_id, post_id, new_body): | ||||||
|  |     """ | ||||||
|  |     Attempt to commit new_body to the existing message. Touches base with | ||||||
|  |     message_edit_query first. Returns the newly updated message object. | ||||||
|  |     """ | ||||||
|     validate([("body", new_body)]) |     validate([("body", new_body)]) | ||||||
|     message = message_edit_query(author_id, thread_id, post_id) |     message = message_edit_query(author_id, thread_id, post_id) | ||||||
|     message["body"] = new_body |     message["body"] = new_body | ||||||
| @ -194,6 +218,14 @@ def user_register(connection, user_name, auth_hash): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def user_resolve(connection, name_or_id, externalize=False, return_false=True): | def user_resolve(connection, name_or_id, externalize=False, return_false=True): | ||||||
|  |     """ | ||||||
|  |     Accepts a name or id and returns the full user object for it. | ||||||
|  | 
 | ||||||
|  |     EXTERNALIZE determines whether to strip the object of private data. | ||||||
|  | 
 | ||||||
|  |     RETURN_FALSE determines whether to raise an exception or just | ||||||
|  |     return bool False if the user doesn't exist | ||||||
|  |     """ | ||||||
|     c = connection.cursor() |     c = connection.cursor() | ||||||
|     c.execute(""" |     c.execute(""" | ||||||
|          SELECT * FROM users |          SELECT * FROM users | ||||||
| @ -216,6 +248,12 @@ def user_resolve(connection, name_or_id, externalize=False, return_false=True): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def user_update(connection, user_object, parameters): | def user_update(connection, user_object, parameters): | ||||||
|  |     """ | ||||||
|  |     Accepts new parameters for a user object and then | ||||||
|  |     commits the changes to the database. Parameters | ||||||
|  |     that are not suitable for editing (like user_id | ||||||
|  |     and anything undefined) are ignored completely. | ||||||
|  |     """ | ||||||
|     user_id = user_object["user_id"] |     user_id = user_object["user_id"] | ||||||
|     for key in ("user_name", "auth_hash", "quip", "bio", "color"): |     for key in ("user_name", "auth_hash", "quip", "bio", "color"): | ||||||
|         value = parameters.get(key) |         value = parameters.get(key) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user