##// END OF EJS Templates
Save signatures when the post is parsed for the later use
Save signatures when the post is parsed for the later use

File last commit:

r1244:0f0731ca decentral
r1244:0f0731ca decentral
Show More
manager.py
128 lines | 3.8 KiB | text/x-python | PythonLexer
neko259
Split post module into post and manager
r1234 from datetime import datetime, timedelta, date
from datetime import time as dtime
import logging
from django.db import models, transaction
from django.utils import timezone
from boards import utils
from boards.mdx_neboard import Parser
from boards.models import PostImage
import boards.models
__author__ = 'vurdalak'
NO_IP = '0.0.0.0'
POSTS_PER_DAY_RANGE = 7
class PostManager(models.Manager):
@transaction.atomic
def create_post(self, title: str, text: str, image=None, thread=None,
ip=NO_IP, tags: list=None, opening_posts: list=None):
"""
Creates new post
"""
is_banned = boards.models.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")
if not tags:
tags = []
if not opening_posts:
opening_posts = []
posting_time = timezone.now()
neko259
Merged with defaul
r1241 new_thread = False
neko259
Split post module into post and manager
r1234 if not thread:
thread = boards.models.thread.Thread.objects.create(
bump_time=posting_time, last_edit_time=posting_time)
list(map(thread.tags.add, tags))
boards.models.thread.Thread.objects.process_oldest_threads()
neko259
Merged with defaul
r1241 new_thread = True
neko259
Split post module into post and manager
r1234
pre_text = Parser().preparse(text)
post = self.create(title=title,
text=pre_text,
pub_time=posting_time,
poster_ip=ip,
thread=thread,
last_edit_time=posting_time)
post.threads.add(thread)
post.set_global_id()
logger = logging.getLogger('boards.post.create')
logger.info('Created post {} by {}'.format(post, post.poster_ip))
if image:
post.images.add(PostImage.objects.create_with_hash(image))
neko259
Merged with defaul
r1241 if not new_thread:
thread.last_edit_time = posting_time
thread.bump()
thread.save()
neko259
Split post module into post and manager
r1234 post.build_url()
post.connect_replies()
post.connect_threads(opening_posts)
post.connect_notifications()
return post
@transaction.atomic
neko259
Save signatures when the post is parsed for the later use
r1244 def import_post(self, title: str, text: str, pub_time: str, global_id,
neko259
Split post module into post and manager
r1234 opening_post=None, tags=list()):
if opening_post is None:
thread = boards.models.thread.Thread.objects.create(
bump_time=pub_time, last_edit_time=pub_time)
list(map(thread.tags.add, tags))
else:
thread = opening_post.get_thread()
post = self.create(title=title, text=text,
pub_time=pub_time,
poster_ip=NO_IP,
last_edit_time=pub_time,
neko259
Save signatures when the post is parsed for the later use
r1244 thread_id=thread.id, global_id=global_id)
neko259
Split post module into post and manager
r1234
post.build_url()
post.connect_replies()
post.connect_notifications()
return post
def delete_posts_by_ip(self, ip):
"""
Deletes all posts of the author with same IP
"""
posts = self.filter(poster_ip=ip)
for post in posts:
post.delete()
@utils.cached_result()
def get_posts_per_day(self) -> float:
"""
Gets average count of posts per day for the last 7 days
"""
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())
posts_per_period = float(self.filter(
pub_time__lte=day_time_end,
pub_time__gte=day_time_start).count())
ppd = posts_per_period / POSTS_PER_DAY_RANGE
return ppd