# HG changeset patch # User raph # Date 1266059067 -3600 # Node ID 0887863001b198b157cc65f256e1b4ae96fd7864 # Parent 4c0f9871729db1d3b8064fc17ca3b1766e30a3b3# Parent 07019190bfe33d164593a42b92713b8265bb263b Merge with 07019190bfe33d164593a42b92713b8265bb263b diff -r 4c0f9871729d -r 0887863001b1 src/cm/media/js/site/text_edit.js --- a/src/cm/media/js/site/text_edit.js Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/media/js/site/text_edit.js Sat Feb 13 12:04:27 2010 +0100 @@ -1,11 +1,9 @@ function check_save(){ - needToConfirm = false; - var newVersion = $('#id_new_version').attr('checked') ; var commentsKept = $('#id_keep_comments').attr('checked') ; - var new_content = $('#id_content').val() - var new_format = $('#id_format').val() + var new_content = $('#id_content').val() ; + var new_format = $('#id_format').val() ; var mess = gettext( 'Should these comments be detached (i.e. kept with no scope) or removed from new version?') ; if (commentsKept) { @@ -62,11 +60,12 @@ } else { if (!newVersion) { + var message = gettext("You chose not to create a new version all comments will be deleted") ; - message += '
' ; - message += gettext( 'Do you want to continue?') ; - $('#confirm_all_removed').html(message) ; - $('#confirm_all_removed').dialog('open') ; + message += '
' ; + message += gettext( 'Do you want to continue?') ; + $('#confirm_all_removed_dlg').html(message) ; + $('#confirm_all_removed_dlg').dialog('open') ; } else { $('#edit_form').submit(); @@ -76,10 +75,15 @@ $(function() { var buttons = {}; - buttons[gettext('No')] = function() {$(this).dialog('close');} ; - buttons[gettext('Yes')] = function() {$(this).dialog('close');$('#edit_form').submit();} ; + buttons[gettext('No')] = function() { + $(this).dialog('close'); + } ; + buttons[gettext('Yes')] = function() { + needToConfirm = false; + $(this).dialog('close');$('#edit_form').submit(); + } ; - $('#confirm_all_removed').dialog({ + $('#confirm_all_removed_dlg').dialog({ bgiframe: true, autoOpen: false, title :gettext('Warning'), @@ -88,8 +92,14 @@ }) ; var buttons0 = {}; - buttons0[gettext('Detach')] = function() {$(this).dialog('close');$('#cancel_modified_scopes').val("1");$('#edit_form').submit();} ; - buttons0[gettext('Remove')] = function() {$(this).dialog('close');$('#cancel_modified_scopes').val("0");$('#edit_form').submit();} ; + buttons0[gettext('Detach')] = function() { + needToConfirm = false; + $(this).dialog('close');$('#cancel_modified_scopes').val("1");$('#edit_form').submit(); + } ; + buttons0[gettext('Remove')] = function() { + needToConfirm = false; + $(this).dialog('close');$('#cancel_modified_scopes').val("0");$('#edit_form').submit(); + } ; buttons0[gettext('Cancel')] = function() {$(this).dialog('close');} ; $('#remove_scope_choice_dlg').dialog({ diff -r 4c0f9871729d -r 0887863001b1 src/cm/models.py --- a/src/cm/models.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/models.py Sat Feb 13 12:04:27 2010 +0100 @@ -6,6 +6,7 @@ from cm.models_utils import * from cm.utils.dj import absolute_reverse from cm.utils.date import datetime_to_user_str +from cm.utils.html import on_content_receive from cm.utils.comment_positioning import compute_new_comment_positions from django import forms from django.db.models import Q @@ -27,6 +28,7 @@ class TextManager(Manager): def create_text(self, title, format, content, note, name, email, tags, user=None, state='approved', **kwargs): + content = on_content_receive(content, format) text = self.create(name=name, email=email, user=user, state=state) text_version = TextVersion.objects.create(title=title, format=format, content=content, text=text, note=note, name=name, email=email, tags=tags, user=user) return text @@ -188,7 +190,6 @@ def get_content(self, format='html'): return pandoc_convert(self.content, self.format, format) - # def _get_comments(self, user = None, filter_reply = 0): # """ # get comments viewable by this user (user = None or user = AnonymousUser => everyone) @@ -228,7 +229,8 @@ def __unicode__(self): return '<%d> %s' % (self.id, self.title) - def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True): + def edit(self, new_title, new_format, new_content, new_tags=None, new_note=None, keep_comments=True, cancel_modified_scopes=True): + new_content = on_content_receive(new_content, new_format) if not keep_comments : self.comment_set.all().delete() elif self.content != new_content or new_format != self.format: @@ -243,8 +245,6 @@ else : [comment.delete() for comment in toremove_comments] - #TODO: RBE: recompute same text comments links - self.title = new_title if new_tags: self.tags = new_tags @@ -269,10 +269,6 @@ def get_version_number(self): return TextVersion.objects.filter(text__exact=self.text).order_by('created').filter(created__lte=self.created).count() - def save(self, force_insert=False, force_update=False): - self.content = re.sub('\r\n|\r|\n', '\n', self.content) - super(AuthorModel, self).save() - class CommentManager(Manager): def duplicate(self, comment, text_version, reply_to=None, keep_dates=False): @@ -322,7 +318,7 @@ super(PermanentModel, self).save() def __unicode__(self): - return '<%d> %s' % (self.id, self.title) + 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, ) def is_reply(self): return self.reply_to != None diff -r 4c0f9871729d -r 0887863001b1 src/cm/utils/comment_positioning.py --- a/src/cm/utils/comment_positioning.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/utils/comment_positioning.py Sat Feb 13 12:04:27 2010 +0100 @@ -12,16 +12,10 @@ def compute_new_comment_positions(old_content, old_format, new_content, new_format, commentList): - if old_format!='html': - previousVersionContent = pandoc_convert(old_content, old_format, 'html') - else: - previousVersionContent = old_content - - if new_format != 'html': - newVersionContent = pandoc_convert(new_content, new_format, 'html') - else: - newVersionContent = new_content - + # cf. TextVersion.get_content + previousVersionContent = pandoc_convert(old_content, old_format, 'html') + newVersionContent = pandoc_convert(new_content, new_format, 'html') + _, previous_char_list, span_starts_previous = spannify(previousVersionContent) _, new_char_list, span_starts_new = spannify(newVersionContent) @@ -68,21 +62,21 @@ # id, initial_start, initial_end, computed_start, computed_end, valid = self.computationResults[i] - for c in commentList: - if c.valid: + for cc in commentList: + if cc.valid: for id in xrange(len(span_starts_new.keys())): start = span_starts_new.get(id) end = span_starts_new.get(id+1, sys.maxint) # adjust start - if c.computed_start_offset >= start and c.computed_start_offset < end: - c.start_wrapper = id - c.start_offset = c.computed_start_offset - start + if cc.computed_start_offset >= start and cc.computed_start_offset < end: + cc.start_wrapper = id + cc.start_offset = cc.computed_start_offset - start # adjust end - if c.computed_end_offset >= start and c.computed_end_offset < end: - c.end_wrapper = id - c.end_offset = c.computed_end_offset - start + if cc.computed_end_offset >= start and cc.computed_end_offset < end: + cc.end_wrapper = id + cc.end_offset = cc.computed_end_offset - start # returns to_modify, to_remove return [c for c in commentList if c.valid], \ diff -r 4c0f9871729d -r 0887863001b1 src/cm/utils/html.py --- a/src/cm/utils/html.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/utils/html.py Sat Feb 13 12:04:27 2010 +0100 @@ -2,6 +2,7 @@ Package to manipulage html chunks """ +from string_utils import strip_cr from BeautifulSoup import BeautifulSoup, Comment def surrond_text_node(html_chunk, start_html, end_html): @@ -16,6 +17,13 @@ return unicode(soup) -# utilities +#utilities def get_text_nodes(soup): return soup(text=lambda text:not isinstance(text, Comment)) + +#WARNING behavior changed also for mardown. but really shouldn't hurt 20100212 +#it is text as received from textarea +def on_content_receive(txt, format) : + #because textarea content arent packaged the same way on windows IE and linux FF, dhouldn't't hurt to clean it for any format + return strip_cr(txt) + diff -r 4c0f9871729d -r 0887863001b1 src/cm/utils/string_utils.py --- a/src/cm/utils/string_utils.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/utils/string_utils.py Sat Feb 13 12:04:27 2010 +0100 @@ -1,4 +1,5 @@ import chardet +import re def to_unicode(input): if type(input) == str: @@ -12,4 +13,9 @@ if not res: raise Exception('UnicodeDecodeError: could not decode') return res - return input \ No newline at end of file + return input + +# strip carriage returns +def strip_cr(input): + return re.sub('\r\n|\r|\n', '\n', input) + diff -r 4c0f9871729d -r 0887863001b1 src/cm/views/create.py --- a/src/cm/views/create.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/views/create.py Sat Feb 13 12:04:27 2010 +0100 @@ -117,10 +117,9 @@ return _text_create_upload(request, CreateTextUploadForm) def create_text(user, data): - text_content = data['content'] text = Text.objects.create_text(title=data['title'], format=data['format'], - content=text_content, + content=data['content'], note=data.get('note', None), name=data.get('name', None), email=data.get('email', None), @@ -129,6 +128,7 @@ ) text.update_denorm_fields() text_version = text.get_latest_version() + text_content = text_version.content for attach_file in data.get('attachs', []): attach_data = file(attach_file, 'rb').read() diff -r 4c0f9871729d -r 0887863001b1 src/cm/views/texts.py --- a/src/cm/views/texts.py Sat Feb 13 11:46:27 2010 +0100 +++ b/src/cm/views/texts.py Sat Feb 13 12:04:27 2010 +0100 @@ -11,6 +11,7 @@ from cm.security import get_texts_with_perm, has_perm, get_viewable_comments, \ has_perm_on_text from cm.utils import get_among, get_among, get_int +from cm.utils.html import on_content_receive from cm.utils.comment_positioning import compute_new_comment_positions, \ insert_comment_markers from cm.utils.spannifier import spannify @@ -678,8 +679,8 @@ text_version = text.get_latest_version() comments = text_version.get_comments() ; - new_content = request.POST['new_content'] new_format = request.POST['new_format'] + new_content = on_content_receive(request.POST['new_content'], new_format) # TODO: RBE : si commentaire mal forme : (position non existante : boom par key error) _tomodify_comments, toremove_comments = compute_new_comment_positions(text_version.content, text_version.format, new_content, new_format, comments)