ENH : adding comments on previous version now possible
authorreno
Tue, 08 Dec 2009 16:51:48 +0100
changeset 24 c8a95e540b79
parent 23 dbbd99172620
child 25 7fb200545bc1
child 30 42a64cbffdf5
ENH : adding comments on previous version now possible
src/cm/client.py
src/cm/converters/oo_converters.py
src/cm/fixtures/test_content.yaml
src/cm/media/js/client/c_server_exchange.js
src/cm/media/js/client/c_sync.js
src/cm/models.py
src/cm/templates/site/text_history.html
src/cm/templates/site/text_view.html
src/cm/templates/site/text_view_comments.html
src/cm/templates/site/text_view_frame.html
src/cm/urls.py
src/cm/utils/embed.py
src/cm/views/__init__.py
src/cm/views/notifications.py
src/cm/views/texts.py
--- a/src/cm/client.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/client.py	Tue Dec 08 16:51:48 2009 +0100
@@ -225,7 +225,7 @@
     return ret 
 
 @has_perm_on_text("can_create_comment")
-def add_comment(request, key):
+def add_comment(request, key, version_key):
 #    if edit_comment_id : #
 #    if self.request.user.is_anonymous() : # accessing via an admin url ?
 #    and comment.user == self.request.user
@@ -251,7 +251,7 @@
             reply_to = Comment.objects.get(id=reply_to_id)
             
         text = Text.objects.get(key=key)
-        text_version = text.get_latest_version()
+        text_version = TextVersion.objects.get(key=version_key)
         
         comment_state = 'approved' if text_version.mod_posteriori else 'pending'
         comment = Comment.objects.create(state=comment_state, text_version=text_version, user=user, name=name, email=email, title=title, content=content, content_html=content_html, tags = tags, start_wrapper = start_wrapper, end_wrapper = end_wrapper, start_offset = start_offset, end_offset = end_offset, reply_to=reply_to)
--- a/src/cm/converters/oo_converters.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/converters/oo_converters.py	Tue Dec 08 16:51:48 2009 +0100
@@ -5,7 +5,7 @@
 #   mkdir /var/www/.qt ; chown www-data:www-data /var/www/.qt
 #   mkdir /var/www/.kde ; chown www-data:www-data /var/www/.kde
 
-UNO_IMPORT = True
+UNO_IMPORT = False
 
 if UNO_IMPORT:
     import uno
--- a/src/cm/fixtures/test_content.yaml	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/fixtures/test_content.yaml	Tue Dec 08 16:51:48 2009 +0100
@@ -113,7 +113,9 @@
     content: 'aaa bbb ccc ddd eee fff ggg'
     text: 1
     mod_posteriori: True
-
+    key: "textversion_key_1" 
+    adminkey: "tv_adminkey_1" 
+    
 - model : cm.text
   pk: 1
   fields:
@@ -137,6 +139,8 @@
     content: 'aaa bbb ccc ddd eee fff ggg'
     text: 2
     mod_posteriori: False
+    key: "textversion_key_2" 
+    adminkey: "tv_adminkey_2" 
 
 - model : cm.text
   pk: 2
@@ -334,6 +338,9 @@
          
     long text'
     text: 3
+    key: "textversion_key_3" 
+    adminkey: "tv_adminkey_3" 
+    
 
 - model : cm.text
   pk: 3
--- a/src/cm/media/js/client/c_server_exchange.js	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/media/js/client/c_server_exchange.js	Tue Dec 08 16:51:48 2009 +0100
@@ -22,6 +22,7 @@
 doExchange = function(serverFun, obj, formId, retFunc, clientContext, clientArgs, inCaseErrorMsg) {
 	obj['fun'] = serverFun ;
 	obj['key'] = sv_key ;
+	obj['version_key'] = sv_version_key ;
 //	obj['adminKey'] = sv_adminKey ;
 	
 	var cfg = {
@@ -70,6 +71,7 @@
 warn_server = function(obj) {
 	obj['fun'] = "warn" ;
 	obj['key'] = sv_key ;
+	obj['version_key'] = sv_version_key ;
 
 	var obj2 = CY.UA ;
 
--- a/src/cm/media/js/client/c_sync.js	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/media/js/client/c_sync.js	Tue Dec 08 16:51:48 2009 +0100
@@ -131,14 +131,14 @@
 							function() { // special case : no waiting for the return, no error check, nothing !
 									var cfg = {
 									method: "POST", 
-									data: urlEncode({'fun':'ownNotify', 'key':sv_key, 'email':ret['email'], 'active':false}) 
+									data: urlEncode({'fun':'ownNotify', 'key':sv_key, 'version_key':sv_version_key, 'email':ret['email'], 'active':false}) 
 								} ; 
 								CY.io(sv_client_url, cfg);
 							}, this, null,
 							function() { // special case : no waiting for the return, no error check, nothing !
 									var cfg = {
 									method: "POST", 
-									data: urlEncode({'fun':'ownNotify', 'key':sv_key, 'email':ret['email'], 'active':true}) 
+									data: urlEncode({'fun':'ownNotify', 'key':sv_key, 'version_key':sv_version_key, 'email':ret['email'], 'active':true}) 
 								} ; 
 								CY.io(sv_client_url, cfg);
 							}, this, null) ;
--- a/src/cm/models.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/models.py	Tue Dec 08 16:51:48 2009 +0100
@@ -138,13 +138,17 @@
 DEFAULT_INPUT_FORMAT = getattr(settings, 'DEFAULT_INPUT_FORMAT', DEFAULT_INPUT_FORMAT_PANDOC)
 CHOICES_INPUT_FORMATS = getattr(settings, 'CHOICES_INPUT_FORMATS', CHOICES_INPUT_FORMATS_PANDOC)
 
-class TextVersionManager(models.Manager):
+class TextVersionManager(KeyManager):
 
     def duplicate(self, text_version, duplicate_comments=True):
         #import pdb;pdb.set_trace()
         old_comment_set = set(text_version.comment_set.all())
         text_version.id = None
-        #import pdb;pdb.set_trace()
+        
+        # generate new key
+        text_version.key = self._gen_key()
+        text_version.adminkey = self._gen_adminkey()
+        
         text_version.save()
         
         duplicate_text_version = text_version
@@ -165,7 +169,7 @@
                  
         return duplicate_text_version
         
-class TextVersion(AuthorModel):
+class TextVersion(AuthorModel, KeyModel):
     modified = models.DateTimeField(auto_now=True)
     created = models.DateTimeField(auto_now_add=True)
 
--- a/src/cm/templates/site/text_history.html	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/templates/site/text_history.html	Tue Dec 08 16:51:48 2009 +0100
@@ -96,6 +96,8 @@
 {% endif %}
 
 {{ content }}
+{{ embed_code }}
+
 {% endautoescape %}
 </div>
 {% endblock %}
--- a/src/cm/templates/site/text_view.html	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/templates/site/text_view.html	Tue Dec 08 16:51:48 2009 +0100
@@ -21,7 +21,10 @@
 <!-- border-width: 0pt;     frameborder="0" -->
 <div id="text_view_frame_container">
 <center>
-<iframe id="text_view_frame" name="text_view_frame" style="height:400px;width:99.9%;"  frameborder="0" src ="{% url text-view-comments-frame text.key %}?{{ request.GET.urlencode }}"/> 
+{% autoescape off %}
+{{ embed_code }}
+{% endautoescape %}
+<!-- <iframe id="text_view_frame" name="text_view_frame" style="height:400px;width:99.9%;"  frameborder="0" src ="{% url text-view-comments-frame-version text.key text_version.key %}?{{ request.GET.urlencode }}"/>  --> 
 </center>
 </div>
 
--- a/src/cm/templates/site/text_view_comments.html	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/templates/site/text_view_comments.html	Tue Dec 08 16:51:48 2009 +0100
@@ -68,6 +68,7 @@
 
 sv_client_date_fmt = "{{ client_date_fmt.js_parse }}"; //"%Y-%m-%dT%H:%M:%S" ;
 sv_key = "{{ text.key|escapejs }}";
+sv_version_key = "{{ text_version.key|escapejs }}";
 sv_format = "{{ text_version.format }}";
 
 sv_withComments = true ; // TODO will bug when false (!)
--- a/src/cm/templates/site/text_view_frame.html	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/templates/site/text_view_frame.html	Tue Dec 08 16:51:48 2009 +0100
@@ -83,7 +83,7 @@
 	    </DIV>
          <iframe id="text_view_comments" name="text_view_comments" class="ui-layout-center"
             width="100%" height="100%" frameborder="0" scrolling="auto"
-            src="{% url text-view-comments text.key %}?{{ request.GET.urlencode }}"></iframe>
+            src="{% url text-view-comments-version text.key text_version.key %}?{{ request.GET.urlencode }}"></iframe>
              
 <!--  exemple de passage d'arguments        <iframe id="text_view_comments" name="text_view_comments" class="ui-layout-center"
             width="100%" height="100%" frameborder="0" scrolling="auto"
--- a/src/cm/urls.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/urls.py	Tue Dec 08 16:51:48 2009 +0100
@@ -54,6 +54,8 @@
      
      # text
      url(r'^text/(?P<key>\w*)/view/$', text_view, name="text-view"),
+#     url(r'^text/(?P<key>\w*)/view/(?P<version_key>\w*)/$', text_view, name="text-view-version"),
+     
      url(r'^text/(?P<key>\w*)/edit/$', text_edit, name="text-edit"),
      url(r'^text/(?P<key>\w*)/pre_edit/$', text_pre_edit, name="text-preedit"),
      url(r'^text/(?P<key>\w*)/share/$', text_share, name="text-share"),
@@ -67,9 +69,13 @@
      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"),
-     url(r'^text/(?P<key>\w*)/version/(?P<id_version>\w*)/$', text_version, name="text-version"),
+#     url(r'^text/(?P<key>\w*)/version/(?P<id_version>\w*)/$', text_version, name="text-version"),
+     
      url(r'^text/(?P<key>\w*)/comments_frame/$', text_view_frame, name="text-view-comments-frame"),
+     url(r'^text/(?P<key>\w*)/comments_frame/(?P<version_key>\w*)/$', text_view_frame, name="text-view-comments-frame-version"),
+     
      url(r'^text/(?P<key>\w*)/comments/$', text_view_comments, name="text-view-comments"),
+     url(r'^text/(?P<key>\w*)/comments/(?P<version_key>\w*)/$', text_view_comments, name="text-view-comments-version"),
 
      url(r'^text/(?P<key>\w*)/user/add/$', user_add, name="user-add-text"),
      url(r'^text/(?P<key>\w*)/user/mass-add/$', user_mass_add, name="user-mass-add-text"),
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/embed.py	Tue Dec 08 16:51:48 2009 +0100
@@ -0,0 +1,12 @@
+from django.core.urlresolvers import reverse
+from django.conf import settings
+
+def embed_html(text_key, attrs='', version_key=None) :
+    if version_key :
+        url =  reverse('text-view-comments-frame-version', args=[text_key, version_key])
+    else :
+        url =  reverse('text-view-comments-frame', args=[text_key])
+
+    embed_code = '<iframe %s frameborder="0" src="%s%s" style="height: 200px; width: 99.9%%; position: relative; top: 0px;">'%(attrs, settings.SITE_URL, url)
+    
+    return embed_code
--- a/src/cm/views/__init__.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/views/__init__.py	Tue Dec 08 16:51:48 2009 +0100
@@ -17,12 +17,25 @@
 import simplejson
 import sys
 
+def get_textversion_by_keys_or_404(textversion_key, adminkey=None, key=None):
+    try:
+        if not adminkey:
+            textversion = TextVersion.objects.get(key=textversion_key)
+        else:
+            textversion = TextVersion.objects.get(key=textversion_key, adminkey=adminkey)
+        if textversion.text.key == key:
+            return textversion
+        else :
+            raise Http404('Mismatch keys Text / TextVersion')
+    except TextVersion.DoesNotExist:
+        raise Http404('No TextVersion with such keys')
+
 def get_text_by_keys_or_404(key, adminkey=None):
     try:
         if not adminkey:
             return Text.objects.get(key=key)
         else:
-            return Text.objects.get(key = key, adminkey = adminkey)
+            return Text.objects.get(key=key, adminkey=adminkey)
     except Text.DoesNotExist:
         raise Http404('No Text with such keys')
 
--- a/src/cm/views/notifications.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/views/notifications.py	Tue Dec 08 16:51:48 2009 +0100
@@ -3,6 +3,7 @@
 from cm.models import ApplicationConfiguration, Notification, Configuration, UserRole
 from cm.models_base import generate_key
 from cm.views import get_text_by_keys_or_404
+from cm.utils.embed import embed_html
 from django import forms
 from django.conf import settings
 from django.contrib.auth.decorators import login_required
@@ -70,7 +71,8 @@
     text_notify_check = Notification.objects.filter(text=text,type='text',user=user, active=True).count()
     workspace_notify_check = Notification.objects.filter(text=None,type='workspace',user=user, active=True).count()
     
-    embed_code = '<iframe frameborder="0" src="%s%s" style="height: 166px; width: 99.9%%; position: relative; top: 0px;">'%(settings.SITE_URL, reverse('text-view-comments-frame', args=[text.key]))   
+    #embed_code = '<iframe frameborder="0" src="%s%s" style="height: 166px; width: 99.9%%; position: relative; top: 0px;">'%(settings.SITE_URL, reverse('text-view-comments-frame', args=[text.key]))
+    embed_code = embed_html(text.key) ;   
     
     if request.method == 'POST':
         if 'activate' in request.POST:
--- a/src/cm/views/texts.py	Fri Dec 04 14:05:05 2009 +0100
+++ b/src/cm/views/texts.py	Tue Dec 08 16:51:48 2009 +0100
@@ -1,3 +1,4 @@
+from cm.utils.embed import embed_html
 from cm.activity import register_activity
 from cm.client import jsonize, get_filter_datas, edit_comment, remove_comment, \
     add_comment, RequestComplexEncoder, comments_thread, own_notify
@@ -15,7 +16,7 @@
     insert_comment_markers
 from cm.utils.html import cleanup_textarea
 from cm.utils.spannifier import spannify
-from cm.views import get_keys_from_dict, get_text_by_keys_or_404, redirect
+from cm.views import get_keys_from_dict, get_textversion_by_keys_or_404, get_text_by_keys_or_404, redirect
 from cm.views.export import content_export2
 from cm.views.user import AnonUserRoleForm, cm_login
 from difflib import unified_diff
@@ -169,12 +170,12 @@
     
 @has_perm_on_text('can_view_text')
 def text_view(request, key, adminkey=None):
-    
     text = get_text_by_keys_or_404(key)
     register_activity(request, "text_view", text=text)    
+    text_version = text.get_latest_version()
+    embed_code = embed_html(key, 'id="text_view_frame" name="text_view_frame"')
     
-    text_version = text.get_latest_version()
-    template_dict = { 'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}
+    template_dict = { 'embed_code':embed_code, 'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}
     return render_to_response('site/text_view.html', template_dict, context_instance=RequestContext(request))
 
 @has_perm_on_text('can_delete_text')
@@ -188,10 +189,13 @@
     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, adminkey=None):
+def text_view_comments(request, key, version_key=None, adminkey=None):
     text = get_text_by_keys_or_404(key)
-    #TODO: stupid why restrict to latest ? 
-    text_version = text.get_latest_version()
+    if version_key :
+        text_version = get_textversion_by_keys_or_404(version_key, adminkey, key)
+    else :
+        text_version = text.get_latest_version()
+
     comments = get_viewable_comments(request, text_version.comment_set.filter(reply_to__isnull=True),text)
     filter_datas = get_filter_datas(request, text_version, text)
     
@@ -222,6 +226,7 @@
         #print request.POST
     elif request.POST:
         key = request.POST['key']
+        version_key = request.POST['version_key']
 
         text = Text.objects.get(key=key) ;
         #TODO: stupid why restrict to latest ? 
@@ -234,7 +239,7 @@
                 if function_name == 'editComment' :
                     ret = edit_comment(request=request, key=key, comment_key=request.POST['comment_key'])
                 elif function_name == 'addComment' :
-                    ret = add_comment(request=request, key=key)
+                    ret = add_comment(request=request, key=key, version_key=version_key)
                 elif function_name == 'removeComment' :
                     ret = remove_comment(request=request, key=key, comment_key=request.POST['comment_key'])
                     
@@ -398,11 +403,14 @@
                                   context_instance=RequestContext(request))
 
 @has_perm_on_text('can_view_text')
-def text_view_frame(request, key, adminkey=None):
+def text_view_frame(request, key, version_key=None, adminkey=None):
     text = get_text_by_keys_or_404(key)
     
-    text_version = text.get_latest_version()
-    template_dict = {'text' : text}
+    if version_key :
+        text_version = get_textversion_by_keys_or_404(version_key, adminkey, key)
+    else :
+        text_version = text.get_latest_version()
+    template_dict = {'text' : text, 'text_version' : text_version}
     return render_to_response('site/text_view_frame.html',
                               template_dict,
                               context_instance=RequestContext(request))
@@ -441,8 +449,10 @@
             vv2 = None
         paired_versions.append((vv1, vv2, colors_dict.get(vv1.get_name(), '#D9D9D9')))
 
+    embed_code = ""
+    content = ""
     if v1_nid and not v2_nid:
-        content = v1.get_content()
+        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))
 
@@ -455,6 +465,7 @@
                      'version1': v1,
                      'version2': v2,
                      'content' : content,
+                     'embed_code':embed_code,
                      'author_colors' : author_colors,
                      }
     return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
@@ -563,14 +574,14 @@
     title = _text_diff(text_version_1.title, text_version_2.title)
     return render_to_response('site/text_view.html', {'text' : text, 'text_version_1' : text_version_1, 'text_version_2' : text_version_2, 'title' : title, 'content' : content}, context_instance=RequestContext(request))
 
-
-@has_perm_on_text('can_view_text')
-def text_version(request, key, id_version):
-    text = get_text_by_keys_or_404(key)
-    text_version = TextVersion.objects.get(pk=id_version)
-    # TODO : assert text_v in text ...
-    # TODO : do not use db id    
-    return render_to_response('site/text_view.html', {'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}, context_instance=RequestContext(request))
+# commented out, unused suspected 
+#@has_perm_on_text('can_view_text')
+#def text_version(request, key, id_version):
+#    text = get_text_by_keys_or_404(key)
+#    text_version = TextVersion.objects.get(pk=id_version)
+#    # TODO : assert text_v in text ...
+#    # TODO : do not use db id    
+#    return render_to_response('site/text_view.html', {'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}, context_instance=RequestContext(request))
 
 class EditTextForm(ModelForm):
     title = forms.CharField(label=_("Title"), widget=forms.TextInput)