Browse Source

Models: set objects instead of directly using ids

This was always inconsistent - I've been setting objects in some models,
and ids in other ones. Using ids can cause various errors, especially in
cases where one of the objects involved hasn't been committed to the
database yet and so hasn't been assigned its id.
merge-requests/85/head
Deimos 5 years ago
parent
commit
44d8aab4f1
  1. 8
      tildes/tildes/models/comment/comment.py
  2. 4
      tildes/tildes/models/comment/comment_label.py
  3. 6
      tildes/tildes/models/comment/comment_notification.py
  4. 13
      tildes/tildes/models/message/message.py
  5. 4
      tildes/tildes/models/topic/topic.py
  6. 5
      tildes/tildes/models/user/user_invite_code.py

8
tildes/tildes/models/comment/comment.py

@ -131,13 +131,9 @@ class Comment(DatabaseModel):
): ):
"""Create a new comment.""" """Create a new comment."""
self.topic = topic self.topic = topic
self.user_id = author.user_id
if parent_comment:
self.parent_comment_id = parent_comment.comment_id
else:
self.parent_comment_id = None
self.user = author
self.markdown = markdown self.markdown = markdown
self.parent_comment = parent_comment
incr_counter("comments") incr_counter("comments")

4
tildes/tildes/models/comment/comment_label.py

@ -58,8 +58,8 @@ class CommentLabel(DatabaseModel):
reason: Optional[str] = None, reason: Optional[str] = None,
): ):
"""Add a new label to a comment.""" """Add a new label to a comment."""
self.comment_id = comment.comment_id
self.user_id = user.user_id
self.comment = comment
self.user = user
self.label = label self.label = label
self.weight = weight self.weight = weight
self.reason = reason self.reason = reason

6
tildes/tildes/models/comment/comment_notification.py

@ -99,15 +99,15 @@ class CommentNotification(DatabaseModel):
for user in users_to_mention: for user in users_to_mention:
# prevent the user from mentioning themselves # prevent the user from mentioning themselves
if comment.user_id == user.user_id:
if comment.user == user:
continue continue
if parent_comment: if parent_comment:
# prevent comment replies from mentioning that comment's poster # prevent comment replies from mentioning that comment's poster
if parent_comment.user_id == user.user_id:
if parent_comment.user == user:
continue continue
# prevent top-level comments from mentioning the thread creator # prevent top-level comments from mentioning the thread creator
elif comment.topic.user_id == user.user_id:
elif comment.topic.user == user:
continue continue
mention_notification = cls( mention_notification = cls(

13
tildes/tildes/models/message/message.py

@ -111,9 +111,9 @@ class MessageConversation(DatabaseModel):
def __init__(self, sender: User, recipient: User, subject: str, markdown: str): def __init__(self, sender: User, recipient: User, subject: str, markdown: str):
"""Create a new message conversation between two users.""" """Create a new message conversation between two users."""
self.sender_id = sender.user_id
self.recipient_id = recipient.user_id
self.unread_user_ids = [self.recipient_id]
self.sender = sender
self.recipient = recipient
self.unread_user_ids = [self.recipient.user_id]
self.subject = subject self.subject = subject
self.markdown = markdown self.markdown = markdown
self.rendered_html = convert_markdown_to_safe_html(markdown) self.rendered_html = convert_markdown_to_safe_html(markdown)
@ -231,12 +231,15 @@ class MessageReply(DatabaseModel):
markdown: str = deferred(Column(Text, nullable=False)) markdown: str = deferred(Column(Text, nullable=False))
rendered_html: str = Column(Text, nullable=False) rendered_html: str = Column(Text, nullable=False)
conversation: MessageConversation = relationship(
"MessageConversation", innerjoin=True
)
sender: User = relationship("User", lazy=False, innerjoin=True) sender: User = relationship("User", lazy=False, innerjoin=True)
def __init__(self, conversation: MessageConversation, sender: User, markdown: str): def __init__(self, conversation: MessageConversation, sender: User, markdown: str):
"""Add a new reply to a message conversation.""" """Add a new reply to a message conversation."""
self.conversation_id = conversation.conversation_id
self.sender_id = sender.user_id
self.conversation = conversation
self.sender = sender
self.markdown = markdown self.markdown = markdown
self.rendered_html = convert_markdown_to_safe_html(markdown) self.rendered_html = convert_markdown_to_safe_html(markdown)

4
tildes/tildes/models/topic/topic.py

@ -196,8 +196,8 @@ class Topic(DatabaseModel):
def _create_base_topic(cls, group: Group, author: User, title: str) -> "Topic": def _create_base_topic(cls, group: Group, author: User, title: str) -> "Topic":
"""Create the "base" for a new topic.""" """Create the "base" for a new topic."""
new_topic = cls() new_topic = cls()
new_topic.group_id = group.group_id
new_topic.user_id = author.user_id
new_topic.group = group
new_topic.user = author
# if the title is all caps, convert to title case # if the title is all caps, convert to title case
if title.isupper(): if title.isupper():

5
tildes/tildes/models/user/user_invite_code.py

@ -8,6 +8,7 @@ import string
from datetime import datetime from datetime import datetime
from sqlalchemy import CheckConstraint, Column, ForeignKey, Integer, Text, TIMESTAMP from sqlalchemy import CheckConstraint, Column, ForeignKey, Integer, Text, TIMESTAMP
from sqlalchemy.orm import relationship
from sqlalchemy.sql.expression import text from sqlalchemy.sql.expression import text
from tildes.lib.string import separate_string from tildes.lib.string import separate_string
@ -39,6 +40,8 @@ class UserInviteCode(DatabaseModel):
) )
invitee_id: int = Column(Integer, ForeignKey("users.user_id")) invitee_id: int = Column(Integer, ForeignKey("users.user_id"))
user: User = relationship("User", innerjoin=True, foreign_keys=[user_id])
def __str__(self) -> str: def __str__(self) -> str:
"""Format the code into a more easily readable version.""" """Format the code into a more easily readable version."""
return separate_string(self.code, "-", 5) return separate_string(self.code, "-", 5)
@ -49,7 +52,7 @@ class UserInviteCode(DatabaseModel):
Note that uniqueness is not confirmed here, so there is the potential to create Note that uniqueness is not confirmed here, so there is the potential to create
duplicate codes (which will fail to commit to the database). duplicate codes (which will fail to commit to the database).
""" """
self.user_id = user.user_id
self.user = user
code_chars = random.choices(self.ALPHABET, k=self.LENGTH) code_chars = random.choices(self.ALPHABET, k=self.LENGTH)
self.code = "".join(code_chars) self.code = "".join(code_chars)

Loading…
Cancel
Save