src/cm/client.py
author gibus
Tue, 25 Jun 2013 11:56:01 +0200
changeset 504 b2e0186daa5b
parent 435 96c16cc6408b
child 605 830993bdf983
permissions -rw-r--r--
Adds a category to comments, painted with colored vertical bar.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
323
addba77f2f90 email_re has moved from django.form.fields to django.core.validators (Django 1.2 alpha 1)
gibus
parents: 144
diff changeset
     1
try:
addba77f2f90 email_re has moved from django.form.fields to django.core.validators (Django 1.2 alpha 1)
gibus
parents: 144
diff changeset
     2
    from django.core.validators import email_re
addba77f2f90 email_re has moved from django.form.fields to django.core.validators (Django 1.2 alpha 1)
gibus
parents: 144
diff changeset
     3
except ImportError:
addba77f2f90 email_re has moved from django.form.fields to django.core.validators (Django 1.2 alpha 1)
gibus
parents: 144
diff changeset
     4
    # support for django pre 1.2 alpha 1
addba77f2f90 email_re has moved from django.form.fields to django.core.validators (Django 1.2 alpha 1)
gibus
parents: 144
diff changeset
     5
    from django.forms.fields import email_re
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
from django.http import HttpResponse, HttpResponseRedirect
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
from django.core.exceptions import ObjectDoesNotExist
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from django.forms import ValidationError
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
from django.utils import simplejson
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
from django.utils.translation import ugettext as _
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
from tagging.models import Tag
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
from tagging.utils import parse_tag_input, LOGARITHMIC, calculate_cloud
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
from tagging.models import TaggedItem
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
from cm.models import *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
from cm.utils.timezone import request_tz_convert
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
from itertools import groupby
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
from time import mktime, sleep
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
from cm.converters.pandoc_converters import pandoc_convert
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
from cm.security import get_viewable_comments, list_viewable_comments, has_perm, has_perm_on_text, has_perm_on_comment, has_own_perm
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
from cm.activity import register_activity
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
from cm.utils.date import datetime_to_user_str, datetime_to_epoch
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
    22
from cm.cm_settings import AUTO_CONTRIB_REGISTER, DECORATED_CREATORS
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
from settings import CLIENT_DATE_FMT
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
import re
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
import time
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
import operator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
selection_place_error_msg = _(u'A selection is required. Select in the text the part your comment applies to.')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
comment_states = ('approved', 'unapproved', 'pending')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
def is_valid_email(email):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    if email_re.match(email) : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        return True 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    return False
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
def jsonize(obj, request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    return simplejson.dumps(obj, cls=RequestComplexEncoder, request=request)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
class RequestComplexEncoder(simplejson.JSONEncoder):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    def __init__(self, request, **kw):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        self.request = request
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        simplejson.JSONEncoder.__init__(self, **kw)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    def default(self, obj):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
        if isinstance(obj, Comment) :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
            comment = obj
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
            #replies = list(comment.comment_set.order_by('created'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
            text=comment.text_version.text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
            replies = get_viewable_comments(self.request, comment.comment_set.all(), text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
            # can_view == true because of get_viewable_comments filter
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
            can_moderate = has_perm(self.request, 'can_edit_comment', text)   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
            can_edit = has_perm(self.request, 'can_edit_comment', text) or has_own_perm(self.request, 'can_edit_comment_own', text, comment)  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
            can_delete = has_perm(self.request, 'can_delete_comment', text) or has_own_perm(self.request, 'can_delete_comment_own', text, comment)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
            return {'id' : comment.id, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
                    'key' : comment.key,
144
e7e1bc64f613 lpermalink uses id_key
rbernard
parents: 106
diff changeset
    61
                    'id_key' : comment.id_key,
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
                   'created_user_str' : datetime_to_user_str(request_tz_convert(comment.created, self.request)),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
                   'modified_user_str' : datetime_to_user_str(request_tz_convert(comment.modified, self.request)),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
#                   'created_str' : datetime_to_str(comment.created), # TODO change to a simple number as modified if possible
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
                   'created' : datetime_to_epoch(comment.created), # TODO change to a simple number as modified if possible
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
                   'modified' : datetime_to_epoch(comment.modified),  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
#                   'modified' : time.mktime(comment.modified.timetuple()),  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
#                   'created' : datetime_to_js_date_str(comment.created),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
                   'reply_to_id' : comment.reply_to_id,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
                   'replies' : replies,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
                   'name' : comment.get_name(), 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
                   'email' : comment.get_email(), 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
                   'logged_author' : (comment.user != None), 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
                   'title':comment.title,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
                   'content':comment.content, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
                   'content_html':comment.content_html, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
                   'tags': ', '.join(parse_tag_input(comment.tags)), 
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
    78
                   'category': comment.category,
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
                   'format': comment.format, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
                   'start_wrapper' : comment.start_wrapper, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
                   'end_wrapper' : comment.end_wrapper,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
                   'start_offset' : comment.start_offset, 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
                   'end_offset' : comment.end_offset,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
                   'state' : comment.state,
144
e7e1bc64f613 lpermalink uses id_key
rbernard
parents: 106
diff changeset
    85
                   'permalink' : reverse('text-view-show-comment', args=[text.key, comment.id_key]),
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
                   # permission
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
                   'can_edit' : can_edit,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
                   'can_delete' : can_delete,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
                   'can_moderate' : can_moderate,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
                   }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
        if isinstance(obj, Tag) :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
            tag = obj
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
            # RBE each time issuing a db request to find comments related to this tag !!! TODO  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
            return { 'ids' : [t.id for t in tag.items.all()], 'name' : tag.name, 'font_size' : tag.font_size}            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
        return simplejson.JSONEncoder.default(self, obj)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
def experiment() :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
    sleep(5) ;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
    return {"key":"value"}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
def read_comment_args(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
    name = request.POST.get('name', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
    email = request.POST.get('email', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
    if name != None :
400
b82f4f749b44 Do not transform commentator's displayed name in lower case when posting comment.
Production Moz <dev@sopinspace.com>
parents: 323
diff changeset
   106
        # GIB: Is there any good reasons to transform the name into lower case?
b82f4f749b44 Do not transform commentator's displayed name in lower case when posting comment.
Production Moz <dev@sopinspace.com>
parents: 323
diff changeset
   107
        #name = name.lower().strip()
b82f4f749b44 Do not transform commentator's displayed name in lower case when posting comment.
Production Moz <dev@sopinspace.com>
parents: 323
diff changeset
   108
        name = name.strip()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
    if email != None :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
        email = email.lower().strip()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    title = request.POST['title'].strip()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
    content = request.POST['content'].strip() 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
    tags = request.POST['tags']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   117
    category = request.POST.get('category', 0);
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   118
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
    reply_to_id = request.POST.get('reply_to_id', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
    format = request.POST['format'] 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
    start_wrapper = request.POST.get('start_wrapper', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
    end_wrapper = request.POST.get('end_wrapper', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
    start_offset = request.POST.get('start_offset', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
    end_offset = request.POST.get('end_offset', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
    if start_wrapper :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
        start_wrapper = int(start_wrapper.strip())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
    if end_wrapper :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
        end_wrapper = int(end_wrapper.strip())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
    if start_offset :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
        start_offset = int(start_offset.strip())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
    if end_offset :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
        end_offset = int(end_offset.strip())
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
    
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   137
    return name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
def validate_comment_args(name, email, title, content, tags):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
    errors = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
    if name != None : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
        if name == "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
            errors['name'] = _(u'name is required')   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
    if email != None :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
        if email == "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
            errors['email'] = _(u'email is required')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
        if not is_valid_email(email) :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
            errors['email'] = _('invalid email')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
    if title == "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
        errors['title'] = _(u'title is required')   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
    if content == "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
        errors['content'] = _(u'content is required')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
    tag_errors = validate_tags(tags)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
    if tag_errors != "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
        errors['tags'] = tag_errors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
    return errors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
@has_perm_on_comment("can_delete_comment")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
def remove_comment(request, key, comment_key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
    ret={}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
        text = Text.objects.get(key=key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
        comment = Comment.objects.get(key = comment_key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
        comment.delete()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
        ret['msg'] = _(u'comment removed')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
        register_activity(request, "comment_removed", text=text, comment=comment)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
    except ObjectDoesNotExist: 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
        pass
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
    return ret ;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
@has_perm_on_comment("can_edit_comment")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
def edit_comment(request, key, comment_key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
    state = request.POST.get('state', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
    change_state = state and state in comment_states     
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
    errors = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
    if not change_state : # moderation action
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
        change_scope = request.POST.get('change_scope', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
    
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   182
        name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
        errors = validate_comment_args(name, email, title, content, tags)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
         
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
        if (change_scope) and start_wrapper=="" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
            errors['selection_place'] = selection_place_error_msg   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
        content_html = pandoc_convert(content, format, "html", full=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
    ret = {} 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
    if errors != {} :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
        ret['errors'] = errors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
    else :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
    # INSERT
106
rbernard
parents: 24
diff changeset
   196
    # TODO check version is latest (if boolean
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
        #comment = Comment.objects.get(id=edit_comment_id)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
        comment = Comment.objects.get(key=comment_key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
        if change_state : # moderation action
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
            comment.state = state 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
        else :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
            comment.name = name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
            comment.email = email
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
            comment.title = title
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
            comment.content = content
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
            comment.content_html = content_html
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
            comment.tags = tags
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   208
            comment.category = category
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
            if change_scope :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
                comment.start_wrapper = start_wrapper
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
                comment.start_offset = start_offset
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
                comment.end_wrapper = end_wrapper
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
                comment.end_offset = end_offset
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
        comment.save()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
        ret['comment'] = comment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
        ret['msg'] = _(u'comment saved')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
    return ret
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
    
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   222
# DIRTY : this function has no error check but anyway errors are not listened to client side 
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   223
@has_perm_on_text("can_create_comment")
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   224
def own_notify(request, key):
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   225
    email_or_user = None if request.user.is_anonymous() else request.user
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   226
    if not email_or_user :
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   227
        email_or_user = request.POST.get('email', None)
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   228
        if email_or_user :
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   229
            email_or_user = email_or_user.lower().strip()
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   230
17
a4be0b8a905d bug fix : can view own comment on comment add on mod priori
reno
parents: 12
diff changeset
   231
    active = (request.POST.get('active', False) == 'true')
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   232
    text = Text.objects.get(key=key)
17
a4be0b8a905d bug fix : can view own comment on comment add on mod priori
reno
parents: 12
diff changeset
   233
    Notification.objects.set_notification(text=None, type='own', active=active, email_or_user=email_or_user)
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   234
    ret = HttpResponse()
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   235
    ret.status_code = 200 
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   236
    return ret 
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   237
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
@has_perm_on_text("can_create_comment")
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 17
diff changeset
   239
def add_comment(request, key, version_key):
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
#    if edit_comment_id : #
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
#    if self.request.user.is_anonymous() : # accessing via an admin url ?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
#    and comment.user == self.request.user
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
    user = None if request.user.is_anonymous() else request.user 
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   244
    name, email, title, content, tags, category, reply_to_id, format, start_wrapper, end_wrapper, start_offset, end_offset = read_comment_args(request)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
    errors = {} 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
    errors = validate_comment_args(name, email, title, content, tags)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
    if start_wrapper == "" :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
        errors['selection_place'] = selection_place_error_msg   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
    #TODO validate pandoc conversion
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
    content_html = pandoc_convert(content, format, "html", full=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
    ret = {} 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
    if errors != {} :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
        ret['errors'] = errors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
    else :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
    # INSERT
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
    # TODO check version still exist ...
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
        reply_to = None
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
        if reply_to_id :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
            reply_to = Comment.objects.get(id=reply_to_id)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
            
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
        text = Text.objects.get(key=key)
24
c8a95e540b79 ENH : adding comments on previous version now possible
reno
parents: 17
diff changeset
   265
        text_version = TextVersion.objects.get(key=version_key)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
        comment_state = 'approved' if text_version.mod_posteriori else 'pending'
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   268
        comment = Comment.objects.create(state=comment_state, text_version=text_version, user=user, name=name, email=email, title=title, content=content, content_html=content_html, tags = tags, category = category, start_wrapper = start_wrapper, end_wrapper = end_wrapper, start_offset = start_offset, end_offset = end_offset, reply_to=reply_to)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
        
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   270
        ask_for_notification = True
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   271
        if user : 
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   272
            workspace_notify_count = Notification.objects.filter(text=None,type='workspace',user=user, active=True).count()
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   273
            text_notify_count = Notification.objects.filter(text=text,type='text',user=user, active=True).count()
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   274
            if workspace_notify_count > 0 or text_notify_count > 0 : 
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   275
                ask_for_notification = False
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   276
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   277
        if ask_for_notification :
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   278
            ask_for_notification = ( None == Notification.objects.get_notifications(text=None, type='own', email_or_user=(user if user else email)))
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   279
        ret['ask_for_notification'] = ask_for_notification
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   280
        ret['email'] = '' if user else email
17
a4be0b8a905d bug fix : can view own comment on comment add on mod priori
reno
parents: 12
diff changeset
   281
a4be0b8a905d bug fix : can view own comment on comment add on mod priori
reno
parents: 12
diff changeset
   282
        if text_version.mod_posteriori or has_perm(request, 'can_view_unapproved_comment', text=text) or has_perm(request, 'can_view_comment_own', text=text) : 
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   283
            ret['comment'] = comment
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   284
            ret['msg'] = _(u"comment saved")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   285
        else :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   286
            ret['msg'] = _(u"comment saved, it is being held for moderation")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   287
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   288
        if AUTO_CONTRIB_REGISTER:
12
f69ff46d3240 various notification changes
reno
parents: 0
diff changeset
   289
            Notification.objects.set_notification(text=text, type='own', active=True, email_or_user=user or email)            
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   290
        register_activity(request, "comment_created", text, comment)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   291
    return ret
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   292
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   293
#we need to call comments_thread from here this function will be very expensive 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   294
# TODO: stupid get rid of text argument
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   295
def get_filter_datas(request, text_version, text):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   296
    from django.db.models import Count
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   297
    from datetime import datetime, timedelta
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   298
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   299
    allowed_ids = [c.id for c in comments_thread(request, text_version, text)] 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   300
    allowed_comments = Comment.objects.filter(Q(text_version=text_version),Q(deleted=False),Q(id__in=allowed_ids)) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   301
    #print allowed_ids 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   302
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   303
    # authors
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   304
#    names = list(Comment.objects.filter(text_version__text__key=key).filter(user__isnull=True).values('name').annotate(nb_comments=Count('id'))) #.order_by('name'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   305
    names = list(allowed_comments.filter(user__isnull=True).values('name').annotate(nb_comments=Count('id'))) #.order_by('name'))
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   306
    if DECORATED_CREATORS:
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   307
      names = list(allowed_comments.filter(user__isnull=False).values('name').annotate(nb_comments=Count('id'))) #.order_by('name'))
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   308
      author = text_version.name
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   309
    else:
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   310
      names += list(User.objects.filter(Q(comment__text_version=text_version),Q(comment__deleted=False), Q(comment__id__in=allowed_ids)).extra(select={'name': "username"}).values('name').annotate(nb_comments=Count('id'))) #.order_by('username'))
429
fc7477d34489 Fixed author when there is none.
gibus
parents: 426
diff changeset
   311
      has_author = User.objects.filter(id=text_version.user_id).values('username')
fc7477d34489 Fixed author when there is none.
gibus
parents: 426
diff changeset
   312
      if has_author:
fc7477d34489 Fixed author when there is none.
gibus
parents: 426
diff changeset
   313
        author = has_author[0]['username']
fc7477d34489 Fixed author when there is none.
gibus
parents: 426
diff changeset
   314
      else:
fc7477d34489 Fixed author when there is none.
gibus
parents: 426
diff changeset
   315
        author = ''
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   316
    if request.GET.get('name', None):
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   317
      me = request.GET.get('name', None)
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   318
    else:
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   319
      me = request.user.username
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   320
    for name in names:
435
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   321
      if name['name']:
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   322
        if name['name'] == me:
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   323
          name['display'] = _(u'me') + ' (' + name['name'] + ')'
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   324
        elif name['name'] == author:
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   325
          name['display'] = _(u'author') + ' (' + name['name'] + ')'
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   326
        else:
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   327
          name['display'] = name['name']
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   328
      else:
435
96c16cc6408b Fixed comments filter by name when name is empty
Production Moz <dev@sopinspace.com>
parents: 431
diff changeset
   329
        name['display'] = ''
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   330
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   331
    def sort_with_author_or_me_first(x, y):
431
0acfbbf18514 Fixed sort with y is NoneType.
gibus
parents: 429
diff changeset
   332
      if x and (x.startswith(_(u'me')) or x.startswith(_(u'author'))):
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   333
        return -1
431
0acfbbf18514 Fixed sort with y is NoneType.
gibus
parents: 429
diff changeset
   334
      if y and (y.startswith(_(u'me')) or y.startswith(_(u'author'))):
426
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   335
        return 1
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   336
      else:
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   337
        return cmp(x, y)
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   338
7c31b3a1284b Added 'me' and 'author' in filter by name.
gibus
parents: 400
diff changeset
   339
    names.sort(cmp = sort_with_author_or_me_first, key = lambda obj:obj["display"])
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   340
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   341
    # dates
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   342
    # TODO maybe optimize by comparing dates in python and saving these 'by day db requests'
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   343
    nb_days = [1, 3, 7, 30]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   344
    dates = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   345
    today = datetime.today()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   346
    for nb_day in nb_days :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   347
        day_date = today - timedelta(nb_day)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   348
        dates.append({'nb_day' : nb_day, 'nb_day_date':datetime_to_epoch(day_date), 'nb_comments':allowed_comments.filter(modified__gt = day_date).count()})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   349
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   350
    # tags
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   351
    comment_ids = [c.id for c in allowed_comments]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   352
    tags = list(Tag.objects.filter(items__content_type = ContentType.objects.get_for_model(Comment),items__object_id__in=comment_ids).values("name").annotate(nb_comments=Count('id')).distinct().order_by('name'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   353
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   354
    # categories
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   355
    categories = []
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   356
    for category in [0, 1, 2, 3, 4, 5] :
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   357
        categories.append({'cat' : category, 'nb_comments':allowed_comments.filter(category = category).count()})
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   358
    
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   359
    # states
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   360
    states = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   361
    for state in comment_states :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   362
        states.append({'state' : state, 'nb_comments':allowed_comments.filter(state = state).count()})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   363
    
504
b2e0186daa5b Adds a category to comments, painted with colored vertical bar.
gibus
parents: 435
diff changeset
   364
    return {'names':names, 'dates':dates, 'tags':tags, 'categories':categories, 'states':states}
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   365
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   366
#def get_ordered_ids(text_version_id):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   367
#    comments_and_replies = Comment.objects.filter(text_version__id=text_version_id)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   368
#    comments = comments_and_replies.filter(reply_to__isnull=True)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   369
#    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   370
#    dic = {}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   371
#    for c in comments_and_replies :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   372
#        top_comment = c.top_comment()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   373
#        max_modif = dic.get(top_comment.id, c.modified)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   374
#        dic[top_comment.id] = c.modified if max_modif < c.modified else max_modif
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   375
#    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   376
#    ordered_comment_ids = {'scope' : [c.id for c in comments.order_by('start_wrapper','start_offset','end_offset')],
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   377
#                           'thread_modified' : map(operator.itemgetter(0), sorted(dic.items(), key=operator.itemgetter(1)))}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   378
#    return ordered_comment_ids
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   379
   
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   380
def validate_tags(tags):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   381
    if tags :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   382
        try :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   383
            if len(tags) > 250 : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   384
                return _(u"Tags input must be no longer than 250 characters.")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   385
            TagField().formfield().clean(tags)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   386
        except ValidationError, e :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   387
            return ",".join(e.messages) 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   388
    return ''
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   389
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   390
MAX_NB_TAGS_IN_COMMENT_CLOUD = 30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   391
def get_tagcloud(key) :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   392
    tagCloud = Tag.objects.cloud_for_model(Comment, steps=8, distribution=LOGARITHMIC, filters=dict(text_version__text__key=key))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   393
    return tagCloud
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   394
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   395
# returns a flat list of viewable comments and their replies ordered as they should be : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   396
# order is : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   397
# 'start_wrapper','start_offset','end_wrapper','end_offset' for 'real' comments
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   398
# 'created' for replies
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   399
# TODO: get rid of text here, keep text_version
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   400
def comments_thread(request, text_version, text) : 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   401
    commentsnoreply = text_version.comment_set.filter(reply_to__isnull=True)#id=3)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   402
    viewable_commentsnoreply = get_viewable_comments(request, commentsnoreply, text, order_by = ('start_wrapper','start_offset','end_wrapper','end_offset'))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   403
    viewable_comments = []
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   404
    for cc in viewable_commentsnoreply :
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   405
        viewable_comments += list_viewable_comments(request, [cc], text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   406
    return viewable_comments
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   407