src/ldt/ldt/ldt_utils/views/workspace.py
changeset 452 8e9494006e7b
parent 392 65c1898141da
child 469 8004f0d1a1bf
--- a/src/ldt/ldt/ldt_utils/views/workspace.py	Wed Jan 25 15:47:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/workspace.py	Wed Jan 25 17:57:01 2012 +0100
@@ -12,7 +12,7 @@
 from django.utils.html import escape
 from django.utils.translation import ugettext as _
 from ldt.ldt_utils.forms import SearchForm
-from ldt.ldt_utils.models import Content, Project
+from ldt.ldt_utils.models import Content, Project, Segment
 from ldt.ldt_utils.utils import boolean_convert
 from ldt.security.utils import add_change_attr, get_userlist
 from lxml.html import fragment_fromstring
@@ -165,36 +165,51 @@
             url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.lignesdetemps.search_init", args=[field, queryStr])
             return render_to_response('ldt/ldt_utils/init_ldt_full.html', {'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
         else:
-            results = get_results_with_context(field, search)     
-            complete_results = []
-            # the search is made only on the published project
-            proj_list = Project.safe_objects.filter(state=2)
+            results = get_results_with_context(field, search) 
+                
+            all_segments = Segment.safe_objects.filter(element_id__in=[e['element_id'] for e in results])
+            all_projects = Project.safe_objects.filter(ldt_id__in=[e['project_id'] for e in results], state=2)
+            all_contents = Content.safe_objects.filter(iri_id__in=[e['iri_id'] for e in results])
+            viewable_projects_id = [p.ldt_id for p in all_projects]
+            
+            complete_results = []           
             results.sort(key=lambda k: k['iri_id'])
-            for iri_id, item in groupby(results, itemgetter('iri_id')):                
-                try: 
-                    content = Content.objects.get(iri_id=iri_id)
-                except Content.DoesNotExist:
-                    continue
-                segments = list(item)
-                to_delete = []
-                for s in segments:
+            
+            for iri_id, item in groupby(results, itemgetter('iri_id')):
+                content = filter(lambda e: e.iri_id == iri_id, all_contents)[0]
+                if content.description is None:
+                    content.description = ''
+                    
+                all_related_segments = list(item)
+                
+                valid_segments = []
+                for s in all_related_segments:
+                    segment = filter(lambda e: e.element_id == s['element_id'] , all_segments)[0]
+                    
+                    segment.score = s['score']
+                    segment.lucene_id = s['lucene_id']
+                    segment.context = s['context']
+                    segment.context_tags = s['tags']
+                                        
                     if not s['project_id']:
                         s['project_id'] = '_'
-                    else:
-                        project = proj_list.filter(ldt_id=s['project_id'])
-                        if len(project) == 0:
-                            to_delete.append(s)
-                            
-                for e in to_delete:
-                    segments.remove(e)
-                    
-                if not segments:
-                    continue 
+                        valid_segments.append(segment)
+                    elif s['project_id'] in viewable_projects_id:
+                        valid_segments.append(segment)
+                
+                # If all segments found belong to unpublished projects or projects
+                # the current user is not allowed to see
+                if not valid_segments:
+                    continue
                 
-                score = sum([seg['score'] for seg in segments])
-                desc = content.description if content.description else ''
-                complete_results.append({'list' : segments, 'score' : score, 'content_title' : content.title, 'content_id' : content.iri_id, 'content_description' : desc, 'content':content })
-            
+                score = sum([seg.score for seg in valid_segments])
+                complete_results.append({
+                                         'list': valid_segments,
+                                         'score': score,
+                                         'content': content,                                         
+                                         })
+                
+      
             complete_results.sort(key=lambda k: k['score'])
                                 
             cache.set('complete_results_%s' % request.user.username, complete_results)
@@ -208,9 +223,8 @@
                 results = paginator.page(page)
             except (EmptyPage, InvalidPage):
                 results = paginator.page(paginator.num_pages)
-                
-            results.object_list = highlight_documents(results.object_list, search, field)
             
+            results.object_list = highlight_documents(results.object_list, search, field)            
             
             if front_template :
                 return render_to_response('front/front_search_results.html', {'results': results, 'nb_results' : paginator.count, 'search' : search, 'LDT_MEDIA_PREFIX': settings.LDT_MEDIA_PREFIX, 'colorurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/color.xml', 'i18nurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.LDT_MEDIA_PREFIX + 'swf/ldt/'}, context_instance=RequestContext(request))