src/cm/models.py
changeset 175 4f072edc51a1
parent 160 0c01050f9717
child 227 57492cd7e162
equal deleted inserted replaced
174:805b9195c511 175:4f072edc51a1
     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)
   241             if cancel_modified_scopes :
   243             if cancel_modified_scopes :
   242                 [comment.remove_scope() for comment in toremove_comments]
   244                 [comment.remove_scope() for comment in toremove_comments]
   243             else :
   245             else :
   244                 [comment.delete() for comment in toremove_comments]
   246                 [comment.delete() for comment in toremove_comments]
   245                 
   247                 
   246         #TODO: RBE: recompute same text comments links 
       
   247 
       
   248         self.title = new_title
   248         self.title = new_title
   249         if new_tags:
   249         if new_tags:
   250             self.tags = new_tags
   250             self.tags = new_tags
   251         if new_note:
   251         if new_note:
   252             self.note = new_note
   252             self.note = new_note
   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):