##// END OF EJS Templates
Enforce privacy accepts a number of days before now
neko259 -
r1864:c0d80fa2 default
parent child Browse files
Show More
@@ -1,15 +1,34 b''
1 from datetime import datetime, timedelta, date
2 from datetime import time as dtime
3
1 from django.core.management import BaseCommand
4 from django.core.management import BaseCommand
2 from django.db import transaction
5 from django.db import transaction
6 from django.utils import timezone
3
7
4 from boards.models import Post
8 from boards.models import Post
5 from boards.models.post.manager import NO_IP
9 from boards.models.post.manager import NO_IP
6
10
7 __author__ = 'neko259'
11 __author__ = 'neko259'
8
12
9
13
10 class Command(BaseCommand):
14 class Command(BaseCommand):
11 help = 'Removes user and IP data from all posts'
15 help = 'Removes user and IP data from posts'
16
17 def add_arguments(self, parser):
18 parser.add_argument('--days-before', type=int,
19 help='Clean posts only before the number of days before today.')
12
20
13 @transaction.atomic
21 @transaction.atomic
14 def handle(self, *args, **options):
22 def handle(self, *args, **options):
15 Post.objects.all().update(poster_ip=NO_IP) No newline at end of file
23 days_before = options.get('days_before')
24
25 if days_before:
26 day_end = date.today() - timedelta(1)
27
28 day_time_end = timezone.make_aware(datetime.combine(
29 day_end, dtime()), timezone.get_current_timezone())
30 posts = Post.objects.filter(pub_time__lte=day_time_end)
31 else:
32 posts = Post.objects.all()
33 posts.update(poster_ip=NO_IP)
34
@@ -1,194 +1,193 b''
1 import logging
1 import logging
2
2
3 from datetime import datetime, timedelta, date
3 from datetime import datetime, timedelta, date
4 from datetime import time as dtime
4 from datetime import time as dtime
5
5
6 from boards.abstracts.exceptions import BannedException, ArchiveException
6 from boards.abstracts.exceptions import BannedException, ArchiveException
7 from django.db import models, transaction
7 from django.db import models, transaction
8 from django.utils import timezone
8 from django.utils import timezone
9 from django.dispatch import Signal
9 from django.dispatch import Signal
10
10
11 import boards
11 import boards
12
12
13 from boards.models.user import Ban
13 from boards.models.user import Ban
14 from boards.mdx_neboard import Parser
14 from boards.mdx_neboard import Parser
15 from boards.models import Attachment
15 from boards.models import Attachment
16 from boards import utils
16 from boards import utils
17
17
18 __author__ = 'neko259'
18 __author__ = 'neko259'
19
19
20 POSTS_PER_DAY_RANGE = 7
20 POSTS_PER_DAY_RANGE = 7
21 NO_IP = '0.0.0.0'
21 NO_IP = '0.0.0.0'
22
22
23
23
24 post_import_deps = Signal()
24 post_import_deps = Signal()
25
25
26
26
27 class PostManager(models.Manager):
27 class PostManager(models.Manager):
28 @transaction.atomic
28 @transaction.atomic
29 def create_post(self, title: str, text: str, files=[], thread=None,
29 def create_post(self, title: str, text: str, files=[], thread=None,
30 ip=NO_IP, tags: list=None,
30 ip=NO_IP, tags: list=None,
31 tripcode='', monochrome=False, images=[],
31 tripcode='', monochrome=False, images=[],
32 file_urls=[]):
32 file_urls=[]):
33 """
33 """
34 Creates new post
34 Creates new post
35 """
35 """
36
36
37 if thread is not None and thread.is_archived():
37 if thread is not None and thread.is_archived():
38 raise ArchiveException('Cannot post into an archived thread')
38 raise ArchiveException('Cannot post into an archived thread')
39
39
40 if not utils.is_anonymous_mode():
40 if not utils.is_anonymous_mode():
41 is_banned = Ban.objects.filter(ip=ip).exists()
41 is_banned = Ban.objects.filter(ip=ip).exists()
42 else:
42 else:
43 is_banned = False
43 is_banned = False
44
44
45 if is_banned:
45 if is_banned:
46 raise BannedException("This user is banned")
46 raise BannedException("This user is banned")
47
47
48 if not tags:
48 if not tags:
49 tags = []
49 tags = []
50
50
51 posting_time = timezone.now()
51 posting_time = timezone.now()
52 new_thread = False
52 new_thread = False
53 if not thread:
53 if not thread:
54 thread = boards.models.thread.Thread.objects.create(
54 thread = boards.models.thread.Thread.objects.create(
55 bump_time=posting_time, last_edit_time=posting_time,
55 bump_time=posting_time, last_edit_time=posting_time,
56 monochrome=monochrome)
56 monochrome=monochrome)
57 list(map(thread.tags.add, tags))
57 list(map(thread.tags.add, tags))
58 new_thread = True
58 new_thread = True
59
59
60 pre_text = Parser().preparse(text)
60 pre_text = Parser().preparse(text)
61
61
62 post = self.create(title=title,
62 post = self.create(title=title,
63 text=pre_text,
63 text=pre_text,
64 pub_time=posting_time,
64 pub_time=posting_time,
65 poster_ip=ip,
65 poster_ip=ip,
66 thread=thread,
66 thread=thread,
67 last_edit_time=posting_time,
67 last_edit_time=posting_time,
68 tripcode=tripcode,
68 tripcode=tripcode,
69 opening=new_thread)
69 opening=new_thread)
70
70
71 logger = logging.getLogger('boards.post.create')
71 logger = logging.getLogger('boards.post.create')
72
72
73 logger.info('Created post [{}] with text [{}] by {}'.format(post,
73 logger.info('Created post [{}] with text [{}] by {}'.format(post,
74 post.get_text(),post.poster_ip))
74 post.get_text(),post.poster_ip))
75
75
76 for file in files:
76 for file in files:
77 self._add_file_to_post(file, post)
77 self._add_file_to_post(file, post)
78 for image in images:
78 for image in images:
79 post.attachments.add(image)
79 post.attachments.add(image)
80 for file_url in file_urls:
80 for file_url in file_urls:
81 post.attachments.add(Attachment.objects.create_from_url(file_url))
81 post.attachments.add(Attachment.objects.create_from_url(file_url))
82
82
83 post.set_global_id()
83 post.set_global_id()
84
84
85 # Thread needs to be bumped only when the post is already created
85 # Thread needs to be bumped only when the post is already created
86 if not new_thread:
86 if not new_thread:
87 thread.last_edit_time = posting_time
87 thread.last_edit_time = posting_time
88 thread.bump()
88 thread.bump()
89 thread.save()
89 thread.save()
90
90
91 return post
91 return post
92
92
93 def delete_posts_by_ip(self, ip):
93 def delete_posts_by_ip(self, ip):
94 """
94 """
95 Deletes all posts of the author with same IP
95 Deletes all posts of the author with same IP
96 """
96 """
97
97
98 posts = self.filter(poster_ip=ip)
98 posts = self.filter(poster_ip=ip)
99 for post in posts:
99 for post in posts:
100 post.delete()
100 post.delete()
101
101
102 @utils.cached_result()
102 @utils.cached_result()
103 def get_posts_per_day(self) -> float:
103 def get_posts_per_day(self) -> float:
104 """
104 """
105 Gets average count of posts per day for the last 7 days
105 Gets average count of posts per day for the last 7 days
106 """
106 """
107
107
108 day_end = date.today()
108 day_end = date.today()
109 day_start = day_end - timedelta(POSTS_PER_DAY_RANGE)
109 day_start = day_end - timedelta(POSTS_PER_DAY_RANGE)
110
110
111 day_time_start = timezone.make_aware(datetime.combine(
111 day_time_start = timezone.make_aware(datetime.combine(
112 day_start, dtime()), timezone.get_current_timezone())
112 day_start, dtime()), timezone.get_current_timezone())
113 day_time_end = timezone.make_aware(datetime.combine(
113 day_time_end = timezone.make_aware(datetime.combine(
114 day_end, dtime()), timezone.get_current_timezone())
114 day_end, dtime()), timezone.get_current_timezone())
115
115
116 posts_per_period = float(self.filter(
116 posts_per_period = float(self.filter(
117 pub_time__lte=day_time_end,
117 pub_time__lte=day_time_end,
118 pub_time__gte=day_time_start).count())
118 pub_time__gte=day_time_start).count())
119
119
120 ppd = posts_per_period / POSTS_PER_DAY_RANGE
120 ppd = posts_per_period / POSTS_PER_DAY_RANGE
121
121
122 return ppd
122 return ppd
123
123
124 def get_post_per_days(self, days) -> int:
124 def get_post_per_days(self, days) -> int:
125 day_end = date.today() + timedelta(1)
125 day_end = date.today() + timedelta(1)
126 day_start = day_end - timedelta(days)
126 day_start = day_end - timedelta(days)
127
127
128 day_time_start = timezone.make_aware(datetime.combine(
128 day_time_start = timezone.make_aware(datetime.combine(
129 day_start, dtime()), timezone.get_current_timezone())
129 day_start, dtime()), timezone.get_current_timezone())
130 day_time_end = timezone.make_aware(datetime.combine(
130 day_time_end = timezone.make_aware(datetime.combine(
131 day_end, dtime()), timezone.get_current_timezone())
131 day_end, dtime()), timezone.get_current_timezone())
132
132
133 return self.filter(
133 return self.filter(
134 pub_time__lte=day_time_end,
134 pub_time__lte=day_time_end,
135 pub_time__gte=day_time_start).count()
135 pub_time__gte=day_time_start).count()
136
136
137
138 @transaction.atomic
137 @transaction.atomic
139 def import_post(self, title: str, text: str, pub_time: str, global_id,
138 def import_post(self, title: str, text: str, pub_time: str, global_id,
140 opening_post=None, tags=list(), files=list(),
139 opening_post=None, tags=list(), files=list(),
141 file_urls=list(), tripcode=None, version=1):
140 file_urls=list(), tripcode=None, version=1):
142 is_opening = opening_post is None
141 is_opening = opening_post is None
143 if is_opening:
142 if is_opening:
144 thread = boards.models.thread.Thread.objects.create(
143 thread = boards.models.thread.Thread.objects.create(
145 bump_time=pub_time, last_edit_time=pub_time)
144 bump_time=pub_time, last_edit_time=pub_time)
146 list(map(thread.tags.add, tags))
145 list(map(thread.tags.add, tags))
147 else:
146 else:
148 thread = opening_post.get_thread()
147 thread = opening_post.get_thread()
149
148
150 post = self.create(title=title,
149 post = self.create(title=title,
151 text=text,
150 text=text,
152 pub_time=pub_time,
151 pub_time=pub_time,
153 poster_ip=NO_IP,
152 poster_ip=NO_IP,
154 last_edit_time=pub_time,
153 last_edit_time=pub_time,
155 global_id=global_id,
154 global_id=global_id,
156 opening=is_opening,
155 opening=is_opening,
157 thread=thread,
156 thread=thread,
158 tripcode=tripcode,
157 tripcode=tripcode,
159 version=version)
158 version=version)
160
159
161 for file in files:
160 for file in files:
162 self._add_file_to_post(file, post)
161 self._add_file_to_post(file, post)
163 for file_url in file_urls:
162 for file_url in file_urls:
164 post.attachments.add(Attachment.objects.create_from_url(file_url))
163 post.attachments.add(Attachment.objects.create_from_url(file_url))
165
164
166 url_to_post = '[post]{}[/post]'.format(str(global_id))
165 url_to_post = '[post]{}[/post]'.format(str(global_id))
167 replies = self.filter(text__contains=url_to_post)
166 replies = self.filter(text__contains=url_to_post)
168 for reply in replies:
167 for reply in replies:
169 post_import_deps.send(reply)
168 post_import_deps.send(reply)
170
169
171 @transaction.atomic
170 @transaction.atomic
172 def update_post(self, post, title: str, text: str, pub_time: str,
171 def update_post(self, post, title: str, text: str, pub_time: str,
173 tags=list(), files=list(), file_urls=list(), tripcode=None, version=1):
172 tags=list(), files=list(), file_urls=list(), tripcode=None, version=1):
174 post.title = title
173 post.title = title
175 post.text = text
174 post.text = text
176 post.pub_time = pub_time
175 post.pub_time = pub_time
177 post.tripcode = tripcode
176 post.tripcode = tripcode
178 post.version = version
177 post.version = version
179 post.save()
178 post.save()
180
179
181 post.clear_cache()
180 post.clear_cache()
182
181
183 post.attachments.clear()
182 post.attachments.clear()
184 for file in files:
183 for file in files:
185 self._add_file_to_post(file, post)
184 self._add_file_to_post(file, post)
186 for file_url in file_urls:
185 for file_url in file_urls:
187 post.attachments.add(Attachment.objects.create_from_url(file_url))
186 post.attachments.add(Attachment.objects.create_from_url(file_url))
188
187
189 thread = post.get_thread()
188 thread = post.get_thread()
190 thread.tags.clear()
189 thread.tags.clear()
191 list(map(thread.tags.add, tags))
190 list(map(thread.tags.add, tags))
192
191
193 def _add_file_to_post(self, file, post):
192 def _add_file_to_post(self, file, post):
194 post.attachments.add(Attachment.objects.create_with_hash(file))
193 post.attachments.add(Attachment.objects.create_with_hash(file))
General Comments 0
You need to be logged in to leave comments. Login now