Show More
@@ -17,7 +17,7 b" HEADER_CONTENT_TYPE = 'content-type'" | |||||
17 |
|
17 | |||
18 | FILE_DOWNLOAD_CHUNK_BYTES = 200000 |
|
18 | FILE_DOWNLOAD_CHUNK_BYTES = 200000 | |
19 |
|
19 | |||
20 | YOUTUBE_URL = re.compile(r'https?://((www\.)?youtube\.com/watch\?v=|youtu.be/)\w+') |
|
20 | YOUTUBE_URL = re.compile(r'https?://((www\.)?youtube\.com/watch\?v=|youtu.be/)[-\w]+') | |
21 |
|
21 | |||
22 |
|
22 | |||
23 | class Downloader: |
|
23 | class Downloader: |
@@ -1,25 +1,20 b'' | |||||
1 | import logging |
|
|||
2 |
|
|
1 | import uuid | |
3 |
|
2 | |||
4 | import re |
|
3 | import re | |
5 | from boards import settings |
|
4 | from boards import settings | |
6 | from boards.abstracts.tripcode import Tripcode |
|
5 | from boards.abstracts.tripcode import Tripcode | |
7 | from boards.mdx_neboard import get_parser |
|
|||
8 | from boards.models import PostImage, Attachment, KeyPair, GlobalId |
|
6 | from boards.models import PostImage, Attachment, KeyPair, GlobalId | |
9 | from boards.models.base import Viewable |
|
7 | from boards.models.base import Viewable | |
10 | from boards.models.post.export import get_exporter, DIFF_TYPE_JSON |
|
8 | from boards.models.post.export import get_exporter, DIFF_TYPE_JSON | |
11 | from boards.models.post.manager import PostManager |
|
9 | from boards.models.post.manager import PostManager | |
12 |
from boards. |
|
10 | from boards.utils import cached_result | |
|
11 | from boards.utils import datetime_to_epoch | |||
13 | from django.core.exceptions import ObjectDoesNotExist |
|
12 | from django.core.exceptions import ObjectDoesNotExist | |
14 | from django.core.urlresolvers import reverse |
|
13 | from django.core.urlresolvers import reverse | |
15 | from django.db import models |
|
14 | from django.db import models | |
16 | from django.db.models import TextField, QuerySet |
|
15 | from django.db.models import TextField, QuerySet | |
17 | from django.db.models.signals import pre_save, post_save, pre_delete, \ |
|
|||
18 | post_delete |
|
|||
19 | from django.dispatch import receiver |
|
|||
20 | from django.template.defaultfilters import truncatewords, striptags |
|
16 | from django.template.defaultfilters import truncatewords, striptags | |
21 | from django.template.loader import render_to_string |
|
17 | from django.template.loader import render_to_string | |
22 | from django.utils import timezone |
|
|||
23 |
|
18 | |||
24 | CSS_CLS_HIDDEN_POST = 'hidden_post' |
|
19 | CSS_CLS_HIDDEN_POST = 'hidden_post' | |
25 | CSS_CLS_DEAD_POST = 'dead_post' |
|
20 | CSS_CLS_DEAD_POST = 'dead_post' | |
@@ -114,11 +109,6 b' class Post(models.Model, Viewable):' | |||||
114 | def __str__(self): |
|
109 | def __str__(self): | |
115 | return 'P#{}/{}'.format(self.id, self.get_title()) |
|
110 | return 'P#{}/{}'.format(self.id, self.get_title()) | |
116 |
|
111 | |||
117 | def get_referenced_posts(self): |
|
|||
118 | threads = self.get_threads().all() |
|
|||
119 | return self.referenced_posts.filter(threads__in=threads)\ |
|
|||
120 | .order_by('pub_time').distinct().all() |
|
|||
121 |
|
||||
122 | def get_title(self) -> str: |
|
112 | def get_title(self) -> str: | |
123 | return self.title |
|
113 | return self.title | |
124 |
|
114 | |||
@@ -183,6 +173,13 b' class Post(models.Model, Viewable):' | |||||
183 |
|
173 | |||
184 | return self.threads |
|
174 | return self.threads | |
185 |
|
175 | |||
|
176 | def _get_cache_key(self): | |||
|
177 | return [datetime_to_epoch(self.last_edit_time)] | |||
|
178 | ||||
|
179 | @cached_result(key_method=_get_cache_key) | |||
|
180 | def get_thread_count(self): | |||
|
181 | return self.get_threads().count() | |||
|
182 | ||||
186 | def get_view(self, *args, **kwargs) -> str: |
|
183 | def get_view(self, *args, **kwargs) -> str: | |
187 | """ |
|
184 | """ | |
188 | Renders post's HTML view. Some of the post params can be passed over |
|
185 | Renders post's HTML view. Some of the post params can be passed over | |
@@ -362,12 +359,11 b' class Post(models.Model, Viewable):' | |||||
362 | ID. |
|
359 | ID. | |
363 | """ |
|
360 | """ | |
364 |
|
361 | |||
365 |
if self.get_thread |
|
362 | if self.get_thread_count() > 1: | |
366 | return '{}/{}'.format(self.get_thread().get_opening_post_id(), self.id) |
|
363 | return '{}/{}'.format(self.get_thread().get_opening_post_id(), self.id) | |
367 | else: |
|
364 | else: | |
368 | return str(self.id) |
|
365 | return str(self.id) | |
369 |
|
366 | |||
370 |
|
||||
371 | def connect_threads(self, opening_posts): |
|
367 | def connect_threads(self, opening_posts): | |
372 | for opening_post in opening_posts: |
|
368 | for opening_post in opening_posts: | |
373 | threads = opening_post.get_threads().all() |
|
369 | threads = opening_post.get_threads().all() |
@@ -181,10 +181,10 b' class Thread(models.Model):' | |||||
181 | """ |
|
181 | """ | |
182 |
|
182 | |||
183 | query = self.multi_replies.order_by('pub_time').prefetch_related( |
|
183 | query = self.multi_replies.order_by('pub_time').prefetch_related( | |
184 |
'images', 'thread', ' |
|
184 | 'images', 'thread', 'attachments') | |
185 | if view_fields_only: |
|
185 | if view_fields_only: | |
186 | query = query.defer('poster_ip') |
|
186 | query = query.defer('poster_ip') | |
187 |
return query |
|
187 | return query | |
188 |
|
188 | |||
189 | def get_top_level_replies(self) -> QuerySet: |
|
189 | def get_top_level_replies(self) -> QuerySet: | |
190 | return self.get_replies().exclude(refposts__threads__in=[self]) |
|
190 | return self.get_replies().exclude(refposts__threads__in=[self]) |
General Comments 0
You need to be logged in to leave comments.
Login now