src/cm/views/texts.py
author gibus
Sat, 10 Sep 2011 15:19:29 +0200
changeset 386 555135ac8900
parent 350 9e4b7555d65d
child 405 3d03b25cd90d
permissions -rw-r--r--
add throbber to wait until text is loaded
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
     1
from cm.utils.embed import embed_html
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
from cm.activity import register_activity
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
from cm.client import jsonize, get_filter_datas, edit_comment, remove_comment, \
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
     4
    add_comment, RequestComplexEncoder, comments_thread, own_notify
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
from cm.cm_settings import NEW_TEXT_VERSION_ON_EDIT
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
from cm.exception import UnauthorizedException
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
from cm.message import *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from cm.models import *
70
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
     9
from django.forms.util import ErrorList
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
from cm.models_base import generate_key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
from cm.security import get_texts_with_perm, has_perm, get_viewable_comments, \
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
    has_perm_on_text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
from cm.utils import get_among, get_among, get_int
175
4f072edc51a1 BUG FIX : handling html
rbernard
parents: 157
diff changeset
    14
from cm.utils.html import on_content_receive
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
from cm.utils.comment_positioning import compute_new_comment_positions, \
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
    insert_comment_markers
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
from cm.utils.spannifier import spannify
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
    18
from cm.views import get_keys_from_dict, get_textversion_by_keys_or_404, get_text_by_keys_or_404, redirect
103
61fd17f9ab78 enh: detached comments
rbernard
parents: 74
diff changeset
    19
from cm.views.export import content_export2, content_export
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
from cm.views.user import AnonUserRoleForm, cm_login
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
from difflib import unified_diff
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
from django import forms
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
from django.conf import settings
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
from django.contrib.auth import login as django_login
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
from django.contrib.auth.forms import AuthenticationForm
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
from django.contrib.auth.models import User
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
from django.core.urlresolvers import reverse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
from django.db.models import Q
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
from django.forms import ModelForm
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
from django.forms.models import BaseModelFormSet, modelformset_factory
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
from django.http import HttpResponse, HttpResponseRedirect, Http404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
from django.shortcuts import render_to_response
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
from django.template import RequestContext
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
from django.template.loader import render_to_string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
from django.utils.translation import ugettext as _, ugettext_lazy
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
from django.views.generic.list_detail import object_list
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
    37
from tagging.models import Tag
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
import difflib
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
import logging
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
import mimetypes
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
import simplejson
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
import sys
231
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
    43
import re
74
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
    44
from django.db.models.sql.datastructures import EmptyResultSet
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
def get_text_and_admin(key, adminkey, assert_admin = False):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    assert_admin => redirect to unauthorized if not admin 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
    admin = False
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
    if adminkey:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        text = Text.objects.get(key = key, adminkey = adminkey)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
        if text:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
            admin = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
        text = Text.objects.get(key=key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
    if assert_admin and not admin:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        raise UnauthorizedException('Is not admin')        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
    return text, admin
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
ACTIVITY_PAGINATION = 10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
RECENT_TEXT_NB = 5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
RECENT_COMMENT_NB = RECENT_TEXT_NB
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
MODERATE_NB = 5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
def dashboard(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
    request.session.set_test_cookie()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
    if request.user.is_authenticated():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
        act_view = {
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
    73
                    'view_texts' : get_int(request.GET, 'view_texts',1),
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
    74
                    'view_comments' : get_int(request.GET, 'view_comments',1),
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
    75
                    'view_users' : get_int(request.GET, 'view_users',1),
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
            
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
    78
        paginate_by = get_int(request.GET, 'paginate', ACTIVITY_PAGINATION)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
        # texts with can_view_unapproved_comment perms
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
        moderator_texts = get_texts_with_perm(request, 'can_view_unapproved_comment')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
        viewer_texts = get_texts_with_perm(request, 'can_view_approved_comment')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
        all_texts_ids = [t.id for t in moderator_texts] + [t.id for t in viewer_texts]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
                    
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
    85
        span = get_among(request.GET, 'span', ('day','month','week',),'week')        
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
        template_dict = { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
                         'span' : span,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
                         'last_texts' : get_texts_with_perm(request, 'can_view_text').order_by('-modified')[:RECENT_TEXT_NB],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                         'last_comments' : Comment.objects.filter(text_version__text__in=all_texts_ids).order_by('-created')[:RECENT_COMMENT_NB],# TODO: useful?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
                         #'last_users' : User.objects.all().order_by('-date_joined')[:5],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
                         }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
        template_dict.update(act_view)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
        all_activities = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
                               'view_comments' : ['comment_created','comment_removed'],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
                               'view_users' : ['user_created', 'user_activated', 'user_suspended','user_enabled',],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
                               'view_texts' : ['text_created','text_removed', 'text_edited', 'text_edited_new_version'],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
                               }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
        selected_activities = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
        [selected_activities.extend(all_activities[k]) for k in act_view.keys() if act_view[k]]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
        activities = Activity.objects.filter(type__in = selected_activities)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
        if not has_perm(request,'can_manage_workspace'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
            texts = get_texts_with_perm(request, 'can_view_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
            activities = activities.filter(Q(text__in=texts))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
            comments = [] 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
            [comments.extend(get_viewable_comments(request, t.last_text_version.comment_set.all(), t)) for t in texts]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
            activities = activities.filter(Q(comment__in=comments) | Q(comment=None) )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
            template_dict['to_mod_profiles'] = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
            template_dict['to_mod_profiles'] = UserProfile.objects.filter(user__is_active=False).filter(is_suspended=True).order_by('-user__date_joined')[:MODERATE_NB]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
        template_dict['to_mod_comments'] = Comment.objects.filter(state='pending').filter(text_version__text__in=moderator_texts).order_by('-modified')[:MODERATE_NB-len(template_dict['to_mod_profiles'])]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
        activities = activities.order_by('-created')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
        return object_list(request, activities,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
                           template_name = 'site/dashboard.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
                           paginate_by = paginate_by,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
                           extra_context = template_dict,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
                           )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
        if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
            form = AuthenticationForm(request, request.POST)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
            if form.is_valid():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
                user = form.get_user()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
                user.backend = 'django.contrib.auth.backends.ModelBackend'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
                cm_login(request, user)            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
                display_message(request, _(u"You're logged in!"))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
                return HttpResponseRedirect(reverse('index'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
            form = AuthenticationForm()        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
        public_texts = get_texts_with_perm(request, 'can_view_text').order_by('-modified')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
        template_dict = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
                         'form' : form,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
                         'texts' : public_texts,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
                         }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
        return render_to_response('site/non_authenticated_index.html', template_dict, context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
TEXT_PAGINATION = 10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
# security check inside view
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
# TODO: set global access perm
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
def text_list(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    paginate_by = get_int(request.GET,'paginate',TEXT_PAGINATION)
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   150
    tag_selected = request.GET.get('tag_selected', 0)
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   151
        
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
    order_by = get_among(request.GET,'order',('title','author','modified','-title','-author','-modified'),'-modified')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
        action = request.POST.get('action',None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
        text_keys = get_keys_from_dict(request.POST, 'check-').keys()        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
        if action == 'delete':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
            for text_key in text_keys:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
                text = Text.objects.get(key=text_key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
                if has_perm(request, 'can_delete_text', text=text):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
                    text.delete()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
                else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
                    raise UnauthorizedException('No perm can_delete_text on comment') 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
            display_message(request, _(u'%(nb_texts)i text(s) deleted') %{'nb_texts':len(text_keys)})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
            return HttpResponseRedirect(reverse('text'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
    texts = get_texts_with_perm(request, 'can_view_text').order_by(order_by)
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   168
74
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
   169
    try:
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
   170
        tag_list = Tag.objects.usage_for_queryset(TextVersion.objects.filter(id__in = [t.last_text_version_id for t in get_texts_with_perm(request, 'can_view_text')]))
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
   171
    except EmptyResultSet:
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
   172
        tag_list = []
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   173
    context = {    
74
c1b6828677db fix bug when no tag is present
raph
parents: 71
diff changeset
   174
               'tag_list' : tag_list,
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   175
               'tag_selected': tag_selected,
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   176
               }
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   177
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   178
    if tag_selected:     
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   179
        tag_ids = Tag.objects.filter(name=tag_selected)
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   180
        if tag_ids:   
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   181
            content_type_id = ContentType.objects.get_for_model(TextVersion).pk
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   182
            # table cm_userprofile is not present if display_suspended_users: fix this 
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   183
            texts = texts.extra(where=['tagging_taggeditem.object_id = cm_text.last_text_version_id', 
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   184
                                       'tagging_taggeditem.content_type_id = %i' %content_type_id,
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   185
                                       'tagging_taggeditem.tag_id = %i' %tag_ids[0].id],
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   186
                                tables=['tagging_taggeditem'],
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   187
                                )
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   188
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
    return object_list(request, texts,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
                       template_name = 'site/text_list.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
                       paginate_by = paginate_by,
38
be1807d390d4 - add tag support to user
raph
parents: 24
diff changeset
   192
                       extra_context=context,
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
                       )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
@has_perm_on_text('can_view_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
def text_view(request, key, adminkey=None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
    register_activity(request, "text_view", text=text)    
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   199
    text_version = text.get_latest_version()
386
555135ac8900 add throbber to wait until text is loaded
gibus
parents: 350
diff changeset
   200
    embed_code = embed_html(key, 'id="text_view_frame" name="text_view_frame" onload="iframe_onload();"', None, request.META.get('QUERY_STRING'))
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   201
    template_dict = { 'embed_code':embed_code, 'text' : text, 'text_version' : text_version, 'title' : text_version.title, 'content' : text_version.get_content()}
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
    return render_to_response('site/text_view.html', template_dict, context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
@has_perm_on_text('can_delete_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
def text_delete(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
    text = Text.objects.get(key=key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
    if request.method != 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
        raise UnauthorizedException('Unauthorized')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
    display_message(request, _(u'Text %(text_title)s deleted') %{'text_title':text.title})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
    register_activity(request, "text_removed", text=text)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
    text.delete()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
    return HttpResponse('') # no redirect because this is called by js
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   214
@has_perm_on_text('can_delete_text')
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   215
def text_version_delete(request, key, text_version_key):
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   216
    text_version = TextVersion.objects.get(key=text_version_key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   217
    text=text_version.text
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   218
    if request.method != 'POST':
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   219
        raise UnauthorizedException('Unauthorized')
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   220
    display_message(request, _(u'Text version %(text_version_title)s deleted') %{'text_version_title':text_version.title})
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   221
    register_activity(request, "text_version_removed", text=text)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   222
    text_version.delete()
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   223
    return HttpResponse('') # no redirect because this is called by js
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   224
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   225
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
@has_perm_on_text('can_view_text') # only protected by text_view / comment filtering done in view
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   227
def text_view_comments(request, key, version_key=None, adminkey=None):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
    text = get_text_by_keys_or_404(key)
114
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   229
    
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   230
    read_only = False
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   231
    if version_key :
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   232
        text_version = get_textversion_by_keys_or_404(version_key, adminkey, key)
114
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   233
        if settings.ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY :
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   234
            read_only = (text.last_text_version_id != text_version.id) 
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   235
    else :
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   236
        text_version = text.get_latest_version()
114
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   237
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
    comments = get_viewable_comments(request, text_version.comment_set.filter(reply_to__isnull=True),text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
    filter_datas = get_filter_datas(request, text_version, text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
    get_params = simplejson.dumps(request.GET)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
    wrapped_text_version, _ , _ = spannify(text_version.get_content())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
    template_dict = {'text' : text,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
                               'text_version' : text_version,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
                               'title' : text_version.title, # TODO use it ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
                               'get_params' : get_params,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
                               'json_comments':jsonize(comments, request),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
                               'json_filter_datas':jsonize(filter_datas, request),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
                               'content' : wrapped_text_version,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
                               'client_date_fmt' : settings.CLIENT_DATE_FMT,
114
49647a504de8 ENH ticket 20 disable edit in versions tab added ALLOW_CLIENT_MODIF_ON_LAST_VERSION_ONLY to settings.py
rbernard
parents: 106
diff changeset
   251
                               'read_only' : read_only,
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
                               }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
    return render_to_response('site/text_view_comments.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
                              template_dict,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
                              context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
def client_exchange(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
    ret = None
106
rbernard
parents: 105
diff changeset
   258
    if request.method == 'POST' :
rbernard
parents: 105
diff changeset
   259
        function_name = request.POST['fun']# function called from client
rbernard
parents: 105
diff changeset
   260
        user = request.user
rbernard
parents: 105
diff changeset
   261
        if function_name == 'experiment' :
rbernard
parents: 105
diff changeset
   262
            ret = experiment()
rbernard
parents: 105
diff changeset
   263
        elif function_name == 'warn' :
rbernard
parents: 105
diff changeset
   264
            # TODO: (RBE to RBA) send mail withinfos
rbernard
parents: 105
diff changeset
   265
            ret = "warn test"
rbernard
parents: 105
diff changeset
   266
            #print request.POST
rbernard
parents: 105
diff changeset
   267
        else :
rbernard
parents: 105
diff changeset
   268
            key = request.POST['key']
rbernard
parents: 105
diff changeset
   269
            version_key = request.POST['version_key']
rbernard
parents: 105
diff changeset
   270
    
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
   271
            text = Text.objects.get(key=key)
106
rbernard
parents: 105
diff changeset
   272
            #TODO: stupid why restrict to latest ? 
rbernard
parents: 105
diff changeset
   273
            text_version = text.get_latest_version()
rbernard
parents: 105
diff changeset
   274
            
rbernard
parents: 105
diff changeset
   275
            if (text != None) :
rbernard
parents: 105
diff changeset
   276
                if function_name == 'ownNotify' : 
rbernard
parents: 105
diff changeset
   277
                    ret = own_notify(request=request, key=key)
rbernard
parents: 105
diff changeset
   278
                if function_name in ('editComment', 'addComment', 'removeComment',) :
rbernard
parents: 105
diff changeset
   279
                    if function_name == 'editComment' :
rbernard
parents: 105
diff changeset
   280
                        ret = edit_comment(request=request, key=key, comment_key=request.POST['comment_key'])
rbernard
parents: 105
diff changeset
   281
                    elif function_name == 'addComment' :
rbernard
parents: 105
diff changeset
   282
                        ret = add_comment(request=request, key=key, version_key=version_key)
rbernard
parents: 105
diff changeset
   283
                    elif function_name == 'removeComment' :
rbernard
parents: 105
diff changeset
   284
                        ret = remove_comment(request=request, key=key, comment_key=request.POST['comment_key'])
rbernard
parents: 105
diff changeset
   285
                        
rbernard
parents: 105
diff changeset
   286
                    ret['filterData'] = get_filter_datas(request, text_version, text)
rbernard
parents: 105
diff changeset
   287
                    #ret['tagCloud'] = get_tagcloud(key)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
    if ret :
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   289
        if type(ret) != HttpResponseRedirect and type(ret) != HttpResponse:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
            ret = HttpResponse(simplejson.dumps(ret, cls=RequestComplexEncoder, request=request))        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
    else :
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   292
        ret = HttpResponse()
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   293
        ret.status_code = 403 
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
    return ret 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
231
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   297
def from_html_links_to_abs_links(content):
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   298
    """
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   299
    Replaces (html) links to attachs with real file path on server
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   300
    """
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   301
    attach_re = r'/text/(?P<key>\w*)/attach/(?P<attach_key>\w*)/'
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   302
    attach_str = r'/text/%s/attach/%s/'
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   303
    for match in re.findall(attach_re, content):
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   304
        link = attach_str %match
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   305
        attach = Attachment.objects.get(key=match[1], text_version__text__key=match[0])                
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   306
        content = content.replace(link, attach.data.path)
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   307
    return content
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   308
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   309
#NOTE : some arguments like : withcolor = "yes" + format = "markdown" are incompatible
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   310
#http://localhost:8000/text/text_key_1/export/pdf/1/all/1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   311
def text_export(request, key, format, download, whichcomments, withcolor, adminkey=None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   312
    text, admin = get_text_and_admin(key, adminkey)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   313
    text_version = text.get_latest_version()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   314
    original_content = text_version.content
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   315
    original_format = text_version.format # BD : html or markdown for  now ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   316
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   317
    download_response = download == "1"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   318
    with_color = withcolor == "1"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   319
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   320
    comments = [] # whichcomments=="none"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   321
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   322
    if whichcomments == "filtered" or whichcomments == "all":
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   323
        #comments = text_version.comment_set.filter(reply_to__isnull=True)# whichcomments=="all"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   324
        #comments = get_viewable_comments(request, text_version.comment_set.filter(reply_to__isnull=True), text, order_by=('start_wrapper','start_offset','end_wrapper','end_offset'))# whichcomments=="all"
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   325
        
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   326
        _comments = text_version.comment_set.all()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   327
        if whichcomments == "filtered" :
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   328
            filteredIds = []
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   329
            if request.method == 'POST' :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   330
                ll = request.POST.get('filteredIds',[]).split(",")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   331
                filteredIds = [ int(l) for l in ll if l]
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   332
            _comments = text_version.comment_set.filter(id__in=filteredIds) # security ! TODO CROSS PERMISSIONS WITH POST CONTENT
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   333
            
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   334
        comments = get_viewable_comments(request, _comments, text, order_by=('start_wrapper','start_offset','end_wrapper','end_offset'))# whichcomments=="all"
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   335
        
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   336
    # decide to use pandoc or not
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   337
    if with_color :
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   338
        use_pandoc = False  # pandoc wouldn't preserve comments scope background colors
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   339
    else :
191
c6e4c5a996d0 BUG FIX : fix tex/latex format
rbernard
parents: 180
diff changeset
   340
        if format in ('markdown', 'latex') : 
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   341
            use_pandoc = True
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   342
        elif format in ('pdf', 'odt') : 
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   343
            use_pandoc = (original_format == "markdown")
231
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   344
        elif format in ('doc', 'html') :
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   345
            use_pandoc = False
231
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   346
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   347
    # correct attach path => real path
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   348
    if format in ('pdf','odt') :        
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   349
        original_content = from_html_links_to_abs_links(original_content)
e71ea24ff34c fix image path for pdf & odt exports (fixes #5)
raph
parents: 230
diff changeset
   350
            
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
    if len(comments) == 0 : #want to bypass html conversion in this case
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   352
        return content_export2(request, original_content, text_version.title, original_format, format, use_pandoc, download_response)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
    else : # case comments to be added  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   354
        #comments = comments.order_by('start_wrapper','start_offset','end_wrapper','end_offset')
232
a6c6b046a9c0 image path correction (when comments)
raph
parents: 231
diff changeset
   355
        html = pandoc_convert(original_content, original_format, 'html')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   356
        wrapped_text_version, _ , _ = spannify(html)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   357
        with_markers = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   358
        marked_content = insert_comment_markers(wrapped_text_version, comments, with_markers, with_color)
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   359
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
        viewable_comments = comments_thread(request, text_version, text) 
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   361
    #        viewable_commentsnoreply = get_viewable_comments(request, commentsnoreply, text, order_by = ('start_wrapper','start_offset','end_wrapper','end_offset'))
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   362
    #        viewable_comments = []
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   363
    #        for cc in viewable_commentsnoreply :
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   364
    #            viewable_comments += list_viewable_comments(request, [cc], text)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
        # numerotation{  id --> numbered as a child}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
        extended_comments = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
        nb_children = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
        for cc in viewable_comments :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
            id = 0 #<-- all top comments are children of comment with id 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
            if cc.is_reply() :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
                id = cc.reply_to_id
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
            nb_children[id] = nb_children.get(id, 0) + 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
            cc.num = "%d"%nb_children[id]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
            extended_comments[cc.id] = cc
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
            if cc.is_reply() :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
                cc.num = "%s.%s"%(extended_comments[cc.reply_to_id].num, cc.num)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
        
56
bd8a4ffc7dad BUG FIX : pdf export PhA tests, TODO fix special html caracters in comments
reno
parents: 42
diff changeset
   383
    #        viewable_comments += list_viewable_comments(request, viewable_commentsnoreply, text)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
        html_comments=render_to_string('site/macros/text_comments.html',{'comments':viewable_comments }, context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
        content = "%s%s"%(marked_content, html_comments)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
        content_format = "html" 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
        # impossible to satisfy because of color then no colors instead:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
        if with_color and format in ('markdown', 'tex') : #TODO : add S5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
            with_color = False  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
        return content_export2(request, content, text_version.title, content_format, format, use_pandoc, download_response)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
def text_print(request, key, adminkey=None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
    text, admin = get_text_and_admin(key, adminkey)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
    text_version = text.get_latest_version()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
#    chosen default url behaviour is export all comments + bckcolor + pdf  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
    comments = Comment.objects.filter(text_version=text_version, reply_to__isnull=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
    with_markers = True
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
    with_colors = True 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
    download_requested = True   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
    action = 'export' # client origine dialog
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
    requested_format = 'pdf' # requested output format
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   408
    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   409
        # colors or not ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   410
        with_colors = (u'yes' == request.POST.get('p_color', u'no'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   411
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   412
        # restrict comments to ones that should be exported / printed          
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   413
        p_comments = request.POST.get('p_comments')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   414
        if p_comments == "filtered" or p_comments == "none" : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   415
            filteredIds = [] # "none" case  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   416
            if p_comments == "filtered" : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   417
                ll = request.POST.get('filteredIds').split(",")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   418
                filteredIds = [ int(l) for l in ll if l]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   419
  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   420
            comments = comments.filter(id__in=filteredIds)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   421
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   422
        # print or export ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   423
        action = request.POST.get('print_export_action')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   424
        requested_format = request.POST.get('p_method')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   425
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   426
    comments = comments.order_by('start_wrapper','start_offset','end_wrapper','end_offset')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   427
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   428
    download_requested = (action == 'export') or (action == 'print' and requested_format != 'html')   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   429
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   430
    ori_format = text_version.format # BD : html or markdown for  now ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   431
    src_format = ori_format # as expected by convert functions ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   432
    src = text_version.content
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   433
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   434
    if len(comments) > 0 and (with_markers or with_colors) :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   435
        html = text_version.get_content()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   436
        wrapped_text_version, _ , _ = spannify(html)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   437
        marked_text_version = insert_comment_markers(wrapped_text_version, comments, with_markers, with_colors)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   438
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   439
        src_format = 'html'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   440
        src = marked_text_version
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   441
        html_comments=render_to_string('site/macros/text_comments.html',{'comments':comments}, context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   442
        src += html_comments
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   443
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   444
    if download_requested :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   445
        use_pandoc = (requested_format == 'html' or requested_format == 'markdown')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   446
        return content_export(request, src, text_version.title, src_format, requested_format, use_pandoc)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   447
    else : # action == 'print' and requested_format == 'html' (no colors)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   448
        template_dict = {'text' : text,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   449
                       'text_version' : text_version,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   450
                       'title' : text_version.title, # TODO use it ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   451
                       'comments': comments,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   452
                       'content' : marked_text_version,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   453
                       'client_date_fmt' : settings.CLIENT_DATE_FMT
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   454
                       }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   455
        if admin:
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
   456
            template_dict['adminkey'] = text.adminkey   
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
   457
            template_dict['admin'] = True       
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   458
        return render_to_response('site/text_print.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   459
                                  template_dict,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   460
                                  context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   461
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   462
@has_perm_on_text('can_view_text')
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   463
def text_view_frame(request, key, version_key=None, adminkey=None):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   464
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   465
    
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   466
    if version_key :
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   467
        text_version = get_textversion_by_keys_or_404(version_key, adminkey, key)
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   468
    else :
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   469
        text_version = text.get_latest_version()
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 12
diff changeset
   470
    template_dict = {'text' : text, 'text_version' : text_version}
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   471
    return render_to_response('site/text_view_frame.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   472
                              template_dict,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   473
                              context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   474
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   475
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   476
@has_perm_on_text('can_view_text')
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   477
def text_history_version(request, key, version_key):
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   478
    text = get_text_by_keys_or_404(key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   479
    text_version = get_textversion_by_keys_or_404(version_key, key=key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   480
    template_dict = {'text' : text,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   481
                     'text_version' : text_version,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   482
                     'embed_code' : embed_html(key, 'id="text_view_frame" name="text_view_frame"', version_key),
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   483
                      }
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   484
    return render_to_response('site/text_history_version.html',
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   485
                              template_dict,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   486
                              context_instance=RequestContext(request))
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   487
151
150cb6e76f30 add permission check on text compare
raph
parents: 149
diff changeset
   488
@has_perm_on_text('can_view_text')
149
0f2c5744b39b cleanup diff files / add experimental diff
raph
parents: 145
diff changeset
   489
def text_history_compare(request, key, v1_version_key, v2_version_key, mode=''):
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   490
    text = get_text_by_keys_or_404(key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   491
    v1 = get_textversion_by_keys_or_404(v1_version_key, key=key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   492
    v2 = get_textversion_by_keys_or_404(v2_version_key, key=key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   493
178
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   494
    content = get_uniffied_inner_diff_table(v1.title,
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   495
                                            v2.title, 
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   496
                                            _("by %(author)s") %{'author' : v1.get_name()},
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   497
                                            _("by %(author)s") %{'author' : v2.get_name()},
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   498
                                            v1.content,
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   499
                                            v2.content)
149
0f2c5744b39b cleanup diff files / add experimental diff
raph
parents: 145
diff changeset
   500
    if mode=='1':
0f2c5744b39b cleanup diff files / add experimental diff
raph
parents: 145
diff changeset
   501
        # alternate diff
250
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   502
        #from cm.utils.diff import text_diff
274
e49623f99d02 import inside function
raph
parents: 254
diff changeset
   503
        from cm.utils.diff import diff_match_patch2        
250
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   504
        dif = diff_match_patch2()
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   505
        content = dif.diff_prettyHtml_one_way(dif.diff_main(v1.get_content(), v2.get_content()), mode='ins_del')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   506
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   507
    template_dict = {
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   508
                     'text' : text,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   509
                     'v1': v1,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   510
                     'v2': v2,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   511
                     'content' : content.strip(),
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   512
                     'empty' : '<table class="diff"><tbody></tbody></table>'==content,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   513
                     }
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   514
    return render_to_response('site/text_history_compare.html',
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   515
                              template_dict,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   516
                              context_instance=RequestContext(request))
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   517
    
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   518
@has_perm_on_text('can_view_text')
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   519
def text_history(request, key):
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   520
    text = get_text_by_keys_or_404(key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   521
    
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   522
    if request.method == 'POST':
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   523
        v1_key = request.POST.get('newkey',None)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   524
        v2_key = request.POST.get('oldkey',None)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   525
        if v1_key and v2_key:  
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   526
            return redirect(request, 'text-history-compare', args=[text.key, v2_key, v1_key ])
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   527
        
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   528
    text_versions = text.get_versions()
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   529
    paginate_by = get_int(request.GET,'paginate',TEXT_PAGINATION)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   530
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   531
    last_last_version = text_versions[1] if len(text_versions)>1 else None 
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   532
    context = {'text':text, 'last_version':text.last_text_version, 'last_last_version':last_last_version}
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   533
    return object_list(request, text_versions,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   534
                       template_name = 'site/text_history.html',
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   535
                       paginate_by = paginate_by,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   536
                       extra_context=context,
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   537
                       )
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   538
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   539
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   540
# taken from trac
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   541
def _get_change_extent(str1, str2):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   542
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   543
    Determines the extent of differences between two strings. Returns a tuple
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   544
    containing the offset at which the changes start, and the negative offset
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   545
    at which the changes end. If the two strings have neither a common prefix
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   546
    nor a common suffix, (0, 0) is returned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   547
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   548
    start = 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   549
    limit = min(len(str1), len(str2))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   550
    while start < limit and str1[start] == str2[start]:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   551
        start += 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   552
    end = -1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   553
    limit = limit - start
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   554
    while - end <= limit and str1[end] == str2[end]:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   555
        end -= 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   556
    return (start, end + 1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   557
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   558
def diff_decorate(minus, plus):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   559
    return minus, plus
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   560
178
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   561
def get_uniffied_inner_diff_table(title1, title2, author1, author2, text1, text2):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   562
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   563
    Return the inner of the html table for text1 vs text2 diff
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   564
    """
350
9e4b7555d65d replace msdos \r\n
Production Moz <dev@sopinspace.com>
parents: 312
diff changeset
   565
    gen = unified_diff(text1.replace('\r\n','\n').split('\n'), text2.replace('\r\n','\n').split('\n'), n=3)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   566
    index = 0
307
0cf1d1fc084c use fixed table size for comparing versions
raph
parents: 301
diff changeset
   567
    res = ['<table class="diff"><col class="diff-marker"/><col class="diff-content"/><col class="diff-separator"/<col class="diff-marker"/><col class="diff-content"/><tbody>']
178
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   568
    res.append('<tr><td></td><td class="diff-title">%s</td><td></td><td></td><td class="diff-title">%s</td></tr>' %(title1, title2))
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   569
    res.append('<tr><td></td><td class="diff-author">%s</td><td></td><td></td><td class="diff-author">%s</td></tr>' %(author1, author2))
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   570
    res.append('<tr><td colspan="5"></td></tr>')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   571
    #res.append('<tr><td width="50%" colspan="2"></td><td width="50%" colspan="2"></td></tr>')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   572
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   573
    for g in gen:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   574
        if index > 1:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   575
            col_in = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   576
            if g.startswith('@@'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   577
                line_number = g.split(' ')[1][1:].split(',')[0]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   578
                if index != 2:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   579
                    res.append('<tr><td></td>&nbsp;<td></td><td></td><td>&nbsp;</td></tr>')                    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   580
                res.append('<tr><td class="diff-lineno" colspan="2">Line %s</td><td class="diff-separator"></td><td class="diff-lineno" colspan="2">Line %s</td></tr>' % (line_number, line_number))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   581
            if g.startswith(' '):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   582
                res.append('<tr><td class="diff-marker"></td><td class="diff-context">%s</td><td class="diff-separator"></td><td class="diff-marker"></td><td class="diff-context">%s</td></tr>' % (g, g))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   583
            if g.startswith('-') or g.startswith('+'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   584
                plus = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   585
                minus = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   586
                while g.startswith('-') or g.startswith('+'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   587
                    if g.startswith('-'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   588
                        minus.append(g[1:])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   589
                    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   590
                        plus.append(g[1:])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   591
                    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   592
                        g = gen.next()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   593
                    except StopIteration:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   594
                        break
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   595
                minus, plus = diff_decorate(minus, plus)
250
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   596
                
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   597
                
274
e49623f99d02 import inside function
raph
parents: 254
diff changeset
   598
                minus, plus = '<br />'.join(minus), '<br />'.join(plus)
e49623f99d02 import inside function
raph
parents: 254
diff changeset
   599
                from cm.utils.diff import diff_match_patch2
250
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   600
                dif = diff_match_patch2()
254
94afd8e00c74 cleanup diff for human reading
raph
parents: 250
diff changeset
   601
                res_diff1 = dif.diff_main(minus, plus)
94afd8e00c74 cleanup diff for human reading
raph
parents: 250
diff changeset
   602
                dif.diff_cleanupSemantic(res_diff1)
94afd8e00c74 cleanup diff for human reading
raph
parents: 250
diff changeset
   603
                p = dif.diff_prettyHtml_one_way(res_diff1, 1)
94afd8e00c74 cleanup diff for human reading
raph
parents: 250
diff changeset
   604
                minus = dif.diff_prettyHtml_one_way(res_diff1, 2)
250
cae2de810f77 improve diff between versions (word diff)
raph
parents: 240
diff changeset
   605
                plus = p
307
0cf1d1fc084c use fixed table size for comparing versions
raph
parents: 301
diff changeset
   606
                res.append('<tr><td class="diff-marker">-</td><td class="diff-deletedline"><div>%s</div></td><td class="diff-separator"></td><td class="diff-marker">+</td><td class="diff-addedline"><div>%s</div></td></tr>' % (minus, plus))
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   607
             
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   608
        index += 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   609
    res.append('</tbody></table>')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   610
    return ''.join(res)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   611
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   612
#def text_history_version(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   613
#    text = get_text_by_keys_or_404(key=key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   614
#    return _text_history_version(request, text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   615
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   616
#def text_history_version_admin(request, key, adminkey):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   617
#    text = get_text_by_keys_or_404(key=key, adminkey=adminkey)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   618
#    return _text_history_version(request, text, True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   619
#    if admin:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   620
#         template_dict['adminkey'] = text.adminkey
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   621
#         template_dict['admin'] = True          
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   622
#    return render_to_response('site/text_history.html', template_dict, context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   623
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   624
class TextVersionForm(ModelForm):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   625
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   626
        model = TextVersion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   627
        fields = ('title', 'content', 'format')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   628
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   629
class EditTextForm(ModelForm):
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   630
    title = forms.CharField(label=ugettext_lazy("Title"), widget=forms.TextInput)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   631
    #format = forms.CharField(label=_("Format"))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   632
    #content = forms.TextField(label=_("Content"))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   633
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   634
    note = forms.CharField(label=ugettext_lazy("Note (optional)"),
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   635
                           widget=forms.TextInput,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   636
                           required=False,
312
731664a49992 add note size limitation
raph
parents: 307
diff changeset
   637
                           max_length=100,
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   638
                           help_text=ugettext_lazy("Add a note to explain the modifications made to the text")
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   639
                           )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   640
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   641
    #tags = forms.CharField(label=_("Tags (optional)"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   642
    #                       widget=forms.TextInput,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   643
    #                       required=False,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   644
    #                       #help_text=_("Add a note to explain the modifications made to the text")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   645
    #                       )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   646
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   647
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   648
    new_version = forms.BooleanField(label=ugettext_lazy("New version (optional)"),
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   649
                           required=False,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   650
                           initial=True,
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   651
                           help_text=ugettext_lazy("Create a new version of this text (recommended)")
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   652
                           )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   653
235
b23aee4dd81d use lazy i18n for edit form
raph
parents: 234
diff changeset
   654
    keep_comments = forms.BooleanField(label=ugettext_lazy("Keep comments (optional)"),
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   655
                           required=False,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   656
                           initial=True,
234
b33dd64a57f0 use lazy i18n for edit form
raph
parents: 232
diff changeset
   657
                           help_text=ugettext_lazy("Keep comments (if not affected by the edit)")
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   658
                           )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   659
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   660
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   661
        model = TextVersion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   662
        fields = ('title', 'format', 'content', 'new_version', 'tags', 'note')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   663
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   664
    def save_into_text(self, text, request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   665
        new_content = request.POST.get('content')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   666
        new_title = request.POST.get('title')
71
a865a5d0809a format in text edit not required / add default to old value
raph
parents: 70
diff changeset
   667
        new_format = request.POST.get('format', text.last_text_version.format)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   668
        new_note = request.POST.get('note',None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   669
        new_tags = request.POST.get('tags',None)
301
6e8fb4869d50 fix: use 'keep_comments' parameter when editing text
raph
parents: 279
diff changeset
   670
        keep_comments = bool(request.POST.get('keep_comments',None))
103
61fd17f9ab78 enh: detached comments
rbernard
parents: 74
diff changeset
   671
        cancel_modified_scopes = (request.POST.get('cancel_modified_scopes',u'1') == u'1')
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   672
        version = text.get_latest_version()
301
6e8fb4869d50 fix: use 'keep_comments' parameter when editing text
raph
parents: 279
diff changeset
   673
        version.edit(new_title, new_format, new_content, new_tags, new_note, keep_comments, cancel_modified_scopes)
103
61fd17f9ab78 enh: detached comments
rbernard
parents: 74
diff changeset
   674
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   675
        return version
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   676
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   677
    def save_new_version(self, text, request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   678
        new_content = request.POST.get('content')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   679
        new_title = request.POST.get('title')
71
a865a5d0809a format in text edit not required / add default to old value
raph
parents: 70
diff changeset
   680
        new_format = request.POST.get('format', text.last_text_version.format)        
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   681
        new_note = request.POST.get('note',None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   682
        new_tags = request.POST.get('tags',None)
103
61fd17f9ab78 enh: detached comments
rbernard
parents: 74
diff changeset
   683
        cancel_modified_scopes = (request.POST.get('cancel_modified_scopes',u'1') == u'1')
178
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   684
        
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   685
        new_text_version = text.edit(new_title, new_format, new_content, new_tags, new_note, keep_comments=True, cancel_modified_scopes=cancel_modified_scopes, new_version=True)
301
6e8fb4869d50 fix: use 'keep_comments' parameter when editing text
raph
parents: 279
diff changeset
   686
6e8fb4869d50 fix: use 'keep_comments' parameter when editing text
raph
parents: 279
diff changeset
   687
        keep_comments = bool(request.POST.get('keep_comments',None))
6e8fb4869d50 fix: use 'keep_comments' parameter when editing text
raph
parents: 279
diff changeset
   688
        new_text_version.edit(new_title, new_format, new_content, new_tags, new_note, keep_comments, cancel_modified_scopes)
178
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   689
        new_text_version.user = request.user if request.user.is_authenticated() else None
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   690
        new_text_version.note = request.POST.get('note','')
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   691
        new_text_version.email = request.POST.get('email','')
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   692
        new_text_version.name = request.POST.get('name','')
bfb36a5d5e50 redesign compare page
raph
parents: 157
diff changeset
   693
        new_text_version.save()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   694
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   695
        return new_text_version
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   696
70
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   697
    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   698
                 initial=None, error_class=ErrorList, label_suffix=':',
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   699
                 empty_permitted=False, instance=None):
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   700
        ModelForm.__init__(self, data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance)
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   701
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   702
        # override manually to disabled
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   703
        format_field = self.fields['format']
237
48c4d74c5cd9 help update / i18n
raph
parents: 235
diff changeset
   704
        format_field.widget.attrs = {'disabled':'disabled'}
71
a865a5d0809a format in text edit not required / add default to old value
raph
parents: 70
diff changeset
   705
        format_field.required = False
70
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   706
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   707
        self.fields['format'] = format_field
11b691c88348 make format read-only (comment positioning problem)
raph
parents: 62
diff changeset
   708
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   709
@has_perm_on_text('can_edit_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   710
def text_pre_edit(request, key, adminkey=None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   711
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   712
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   713
    text_version = text.get_latest_version()
279
46b0773c20c1 code cleanup
raph
parents: 274
diff changeset
   714
    comments = text_version.get_comments()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   715
    new_format = request.POST['new_format']
175
4f072edc51a1 BUG FIX : handling html
rbernard
parents: 157
diff changeset
   716
    new_content = on_content_receive(request.POST['new_content'], new_format)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   717
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   718
    # TODO: RBE : si commentaire mal forme : (position non existante : boom par key error)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   719
    _tomodify_comments, toremove_comments = compute_new_comment_positions(text_version.content, text_version.format, new_content, new_format, comments)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   720
    return HttpResponse(simplejson.dumps({'nb_removed' : len(toremove_comments) }))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   721
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   722
class EditTextFormAnon(EditTextForm):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   723
    name = forms.CharField(label=ugettext_lazy("Name (optional)"), widget=forms.TextInput, required=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   724
    email = forms.EmailField(label=ugettext_lazy("Email (optional)"), required=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   725
    content = forms.CharField(label=ugettext_lazy("Content"), required=True, widget=forms.Textarea(attrs={'rows':'30', 'cols': '70'}))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   726
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   727
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   728
        model = TextVersion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   729
        fields = ('title', 'format', 'content', 'tags', 'note', 'name', 'email')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   730
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   731
@has_perm_on_text('can_edit_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   732
def text_edit(request, key, adminkey=None):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   733
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   734
    text_version = text.get_latest_version()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   735
    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   736
        if request.user.is_authenticated():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   737
            form = EditTextForm(request.POST)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   738
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   739
            form = EditTextFormAnon(request.POST)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   740
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   741
        if form.is_valid():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   742
            if request.POST.get('new_version'):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   743
                new_version = form.save_new_version(text, request)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   744
                register_activity(request, "text_edited_new_version", text=text, text_version=new_version)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   745
            else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   746
                form.save_into_text(text, request)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   747
                register_activity(request, "text_edited", text=text)    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   748
            return redirect(request, 'text-view', args=[text.key]) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   749
    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   750
        default_data = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   751
                        'content': text_version.content,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   752
                        'title': text_version.title,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   753
                        'format': text_version.format,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   754
                        'tags': text_version.tags,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   755
                        'new_version': NEW_TEXT_VERSION_ON_EDIT,
240
a00efaf32ea7 note should not beeing passed to new version (fixes #12)
raph
parents: 237
diff changeset
   756
                        'note' : '',
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   757
                        'keep_comments' : True,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   758
                       }        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   759
        if request.user.is_authenticated():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   760
            form = EditTextForm(default_data)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   761
        else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   762
            form = EditTextFormAnon(default_data)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   763
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   764
    template_dict = {'text' : text, 'form' : form}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   765
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   766
    return render_to_response('site/text_edit.html', template_dict , context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   767
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   768
@has_perm_on_text('can_edit_text')
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   769
def text_revert(request, key, text_version_key):
230
fb1a2dfb473d refactor arg passing between frames
raph
parents: 191
diff changeset
   770
    if request.method != 'POST':
fb1a2dfb473d refactor arg passing between frames
raph
parents: 191
diff changeset
   771
        raise UnauthorizedException('Unauthorized')
fb1a2dfb473d refactor arg passing between frames
raph
parents: 191
diff changeset
   772
        
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   773
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   774
145
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   775
    text_version = text.revert_to_version(text_version_key)
fb5b1e6ad179 refactor version explorer
raph
parents: 114
diff changeset
   776
    display_message(request, _(u'A new version (copied from version %(version_title)s) has been created') % {'version_title':text_version.title})
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   777
230
fb1a2dfb473d refactor arg passing between frames
raph
parents: 191
diff changeset
   778
    return HttpResponse('') # no redirect because this is called by js
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   779
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   780
@has_perm_on_text('can_view_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   781
def text_attach(request, key, attach_key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   782
    attach = Attachment.objects.get(key=attach_key, text_version__text__key=key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   783
    content = file(attach.data.path).read()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   784
    mimetype, _encoding = mimetypes.guess_type(attach.data.path)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   785
    response = HttpResponse(content, mimetype)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   786
    return response
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   787
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   788
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   789
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   790
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   791
def fix_anon_in_formset(formset):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   792
    # fix role choice in formset for anon (not all role are allowed)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   793
    role_field = [f.fields['role'] for f in formset.forms if f.instance.user == None][0]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   794
    role_field.choices = [(u'', u'---------')] + [(r.id, str(r)) for r in Role.objects.filter(anon = True)] # limit anon choices
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   795
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   796
class BaseUserRoleFormSet(BaseModelFormSet):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   797
    def clean(self):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   798
        """Checks that anon users are given roles with anon=True."""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   799
        for i in range(0, self.total_form_count()):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   800
            form = self.forms[i]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   801
            print form.cleaned_data
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   802
            user_role = form.cleaned_data['id']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   803
            if user_role.user == None:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   804
                role = form.cleaned_data['role']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   805
                if not role.anon:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   806
                    # nasty stuff: cannot happen so not dealt with in tempate
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   807
                    logging.warn('Cannot give such role to anon user.')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   808
                    raise forms.ValidationError, "Cannot give such role to anon user."
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   809
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   810
#@has_perm_on_text('can_manage_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   811
#def xtext_share(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   812
#    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   813
#    order_by = get_among(request.GET,'order',('user__username','-user__username','role__name','-role__name'),'user__username')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   814
#        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   815
#    UserRole.objects.create_userroles_text(text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   816
#    UserRoleFormSet = modelformset_factory(UserRole, fields=('role', ), extra=0, formset = BaseUserRoleFormSet)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   817
#    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   818
#    # put anon users on top no matter what the order says (TODO: ?)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   819
#    userrole_queryset = UserRole.objects.filter(text=text).extra(select={'anon':'"cm_userrole"."user_id">-1'}).order_by('-anon',order_by)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   820
#    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   821
#        formset = UserRoleFormSet(request.POST, queryset = userrole_queryset)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   822
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   823
#        if formset.is_valid():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   824
#            formset.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   825
#            display_message(request, "Sharing updated.")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   826
#            return HttpResponseRedirect(reverse('text-share',args=[text.key]))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   827
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   828
#    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   829
#        formset = UserRoleFormSet(queryset = userrole_queryset)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   830
#        fix_anon_in_formset(formset)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   831
#         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   832
#    global_anon_userrole = UserRole.objects.get(text=None, user=None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   833
#    return render_to_response('site/text_share.html', {'text' : text, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   834
#                                                       'formset' : formset,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   835
#                                                       'global_anon_userrole' : global_anon_userrole,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   836
#                                                       } , context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   837
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   838
# TODO: permission protection ? format value check ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   839
def text_wysiwyg_preview(request, format):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   840
    html_content = ""
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   841
    if request.POST : # if satisfied in the no html case, in html case : no POST (cf. markitup) previewTemplatePath and previewParserPath
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   842
        html_content = pandoc_convert(request.POST['data'], format, "html", full=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   843
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   844
    return render_to_response('site/wysiwyg_preview.html', {'content':html_content} , context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   845
        #return HttpResponse(pandoc_convert(content, format, "html", full=False))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   846
97
c01cc15e6968 fix pagination in text user list
raph
parents: 74
diff changeset
   847
USER_PAGINATION = 10
c01cc15e6968 fix pagination in text user list
raph
parents: 74
diff changeset
   848
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   849
@has_perm_on_text('can_manage_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   850
def text_share(request, key):
42
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   851
    display_suspended_users = get_int(request.GET, 'display', 0)
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   852
    tag_selected = request.GET.get('tag_selected', 0)
97
c01cc15e6968 fix pagination in text user list
raph
parents: 74
diff changeset
   853
    paginate_by = get_int(request.GET, 'paginate', USER_PAGINATION)    
42
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   854
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   855
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   856
    order_by = get_among(request.GET,'order',('user__username',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   857
                                              'user__email',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   858
                                              '-user__username',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   859
                                              '-user__email',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   860
                                              'role__name',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   861
                                              '-role__name',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   862
                                              ),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   863
                          'user__username')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   864
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   865
    UserRole.objects.create_userroles_text(text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   866
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   867
    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   868
        if 'save' in request.POST:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   869
            user_profile_keys_roles = get_keys_from_dict(request.POST, 'user-role-')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   870
            count = 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   871
            for user_profile_key in user_profile_keys_roles:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   872
                role_id = user_profile_keys_roles[user_profile_key]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   873
                if not user_profile_key:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   874
                    user_role = UserRole.objects.get(user = None, text = text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   875
                else:                    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   876
                    user_role = UserRole.objects.get(user__userprofile__key = user_profile_key, text = text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   877
                if (role_id != u'' or user_role.role_id!=None) and role_id!=unicode(user_role.role_id):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   878
                    if role_id:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   879
                        user_role.role_id = int(role_id)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   880
                    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   881
                        user_role.role_id = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   882
                    user_role.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   883
                    count += 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   884
            display_message(request, _(u'%(count)i user(s) role modified') %{'count':count})                
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   885
            return HttpResponseRedirect(reverse('text-share', args=[text.key]))    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   886
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   887
    anon_role = UserRole.objects.get(user = None, text = text).role
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   888
    global_anon_role = UserRole.objects.get(user = None, text = None).role
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   889
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   890
    context = {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   891
               'anon_role' : anon_role,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   892
               'global_anon_role' : global_anon_role,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   893
               'all_roles' : Role.objects.all(),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   894
               'anon_roles' : Role.objects.filter(anon = True),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   895
               'text' : text,
42
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   896
               'display_suspended_users' : display_suspended_users,
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   897
               'tag_list' : Tag.objects.usage_for_model(UserProfile),
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   898
               'tag_selected': tag_selected,               
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   899
               }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   900
42
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   901
    query = UserRole.objects.filter(text=text).filter(~Q(user=None)).order_by(order_by)
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   902
    if not display_suspended_users:
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   903
        query = query.exclude(Q(user__userprofile__is_suspended=True) & Q(user__is_active=True))
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   904
    else:
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   905
        # trick to include userprofile table anyway (to filter by tags)
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   906
        query = query.filter(Q(user__userprofile__is_suspended=True) | Q(user__userprofile__is_suspended=False))
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   907
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   908
    if tag_selected:     
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   909
        tag_ids = Tag.objects.filter(name=tag_selected)
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   910
        if tag_ids:   
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   911
            content_type_id = ContentType.objects.get_for_model(UserProfile).pk
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   912
            query = query.extra(where=['tagging_taggeditem.object_id = cm_userprofile.id', 
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   913
                                       'tagging_taggeditem.content_type_id = %i' %content_type_id,
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   914
                                       'tagging_taggeditem.tag_id = %i' %tag_ids[0].id],
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   915
                                tables=['tagging_taggeditem'],
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   916
                                )
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   917
82f6e2879e0a add tag filter to text share page
raph
parents: 38
diff changeset
   918
    return object_list(request, query,
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   919
                       template_name = 'site/text_share.html',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   920
                       paginate_by = paginate_by,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   921
                       extra_context = context,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   922
                       )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   923
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   924
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   925
class SettingsTextForm(ModelForm):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   926
    # example name = forms.CharField(label=_("Name (optional)"), widget=forms.TextInput, required=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   927
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   928
    class Meta:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   929
        model = TextVersion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   930
        fields = ('mod_posteriori',)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   931
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   932
@has_perm_on_text('can_manage_text')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   933
def text_settings(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   934
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   935
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   936
    text_version = text.get_latest_version()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   937
    if request.method == 'POST':
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   938
        form = SettingsTextForm(request.POST, instance = text_version)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   939
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   940
        if form.is_valid():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   941
            form.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   942
            display_message(request, _(u'Text settings updated'))                            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   943
            return redirect(request, 'text-view', args=[text.key])
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   944
    else:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   945
        form = SettingsTextForm(instance = text_version)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   946
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   947
    template_dict = {'text' : text, 'form' : form}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   948
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   949
    return render_to_response('site/text_settings.html', template_dict , context_instance=RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   950