src/cm/views/texts.py
changeset 155 f436e2fef076
parent 154 8cb89c153140
parent 151 150cb6e76f30
child 157 7b1c363b566d
equal deleted inserted replaced
154:8cb89c153140 155:f436e2fef076
     1 from cm.utils.embed import embed_html
     1 from cm.utils.embed import embed_html
     2 from cm.activity import register_activity
     2 from cm.activity import register_activity
     3 from cm.client import jsonize, get_filter_datas, edit_comment, remove_comment, \
     3 from cm.client import jsonize, get_filter_datas, edit_comment, remove_comment, \
     4     add_comment, RequestComplexEncoder, comments_thread, own_notify
     4     add_comment, RequestComplexEncoder, comments_thread, own_notify
     5 from cm.cm_settings import NEW_TEXT_VERSION_ON_EDIT
     5 from cm.cm_settings import NEW_TEXT_VERSION_ON_EDIT
     6 from cm.diff import text_diff as _text_diff, text_history as inner_text_history, \
       
     7     get_colors
       
     8 from cm.exception import UnauthorizedException
     6 from cm.exception import UnauthorizedException
     9 from cm.message import *
     7 from cm.message import *
    10 from cm.models import *
     8 from cm.models import *
    11 from django.forms.util import ErrorList
     9 from django.forms.util import ErrorList
    12 from cm.models_base import generate_key
    10 from cm.models_base import generate_key
   209     display_message(request, _(u'Text %(text_title)s deleted') %{'text_title':text.title})
   207     display_message(request, _(u'Text %(text_title)s deleted') %{'text_title':text.title})
   210     register_activity(request, "text_removed", text=text)    
   208     register_activity(request, "text_removed", text=text)    
   211     text.delete()
   209     text.delete()
   212     return HttpResponse('') # no redirect because this is called by js
   210     return HttpResponse('') # no redirect because this is called by js
   213 
   211 
       
   212 @has_perm_on_text('can_delete_text')
       
   213 def text_version_delete(request, key, text_version_key):
       
   214     text_version = TextVersion.objects.get(key=text_version_key)
       
   215     text=text_version.text
       
   216     if request.method != 'POST':
       
   217         raise UnauthorizedException('Unauthorized')
       
   218     display_message(request, _(u'Text version %(text_version_title)s deleted') %{'text_version_title':text_version.title})
       
   219     register_activity(request, "text_version_removed", text=text)
       
   220     import pdb;pdb.set_trace()
       
   221     text_version.delete()
       
   222     return HttpResponse('') # no redirect because this is called by js
       
   223 
       
   224 
   214 @has_perm_on_text('can_view_text') # only protected by text_view / comment filtering done in view
   225 @has_perm_on_text('can_view_text') # only protected by text_view / comment filtering done in view
   215 def text_view_comments(request, key, version_key=None, adminkey=None):
   226 def text_view_comments(request, key, version_key=None, adminkey=None):
   216     text = get_text_by_keys_or_404(key)
   227     text = get_text_by_keys_or_404(key)
   217     
   228     
   218     read_only = False
   229     read_only = False
   443                               template_dict,
   454                               template_dict,
   444                               context_instance=RequestContext(request))
   455                               context_instance=RequestContext(request))
   445 
   456 
   446 
   457 
   447 @has_perm_on_text('can_view_text')
   458 @has_perm_on_text('can_view_text')
   448 def text_history(request, key, v1_nid=None, v2_nid=None, adminkey=False):
   459 def text_history_version(request, key, version_key):
   449     text = get_text_by_keys_or_404(key)    
   460     text = get_text_by_keys_or_404(key)
       
   461     text_version = get_textversion_by_keys_or_404(version_key, key=key)
       
   462     template_dict = {'text' : text,
       
   463                      'text_version' : text_version,
       
   464                      'embed_code' : embed_html(key, 'id="text_view_frame" name="text_view_frame"', version_key),
       
   465                       }
       
   466     return render_to_response('site/text_history_version.html',
       
   467                               template_dict,
       
   468                               context_instance=RequestContext(request))
       
   469 
       
   470 @has_perm_on_text('can_view_text')
       
   471 def text_history_compare(request, key, v1_version_key, v2_version_key, mode=''):
       
   472     text = get_text_by_keys_or_404(key)
       
   473     v1 = get_textversion_by_keys_or_404(v1_version_key, key=key)
       
   474     v2 = get_textversion_by_keys_or_404(v2_version_key, key=key)
       
   475 
       
   476     content = get_uniffied_inner_diff_table(v1.content, v2.content)
       
   477     if mode=='1':
       
   478         # alternate diff
       
   479         from cm.utils.diff import text_diff
       
   480         content = text_diff(v1.get_content(), v2.get_content())
       
   481 
       
   482     template_dict = {
       
   483                      'text' : text,
       
   484                      'v1': v1,
       
   485                      'v2': v2,
       
   486                      'content' : content.strip(),
       
   487                      'empty' : '<table class="diff"><tbody></tbody></table>'==content,
       
   488                      }
       
   489     return render_to_response('site/text_history_compare.html',
       
   490                               template_dict,
       
   491                               context_instance=RequestContext(request))
       
   492     
       
   493 @has_perm_on_text('can_view_text')
       
   494 def text_history(request, key):
       
   495     text = get_text_by_keys_or_404(key)
       
   496     
       
   497     if request.method == 'POST':
       
   498         v1_key = request.POST.get('newkey',None)
       
   499         v2_key = request.POST.get('oldkey',None)
       
   500         if v1_key and v2_key:  
       
   501             return redirect(request, 'text-history-compare', args=[text.key, v2_key, v1_key ])
       
   502         
   450     text_versions = text.get_versions()
   503     text_versions = text.get_versions()
   451     author_colors = get_colors([t.get_name() for t in text.get_inversed_versions()])
   504     paginate_by = get_int(request.GET,'paginate',TEXT_PAGINATION)
   452     
   505 
   453     if v1_nid:
   506     last_last_version = text_versions[1] if len(text_versions)>1 else None 
   454         v1_nid = int(v1_nid)
   507     context = {'text':text, 'last_version':text.last_text_version, 'last_last_version':last_last_version}
   455     else:
   508     return object_list(request, text_versions,
   456         v1_nid = text.get_versions_number()
   509                        template_name = 'site/text_history.html',
   457         
   510                        paginate_by = paginate_by,
   458     v1 = text.get_version(v1_nid)
   511                        extra_context=context,
   459 
   512                        )
   460     v1_id = v1.id
   513     
   461     
       
   462     v2_id = None
       
   463     v2 = None
       
   464     if v2_nid:
       
   465         v2_nid = int(v2_nid)
       
   466         v2 = text.get_version(v2_nid)
       
   467         v2_id = v2.id
       
   468 
       
   469     versions = text.get_inversed_versions()
       
   470     paired_versions = []
       
   471     colors_dict = dict(author_colors)
       
   472     for index in range(len(versions)):
       
   473         vv1 = versions[index]
       
   474         if index + 1 < len(versions):
       
   475             vv2 = versions[index + 1]
       
   476         else:
       
   477             vv2 = None
       
   478         paired_versions.append((vv1, vv2, colors_dict.get(vv1.get_name(), '#D9D9D9')))
       
   479 
       
   480     embed_code = ""
       
   481     content = ""
       
   482     if v1_nid and not v2_nid:
       
   483         embed_code = embed_html(key, 'id="text_view_frame" name="text_view_frame"', v1.key)
       
   484     else:
       
   485         content = get_uniffied_inner_diff_table(v1.content, v2.content)
       
   486 
       
   487     template_dict = {'paired_versions' : paired_versions,
       
   488                      'text' : text,
       
   489                      'v1_nid' : v1_nid,
       
   490                      'v2_nid' : v2_nid,
       
   491                      'v1_id' : v1_id,
       
   492                      'v2_id' : v2_id,
       
   493                      'version1': v1,
       
   494                      'version2': v2,
       
   495                      'content' : content.strip(),
       
   496                      'embed_code':embed_code,
       
   497                      'is_diff' : content !='<table class="diff"><tbody></tbody></table>',
       
   498                      'author_colors' : author_colors,
       
   499                      }
       
   500     return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
       
   501 
   514 
   502 # taken from trac
   515 # taken from trac
   503 def _get_change_extent(str1, str2):
   516 def _get_change_extent(str1, str2):
   504     """
   517     """
   505     Determines the extent of differences between two strings. Returns a tuple
   518     Determines the extent of differences between two strings. Returns a tuple
   556              
   569              
   557         index += 1
   570         index += 1
   558     res.append('</tbody></table>')
   571     res.append('</tbody></table>')
   559     return ''.join(res)
   572     return ''.join(res)
   560 
   573 
   561 @has_perm_on_text('can_view_text')
       
   562 def text_history_compare(request, key, v1_nid=None, v2_nid=None, adminkey=None):
       
   563     text = get_text_by_keys_or_404(key)
       
   564 
       
   565     vis_diff = difflib.HtmlDiff()
       
   566     v1 = text.get_version(int(v1_nid))
       
   567     v2 = text.get_version(int(v2_nid))
       
   568     content = _text_diff(v2.get_content(), v1.get_content())
       
   569     #content = vis_diff.make_table(v1.content.split('\n'), v2.content.split('\n'), v1_nid, v2_nid, context=None)
       
   570     
       
   571     template_dict = {
       
   572                      'text' : text,
       
   573                      'content' : content,
       
   574                      }
       
   575     return render_to_response('site/text_history_compare.html', template_dict, context_instance=RequestContext(request))
       
   576 
       
   577 #def text_history_version(request, key):
   574 #def text_history_version(request, key):
   578 #    text = get_text_by_keys_or_404(key=key)
   575 #    text = get_text_by_keys_or_404(key=key)
   579 #    return _text_history_version(request, text)
   576 #    return _text_history_version(request, text)
   580 #
   577 #
   581 #def text_history_version_admin(request, key, adminkey):
   578 #def text_history_version_admin(request, key, adminkey):
   584 #    if admin:
   581 #    if admin:
   585 #         template_dict['adminkey'] = text.adminkey
   582 #         template_dict['adminkey'] = text.adminkey
   586 #         template_dict['admin'] = True          
   583 #         template_dict['admin'] = True          
   587 #    return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
   584 #    return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
   588 #
   585 #
   589 #def _text_history_version(request, text, admin=False):
       
   590 #    pass
       
   591 #    
       
   592 class TextVersionForm(ModelForm):
   586 class TextVersionForm(ModelForm):
   593     class Meta:
   587     class Meta:
   594         model = TextVersion
   588         model = TextVersion
   595         fields = ('title', 'content', 'format')
   589         fields = ('title', 'content', 'format')
   596 
       
   597 @has_perm_on_text('can_view_text')
       
   598 def text_diff(request, key, id_v1, id_v2):
       
   599     text = get_text_by_keys_or_404(key)
       
   600     text_version_1 = TextVersion.objects.get(pk=id_v1)
       
   601     text_version_2 = TextVersion.objects.get(pk=id_v2)
       
   602     content = _text_diff(text_version_1.get_content(), text_version_2.get_content())
       
   603     title = _text_diff(text_version_1.title, text_version_2.title)
       
   604     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))
       
   605 
       
   606 # commented out, unused suspected 
       
   607 #@has_perm_on_text('can_view_text')
       
   608 #def text_version(request, key, id_version):
       
   609 #    text = get_text_by_keys_or_404(key)
       
   610 #    text_version = TextVersion.objects.get(pk=id_version)
       
   611 #    # TODO : assert text_v in text ...
       
   612 #    # TODO : do not use db id    
       
   613 #    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))
       
   614 
   590 
   615 class EditTextForm(ModelForm):
   591 class EditTextForm(ModelForm):
   616     title = forms.CharField(label=_("Title"), widget=forms.TextInput)
   592     title = forms.CharField(label=_("Title"), widget=forms.TextInput)
   617     #format = forms.CharField(label=_("Format"))
   593     #format = forms.CharField(label=_("Format"))
   618     #content = forms.TextField(label=_("Content"))
   594     #content = forms.TextField(label=_("Content"))
   747 
   723 
   748     return render_to_response('site/text_edit.html', template_dict , context_instance=RequestContext(request))
   724     return render_to_response('site/text_edit.html', template_dict , context_instance=RequestContext(request))
   749 
   725 
   750 # TODO: modif de la base => if POST
   726 # TODO: modif de la base => if POST
   751 @has_perm_on_text('can_edit_text')
   727 @has_perm_on_text('can_edit_text')
   752 def text_revert(request, key, v1_nid, adminkey=None):
   728 def text_revert(request, key, text_version_key):
   753     text = get_text_by_keys_or_404(key)
   729     text = get_text_by_keys_or_404(key)
   754 
   730 
   755     text.revert_to_version(v1_nid)
   731     text_version = text.revert_to_version(text_version_key)
   756     display_message(request, _(u'A new version (copied from version %(version_id)s) has been created') % {'version_id':v1_nid})
   732     display_message(request, _(u'A new version (copied from version %(version_title)s) has been created') % {'version_title':text_version.title})
   757 
   733 
   758     return HttpResponseRedirect(reverse('text-history', args=[text.key]))
   734     return HttpResponseRedirect(reverse('text-history', args=[text.key]))
   759     
   735     
   760 @has_perm_on_text('can_view_text')
   736 @has_perm_on_text('can_view_text')
   761 def text_attach(request, key, attach_key):
   737 def text_attach(request, key, attach_key):