First step of pagination for contents and projet in workspace home.
authorcavaliet
Fri, 25 May 2012 17:47:20 +0200
changeset 644 94429061bbfa
parent 621 49e6b1148a7a
child 645 5af755809dd1
First step of pagination for contents and projet in workspace home.
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/workspace_base.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views/content.py
src/ldt/ldt/ldt_utils/views/project.py
src/ldt/ldt/ldt_utils/views/workspace.py
src/ldt/ldt/settings.py
src/ldt/ldt/static/ldt/css/style.css
src/ldt/ldt/static/ldt/css/workspace.css
src/ldt/ldt/static/ldt/js/projectscontents.js
web/ldtplatform/config.py.tmpl
web/ldtplatform/settings.py
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/contentslist.html	Fri May 25 17:47:20 2012 +0200
@@ -1,5 +1,22 @@
 {% load i18n %}
 {% load thumbnail %}
+{% load front_tags %}
+
+{% if nb_ct_pages %}
+	<p class="prev_next_cont_proj" >
+	{% if 0 < current_content_page %}<a class="contents_page clickable" alt="prev">&lt;&lt;</a>&nbsp;&nbsp;{% endif %}
+	{% for i in nb_ct_pages|get_range %}
+	  {% if i == current_content_page %}
+	    {{i|add:'1'}}
+	  {% else %}
+	    <a class="contents_page clickable" alt="{{i}}">{{i|add:'1'}}</a>
+	  {% endif %}
+	  &nbsp;&nbsp;
+	{% endfor %}
+	{% if current_content_page|add:'1' < nb_ct_pages %}<a class="contents_page clickable" alt="next">&gt;&gt;</a>{% endif %}
+    <input type="hidden" value="{{current_content_page}}" name="current_content_page" id="current_content_page">
+	</p>
+{% endif %}
 <div class="projectscontentsheader projectcontentsheadertitle span-12 last" id="contentsheader">
 {% trans "name" %}
 </div>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/projectslist.html	Fri May 25 17:47:20 2012 +0200
@@ -1,5 +1,22 @@
 {% load i18n %}
 {% load thumbnail %}
+{% load front_tags %}
+
+{% if nb_pj_pages %}
+    <p class="prev_next_cont_proj" >
+    {% if 0 < current_project_page %}<a class="projects_page clickable" alt="prev">&lt;&lt;</a>&nbsp;&nbsp;{% endif %}
+    {% for i in nb_pj_pages|get_range %}
+      {% if i == current_project_page %}
+        {{i|add:'1'}}
+      {% else %}
+        <a class="projects_page clickable" alt="{{i}}">{{i|add:'1'}}</a>
+      {% endif %}
+      &nbsp;&nbsp;
+    {% endfor %}
+    {% if current_project_page|add:'1' < nb_pj_pages %}<a class="projects_page clickable" alt="next">&gt;&gt;</a>{% endif %}
+    <input type="hidden" value="{{current_project_page}}" name="current_project_page" id="current_project_page">
+    </p>
+{% endif %}
 <div class="projectscontentsheader projectcontentsheadertitle span-12 last" id="projectsheader">
 {% trans "name" %}
 </div>
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/workspace_base.html	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/workspace_base.html	Fri May 25 17:47:20 2012 +0200
@@ -16,11 +16,12 @@
 var project_filter_url = "{% url ldt.ldt_utils.views.project.projects_filter filter='__FILTER__' is_owner='true' status='0' %}";
 var publish_project_url = "{% url ldt.ldt_utils.views.project.publish '__PROJECT_ID__' %}";
 var unpublish_project_url = "{% url ldt.ldt_utils.views.project.unpublish '__PROJECT_ID__' %}";
-
+var contents_page_url = "{% url ldt.ldt_utils.views.content.contents_page %}";
+var projects_page_url = "{% url ldt.ldt_utils.views.project.projects_page %}";
+var remember_projects_page = false;
 
 function init_events(base_node) {
-
-	init_events_all(base_node, "{% url ldt.ldt_utils.views.workspace.popup_embed %}", content_filter_url, project_filter_url, publish_project_url, unpublish_project_url);
+	init_events_all(base_node, "{% url ldt.ldt_utils.views.workspace.popup_embed %}", content_filter_url, project_filter_url, publish_project_url, unpublish_project_url, contents_page_url, projects_page_url);
 	
 }
 	
@@ -34,7 +35,7 @@
 	];
 	
 	searchFieldInit(input_list_init);
-	
+    
 	init_events(document);
 
 });
--- a/src/ldt/ldt/ldt_utils/urls.py	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/urls.py	Fri May 25 17:47:20 2012 +0200
@@ -28,6 +28,8 @@
     url(r'cljson/idcutting/(?P<id>.*)/(?P<cutting_id>.*)$', 'views.json.project_json_cutting_id'),
     url(r'^rdf/id/(?P<ldt_id>.*)$', 'views.rdf.project_annotations_rdf'),
     url(r'^workspace/?$', "views.workspace.home", name="root-view"),
+    url(r'^contentspage/$', 'views.content.contents_page'),
+    url(r'^projectspage/$', 'views.project.projects_page'),
     url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)$', "views.project.projects_filter",),
     url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)/(?P<id_group>.*)$', "views.project.projects_filter",),
     url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.content.contents_filter",),
--- a/src/ldt/ldt/ldt_utils/views/content.py	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/views/content.py	Fri May 25 17:47:20 2012 +0200
@@ -23,6 +23,7 @@
 import subprocess
 import re
 import datetime
+import math
 
 def write_content_base(request, iri_id=None): 
 
@@ -390,11 +391,33 @@
 
     if filter:
         content_list = Content.safe_objects.filter(title__icontains=filter) #@UndefinedVariable
+        content_list = add_change_attr(request.user, content_list)
+        return render_to_response("ldt/ldt_utils/partial/contentslist.html",
+                                  {'contents': content_list, 'nb_ct_pages': None},
+                                  context_instance=RequestContext(request))
     else:
-        content_list = Content.safe_objects.all() #@UndefinedVariable
+        return contents_page(request)
         
-    content_list = add_change_attr(request.user, content_list)
     
+
+
+@login_required
+def contents_page(request):
+    num_page = 0
+    if request.POST.has_key('num_page'):
+        num_page = int(request.POST["num_page"])
+    content_nb, nb_ct_pages, content_list = get_contents_page(num_page, request.user)
+    
+    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
     return render_to_response("ldt/ldt_utils/partial/contentslist.html",
-                              {'contents': content_list},
-                              context_instance=RequestContext(request))
\ No newline at end of file
+                              {'contents': content_list, 'nb_ct_pages': nb_ct_pages, 'content_nb': content_nb, 'current_content_page':float(num_page),
+                               'is_gecko': is_gecko
+                               },
+                              context_instance=RequestContext(request))
+    
+
+def get_contents_page(num_page, user):
+    content_nb = float(Content.safe_objects.count()) #@UndefinedVariable
+    nb_ct_pages = int(math.ceil(content_nb / settings.LDT_MAX_CONTENTS_PER_PAGE))
+    content_list = add_change_attr(user, Content.safe_objects.all()[(num_page*settings.LDT_MAX_CONTENTS_PER_PAGE):((num_page+1)*settings.LDT_MAX_CONTENTS_PER_PAGE)]) #@UndefinedVariable
+    return content_nb, nb_ct_pages, content_list
--- a/src/ldt/ldt/ldt_utils/views/project.py	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/views/project.py	Fri May 25 17:47:20 2012 +0200
@@ -16,6 +16,7 @@
                                 get_userlist_model)
 from ldt.user.forms import PictureForm
 import lxml.etree
+import math
 
 @login_required
 def create_ldt_view(request):
@@ -219,7 +220,10 @@
     if status == 2:
         url_templ = "ldt/ldt_utils/partial/publishedprojectslist.html"
     else:
-        url_templ = "ldt/ldt_utils/partial/projectslist.html"
+        if filter:
+            url_templ = "ldt/ldt_utils/partial/projectslist.html"
+        else:
+            return projects_page(request)
         
     return render_to_response(url_templ,
                               {'projects': project_list, 'show_username':show_username,
@@ -238,7 +242,27 @@
     ldt.unpublish()
     return HttpResponse(simplejson.dumps({'res':True, 'ldt': {'id': ldt.id, 'state':ldt.state, 'ldt_id': ldt.ldt_id}}, ensure_ascii=False), mimetype='application/json')
 
-
   
 def created_ldt(request):
     return render_to_response('ldt/ldt_utils/save_done.html', context_instance=RequestContext(request))
+
+@login_required
+def projects_page(request):
+    num_page = 0
+    if request.POST.has_key('num_page'):
+        num_page = int(request.POST["num_page"])
+    project_nb, nb_pj_pages, project_list = get_projects_page(num_page, request.user)
+    
+    is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
+    return render_to_response("ldt/ldt_utils/partial/projectslist.html",
+                              {'projects': project_list, 'nb_pj_pages': nb_pj_pages, 'content_nb': project_nb, 'current_project_page':float(num_page),
+                               'is_gecko': is_gecko
+                               },
+                              context_instance=RequestContext(request))
+    
+
+def get_projects_page(num_page, user):
+    project_nb = float(Project.safe_objects.filter(owner=user).count()) #@UndefinedVariable
+    nb_pj_pages = int(math.ceil(project_nb / settings.LDT_MAX_PROJECTS_PER_PAGE))
+    project_list = add_change_attr(user, Project.safe_objects.filter(owner=user)[(num_page*settings.LDT_MAX_PROJECTS_PER_PAGE):((num_page+1)*settings.LDT_MAX_PROJECTS_PER_PAGE)]) #@UndefinedVariable
+    return project_nb, nb_pj_pages, project_list
--- a/src/ldt/ldt/ldt_utils/views/workspace.py	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/ldt_utils/views/workspace.py	Fri May 25 17:47:20 2012 +0200
@@ -13,9 +13,11 @@
 from ldt.ldt_utils.forms import SearchForm
 from ldt.ldt_utils.models import Content, Project, Segment
 from ldt.ldt_utils.utils import boolean_convert
+from ldt.ldt_utils.projectserializer import ProjectSerializer
+from ldt.ldt_utils.views.content import get_contents_page
+from ldt.ldt_utils.views.project import get_projects_page
 from ldt.security.utils import add_change_attr, get_userlist
 from lxml.html import fragment_fromstring
-from ldt.ldt_utils.projectserializer import ProjectSerializer
 from operator import itemgetter
 from itertools import groupby
 import base64
@@ -27,11 +29,12 @@
 @login_required
 def home(request):
     
-    # list of contents
-    content_list = add_change_attr(request.user, Content.safe_objects.all()) #@UndefinedVariable
-    
+    num_page = 0
+    # Prepare contents pagination
+    content_nb, nb_ct_pages, content_list = get_contents_page(num_page, request.user)
     # get list of projects owned by the current user
-    project_list = add_change_attr(request.user, Project.safe_objects.filter(owner=request.user)) #@UndefinedVariable
+    project_nb, nb_pj_pages, project_list = get_projects_page(num_page, request.user)
+    #project_list = add_change_attr(request.user, Project.safe_objects.filter(owner=request.user)[:settings.LDT_MAX_PROJECTS_PER_PAGE]) #@UndefinedVariable
 
     is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
     
@@ -44,12 +47,15 @@
     
     # render list
     return render_to_response("ldt/ldt_utils/workspace.html",
-                              {'contents': content_list, 'projects': project_list,
+                              {'contents': content_list, 'nb_ct_pages': nb_ct_pages, 'content_nb': content_nb, 'current_content_page':float(num_page),
+                               'projects': project_list, 'nb_pj_pages': nb_pj_pages, 'project_nb': project_nb, 'current_project_page':float(num_page),
                                'is_gecko': is_gecko, #'project_api_url':"match.url_name",
                                #'project_api_view':match.url_name,'project_api_args':"project_api_args",'project_api_kwargs':"project_api_kwargs"
                                },
                               context_instance=RequestContext(request))
 
+    
+
 @login_required
 def groups(request): 
 
@@ -245,5 +251,6 @@
 
 def loading(request): 
     return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))
+   
 
 
--- a/src/ldt/ldt/settings.py	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/settings.py	Fri May 25 17:47:20 2012 +0200
@@ -81,6 +81,8 @@
 LDT_MAX_FRAGMENT_PER_SEARCH = 3
 LDT_RESULTS_PER_PAGE = 1
 LDT_JSON_DEFAULT_INDENT = 2
+LDT_MAX_CONTENTS_PER_PAGE = 10
+LDT_MAX_PROJECTS_PER_PAGE = 10
 
 AUTO_INDEX_AFTER_SAVE = getattr(settings, 'AUTO_INDEX_AFTER_SAVE', True)
 
--- a/src/ldt/ldt/static/ldt/css/style.css	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/static/ldt/css/style.css	Fri May 25 17:47:20 2012 +0200
@@ -168,7 +168,7 @@
 
 #inner_content {
 	min-height: 600px;
-	padding: 40px 0px 50px 0px; 	
+	padding: 30px 0px 50px 0px; 	
 }
 
 .projectscontentstitle {
--- a/src/ldt/ldt/static/ldt/css/workspace.css	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/static/ldt/css/workspace.css	Fri May 25 17:47:20 2012 +0200
@@ -1,7 +1,7 @@
 @charset "UTF-8";
 
 .titlediv {
-	margin: 0px 0px 25px 0px;
+	margin: 0px 0px 5px 0px;
 	min-height: 40px;
 	vertical-align: middle;
 }
@@ -230,3 +230,12 @@
 .clickable {
 	cursor: pointer;	
 }
+
+.prev_next_cont_proj {
+    margin: 0 0 5px;
+    float: right;
+}
+.prev_next_cont_proj a, .prev_next_cont_proj a:visited{
+	color: #0063DC;
+    text-decoration: none;
+}
\ No newline at end of file
--- a/src/ldt/ldt/static/ldt/js/projectscontents.js	Wed May 23 17:32:08 2012 +0200
+++ b/src/ldt/ldt/static/ldt/js/projectscontents.js	Fri May 25 17:47:20 2012 +0200
@@ -151,28 +151,83 @@
             var filterVal = "_" + encodeURIComponent(target.realVal());
             url = url.replace('__FILTER__',filterVal);
             url = url.replace('__ID_GROUP__',$('#id_group').val());
-            $.ajax({
-                url: url,
-                cache: false,
-                success: function(data, status, request) {
-                	$(container_selector).html(data);
-                    target.next(".searchajaxloader").hide();
-                    if(target.realVal().length > 0) {
-                        target.nextAll(".searchclear").show();
-                    }
-                    init_events($(container_selector));
-                    target.removeAttr('timer');
-                }
-            });  
+            if(remember_projects_page){
+            	remember_projects_page = false;
+            	v = parseInt($("#current_project_page").val());
+	            $.ajax({
+	                url: url,
+	                cache: false,
+	                type: 'POST',
+	                data: {csrfmiddlewaretoken:global_csrf_token, 
+	                       num_page:num_page
+	                       },
+	                success: function(data, status, request) {
+	                	$(container_selector).html(data);
+	                    target.next(".searchajaxloader").hide();
+	                    if(target.realVal().length > 0) {
+	                        target.nextAll(".searchclear").show();
+	                    }
+	                    init_events($(container_selector));
+	                    target.removeAttr('timer');
+	                },
+	        		error: function(jqXHR, textStatus, errorThrown) {
+	        			resp = $.parseJSON(jqXHR.responseText);
+	        			alert(resp.message);
+	        		}
+	            });
+	        }
+            else{
+	            $.ajax({
+	                url: url,
+	                cache: false,
+	                success: function(data, status, request) {
+	                	$(container_selector).html(data);
+	                    target.next(".searchajaxloader").hide();
+	                    if(target.realVal().length > 0) {
+	                        target.nextAll(".searchclear").show();
+	                    }
+	                    init_events($(container_selector));
+	                    target.removeAttr('timer');
+	                }
+	            });
+            }
         },
         300)
     );
 }
 
-function init_events_contents(base_node, embed_url, content_filter_url, project_filter_url) {
+function init_events_contents(base_node, embed_url, content_filter_url, project_filter_url, contents_page_url) {
     
     init_events_base(base_node, embed_url);
     
+    // Content pagination in workspace home
+    $('.contents_page').click(function(e){
+    	num_page = $(this).attr('alt');
+    	if(num_page=="prev"){
+    		num_page = parseInt($('#current_content_page').val()) - 1;
+    	}
+    	else if(num_page=="next"){
+    		num_page = parseInt($('#current_content_page').val()) + 1;
+    	}
+    	$.ajax({
+            url: contents_page_url,
+            type: 'POST',
+            data: {csrfmiddlewaretoken:global_csrf_token, 
+                   num_page:num_page
+                   },
+            // bug with jquery >= 1.5, "json" adds a callback so we don't specify dataType
+            //dataType: 'json',
+            success: function(msg, textStatus, XMLHttpRequest) {
+                $('#contentslistcontainer').html(msg);
+                init_events($('#contentslistcontainer'));
+            },
+    		error: function(jqXHR, textStatus, errorThrown) {
+    			resp = $.parseJSON(jqXHR.responseText);
+    			alert(resp.message);
+    		}
+        });
+	});
+    
     $('.content_link_create').each(function(i){
         $(this).attr("target","_blank");
     });
@@ -286,12 +341,40 @@
     });
 }
 
-function init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl) {
+function init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl, projects_page_url) {
 
     init_modal_window ('.ldt_link_open_ldt', 1035, 670, 1025, 660, base_node, searchprojectfilterurl);
     init_modal_window ('.ldt_link_create_project', 760, 400, 750, 390, base_node, searchprojectfilterurl);
     init_modal_window ('.ldt_link_copy_project', 500, 150, 500, 150, base_node, searchprojectfilterurl);
     
+    // Project pagination in workspace home
+    $('.projects_page').click(function(e){
+    	num_page = $(this).attr('alt');
+    	if(num_page=="prev"){
+    		num_page = parseInt($('#current_project_page').val()) - 1;
+    	}
+    	else if(num_page=="next"){
+    		num_page = parseInt($('#current_project_page').val()) + 1;
+    	}
+    	$.ajax({
+            url: projects_page_url,
+            type: 'POST',
+            data: {csrfmiddlewaretoken:global_csrf_token, 
+                   num_page:num_page
+            },
+            // bug with jquery >= 1.5, "json" adds a callback so we don't specify dataType
+            //dataType: 'json',
+            success: function(msg, textStatus, XMLHttpRequest) {
+                $('#projectslistcontainer').html(msg);
+                init_events($('#projectslistcontainer'));
+            },
+    		error: function(jqXHR, textStatus, errorThrown) {
+    			resp = $.parseJSON(jqXHR.responseText);
+    			alert(resp.message);
+    		}
+        });
+	});
+    
     $('.publishedproject', base_node).click(function(e) {
         e.preventDefault();
         display_loading_icon($(this));
@@ -306,7 +389,9 @@
             //dataType: 'json',
             success: function(json, textStatus, XMLHttpRequest) {
                 if(json.res) {
-                    searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
+                	console.log("1 remember_projects_page = " + remember_projects_page);
+                	remember_projects_page = true;
+                	searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
                 }
             }
         });
@@ -326,6 +411,8 @@
             //dataType: 'json',
             success: function(json, textStatus, XMLHttpRequest) {
                 if(json.res) {
+                	console.log("2 remember_projects_page = " + remember_projects_page);
+                	remember_projects_page = true;
                     searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
                 }
             }
@@ -417,9 +504,9 @@
     init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl);
 }
 
-function init_events_all(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl, publishprojecturl, unpublishprojecturl) {
-    init_events_contents(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl);
-    init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl);
+function init_events_all(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl, publishprojecturl, unpublishprojecturl, contents_page_url, projects_page_url) {
+    init_events_contents(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl, contents_page_url);
+    init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl, projects_page_url);
 }
 
 
--- a/web/ldtplatform/config.py.tmpl	Wed May 23 17:32:08 2012 +0200
+++ b/web/ldtplatform/config.py.tmpl	Fri May 25 17:47:20 2012 +0200
@@ -87,6 +87,8 @@
 LDT_MAX_FRAGMENT_PER_SEARCH = 3
 LDT_RESULTS_PER_PAGE = 1
 LDT_JSON_DEFAULT_INDENT = 0
+LDT_MAX_CONTENTS_PER_PAGE = 5
+LDT_MAX_PROJECTS_PER_PAGE = 5
 
 EMPTY_MEDIA_EXTERNALID = None
 
--- a/web/ldtplatform/settings.py	Wed May 23 17:32:08 2012 +0200
+++ b/web/ldtplatform/settings.py	Fri May 25 17:47:20 2012 +0200
@@ -181,6 +181,8 @@
 LDT_JSON_DEFAULT_INDENT = 0
 LDT_MAX_FRAGMENT_PER_SEARCH = 3
 LDT_RESULTS_PER_PAGE = 10
+LDT_MAX_CONTENTS_PER_PAGE = 10
+LDT_MAX_PROJECTS_PER_PAGE = 10
 
 OAUTH_PROVIDER_KEY_SIZE = 32
 OAUTH_PROVIDER_SECRET_SIZE = 32