##// END OF EJS Templates
New backend for fav threads. Now only last post ids are saved, no thread ids
New backend for fav threads. Now only last post ids are saved, no thread ids

File last commit:

r2008:5d3c1f7e default
r2044:227641ed default
Show More
signals.py
136 lines | 5.0 KiB | text/x-python | PythonLexer
import os
import re
from django.db.models.signals import post_save, pre_save, pre_delete, \
post_delete
from django.dispatch import receiver
from django.utils import timezone
from boards import thumbs
from boards.abstracts.constants import REGEX_REPLY, THUMB_SIZES
from boards.mdx_neboard import get_parser
from boards.models import Post, GlobalId, Attachment
from boards.models.attachment.viewers import FILE_TYPES_IMAGE
from boards.models.post import REGEX_NOTIFICATION, REGEX_GLOBAL_REPLY
from boards.models.post.manager import post_import_deps
from boards.models.user import Notification
from neboard.settings import MEDIA_ROOT
@receiver(post_save, sender=Post)
def connect_replies(instance, **kwargs):
if not kwargs['update_fields']:
for reply_number in re.finditer(REGEX_REPLY, instance.get_raw_text()):
post_id = reply_number.group(1)
try:
referenced_post = Post.objects.get(id=post_id)
if not referenced_post.referenced_posts.filter(
id=instance.id).exists():
referenced_post.referenced_posts.add(instance)
referenced_post.last_edit_time = instance.pub_time
referenced_post.build_refmap()
referenced_post.save(update_fields=['refmap', 'last_edit_time'])
except Post.DoesNotExist:
pass
@receiver(post_save, sender=Post)
@receiver(post_import_deps, sender=Post)
def connect_global_replies(instance, **kwargs):
if not kwargs['update_fields']:
for reply_number in re.finditer(REGEX_GLOBAL_REPLY, instance.get_raw_text()):
key_type = reply_number.group(1)
key = reply_number.group(2)
local_id = reply_number.group(3)
try:
global_id = GlobalId.objects.get(key_type=key_type, key=key,
local_id=local_id)
referenced_post = Post.objects.get(global_id=global_id)
referenced_post.referenced_posts.add(instance)
referenced_post.last_edit_time = instance.pub_time
referenced_post.build_refmap()
referenced_post.save(update_fields=['refmap', 'last_edit_time'])
except (GlobalId.DoesNotExist, Post.DoesNotExist):
pass
@receiver(post_save, sender=Post)
def connect_notifications(instance, **kwargs):
if not kwargs['update_fields']:
for reply_number in re.finditer(REGEX_NOTIFICATION, instance.get_raw_text()):
user_name = reply_number.group(1).lower()
Notification.objects.get_or_create(name=user_name, post=instance)
@receiver(pre_save, sender=Post)
@receiver(post_import_deps, sender=Post)
def parse_text(instance, **kwargs):
instance._text_rendered = get_parser().parse(instance.get_raw_text())
@receiver(pre_delete, sender=Post)
def delete_attachments(instance, **kwargs):
for attachment in instance.attachments.all():
attachment_refs_count = attachment.attachment_posts.count()
if attachment_refs_count == 1:
attachment.delete()
@receiver(post_delete, sender=Post)
def update_thread_on_delete(instance, **kwargs):
thread = instance.get_thread()
thread.last_edit_time = timezone.now()
thread.save()
@receiver(post_delete, sender=Post)
def delete_global_id(instance, **kwargs):
if instance.global_id and instance.global_id.id:
instance.global_id.delete()
@receiver(post_save, sender=Attachment)
def generate_thumb(instance, **kwargs):
if instance.mimetype in FILE_TYPES_IMAGE:
for size in THUMB_SIZES:
(w, h) = size
split = instance.file.name.rsplit('.', 1)
thumb_name = '%s.%sx%s.%s' % (split[0], w, h, split[1])
if not instance.file.storage.exists(thumb_name):
# you can use another thumbnailing function if you like
thumb_content = thumbs.generate_thumb(instance.file, size, split[1])
thumb_name_ = instance.file.storage.save(thumb_name, thumb_content)
if not thumb_name == thumb_name_:
raise ValueError(
'There is already a file named %s' % thumb_name_)
@receiver(pre_delete, sender=Post)
def rebuild_refmap(instance, **kwargs):
for referenced_post in instance.refposts.all():
referenced_post.build_refmap(excluded_ids=[instance.id])
referenced_post.save(update_fields=['refmap'])
@receiver(post_delete, sender=Attachment)
def delete_file(instance, **kwargs):
if instance.is_internal():
file = MEDIA_ROOT + instance.file.name
try:
os.remove(file)
except FileNotFoundError:
pass
if instance.mimetype in FILE_TYPES_IMAGE:
for size in THUMB_SIZES:
file_name_parts = instance.file.name.split('.')
thumb_file = MEDIA_ROOT + '{}.{}x{}.{}'.format(file_name_parts[0], size[0], size[1], file_name_parts[1])
try:
os.remove(thumb_file)
except FileNotFoundError:
pass