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): |