<hr />
+
+ <nav class="text-center" style="margin-bottom: 15px">
+ <form action="{{ request.path }}" method="get" class="form-inline" role="form" style="display: inline-block">
+ <div class="input-group input-group-sm">
+ <span class="input-group-btn">
+ {% if page.has_previous %}
+ <a href="{{ request.path }}?page={{ page.previous_page_number }}" class="btn btn-default">
+ {% else %}
+ <a href="#" class="btn btn-default disabled">
+ {% endif %}
+ <span class="glyphicon glyphicon-chevron-left"></span>
+ </a>
+ </span>
+ <label class="sr-only" for="page">Strona</label>
+ <input type="text" class="form-control text-center" id="page" name="page" value="{{ page.number }}" style="width: 50px">
+ <span class="input-group-btn">
+ {% if page.has_next %}
+ <a href="{{ request.path }}?page={{ page.next_page_number }}" class="btn btn-default">
+ {% else %}
+ <a href="#" class="btn btn-default disabled">
+ {% endif %}
+ <span class="glyphicon glyphicon-chevron-right"></span>
+ </a>
+ </span>
+ </div>
+ </form>
+ z
+ <a href="{{ request.path }}?page={{ num_pages }}">{{ num_pages }}</a>
+ </nav>
+
<table class="table table-hover tree">
<thead>
<tr>
</tr>
</thead>
<tbody>
- {% regroup tasks by job as jobs %}
+ {% regroup page by job as jobs %}
{% for job in jobs %}
{% ifequal job.list|length 1 %}
<nav class="text-center">
<ul class="pagination">
- <li>
- <a href="#" aria-label="Previous">
- <span aria-hidden="true">«</span>
+ {% if page.has_previous %}
+ <li>
+ <a href="{{ request.path }}?page={{ page.previous_page_number }}" aria-label="Previous">
+ <span aria-hidden="true"><span class="glyphicon glyphicon-chevron-left"></span> poprzednia</span>
</a>
+ {% endif %}
+ </li>
+
+ <li{% ifequal page.number 1 %} class="active"{% endifequal %}>
+ <a href="{{ request.path }}?page=1">1</a>
</li>
- <li><a href="#">1</a></li>
- <li><a href="#">2</a></li>
- <li><a href="#">3</a></li>
- <li><a href="#">4</a></li>
- <li><a href="#">5</a></li>
- <li>
- <a href="#" aria-label="Next">
- <span aria-hidden="true">»</span>
+
+ {% if pages_range.0 > 2 %}
+ <li class="disabled"><span aria-hidden="true"><strong>…</strong></span></li>
+ {% endif %}
+
+ {% for num in pages_range %}
+ <li{% ifequal page.number num %} class="active"{% endifequal %}>
+ <a href="{{ request.path }}?page={{ num }}">{{ num }}</a>
+ </li>
+ {% endfor %}
+
+ <li class="disabled"><span aria-hidden="true"><strong>z</strong></span></li>
+ <li><a href="{{ request.path }}?page={{ num_pages }}">{{ num_pages }}</a></li>
+
+ {% if page.has_next %}
+ <li>
+ <a href="{{ request.path }}?page={{ page.next_page_number }}" aria-label="Next">
+ <span aria-hidden="true">następna <span class="glyphicon glyphicon-chevron-right"></span></span>
</a>
+ {% endif %}
</li>
</ul>
</nav>
-from datetime import timedelta
+from django.core.paginator import Paginator
from django.db import transaction
from django.utils.timezone import now
from pyqcg.service import Registry
from pyqcg.utils import Credential, TimePeriod
+from qcg import constants
+
def get_attributes(obj, attrs):
return {name: getattr(obj, name) for name in attrs if getattr(obj, name) is not None}
# release user lock
user.last_update = now()
user.save()
+
+
+def try_parse_int(s, default=None, base=10):
+ try:
+ return int(s, base)
+ except (TypeError, ValueError):
+ return default
+
+
+def paginator_context(request, objects, per_page=constants.PER_PAGE):
+ paginator = Paginator(objects, per_page)
+
+ page_num = try_parse_int(request.GET.get('page'), 1)
+ if not (1 <= page_num <= paginator.num_pages):
+ page_num = 1
+
+ pages_range = range(max(2, min(page_num - 2, paginator.num_pages - 4)),
+ min(max(page_num + 2, 5), paginator.num_pages) + 1)
+
+ return {'page': paginator.page(page_num), 'num_pages': paginator.num_pages, 'pages_range': pages_range}
from django.utils.http import urlencode
from django_openid_auth.views import make_consumer
from openid.extensions import ax
-from pyqcg.qcg import QCG
-from qcg.models import Task
+from pyqcg import QCG
-from qcg.utils import update_user_data
+from qcg.models import Task
+from qcg.utils import update_user_data, paginator_context
def index(request):
tasks = Task.objects.filter(job__owner=request.user) \
.select_related('job').prefetch_related('allocations__nodes') \
- .order_by('-job__submission_time', '-submission_time')[:25]
+ .order_by('-job__submission_time', '-submission_time')
+
+ context = paginator_context(request, tasks)
- return render(request, 'qcg/jobs.html', {'tasks': tasks})
+ return render(request, 'qcg/jobs.html', context)
def job_details(request):