##// END OF EJS Templates
Store UUID for posts and get thread diff by UUIDs instead of update time or...
Store UUID for posts and get thread diff by UUIDs instead of update time or IDs

File last commit:

r1118:01343b9e default
r1118:01343b9e default
Show More
post.py
433 lines | 13.4 KiB | text/x-python | PythonLexer
neko259
Optimized getting current date in PPD calculation
r586 from datetime import datetime, timedelta, date
neko259
Show posts per
r407 from datetime import time as dtime
neko259
Added some logging
r639 import logging
neko259
Split up user models
r386 import re
neko259
Store UUID for posts and get thread diff by UUIDs instead of update time or...
r1118 import uuid
neko259
Added image duplicate check
r527
neko259
Refactoring
r1061 from django.core.exceptions import ObjectDoesNotExist
neko259
Added post url caching to cache post replies and id urls
r589 from django.core.urlresolvers import reverse
neko259
Added post admin page with tags edit capability
r566 from django.db import models, transaction
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 from django.db.models import TextField
neko259
Added tag search. Refactored search to show any model results in a list.
r692 from django.template.loader import render_to_string
neko259
Moved models to a separate module folder. Starting to split up models file
r384 from django.utils import timezone
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 from boards import settings
neko259
Moved text parser and preparser to a separate module (BB-64)
r1066 from boards.mdx_neboard import Parser
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 from boards.models import PostImage
neko259
Added tag search. Refactored search to show any model results in a list.
r692 from boards.models.base import Viewable
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 from boards import utils
neko259
Don't allow banned user to post into threads
r1098 from boards.models.user import Notification, Ban
neko259
Fixed creating new thread that was broken after messing up dependencies in...
r959 import boards.models.thread
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Refactoring
r917
neko259
Use cache for PPD value
r410 APP_LABEL_BOARDS = 'boards'
neko259
Optimized PPD counter (now it uses a single query instead of one for each day)
r745 POSTS_PER_DAY_RANGE = 7
neko259
Get PPD for the last week
r408
neko259
Moved models to a separate module folder. Starting to split up models file
r384 BAN_REASON_AUTO = 'Auto'
IMAGE_THUMB_SIZE = (200, 150)
neko259
Enlarged title field
r612 TITLE_MAX_LENGTH = 200
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Added TODOs to the bad and deprecated code to be removed
r702 # TODO This should be removed
neko259
Moved models to a separate module folder. Starting to split up models file
r384 NO_IP = '0.0.0.0'
neko259
Added TODOs to the bad and deprecated code to be removed
r702
neko259
Moving neboard to python3 support (no python2 for now until we figure out how...
r765 REGEX_REPLY = re.compile(r'\[post\](\d+)\[/post\]')
neko259
User notifications (BB-59)
r990 REGEX_NOTIFICATION = re.compile(r'\[user\](\w+)\[/user\]')
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 PARAMETER_TRUNCATED = 'truncated'
PARAMETER_TAG = 'tag'
PARAMETER_OFFSET = 'offset'
PARAMETER_DIFF_TYPE = 'type'
neko259
Render post view template tag by calling post.get_view instead of duplicating...
r1096 PARAMETER_CSS_CLASS = 'css_class'
neko259
Refactoring
r917 PARAMETER_THREAD = 'thread'
PARAMETER_IS_OPENING = 'is_opening'
PARAMETER_MODERATOR = 'moderator'
PARAMETER_POST = 'post'
PARAMETER_OP_ID = 'opening_post_id'
PARAMETER_NEED_OPEN_LINK = 'need_open_link'
neko259
Fixes to previous commit
r1057 PARAMETER_REPLY_LINK = 'reply_link'
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
DIFF_TYPE_HTML = 'html'
DIFF_TYPE_JSON = 'json'
neko259
Minor refactoring for post model
r1080 REFMAP_STR = '<a href="{}">&gt;&gt;{}</a>'
neko259
Moved models to a separate module folder. Starting to split up models file
r384
class PostManager(models.Manager):
neko259
Small fixes to the websocket notifications. Make post creation atomic, not the entire view
r915 @transaction.atomic
def create_post(self, title: str, text: str, image=None, thread=None,
neko259
Added a form field for additional threads list in multi-thread posts
r1077 ip=NO_IP, tags: list=None, threads: list=None):
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Optimized imports and added some docstrings to the post module
r622 Creates new post
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Don't allow banned user to post into threads
r1098 is_banned = Ban.objects.filter(ip=ip).exists()
# TODO Raise specific exception and catch it in the views
if is_banned:
raise Exception("This user is banned")
neko259
Fixed tag problems with python3 (related to the 'map' function that was...
r766 if not tags:
tags = []
neko259
Added a form field for additional threads list in multi-thread posts
r1077 if not threads:
threads = []
neko259
Fixed tag problems with python3 (related to the 'map' function that was...
r766
neko259
Moved models to a separate module folder. Starting to split up models file
r384 posting_time = timezone.now()
neko259
Split up post model into post and thread to normalise models. Still need some refactoring
r398 if not thread:
neko259
Fixed creating new thread that was broken after messing up dependencies in...
r959 thread = boards.models.thread.Thread.objects.create(
neko259
Post model code refacoring. Added help on the "thread" parser tag
r1063 bump_time=posting_time, last_edit_time=posting_time)
neko259
Delete old threads only on thread creation, not on every added post
r615 new_thread = True
neko259
Split up post model into post and thread to normalise models. Still need some refactoring
r398 else:
neko259
Delete old threads only on thread creation, not on every added post
r615 new_thread = False
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Moved text parser and preparser to a separate module (BB-64)
r1066 pre_text = Parser().preparse(text)
neko259
Pre-parse text to change the markdown-style patterns to bbcode
r865
neko259
Moved models to a separate module folder. Starting to split up models file
r384 post = self.create(title=title,
neko259
Pre-parse text to change the markdown-style patterns to bbcode
r865 text=pre_text,
neko259
Moved models to a separate module folder. Starting to split up models file
r384 pub_time=posting_time,
poster_ip=ip,
neko259
Added field to hold the "main" thread. When connecting reflinks, connect...
r980 thread=thread,
neko259
Removed user and settings mode. Added settings manager to manage settings and keep them in the session (or any other backend like cookie in the future
r728 last_edit_time=posting_time)
neko259
Allow connecting post to many threads
r979 post.threads.add(thread)
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Another log names change
r868 logger = logging.getLogger('boards.post.create')
neko259
Use more log tags in post module
r866
neko259
Refactored post and thread models
r1091 logger.info('Created post {} by {}'.format(post, post.poster_ip))
neko259
Don't output post text to a log
r850
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 if image:
neko259
Refactored post image code. Added a method to create an image or get an...
r1025 post.images.add(PostImage.objects.create_with_hash(image))
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693
neko259
Use map() in python3 style
r770 list(map(thread.add_tag, tags))
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Delete old threads only on thread creation, not on every added post
r615 if new_thread:
neko259
Fixed creating new thread that was broken after messing up dependencies in...
r959 boards.models.thread.Thread.objects.process_oldest_threads()
neko259
Bump thread only after adding post to it
r885 else:
neko259
Update all posts in thread diff when the thread become not bumpable (BB-66)
r1029 thread.last_edit_time = posting_time
neko259
Bump thread only after adding post to it
r885 thread.bump()
thread.save()
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008 post.connect_replies()
neko259
Added a form field for additional threads list in multi-thread posts
r1077 post.connect_threads(threads)
neko259
User notifications (BB-59)
r990 post.connect_notifications()
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Store each post URL in the database instead of computing it every time
r1112 post.build_url()
neko259
Moved models to a separate module folder. Starting to split up models file
r384 return post
def delete_posts_by_ip(self, ip):
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Optimized imports and added some docstrings to the post module
r622 Deletes all posts of the author with same IP
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Moved models to a separate module folder. Starting to split up models file
r384 posts = self.filter(poster_ip=ip)
neko259
Fixed tag problems with python3 (related to the 'map' function that was...
r766 for post in posts:
neko259
Delete thread when the OP is deleted. Removed old post deleter
r880 post.delete()
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 @utils.cached_result()
neko259
Added type hints to some models and managers
r1083 def get_posts_per_day(self) -> float:
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Optimized imports and added some docstrings to the post module
r622 Gets average count of posts per day for the last 7 days
neko259
Small changes to the docstrings. Added some TODOs
r418 """
neko259
Show posts per
r407
neko259
Optimized PPD counter (now it uses a single query instead of one for each day)
r745 day_end = date.today()
day_start = day_end - timedelta(POSTS_PER_DAY_RANGE)
day_time_start = timezone.make_aware(datetime.combine(
day_start, dtime()), timezone.get_current_timezone())
day_time_end = timezone.make_aware(datetime.combine(
day_end, dtime()), timezone.get_current_timezone())
neko259
Fixed PPD counting. Before this it was count from the future week
r413
neko259
Optimized PPD counter (now it uses a single query instead of one for each day)
r745 posts_per_period = float(self.filter(
pub_time__lte=day_time_end,
pub_time__gte=day_time_start).count())
neko259
Get PPD for the last week
r408
neko259
Optimized PPD counter (now it uses a single query instead of one for each day)
r745 ppd = posts_per_period / POSTS_PER_DAY_RANGE
neko259
Get PPD for the last week
r408
neko259
Use cache for PPD value
r410 return ppd
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Added tag search. Refactored search to show any model results in a list.
r692 class Post(models.Model, Viewable):
neko259
Moved models to a separate module folder. Starting to split up models file
r384 """A post is a message."""
objects = PostManager()
class Meta:
neko259
Use cache for PPD value
r410 app_label = APP_LABEL_BOARDS
neko259
Optimized thread view and threads list
r649 ordering = ('id',)
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Removed poster user agent field
r1078 title = models.CharField(max_length=TITLE_MAX_LENGTH, null=True, blank=True)
neko259
Moved models to a separate module folder. Starting to split up models file
r384 pub_time = models.DateTimeField()
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 text = TextField(blank=True, null=True)
_text_rendered = TextField(blank=True, null=True, editable=False)
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 images = models.ManyToManyField(PostImage, null=True, blank=True,
related_name='ip+', db_index=True)
neko259
Moved models to a separate module folder. Starting to split up models file
r384
poster_ip = models.GenericIPAddressField()
last_edit_time = models.DateTimeField()
referenced_posts = models.ManyToManyField('Post', symmetrical=False,
null=True,
neko259
Query optimizations
r661 blank=True, related_name='rfp+',
db_index=True)
neko259
Added refmap cache to speed up work with reference maps
r674 refmap = models.TextField(null=True, blank=True)
neko259
Allow connecting post to many threads
r979 threads = models.ManyToManyField('Thread', db_index=True)
neko259
Added field to hold the "main" thread. When connecting reflinks, connect...
r980 thread = models.ForeignKey('Thread', db_index=True, related_name='pt+')
neko259
Store UUID for posts and get thread diff by UUIDs instead of update time or...
r1118
neko259
Store each post URL in the database instead of computing it every time
r1112 url = models.TextField()
neko259
Store UUID for posts and get thread diff by UUIDs instead of update time or...
r1118 uid = models.TextField()
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Show thread, post and tag names in admin with python3
r875 def __str__(self):
neko259
Use more clean naming of admin entities
r878 return 'P#{}/{}'.format(self.id, self.title)
neko259
Moved models to a separate module folder. Starting to split up models file
r384
neko259
Fixes to tags management after the last changes
r911 def get_title(self) -> str:
neko259
Optimized imports and added some docstrings to the post module
r622 """
Gets original post title or part of its text.
"""
neko259
Moved models to a separate module folder. Starting to split up models file
r384 title = self.title
neko259
Fixed some issues based on feedback at linux.org.ru
r618 if not title:
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 title = self.get_text()
neko259
Moved models to a separate module folder. Starting to split up models file
r384
return title
neko259
Fixes to tags management after the last changes
r911 def build_refmap(self) -> None:
neko259
Removed linked tags. Added changelog for 2.0. Fixed reply connection.
r740 """
Builds a replies map string from replies list. This is a cache to stop
the server from recalculating the map on every post show.
"""
neko259
Added refmap cache to speed up work with reference maps
r674
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 post_urls = [REFMAP_STR.format(refpost.get_url(), refpost.id)
for refpost in self.referenced_posts.all()]
neko259
Added refmap cache to speed up work with reference maps
r674
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008 self.refmap = ', '.join(post_urls)
neko259
Added refmap cache to speed up work with reference maps
r674
neko259
Fixes to tags management after the last changes
r911 def is_referenced(self) -> bool:
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008 return self.refmap and len(self.refmap) > 0
neko259
Split up post model into post and thread to normalise models. Still need some refactoring
r398
neko259
Fixes to tags management after the last changes
r911 def is_opening(self) -> bool:
neko259
Optimized imports and added some docstrings to the post module
r622 """
Checks if this is an opening post or just a reply.
"""
neko259
Backed out changeset a37f5ca1da43
r949 return self.get_thread().get_opening_post_id() == self.id
neko259
Fixed some issues with post model migration
r400
neko259
Always show main thread for post in post link. Prefetch thread replies' thread and threads
r984 def get_url(self):
neko259
Store each post URL in the database instead of computing it every time
r1112 return self.url
neko259
Added post url caching to cache post replies and id urls
r589
neko259
Removed unecessary connection of a thread to its replies, cause posts are...
r958 def get_thread(self):
neko259
Added field to hold the "main" thread. When connecting reflinks, connect...
r980 return self.thread
neko259
Allow connecting post to many threads
r979
neko259
Added type hints to some models and managers
r1083 def get_threads(self) -> list:
neko259
Optimized imports and added some docstrings to the post module
r622 """
Gets post's thread.
"""
neko259
Allow connecting post to many threads
r979 return self.threads
neko259
Made getting post thread more generic and scalable
r617
neko259
Added tag search. Refactored search to show any model results in a list.
r692 def get_view(self, moderator=False, need_open_link=False,
neko259
Render post view template tag by calling post.get_view instead of duplicating...
r1096 truncated=False, reply_link=False, *args, **kwargs) -> str:
neko259
Refactoring
r917 """
Renders post's HTML view. Some of the post params can be passed over
kwargs for the means of caching (if we view the thread, some params
are same for every post and don't need to be computed over and over.
"""
neko259
Added tag search. Refactored search to show any model results in a list.
r692
neko259
Removed obsolete parameter from post view tag
r988 thread = self.get_thread()
neko259
Refactoring
r917 is_opening = kwargs.get(PARAMETER_IS_OPENING, self.is_opening())
neko259
Added tag search. Refactored search to show any model results in a list.
r692
neko259
Use post id in search. Speed up post viewing
r724 if is_opening:
opening_post_id = self.id
else:
opening_post_id = thread.get_opening_post_id()
neko259
Added tag search. Refactored search to show any model results in a list.
r692
neko259
Render post view template tag by calling post.get_view instead of duplicating...
r1096 css_class = 'post'
if thread.archived:
css_class += ' archive_post'
elif not thread.can_bump():
css_class += ' dead_post'
neko259
Added tag search. Refactored search to show any model results in a list.
r692 return render_to_string('boards/post.html', {
neko259
Refactoring
r917 PARAMETER_POST: self,
PARAMETER_MODERATOR: moderator,
PARAMETER_IS_OPENING: is_opening,
PARAMETER_THREAD: thread,
neko259
Render post view template tag by calling post.get_view instead of duplicating...
r1096 PARAMETER_CSS_CLASS: css_class,
neko259
Refactoring
r917 PARAMETER_NEED_OPEN_LINK: need_open_link,
PARAMETER_TRUNCATED: truncated,
PARAMETER_OP_ID: opening_post_id,
neko259
Render post view template tag by calling post.get_view instead of duplicating...
r1096 PARAMETER_REPLY_LINK: reply_link,
neko259
Added tag search. Refactored search to show any model results in a list.
r692 })
neko259
Added required tags. At least one such tag is needed to create a thread. All...
r922 def get_search_view(self, *args, **kwargs):
return self.get_view(args, kwargs)
neko259
Fixes to tags management after the last changes
r911 def get_first_image(self) -> PostImage:
neko259
Moved post image to a separate model. Each post (as of model) can contain multiple images now. The image shown to the user is got with get_first_image method
r693 return self.images.earliest('id')
neko259
Code cleanup. Update only edited fields while performing thread archiving or post editing. Remove image when post is removed
r715 def delete(self, using=None):
"""
neko259
Delete replies properly when deleting a thread. Delete thread directly, not by...
r950 Deletes all post images and the post itself.
neko259
Code cleanup. Update only edited fields while performing thread archiving or post editing. Remove image when post is removed
r715 """
neko259
Image deduplication (BB-53). When an image with the same hash is uploaded, it...
r944 for image in self.images.all():
image_refs_count = Post.objects.filter(images__in=[image]).count()
if image_refs_count == 1:
image.delete()
neko259
Code cleanup. Update only edited fields while performing thread archiving or post editing. Remove image when post is removed
r715
neko259
Delete replies properly when deleting a thread. Delete thread directly, not by...
r950 thread = self.get_thread()
thread.last_edit_time = timezone.now()
thread.save()
neko259
Delete thread when the OP is deleted. Removed old post deleter
r880
neko259
Actually delete the opening post when deleting the thread
r884 super(Post, self).delete(using)
neko259
Delete thread when the OP is deleted. Removed old post deleter
r880
logging.getLogger('boards.post.delete').info(
neko259
Preparse comment to bbcode
r888 'Deleted post {}'.format(self))
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 # TODO Implement this with OOP, e.g. use the factory and HtmlPostData class
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 def get_post_data(self, format_type=DIFF_TYPE_JSON, request=None,
neko259
Added type hints to some models and managers
r1083 include_last_update=False) -> str:
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 """
Gets post HTML or JSON data that can be rendered on a page or used by
API.
"""
if format_type == DIFF_TYPE_HTML:
neko259
Fixed issue in rendering post without having a request
r1117 if request is not None and PARAMETER_TRUNCATED in request.GET:
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 truncated = True
reply_link = False
neko259
Fixes to previous commit
r1057 else:
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 truncated = False
reply_link = True
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 return self.get_view(truncated=truncated, reply_link=reply_link,
moderator=utils.is_moderator(request))
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 elif format_type == DIFF_TYPE_JSON:
post_json = {
'id': self.id,
'title': self.title,
neko259
Added parser test. Fixed quote preparsing
r886 'text': self._text_rendered,
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 }
if self.images.exists():
post_image = self.get_first_image()
post_json['image'] = post_image.image.url
post_json['image_preview'] = post_image.image.url_200x150
if include_last_update:
neko259
Show moderator controls when downloading a single post over API. Removed duplicate code from get_post_data
r1109 post_json['bump_time'] = utils.datetime_to_epoch(
neko259
Allow connecting post to many threads
r979 self.get_thread().bump_time)
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 return post_json
neko259
Refactored post and thread models
r1091 def notify_clients(self, recursive=True):
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 """
Sends post HTML data to the thread web socket.
"""
if not settings.WEBSOCKETS_ENABLED:
return
neko259
Fixed notifications for multi-thread posts. Fixed hiding hidden tag threads when viewing tag page
r1062 thread_ids = list()
for thread in self.get_threads().all():
thread_ids.append(thread.id)
neko259
Refactored post and thread models
r1091 thread.notify_clients()
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
if recursive:
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 for reply_number in re.finditer(REGEX_REPLY, self.get_raw_text()):
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853 post_id = reply_number.group(1)
neko259
Refactoring
r1061
try:
ref_post = Post.objects.get(id=post_id)
neko259
Added centrifuge (websocket) support for thread autoupdate. Only websocket version is supported for now
r853
neko259
Fixed notifications for multi-thread posts. Fixed hiding hidden tag threads when viewing tag page
r1062 if ref_post.get_threads().exclude(id__in=thread_ids).exists():
# If post is in this thread, its thread was already notified.
# Otherwise, notify its thread separately.
neko259
Refactored post and thread models
r1091 ref_post.notify_clients(recursive=False)
neko259
Refactoring
r1061 except ObjectDoesNotExist:
pass
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881
neko259
Store each post URL in the database instead of computing it every time
r1112 def build_url(self):
thread = self.get_thread()
opening_id = thread.get_opening_post_id()
post_url = reverse('thread', kwargs={'post_id': opening_id})
if self.id != opening_id:
post_url += '#' + str(self.id)
self.url = post_url
self.save(update_fields=['url'])
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
neko259
Moved text parser and preparser to a separate module (BB-64)
r1066 self._text_rendered = Parser().parse(self.get_raw_text())
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881
neko259
Store UUID for posts and get thread diff by UUIDs instead of update time or...
r1118 self.uid = str(uuid.uuid4())
if update_fields is not None and 'uid' not in update_fields:
update_fields += ['uid']
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 if self.id:
for thread in self.get_threads().all():
neko259
Update thread bumpable status and posts only if it is yet bumpable
r1092 if thread.can_bump():
thread.update_bump_status()
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 thread.last_edit_time = self.last_edit_time
thread.save(update_fields=['last_edit_time', 'bumpable'])
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 super().save(force_insert, force_update, using, update_fields)
neko259
Fixes to tags management after the last changes
r911 def get_text(self) -> str:
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 return self._text_rendered
neko259
Fixes to tags management after the last changes
r911 def get_raw_text(self) -> str:
neko259
Removed django-markupfield as it is incompatible with the new migrations. Use 2 fields for storing raw and rendered text and work with them directly
r881 return self.text
neko259
Show thread number in the post number if post has many threads
r981
def get_absolute_id(self) -> str:
neko259
Always show main thread for post in post link. Prefetch thread replies' thread and threads
r984 """
If the post has many threads, shows its main thread OP id in the post
ID.
"""
neko259
Show thread number in the post number if post has many threads
r981 if self.get_threads().count() > 1:
return '{}/{}'.format(self.get_thread().get_opening_post_id(), self.id)
else:
return str(self.id)
neko259
User notifications (BB-59)
r990
def connect_notifications(self):
for reply_number in re.finditer(REGEX_NOTIFICATION, self.get_raw_text()):
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008 user_name = reply_number.group(1).lower()
neko259
User notifications (BB-59)
r990 Notification.objects.get_or_create(name=user_name, post=self)
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008
def connect_replies(self):
"""
Connects replies to a post to show them as a reflink map
"""
for reply_number in re.finditer(REGEX_REPLY, self.get_raw_text()):
post_id = reply_number.group(1)
neko259
Refactoring
r1061
try:
referenced_post = Post.objects.get(id=post_id)
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008 referenced_post.referenced_posts.add(self)
referenced_post.last_edit_time = self.pub_time
referenced_post.build_refmap()
referenced_post.save(update_fields=['refmap', 'last_edit_time'])
neko259
Refactoring
r1061 except ObjectDoesNotExist:
pass
neko259
Use only lowercase name in notifications. Refactored post manager and refmap...
r1008
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 def connect_threads(self, opening_posts):
neko259
Refactoring
r1061 """
If the referenced post is an OP in another thread,
make this post multi-thread.
"""
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 for opening_post in opening_posts:
threads = opening_post.get_threads().all()
for thread in threads:
if thread.can_bump():
thread.update_bump_status()
neko259
Split reflink and multithread post to different patterns
r1060
neko259
Refactored websockets notifications and updating threads when updating posts
r1088 thread.last_edit_time = self.last_edit_time
neko259
Added a form field for additional threads list in multi-thread posts
r1077 thread.save(update_fields=['last_edit_time', 'bumpable'])
neko259
Split reflink and multithread post to different patterns
r1060
neko259
Added a form field for additional threads list in multi-thread posts
r1077 self.threads.add(thread)