353dc0c35a8a57ec96eed13aed5c5d335cac3de1
[qcg-portal.git] / qcg / utils.py
1 from datetime import timedelta
2 from django.db import transaction
3 from django.utils.timezone import now
4 from pyqcg.service import Registry
5 from pyqcg.utils import Credential, TimePeriod
6
7
8 def get_attributes(obj, attrs):
9     return {name: getattr(obj, name) for name in attrs if getattr(obj, name) is not None}
10
11
12 def username_from_dn(dn):
13     _, username = dn.rsplit('=', 1)
14
15     return username
16
17
18 @transaction.atomic
19 def update_user_data(user, proxy):
20     from qcg.models import User, Job, Task, Allocation, NodeInfo
21
22     credential = Credential(proxy)
23     registry = Registry(credential)
24
25     # put lock on user record (hopefully..?)
26     user = User.objects.select_for_update().get(pk=user.pk)
27
28     changed_filter = {'changed': TimePeriod(after=user.last_update)}
29
30     ###################################
31     # Jobs
32     ###################################
33     for qcg_job in registry.jobs(**changed_filter):
34         params = Job.qcg_map(qcg_job, user)
35         job_id = params.pop('job_id')
36
37         Job.objects.update_or_create(job_id=job_id, defaults=params)
38
39     ###################################
40     # Tasks
41     ###################################
42     jobs_cache = {j.job_id: j for j in Job.objects.filter(owner=user)}
43     for qcg_task in registry.tasks(**changed_filter):
44         params = Task.qcg_map(qcg_task, jobs_cache)
45         task_id = params.pop('task_id')
46
47         task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params)
48
49         if not created:
50             task.allocations.all().delete()
51
52         for qcg_alloc in qcg_task.allocations:
53             alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc))
54
55             for qcg_node in qcg_alloc.nodes:
56                 alloc.nodes.create(**NodeInfo.qcg_map(qcg_node))
57
58     # release user lock
59     user.last_update = now()
60     user.save()