jobs list: filter by purged attribute
[qcg-portal.git] / qcg / utils.py
index 353dc0c..29f631b 100644 (file)
@@ -1,8 +1,11 @@
-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
+import string
+import random
+
+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 +18,33 @@ def username_from_dn(dn):
     return username
 
 
-@transaction.atomic
-def update_user_data(user, proxy):
-    from qcg.models import User, Job, Task, Allocation, NodeInfo
+def try_parse_int(s, default=None, base=10):
+    try:
+        return int(s, base)
+    except (TypeError, ValueError):
+        return default
 
-    credential = Credential(proxy)
-    registry = Registry(credential)
 
-    # put lock on user record (hopefully..?)
-    user = User.objects.select_for_update().get(pk=user.pk)
+def paginator_context(request, objects, per_page=constants.PER_PAGE):
+    paginator = Paginator(objects, per_page)
 
-    changed_filter = {'changed': TimePeriod(after=user.last_update)}
+    page_num = try_parse_int(request.GET.get('page'), 1)
+    if not (1 <= page_num <= paginator.num_pages):
+        page_num = 1
 
-    ###################################
-    # Jobs
-    ###################################
-    for qcg_job in registry.jobs(**changed_filter):
-        params = Job.qcg_map(qcg_job, user)
-        job_id = params.pop('job_id')
+    pages_range = range(max(2, min(page_num - 2, paginator.num_pages - 4)),
+                        min(max(page_num + 2, 5), paginator.num_pages) + 1)
 
-        Job.objects.update_or_create(job_id=job_id, defaults=params)
+    return {'page': paginator.page(page_num), 'num_pages': paginator.num_pages, 'pages_range': pages_range}
 
-    ###################################
-    # 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')
 
-        task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params)
+def localtime_str(datetime):
+    return date_format(localtime(datetime), 'DATETIME_FORMAT')
 
-        if not created:
-            task.allocations.all().delete()
 
-        for qcg_alloc in qcg_task.allocations:
-            alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc))
+def random_id(size=8, chars=string.ascii_uppercase + string.digits):
+    return ''.join(random.choice(chars) for _ in range(size))
 
-            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 chunks(seq, size):
+    return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))