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