##// END OF EJS Templates
Fixed post deletion and export to JSON
neko259 -
r1603:0695b6a9 default
parent child Browse files
Show More
@@ -1,57 +1,57 b''
1 from django.contrib.auth.context_processors import PermWrapper
1 from django.contrib.auth.context_processors import PermWrapper
2
2
3 from boards import utils
3 from boards import utils
4
4
5
5
6 PARAMETER_TRUNCATED = 'truncated'
6 PARAMETER_TRUNCATED = 'truncated'
7
7
8 DIFF_TYPE_HTML = 'html'
8 DIFF_TYPE_HTML = 'html'
9 DIFF_TYPE_JSON = 'json'
9 DIFF_TYPE_JSON = 'json'
10
10
11
11
12 class Exporter():
12 class Exporter():
13 @staticmethod
13 @staticmethod
14 def export(post, request, include_last_update) -> str:
14 def export(post, request, include_last_update) -> str:
15 pass
15 pass
16
16
17
17
18 class HtmlExporter(Exporter):
18 class HtmlExporter(Exporter):
19 @staticmethod
19 @staticmethod
20 def export(post, request, include_last_update):
20 def export(post, request, include_last_update):
21 if request is not None and PARAMETER_TRUNCATED in request.GET:
21 if request is not None and PARAMETER_TRUNCATED in request.GET:
22 truncated = True
22 truncated = True
23 reply_link = False
23 reply_link = False
24 else:
24 else:
25 truncated = False
25 truncated = False
26 reply_link = True
26 reply_link = True
27
27
28 return post.get_view(truncated=truncated, reply_link=reply_link,
28 return post.get_view(truncated=truncated, reply_link=reply_link,
29 perms=PermWrapper(request.user))
29 perms=PermWrapper(request.user))
30
30
31
31
32 class JsonExporter(Exporter):
32 class JsonExporter(Exporter):
33 @staticmethod
33 @staticmethod
34 def export(post, request, include_last_update):
34 def export(post, request, include_last_update):
35 post_json = {
35 post_json = {
36 'id': post.id,
36 'id': post.id,
37 'title': post.title,
37 'title': post.title,
38 'text': post.get_raw_text(),
38 'text': post.get_raw_text(),
39 }
39 }
40 if post.images.exists():
40 if post.attachments.exists():
41 post_image = post.get_first_image()
41 post_image = post.get_first_image()
42 post_json['image'] = post_image.image.url
42 post_json['image'] = post_image.file.url
43 post_json['image_preview'] = post_image.image.url_200x150
43 post_json['image_preview'] = post_image.get_preview_url()
44 if include_last_update:
44 if include_last_update:
45 post_json['bump_time'] = utils.datetime_to_epoch(
45 post_json['bump_time'] = utils.datetime_to_epoch(
46 post.get_thread().bump_time)
46 post.get_thread().bump_time)
47 return post_json
47 return post_json
48
48
49
49
50 EXPORTERS = {
50 EXPORTERS = {
51 DIFF_TYPE_HTML: HtmlExporter,
51 DIFF_TYPE_HTML: HtmlExporter,
52 DIFF_TYPE_JSON: JsonExporter,
52 DIFF_TYPE_JSON: JsonExporter,
53 }
53 }
54
54
55
55
56 def get_exporter(export_type: str) -> Exporter:
56 def get_exporter(export_type: str) -> Exporter:
57 return EXPORTERS[export_type]()
57 return EXPORTERS[export_type]()
@@ -1,116 +1,108 b''
1 import re
1 import re
2 from boards import thumbs
2 from boards import thumbs
3 from boards.mdx_neboard import get_parser
3 from boards.mdx_neboard import get_parser
4
4
5 from boards.models import Post, GlobalId, Attachment
5 from boards.models import Post, GlobalId, Attachment
6 from boards.models.attachment.viewers import FILE_TYPES_IMAGE
6 from boards.models.attachment.viewers import FILE_TYPES_IMAGE
7 from boards.models.post import REGEX_NOTIFICATION, REGEX_REPLY,\
7 from boards.models.post import REGEX_NOTIFICATION, REGEX_REPLY,\
8 REGEX_GLOBAL_REPLY
8 REGEX_GLOBAL_REPLY
9 from boards.models.post.manager import post_import_deps
9 from boards.models.post.manager import post_import_deps
10 from boards.models.user import Notification
10 from boards.models.user import Notification
11 from django.db.models.signals import post_save, pre_save, pre_delete, \
11 from django.db.models.signals import post_save, pre_save, pre_delete, \
12 post_delete
12 post_delete
13 from django.dispatch import receiver
13 from django.dispatch import receiver
14 from django.utils import timezone
14 from django.utils import timezone
15
15
16
16
17 THUMB_SIZES = ((200, 150),)
17 THUMB_SIZES = ((200, 150),)
18
18
19
19
20 @receiver(post_save, sender=Post)
20 @receiver(post_save, sender=Post)
21 def connect_replies(instance, **kwargs):
21 def connect_replies(instance, **kwargs):
22 for reply_number in re.finditer(REGEX_REPLY, instance.get_raw_text()):
22 for reply_number in re.finditer(REGEX_REPLY, instance.get_raw_text()):
23 post_id = reply_number.group(1)
23 post_id = reply_number.group(1)
24
24
25 try:
25 try:
26 referenced_post = Post.objects.get(id=post_id)
26 referenced_post = Post.objects.get(id=post_id)
27
27
28 if not referenced_post.referenced_posts.filter(
28 if not referenced_post.referenced_posts.filter(
29 id=instance.id).exists():
29 id=instance.id).exists():
30 referenced_post.referenced_posts.add(instance)
30 referenced_post.referenced_posts.add(instance)
31 referenced_post.last_edit_time = instance.pub_time
31 referenced_post.last_edit_time = instance.pub_time
32 referenced_post.build_refmap()
32 referenced_post.build_refmap()
33 referenced_post.save(update_fields=['refmap', 'last_edit_time'])
33 referenced_post.save(update_fields=['refmap', 'last_edit_time'])
34 except Post.DoesNotExist:
34 except Post.DoesNotExist:
35 pass
35 pass
36
36
37
37
38 @receiver(post_save, sender=Post)
38 @receiver(post_save, sender=Post)
39 @receiver(post_import_deps, sender=Post)
39 @receiver(post_import_deps, sender=Post)
40 def connect_global_replies(instance, **kwargs):
40 def connect_global_replies(instance, **kwargs):
41 for reply_number in re.finditer(REGEX_GLOBAL_REPLY, instance.get_raw_text()):
41 for reply_number in re.finditer(REGEX_GLOBAL_REPLY, instance.get_raw_text()):
42 key_type = reply_number.group(1)
42 key_type = reply_number.group(1)
43 key = reply_number.group(2)
43 key = reply_number.group(2)
44 local_id = reply_number.group(3)
44 local_id = reply_number.group(3)
45
45
46 try:
46 try:
47 global_id = GlobalId.objects.get(key_type=key_type, key=key,
47 global_id = GlobalId.objects.get(key_type=key_type, key=key,
48 local_id=local_id)
48 local_id=local_id)
49 referenced_post = Post.objects.get(global_id=global_id)
49 referenced_post = Post.objects.get(global_id=global_id)
50 referenced_post.referenced_posts.add(instance)
50 referenced_post.referenced_posts.add(instance)
51 referenced_post.last_edit_time = instance.pub_time
51 referenced_post.last_edit_time = instance.pub_time
52 referenced_post.build_refmap()
52 referenced_post.build_refmap()
53 referenced_post.save(update_fields=['refmap', 'last_edit_time'])
53 referenced_post.save(update_fields=['refmap', 'last_edit_time'])
54 except (GlobalId.DoesNotExist, Post.DoesNotExist):
54 except (GlobalId.DoesNotExist, Post.DoesNotExist):
55 pass
55 pass
56
56
57
57
58 @receiver(post_save, sender=Post)
58 @receiver(post_save, sender=Post)
59 def connect_notifications(instance, **kwargs):
59 def connect_notifications(instance, **kwargs):
60 for reply_number in re.finditer(REGEX_NOTIFICATION, instance.get_raw_text()):
60 for reply_number in re.finditer(REGEX_NOTIFICATION, instance.get_raw_text()):
61 user_name = reply_number.group(1).lower()
61 user_name = reply_number.group(1).lower()
62 Notification.objects.get_or_create(name=user_name, post=instance)
62 Notification.objects.get_or_create(name=user_name, post=instance)
63
63
64
64
65 @receiver(pre_save, sender=Post)
65 @receiver(pre_save, sender=Post)
66 @receiver(post_import_deps, sender=Post)
66 @receiver(post_import_deps, sender=Post)
67 def parse_text(instance, **kwargs):
67 def parse_text(instance, **kwargs):
68 instance._text_rendered = get_parser().parse(instance.get_raw_text())
68 instance._text_rendered = get_parser().parse(instance.get_raw_text())
69
69
70
70
71 @receiver(pre_delete, sender=Post)
71 @receiver(pre_delete, sender=Post)
72 def delete_images(instance, **kwargs):
73 for image in instance.images.all():
74 image_refs_count = image.post_images.count()
75 if image_refs_count == 1:
76 image.delete()
77
78
79 @receiver(pre_delete, sender=Post)
80 def delete_attachments(instance, **kwargs):
72 def delete_attachments(instance, **kwargs):
81 for attachment in instance.attachments.all():
73 for attachment in instance.attachments.all():
82 attachment_refs_count = attachment.attachment_posts.count()
74 attachment_refs_count = attachment.attachment_posts.count()
83 if attachment_refs_count == 1:
75 if attachment_refs_count == 1:
84 attachment.delete()
76 attachment.delete()
85
77
86
78
87 @receiver(post_delete, sender=Post)
79 @receiver(post_delete, sender=Post)
88 def update_thread_on_delete(instance, **kwargs):
80 def update_thread_on_delete(instance, **kwargs):
89 thread = instance.get_thread()
81 thread = instance.get_thread()
90 thread.last_edit_time = timezone.now()
82 thread.last_edit_time = timezone.now()
91 thread.save()
83 thread.save()
92
84
93
85
94 @receiver(post_delete, sender=Post)
86 @receiver(post_delete, sender=Post)
95 def delete_global_id(instance, **kwargs):
87 def delete_global_id(instance, **kwargs):
96 if instance.global_id and instance.global_id.id:
88 if instance.global_id and instance.global_id.id:
97 instance.global_id.delete()
89 instance.global_id.delete()
98
90
99
91
100 @receiver(post_save, sender=Attachment)
92 @receiver(post_save, sender=Attachment)
101 def generate_thumb(instance, **kwargs):
93 def generate_thumb(instance, **kwargs):
102 if instance.mimetype in FILE_TYPES_IMAGE:
94 if instance.mimetype in FILE_TYPES_IMAGE:
103 for size in THUMB_SIZES:
95 for size in THUMB_SIZES:
104 (w, h) = size
96 (w, h) = size
105 split = instance.file.name.rsplit('.', 1)
97 split = instance.file.name.rsplit('.', 1)
106 thumb_name = '%s.%sx%s.%s' % (split[0], w, h, split[1])
98 thumb_name = '%s.%sx%s.%s' % (split[0], w, h, split[1])
107
99
108 if not instance.file.storage.exists(thumb_name):
100 if not instance.file.storage.exists(thumb_name):
109 # you can use another thumbnailing function if you like
101 # you can use another thumbnailing function if you like
110 thumb_content = thumbs.generate_thumb(instance.file, size, split[1])
102 thumb_content = thumbs.generate_thumb(instance.file, size, split[1])
111
103
112 thumb_name_ = instance.file.storage.save(thumb_name, thumb_content)
104 thumb_name_ = instance.file.storage.save(thumb_name, thumb_content)
113
105
114 if not thumb_name == thumb_name_:
106 if not thumb_name == thumb_name_:
115 raise ValueError(
107 raise ValueError(
116 'There is already a file named %s' % thumb_name_)
108 'There is already a file named %s' % thumb_name_)
General Comments 0
You need to be logged in to leave comments. Login now