1 from django.db import transaction
2 from django.utils.timezone import now
4 from pyqcg.service import Registry
5 from pyqcg.utils import Credential, TimePeriod
9 def update_user_data(user, proxy):
10 from qcg.models import User, Job, Task, Allocation, NodeInfo
12 credential = Credential(proxy)
13 registry = Registry(credential)
15 # put lock on user record (hopefully..?)
16 user = User.objects.select_for_update().get(pk=user.pk)
18 changed_filter = {'changed': TimePeriod(after=user.last_update)}
20 ###################################
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')
27 Job.objects.update_or_create(job_id=job_id, defaults=params)
29 ###################################
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')
37 task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params)
40 task.allocations.all().delete()
42 for qcg_alloc in qcg_task.allocations:
43 alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc))
45 for qcg_node in qcg_alloc.nodes:
46 alloc.nodes.create(**NodeInfo.qcg_map(qcg_node))
49 user.last_update = now()