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