refactor version explorer
authorraph
Fri, 05 Feb 2010 12:23:29 +0100
changeset 145 fb5b1e6ad179
parent 142 9b3438382e53
child 146 51c34f5970c2
refactor version explorer
src/cm/models.py
src/cm/templates/site/text_history.html
src/cm/templates/site/text_history_compare.html
src/cm/templates/site/text_history_version.html
src/cm/templatetags/com.py
src/cm/tests/test_history.py
src/cm/urls.py
src/cm/views/texts.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):
--- 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 @@
 -->
 </script>
 
+<div id="text_history" class="tab-meta">   
+
 <script type="text/javascript">
 <!--
 $(function() {
-    $(".arrow").bind("mouseenter", function(e){
-        $(this).attr('src','{{ MEDIA_URL }}img/arrow_w_red.png');
-    });
-    
-    $(".arrow").bind("mouseout", function(e){
-        $(this).attr('src','{{ MEDIA_URL }}img/arrow_w_blue.png');
-    });
-    
-    $(".ver_span").bind("mouseenter", function(e){
-        $(this).removeClass('version_item').addClass('version_item-selected');
-    });
-        
-    $(".ver_span").bind("mouseout", function(e){
-        $(this).removeClass('version_item-selected').addClass('version_item');
-    });    
-});
+    $(".hidden-text-actions").css('visibility','hidden');   
+}) ;
+$(function() {
+	$("input[name=oldkey]").click(function () {
+		hide_show($(this), 'newkey', true, true, -1);
+		hide_show($(this), 'newkey', false, false, 0);
+	});   
+	$("input[name=newkey]").click(function () {
+		hide_show($(this), 'oldkey', false, true, 0);
+		hide_show($(this), 'oldkey', true, false, +1);
+	});   
+
+	$("input[name=newkey]")[0].click();
+	$("input[name=oldkey]")[1].click();
+}) ;
+
+
+function hide_show(elem, name, hide, up, plus) {	
+	var nb = elem.attr('id').split('-')[1];
+	nb = parseInt(nb) + plus;
+	
+	if (hide)
+		var vis = 'hidden';
+	else
+		var vis = 'visible';
+		
+	if (up)
+		var fu = 'gt';
+	else
+		var fu = 'lt';
+	$("input[name=" + name + "]:" + fu + "(" + nb + ")").css('visibility',vis);
+};
 -->
 </script>
 
-<div id="text_history" class="tab-meta">    
-<div class="label">{% blocktrans %}Versions:{% endblocktrans %}
-{% for author,color in author_colors %}
-    <span style="background: {{ color }};">{{ author }}</span>
-{% endfor %} 
-</div>
-
-<span id="text_history_timeline">
-{% for v1, v2, color in paired_versions %}
-    <a href="{% url text-history-version text.key v1.version_number %}" title="{% blocktrans with v1.version_number as v1number %}version #{{ v1number }}{% endblocktrans %}{% if v1.name %} {% blocktrans  with v1.name as v1name %}by {{ v1name }}{% endblocktrans %}{% endif %}{% if v1.note %} / {{ v1.note }}{% endif %} ({% blocktrans with v1.created|local_date as v1created %}created {{ v1created }}{% endblocktrans %})">
-    <span id={{ v1_id }}
-          style="background: {{ color }};" 
-          class="ver_span {% choice_string v1_id v1.id version_item-selected or v1.id v2_id version_item-selected version_item %}">{{ forloop.counter }}</span></a>
+<ul class="sub_list">
+    <li class="active_sub">{% blocktrans %}Version list{% endblocktrans %}</li>
+    {% if last_last_version %}    
+    <li> / </li>
+    <li><a href="{% url text-history-compare text.key last_last_version.key last_version.key %}">{% blocktrans %}Compare last two versions{% endblocktrans %}</a></li>
+    {% endif %}
+</ul>
 
-    {% if v2 %}
-    <span class="{% choice_string v2_nid v2.version_number diff_item-selected diff_item %}">
-        <!-- <a href="{% url text-history-compare text.key v1.version_number v2.version_number %}" title="diff between {{ forloop.counter }} and following ">&rarr;</a>-->
-        <a href="{% url text-history-compare text.key v1.version_number v2.version_number %}" title="{% blocktrans with v1.version_number as v1number and v2.version_number as v2number %}differences between version #{{ v1number }} and #{{ v2number }}{% endblocktrans %}"><span style="vertical-align:middle;" >
-            <img class="arrow"
-                id="arrow_{{ v1.version_number }}"
-                src="{{ MEDIA_URL }}img/arrow_w_blue.png"/></span></a>
-    </span>    
-    {% endif %}
-{% endfor %}
-</span>
+<form id="compare_form" action="." method="post">
+
+<input name="compare" id="compare_button" type="submit" value="{% blocktrans %}Compare selected versions{% endblocktrans %}"/>
 
-{% if can_edit_text %}
 <br />
-<br />
-<form action="{% url text-revert text.key v1_nid %}" method="POST" ><input name="revert" type="submit" value="{% blocktrans %}Revert to version #{{ v1_nid }}{% endblocktrans %}"/></form>
-{% endif %}
+{% include "site/macros/paginator.html" %}
+
+<div style="clear:both;"></div>
 
-{% if v2_nid %}
-    <h2>{% blocktrans with v1_nid as v1_nid and v1_nid as v1_nid %}Differences between version #{{ v1_nid }} and version #{{ v2_nid }}:{% endblocktrans %}</h2>
-{% else %}
-	<h2>{{ version1.title }}</h2>
-    <span class="metadata">{% blocktrans with version1.created|local_date:tz as date and v1_nid as version_number %}Version #{{ version_number }} created on {{ date }}{% endblocktrans %}</span>
-    <br /><br />   
-{% endif %}
-{% autoescape off %}
+<table summary="text list" class="large_table">
+    <thead>
+        <tr>
+            <th>{% blocktrans %}Version{% endblocktrans %}</th>
+            <th colspan="2" width="1%">{% blocktrans %}Selection{% endblocktrans %}</th>
+            <th>{% blocktrans %}Title{% endblocktrans %}</th>
+            <th>{% blocktrans %}Author{% endblocktrans %}</th>
+            <th>{% blocktrans %}Created{% endblocktrans %}</th>
+            <th>{% blocktrans %}# comments{% endblocktrans %}</th>
+        </tr>
+    </thead>
+    <tbody>
+        {% 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 %}
+        
+        <tr class="text-{{ text_version.key }} {% cycle 'odd' 'even' %}">
+            {% if can_manage_workspace %}<td><input type="checkbox" class="text_check" name="check-{{ text_version.key }}"/></td>{% endif %}
+            <td>#{{ forloop.counter0|add:page_obj.start_index|invneg:paginator.count|add:"1" }}</td>
+            <td><input id="oldkey-{{ forloop.counter0 }}" type="radio" name="oldkey" value="{{ text_version.key }}"/></td>
+            <td><input id="newkey-{{ forloop.counter0 }}" type="radio" name="newkey" value="{{ text_version.key }}"/></td>                        
+            <td>
+                <a class="main_object_title" href="{% url text-history-version text.key text_version.key %}">{{ text_version.title }}</a>
+                
+                
+                <div class="hidden-text-actions text-actions-{{ text_version.key }}">
+                    <a href="{% url text-history-version text.key text_version.key %}">{% blocktrans %}View{% endblocktrans %}</a> 
+                    {% if text_version.get_previous_version %}| <a href="{% url text-history-compare text.key text_version.key text_version.get_previous_version.key %}">{% blocktrans %}Compare with previous version{% endblocktrans %}</a>{% endif %}
+                    {% if can_edit_text %} | <a href="{% url text-revert text.key text_version.key %}">{% blocktrans %}Revert to this version{% endblocktrans %}</a>{% endif %}
+                    {% comment %}{% if can_delete_text %}<a id="text-delete-{{ text_version.key }}" href="#">{% blocktrans %}Delete{% endblocktrans %}</a>
+                    <script type="text/javascript">                
+                    <!--
+                    $(function() {
+                        $("#text-delete-{{ text_version.key }}").click(function(){
+                            url = '{% url text-version-delete text.key text_version.key %}';
+                            question = "{% blocktrans %}Are you sure you want to delete this version?{% endblocktrans %}";
+                            if (confirm(question)) {
+                                $.post(url, function(data){
+                                      window.location = '{% url index %}';
+                                    });                        
+                            }
+                        });
+                        
+                    }) ;
+                    --> 
+                    </script>                    
+                    {% endif %}
+                    {% endcomment %}
+                </div>
+                <script type="text/javascript">                
+                <!--
+                $(function() {
+                    $(".text-{{ text_version.key }}").mouseover(function(){
+                        $(".text-actions-{{ text_version.key }}").css('visibility','visible');
+                        $(".text-{{ text_version.key }}").addClass('hover');   
+                    });
+                    $(".text-{{ text_version.key }}").mouseout(function(){
+                        $(".text-actions-{{ text_version.key }}").css('visibility','hidden');   
+                        $(".text-{{ text_version.key }}").removeClass('hover');   
+                    });
+                }) ;
+                --> 
+                </script>
+            </td>
+            <td>{{ text_version.get_name }}</td>
+            <td>{{ text_version.created|local_date }}</td>
+            <td>{{ text_version|nb_comments:request }}</td>
 
-{% if v2_nid %}
-<br />
-<table class="diff" width="100%">
-    <tr>
-        <td class="diff-head" width="45%">
-        	{{ version1.title }}
-            <br/>
-            <span class="metadata">{% blocktrans with version1.created|local_date:tz as date and v1_nid as version_number %}Version #{{ version_number }} created on {{ date }}{% endblocktrans %}</span>
-        </td>
-        <td width="10%"></td>
-        <td class="diff-head" width="45%">
-        	{{ version2.title }}
-            <br/>
-            <span class="metadata">{% blocktrans with version2.created|local_date:tz as date and v2_nid as version_number %}Version #{{ version_number }} created on {{ date }}{% endblocktrans %}</span>            
-        </td>
-    </tr>
+        </tr>
+        {% endfor %}
+    </tbody>
 </table>
-{% endif %}
-
 
-{% if is_diff %}
-{{ content }}
-{% else %}
-<center>{% blocktrans %}No differences{% endblocktrans %}</center>
-{% endif %}
+</form>
 
-{% if embed_code %}
-<div id="autoexpand_text_view_frame_container">
-{{ embed_code }}
-{% endif %}
-</div>
-
-{% endautoescape %}
 </div>
 {% endblock %}
--- /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 %}
+
+<script type="text/javascript">
+<!--
+tb_conf['current_tab'] = 'history';
+-->
+</script>
+
+<div id="text_history" class="tab-meta">   
+
+<script type="text/javascript">
+<!--
+$(function() {
+    $(".hidden-text-actions").css('visibility','hidden');   
+}) ;
+-->
+
+</script>
+
+
+<ul class="sub_list">
+    <li><a href="{% url text-history text.key %}">{% blocktrans %}Version list{% endblocktrans %}</a></li>
+    <li> / </li>
+    <li><a href="{% url text-history-version text.key v1.key %}">{% blocktrans with v1.get_version_number as version_number %}Version {{ version_number }}{% endblocktrans %}</a></li>
+    <li> / </li>
+    <li class="active_sub">{% blocktrans with v1.get_version_number as version_1_number and v2.get_version_number as version_2_number %}Comparison beetween version #{{ version_1_number }} and #{{ version_2_number }}{% endblocktrans %}</li>
+    <li> / </li>
+    <li><a href="{% url text-history-version text.key v2.key %}">{% blocktrans with v2.get_version_number as version_number %}Version {{ version_number }}{% endblocktrans %}</a></li>
+    
+</ul>
+
+<div style="clear:both;"></div>
+
+{% autoescape off %}
+{% if empty %}
+<center>{% blocktrans %}No differences{% endblocktrans %}</center>
+{% else %}
+{{ content }}
+{% endif %}
+{% endautoescape %}
+
+</div>
+{% endblock %}
--- /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 %}
+
+<script type="text/javascript">
+<!--
+tb_conf['current_tab'] = 'history';
+-->
+</script>
+
+<div id="text_history" class="tab-meta">   
+
+<script type="text/javascript">
+<!--
+$(function() {
+    $(".hidden-text-actions").css('visibility','hidden');   
+}) ;
+-->
+
+</script>
+
+
+<ul class="sub_list">
+    <li><a href="{% url text-history text.key %}">{% blocktrans %}Version list{% endblocktrans %}</a></li>
+    <li> / </li>
+    <li class="active_sub">{% blocktrans with text_version.get_version_number as version_number %}Version {{ version_number }}{% endblocktrans %}</li>
+    {% if text_version.get_previous_version %}
+    <li> / </li>
+    <li><a href="{% url text-history-compare text.key text_version.get_previous_version.key text_version.key %}">{% blocktrans %}Compare with previous version{% endblocktrans %}</a></li>
+    {% endif %}
+    {% if text_version.get_next_version %}
+    <li> / </li>
+    <li><a href="{% url text-history-compare text.key text_version.key text_version.get_next_version.key %}">{% blocktrans %}Compare with next version{% endblocktrans %}</a></li>
+    {% endif %}
+</ul>
+
+<div style="clear:both;"></div>
+
+<div id="autoexpand_text_view_frame_container">
+{% autoescape off %}
+{{ embed_code }}
+{% endautoescape %}
+</div>
+
+</div>
+{% endblock %}
--- 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)
--- 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)
 
--- 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<key>\w*)/pre_edit/$', text_pre_edit, name="text-preedit"),
      url(r'^text/(?P<key>\w*)/settings/$', text_settings, name="text-settings"),
      url(r'^text/(?P<key>\w*)/history/$', text_history, name="text-history"),
-     url(r'^text/(?P<key>\w*)/history-version/(?P<v1_nid>\d*)/$', text_history, name="text-history-version"),
-     url(r'^text/(?P<key>\w*)/history/(?P<v1_nid>\w*)/(?P<v2_nid>\d*)/$', text_history, name="text-history-compare"),
-     url(r'^text/(?P<key>\w*)/revert/(?P<v1_nid>\w*)/$', text_revert, name="text-revert"),
+     url(r'^text/(?P<key>\w*)/history-version/(?P<version_key>\w*)/$', text_history_version, name="text-history-version"),
+     url(r'^text/(?P<key>\w*)/history-compare/(?P<v1_version_key>\w*)/(?P<v2_version_key>\w*)/$', text_history_compare, name="text-history-compare"),
+     url(r'^text/(?P<key>\w*)/revert/(?P<text_version_key>\w*)/$', text_revert, name="text-revert"),
      url(r'^text/(?P<key>\w*)/attach/(?P<attach_key>\w*)/$', text_attach, name="text-attach"),
-     url(r'^text/(?P<key>\w*)/delete/$', text_delete, name="text-delete"),     
+     url(r'^text/(?P<key>\w*)/delete/$', text_delete, name="text-delete"),
+     url(r'^text/(?P<key>\w*)/(?P<text_version_key>\w*)/delete/$', text_version_delete, name="text-version-delete"),        
      url(r'^text/(?P<key>\w*)/export/(?P<format>\w*)/(?P<download>\w*)/(?P<whichcomments>\w*)/(?P<withcolor>\w*)/$', text_export, name="text-export"),
      url(r'^text/(?P<key>\w*)/history/$', text_history, name="text-history"),
      url(r'^text/(?P<key>\w*)/diff/(?P<id_v1>\w*)/(?P<id_v2>\w*)/$', text_diff, name="text-diff"),
--- 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' : '<table class="diff"><tbody></tbody></table>'==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 !='<table class="diff"><tbody></tbody></table>',
-                     '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('</tbody></table>')
     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]))