X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=qcg%2Futils.py;h=24a5a24395877c077796fbe87026c65435a0fd42;hb=0be92069d46130aad675fa715184e9c209140ce9;hp=353dc0c35a8a57ec96eed13aed5c5d335cac3de1;hpb=f65c86b86fd66ad8b0d45f3a5e4f6169e2e71d19;p=qcg-portal.git diff --git a/qcg/utils.py b/qcg/utils.py index 353dc0c..24a5a24 100644 --- a/qcg/utils.py +++ b/qcg/utils.py @@ -1,8 +1,8 @@ -from datetime import timedelta -from django.db import transaction -from django.utils.timezone import now -from pyqcg.service import Registry -from pyqcg.utils import Credential, TimePeriod +from django.core.paginator import Paginator +from django.utils.formats import date_format +from django.utils.timezone import localtime + +from qcg import constants def get_attributes(obj, attrs): @@ -15,46 +15,25 @@ def username_from_dn(dn): return username -@transaction.atomic -def update_user_data(user, proxy): - from qcg.models import User, Job, Task, Allocation, NodeInfo - - credential = Credential(proxy) - registry = Registry(credential) - - # put lock on user record (hopefully..?) - user = User.objects.select_for_update().get(pk=user.pk) - - changed_filter = {'changed': TimePeriod(after=user.last_update)} - - ################################### - # Jobs - ################################### - for qcg_job in registry.jobs(**changed_filter): - params = Job.qcg_map(qcg_job, user) - job_id = params.pop('job_id') +def try_parse_int(s, default=None, base=10): + try: + return int(s, base) + except (TypeError, ValueError): + return default - Job.objects.update_or_create(job_id=job_id, defaults=params) - ################################### - # Tasks - ################################### - jobs_cache = {j.job_id: j for j in Job.objects.filter(owner=user)} - for qcg_task in registry.tasks(**changed_filter): - params = Task.qcg_map(qcg_task, jobs_cache) - task_id = params.pop('task_id') +def paginator_context(request, objects, per_page=constants.PER_PAGE): + paginator = Paginator(objects, per_page) - task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params) + page_num = try_parse_int(request.GET.get('page'), 1) + if not (1 <= page_num <= paginator.num_pages): + page_num = 1 - if not created: - task.allocations.all().delete() + pages_range = range(max(2, min(page_num - 2, paginator.num_pages - 4)), + min(max(page_num + 2, 5), paginator.num_pages) + 1) - for qcg_alloc in qcg_task.allocations: - alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc)) + return {'page': paginator.page(page_num), 'num_pages': paginator.num_pages, 'pages_range': pages_range} - for qcg_node in qcg_alloc.nodes: - alloc.nodes.create(**NodeInfo.qcg_map(qcg_node)) - # release user lock - user.last_update = now() - user.save() +def localtime_str(datetime): + return date_format(localtime(datetime), 'DATETIME_FORMAT')