4 DEFAULT_INPUT_FORMAT as DEFAULT_INPUT_FORMAT_PANDOC, pandoc_convert |
4 DEFAULT_INPUT_FORMAT as DEFAULT_INPUT_FORMAT_PANDOC, pandoc_convert |
5 from cm.models_base import PermanentModel, KeyManager, Manager, KeyModel, AuthorModel |
5 from cm.models_base import PermanentModel, KeyManager, Manager, KeyModel, AuthorModel |
6 from cm.models_utils import * |
6 from cm.models_utils import * |
7 from cm.utils.dj import absolute_reverse |
7 from cm.utils.dj import absolute_reverse |
8 from cm.utils.date import datetime_to_user_str |
8 from cm.utils.date import datetime_to_user_str |
|
9 from cm.utils.html import on_content_receive |
9 from cm.utils.comment_positioning import compute_new_comment_positions |
10 from cm.utils.comment_positioning import compute_new_comment_positions |
10 from django import forms |
11 from django import forms |
11 from django.db.models import Q |
12 from django.db.models import Q |
12 from django.template.loader import render_to_string |
13 from django.template.loader import render_to_string |
13 from django.conf import settings |
14 from django.conf import settings |
25 from django.db import connection |
26 from django.db import connection |
26 from datetime import datetime |
27 from datetime import datetime |
27 |
28 |
28 class TextManager(Manager): |
29 class TextManager(Manager): |
29 def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs): |
30 def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs): |
|
31 content = on_content_receive(content, format) |
30 text = self.create(name=name, email=email, user=user, state=state) |
32 text = self.create(name=name, email=email, user=user, state=state) |
31 text_version = TextVersion.objects.create(title=title, format=format, content=content, text=text, note=note, name=name, email=email, tags=tags, user=user) |
33 text_version = TextVersion.objects.create(title=title, format=format, content=content, text=text, note=note, name=name, email=email, tags=tags, user=user) |
32 return text |
34 return text |
33 |
35 |
34 def create_new_version(self, text, title, format, content, note, name, email, tags, user=None, **kwargs): |
36 def create_new_version(self, text, title, format, content, note, name, email, tags, user=None, **kwargs): |
186 |
188 |
187 objects = TextVersionManager() |
189 objects = TextVersionManager() |
188 |
190 |
189 def get_content(self, format='html'): |
191 def get_content(self, format='html'): |
190 return pandoc_convert(self.content, self.format, format) |
192 return pandoc_convert(self.content, self.format, format) |
191 |
|
192 # def _get_comments(self, user = None, filter_reply = 0): |
193 # def _get_comments(self, user = None, filter_reply = 0): |
193 # """ |
194 # """ |
194 # get comments viewable by this user (user = None or user = AnonymousUser => everyone) |
195 # get comments viewable by this user (user = None or user = AnonymousUser => everyone) |
195 # filter_reply = 0: comments and replies |
196 # filter_reply = 0: comments and replies |
196 # 1: comments |
197 # 1: comments |
226 return self.comment_set.filter(~Q(reply_to == None), Q(deleted=False)) |
227 return self.comment_set.filter(~Q(reply_to == None), Q(deleted=False)) |
227 |
228 |
228 def __unicode__(self): |
229 def __unicode__(self): |
229 return '<%d> %s' % (self.id, self.title) |
230 return '<%d> %s' % (self.id, self.title) |
230 |
231 |
231 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True): |
232 def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True): |
|
233 new_content = on_content_receive(new_content, new_format) |
232 if not keep_comments : |
234 if not keep_comments : |
233 self.comment_set.all().delete() |
235 self.comment_set.all().delete() |
234 elif self.content != new_content or new_format != self.format: |
236 elif self.content != new_content or new_format != self.format: |
235 comments = self.get_comments() ; |
237 comments = self.get_comments() ; |
236 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
238 tomodify_comments, toremove_comments = compute_new_comment_positions(self.content, self.format, new_content, new_format, comments) |
267 return other_versions[0] if other_versions else None |
267 return other_versions[0] if other_versions else None |
268 |
268 |
269 def get_version_number(self): |
269 def get_version_number(self): |
270 return TextVersion.objects.filter(text__exact=self.text).order_by('created').filter(created__lte=self.created).count() |
270 return TextVersion.objects.filter(text__exact=self.text).order_by('created').filter(created__lte=self.created).count() |
271 |
271 |
272 def save(self, force_insert=False, force_update=False): |
|
273 self.content = re.sub('\r\n|\r|\n', '\n', self.content) |
|
274 super(AuthorModel, self).save() |
|
275 |
|
276 class CommentManager(Manager): |
272 class CommentManager(Manager): |
277 |
273 |
278 def duplicate(self, comment, text_version, reply_to=None, keep_dates=False): |
274 def duplicate(self, comment, text_version, reply_to=None, keep_dates=False): |
279 comment.id = None |
275 comment.id = None |
280 comment.text_version = text_version |
276 comment.text_version = text_version |
320 self.created = now |
316 self.created = now |
321 self.modified = now |
317 self.modified = now |
322 super(PermanentModel, self).save() |
318 super(PermanentModel, self).save() |
323 |
319 |
324 def __unicode__(self): |
320 def __unicode__(self): |
325 return '<%d> %s' % (self.id, self.title) |
321 return '<%d> %s [st_wrp:%d, st_ofs:%d, e_wrp:%d, e_ofs:%d]' % (self.id, self.title, self.start_wrapper, self.start_offset, self.end_wrapper, self.end_offset, ) |
326 |
322 |
327 def is_reply(self): |
323 def is_reply(self): |
328 return self.reply_to != None |
324 return self.reply_to != None |
329 |
325 |
330 def is_thread_full_visible(self, own_user=None): |
326 def is_thread_full_visible(self, own_user=None): |