# HG changeset patch # User raph # Date 1265369009 -3600 # Node ID fb5b1e6ad179102869f20949062e3fe4230811ee # Parent 9b3438382e53da7226e8ed7e6d60dadf60400a38 refactor version explorer diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/models.py --- a/src/cm/models.py Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/models.py Fri Feb 05 12:23:29 2010 +0100 @@ -85,12 +85,10 @@ """ versions = TextVersion.objects.filter(text__exact=self).order_by('-created') # TODO: use new postgresql 8.4 row_number as extra select to do that - for index in xrange(len(versions)): - v = versions[index] - # version_number is 1-based - setattr(v, 'version_number', len(versions) - index) - #for v in versions: - # print v.created,v.id,v.version_number + #for index in xrange(len(versions)): + # v = versions[index] + # # version_number is 1-based + # setattr(v, 'version_number', len(versions) - index) return versions def get_version(self, version_number): @@ -103,10 +101,10 @@ def get_inversed_versions(self): versions = TextVersion.objects.filter(text__exact=self).order_by('created') # TODO: use new postgresql 8.4 row_number as extra select to do that - for index in xrange(len(versions)): - v = versions[index] - # version_number is 1-based - setattr(v, 'version_number', index + 1) + #for index in xrange(len(versions)): + # v = versions[index] + # # version_number is 1-based + # setattr(v, 'version_number', index + 1) return versions def get_versions_number(self): @@ -118,8 +116,10 @@ else: return False - def revert_to_version(self, v_id): - text_version = self.get_version(int(v_id)) + def revert_to_version(self, text_version_key): + text_version = TextVersion.objects.get(key=text_version_key) + if text_version.text != self: + raise Exception('Invalid revert attempt') new_text_version = TextVersion.objects.duplicate(text_version, True) return new_text_version @@ -252,7 +252,22 @@ self.content = new_content self.format = new_format self.save() - + + def get_next_version(self): + other_versions = TextVersion.objects.filter(text__exact=self.text).order_by('created').filter(created__gt=self.created) + return other_versions[0] if other_versions else None + if other_versions: + return + else: + return None + + def get_previous_version(self): + other_versions = TextVersion.objects.filter(text__exact=self.text).order_by('-created').filter(created__lt=self.created) + return other_versions[0] if other_versions else None + + def get_version_number(self): + return TextVersion.objects.filter(text__exact=self.text).order_by('created').filter(created__lte=self.created).count() + class CommentManager(Manager): def duplicate(self, comment, text_version, reply_to=None, keep_dates=False): diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/templates/site/text_history.html --- a/src/cm/templates/site/text_history.html Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/templates/site/text_history.html Fri Feb 05 12:23:29 2010 +0100 @@ -12,101 +12,139 @@ --> +
+ -
-
{% blocktrans %}Versions:{% endblocktrans %} -{% for author,color in author_colors %} - {{ author }} -{% endfor %} -
- - -{% for v1, v2, color in paired_versions %} - - {{ forloop.counter }} + - {% if v2 %} - - - - - - {% endif %} -{% endfor %} - +
+ + -{% if can_edit_text %}
-
-
-{% endif %} +{% include "site/macros/paginator.html" %} + +
-{% if v2_nid %} -

{% blocktrans with v1_nid as v1_nid and v1_nid as v1_nid %}Differences between version #{{ v1_nid }} and version #{{ v2_nid }}:{% endblocktrans %}

-{% else %} -

{{ version1.title }}

- -

-{% endif %} -{% autoescape off %} + + + + + + + + + + + + + {% for text_version in object_list %} + + {% get_local_text_perm request text can_edit_text as can_edit_text %} + {% get_local_text_perm request text can_delete_text as can_delete_text %} + {% get_local_text_perm request text can_manage_text as can_manage_text %} + + + {% if can_manage_workspace %}{% endif %} + + + + + + + -{% if v2_nid %} -
-
{% blocktrans %}Version{% endblocktrans %}{% blocktrans %}Selection{% endblocktrans %}{% blocktrans %}Title{% endblocktrans %}{% blocktrans %}Author{% endblocktrans %}{% blocktrans %}Created{% endblocktrans %}{% blocktrans %}# comments{% endblocktrans %}
#{{ forloop.counter0|add:page_obj.start_index|invneg:paginator.count|add:"1" }} + {{ text_version.title }} + + +
+ {% blocktrans %}View{% endblocktrans %} + {% if text_version.get_previous_version %}| {% blocktrans %}Compare with previous version{% endblocktrans %}{% endif %} + {% if can_edit_text %} | {% blocktrans %}Revert to this version{% endblocktrans %}{% endif %} + {% comment %}{% if can_delete_text %}{% blocktrans %}Delete{% endblocktrans %} + + {% endif %} + {% endcomment %} +
+ +
{{ text_version.get_name }}{{ text_version.created|local_date }}{{ text_version|nb_comments:request }}
- - - - - + + {% endfor %} +
- {{ version1.title }} -
- -
- {{ version2.title }} -
- -
-{% endif %} - -{% if is_diff %} -{{ content }} -{% else %} -
{% blocktrans %}No differences{% endblocktrans %}
-{% endif %} + -{% if embed_code %} -
-{{ embed_code }} -{% endif %} -
- -{% endautoescape %}
{% endblock %} diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/templates/site/text_history_compare.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/templates/site/text_history_compare.html Fri Feb 05 12:23:29 2010 +0100 @@ -0,0 +1,49 @@ +{% extends "site/layout/base_text.html" %} +{% load com %} +{% load i18n %} +{% load local_perms %} +{% block main %} + +{% get_local_text_perm request text can_edit_text as can_edit_text %} + + + +
+ + + + + + +
+ +{% autoescape off %} +{% if empty %} +
{% blocktrans %}No differences{% endblocktrans %}
+{% else %} +{{ content }} +{% endif %} +{% endautoescape %} + +
+{% endblock %} diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/templates/site/text_history_version.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/templates/site/text_history_version.html Fri Feb 05 12:23:29 2010 +0100 @@ -0,0 +1,50 @@ +{% extends "site/layout/base_text.html" %} +{% load com %} +{% load i18n %} +{% load local_perms %} +{% block main %} + +{% get_local_text_perm request text can_edit_text as can_edit_text %} + + + +
+ + + + + + +
+ +
+{% autoescape off %} +{{ embed_code }} +{% endautoescape %} +
+ +
+{% endblock %} diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/templatetags/com.py --- a/src/cm/templatetags/com.py Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/templatetags/com.py Fri Feb 05 12:23:29 2010 +0100 @@ -209,11 +209,14 @@ from cm.security import get_viewable_comments +from cm.models import Text @register.filter(name='nb_comments') def nb_comments(text, request): - return len(get_viewable_comments(request, text.last_text_version.comment_set.all(), text)) - + if type(text) == Text: + return len(get_viewable_comments(request, text.last_text_version.comment_set.all(), text)) + else: + return len(get_viewable_comments(request, text.comment_set.all(), text)) ## number tags from cm.security import get_texts_with_perm, get_viewable_comments @@ -297,3 +300,7 @@ all_params = all_params[1:] return NewParams([a for a in all_params]) +@register.filter(name='invneg') +def do_invneg(value, arg): + """.""" + return int(arg) - int(value) diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/tests/test_history.py --- a/src/cm/tests/test_history.py Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/tests/test_history.py Fri Feb 05 12:23:29 2010 +0100 @@ -10,6 +10,7 @@ def test_revert(self): text = Text.objects.all()[0] #for i in range(1,text.get_versions_number()+1): - text.revert_to_version(1) + text_version = Text.last_text_version + text.revert_to_version(text_version.key) #self.assertEqual(Comment.objects.count(), 16) diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/urls.py --- a/src/cm/urls.py Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/urls.py Fri Feb 05 12:23:29 2010 +0100 @@ -63,11 +63,12 @@ url(r'^text/(?P\w*)/pre_edit/$', text_pre_edit, name="text-preedit"), url(r'^text/(?P\w*)/settings/$', text_settings, name="text-settings"), url(r'^text/(?P\w*)/history/$', text_history, name="text-history"), - url(r'^text/(?P\w*)/history-version/(?P\d*)/$', text_history, name="text-history-version"), - url(r'^text/(?P\w*)/history/(?P\w*)/(?P\d*)/$', text_history, name="text-history-compare"), - url(r'^text/(?P\w*)/revert/(?P\w*)/$', text_revert, name="text-revert"), + url(r'^text/(?P\w*)/history-version/(?P\w*)/$', text_history_version, name="text-history-version"), + url(r'^text/(?P\w*)/history-compare/(?P\w*)/(?P\w*)/$', text_history_compare, name="text-history-compare"), + url(r'^text/(?P\w*)/revert/(?P\w*)/$', text_revert, name="text-revert"), url(r'^text/(?P\w*)/attach/(?P\w*)/$', text_attach, name="text-attach"), - url(r'^text/(?P\w*)/delete/$', text_delete, name="text-delete"), + url(r'^text/(?P\w*)/delete/$', text_delete, name="text-delete"), + url(r'^text/(?P\w*)/(?P\w*)/delete/$', text_version_delete, name="text-version-delete"), url(r'^text/(?P\w*)/export/(?P\w*)/(?P\w*)/(?P\w*)/(?P\w*)/$', text_export, name="text-export"), url(r'^text/(?P\w*)/history/$', text_history, name="text-history"), url(r'^text/(?P\w*)/diff/(?P\w*)/(?P\w*)/$', text_diff, name="text-diff"), diff -r 9b3438382e53 -r fb5b1e6ad179 src/cm/views/texts.py --- a/src/cm/views/texts.py Wed Feb 03 15:42:56 2010 +0100 +++ b/src/cm/views/texts.py Fri Feb 05 12:23:29 2010 +0100 @@ -212,6 +212,19 @@ text.delete() return HttpResponse('') # no redirect because this is called by js +@has_perm_on_text('can_delete_text') +def text_version_delete(request, key, text_version_key): + text_version = TextVersion.objects.get(key=text_version_key) + text=text_version.text + if request.method != 'POST': + raise UnauthorizedException('Unauthorized') + display_message(request, _(u'Text version %(text_version_title)s deleted') %{'text_version_title':text_version.title}) + register_activity(request, "text_version_removed", text=text) + import pdb;pdb.set_trace() + text_version.delete() + return HttpResponse('') # no redirect because this is called by js + + @has_perm_on_text('can_view_text') # only protected by text_view / comment filtering done in view def text_view_comments(request, key, version_key=None, adminkey=None): text = get_text_by_keys_or_404(key) @@ -446,59 +459,57 @@ @has_perm_on_text('can_view_text') -def text_history(request, key, v1_nid=None, v2_nid=None, adminkey=False): - text = get_text_by_keys_or_404(key) - text_versions = text.get_versions() - author_colors = get_colors([t.get_name() for t in text.get_inversed_versions()]) - - if v1_nid: - v1_nid = int(v1_nid) - else: - v1_nid = text.get_versions_number() - - v1 = text.get_version(v1_nid) +def text_history_version(request, key, version_key): + text = get_text_by_keys_or_404(key) + text_version = get_textversion_by_keys_or_404(version_key, key=key) + template_dict = {'text' : text, + 'text_version' : text_version, + 'embed_code' : embed_html(key, 'id="text_view_frame" name="text_view_frame"', version_key), + } + return render_to_response('site/text_history_version.html', + template_dict, + context_instance=RequestContext(request)) - v1_id = v1.id - - v2_id = None - v2 = None - if v2_nid: - v2_nid = int(v2_nid) - v2 = text.get_version(v2_nid) - v2_id = v2.id +#@has_perm_on_text('can_view_text') +def text_history_compare(request, key, v1_version_key, v2_version_key): + text = get_text_by_keys_or_404(key) + v1 = get_textversion_by_keys_or_404(v1_version_key, key=key) + v2 = get_textversion_by_keys_or_404(v2_version_key, key=key) + + content = get_uniffied_inner_diff_table(cleanup_textarea(v1.content), cleanup_textarea(v2.content)) - versions = text.get_inversed_versions() - paired_versions = [] - colors_dict = dict(author_colors) - for index in range(len(versions)): - vv1 = versions[index] - if index + 1 < len(versions): - vv2 = versions[index + 1] - else: - vv2 = None - paired_versions.append((vv1, vv2, colors_dict.get(vv1.get_name(), '#D9D9D9'))) + template_dict = { + 'text' : text, + 'v1': v1, + 'v2': v2, + 'content' : content.strip(), + 'empty' : '
'==content, + } + return render_to_response('site/text_history_compare.html', + template_dict, + context_instance=RequestContext(request)) + +@has_perm_on_text('can_view_text') +def text_history(request, key): + text = get_text_by_keys_or_404(key) + + if request.method == 'POST': + v1_key = request.POST.get('newkey',None) + v2_key = request.POST.get('oldkey',None) + if v1_key and v2_key: + return redirect(request, 'text-history-compare', args=[text.key, v2_key, v1_key ]) + + text_versions = text.get_versions() + paginate_by = get_int(request.GET,'paginate',TEXT_PAGINATION) - embed_code = "" - content = "" - if v1_nid and not v2_nid: - embed_code = embed_html(key, 'id="text_view_frame" name="text_view_frame"', v1.key) - else: - content = get_uniffied_inner_diff_table(cleanup_textarea(v1.content), cleanup_textarea(v2.content)) - - template_dict = {'paired_versions' : paired_versions, - 'text' : text, - 'v1_nid' : v1_nid, - 'v2_nid' : v2_nid, - 'v1_id' : v1_id, - 'v2_id' : v2_id, - 'version1': v1, - 'version2': v2, - 'content' : content.strip(), - 'embed_code':embed_code, - 'is_diff' : content !='
', - 'author_colors' : author_colors, - } - return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request)) + last_last_version = text_versions[1] if len(text_versions)>1 else None + context = {'text':text, 'last_version':text.last_text_version, 'last_last_version':last_last_version} + return object_list(request, text_versions, + template_name = 'site/text_history.html', + paginate_by = paginate_by, + extra_context=context, + ) + # taken from trac def _get_change_extent(str1, str2): @@ -559,22 +570,6 @@ res.append('') return ''.join(res) -@has_perm_on_text('can_view_text') -def text_history_compare(request, key, v1_nid=None, v2_nid=None, adminkey=None): - text = get_text_by_keys_or_404(key) - - vis_diff = difflib.HtmlDiff() - v1 = text.get_version(int(v1_nid)) - v2 = text.get_version(int(v2_nid)) - content = _text_diff(v2.get_content(), v1.get_content()) - #content = vis_diff.make_table(v1.content.split('\n'), v2.content.split('\n'), v1_nid, v2_nid, context=None) - - template_dict = { - 'text' : text, - 'content' : content, - } - return render_to_response('site/text_history_compare.html', template_dict, context_instance=RequestContext(request)) - #def text_history_version(request, key): # text = get_text_by_keys_or_404(key=key) # return _text_history_version(request, text) @@ -750,11 +745,11 @@ # TODO: modif de la base => if POST @has_perm_on_text('can_edit_text') -def text_revert(request, key, v1_nid, adminkey=None): +def text_revert(request, key, text_version_key): text = get_text_by_keys_or_404(key) - text.revert_to_version(v1_nid) - display_message(request, _(u'A new version (copied from version %(version_id)s) has been created') % {'version_id':v1_nid}) + text_version = text.revert_to_version(text_version_key) + display_message(request, _(u'A new version (copied from version %(version_title)s) has been created') % {'version_title':text_version.title}) return HttpResponseRedirect(reverse('text-history', args=[text.key]))