From 818a4f0b5921f3ddd42d194018be648b0a29c389 Mon Sep 17 00:00:00 2001 From: Daniel Haas Date: Wed, 17 Jun 2015 15:36:17 -0700 Subject: [PATCH] Don't delete retainer tasks once they've been accepted. --- ampcrowd/basecrowd/models.py | 2 +- ampcrowd/basecrowd/tasks.py | 24 ++++++++++----- .../templates/basecrowd/retainer.html | 30 +++++++++++++++++++ ampcrowd/basecrowd/views.py | 7 +++-- 4 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 ampcrowd/basecrowd/templates/basecrowd/retainer.html diff --git a/ampcrowd/basecrowd/models.py b/ampcrowd/basecrowd/models.py index d0c3db6..5854ad0 100644 --- a/ampcrowd/basecrowd/models.py +++ b/ampcrowd/basecrowd/models.py @@ -170,7 +170,7 @@ class AbstractRetainerPool(models.Model): # The relationship will be auto-generated to the worker class of the # registered crowd, and can be accessed via the 'workers' attribute. # The related_name will be 'pools' to enable reverse lookups, e.g. - # workers = models.ManyToManyField(CrowdTask, related_name='pools') + # workers = models.ManyToManyField(CrowdWorker, related_name='pools') # The status of this pool. STATUSES = ( diff --git a/ampcrowd/basecrowd/tasks.py b/ampcrowd/basecrowd/tasks.py index 3315c66..1296481 100644 --- a/ampcrowd/basecrowd/tasks.py +++ b/ampcrowd/basecrowd/tasks.py @@ -41,6 +41,7 @@ def submit_callback_answer(current_task): urllib2.urlopen(url, urllib.urlencode(params)) # Recruit for retainer pools by auto-posting tasks as necessary. +# TODO: worry about concurrency if multiple of these run at once. @celery.task def post_retainer_tasks(): logger = logging.getLogger(__name__) @@ -90,12 +91,12 @@ def post_retainer_tasks(): # skip interface.task_pre_save because this isn't a real task. task = crowd_model_spec.task_model.objects.create( - task_type=dummy_config['task_type'], + task_type=task_config['task_type'], data=dummy_content, create_time=timezone.now(), task_id=task_id, group=pool.task_groups.order_by('created_at')[0], - num_assignments=1 + num_assignments=task_config['num_assignments'], ) logger.info("Created Task %s" % task_id) @@ -124,6 +125,9 @@ def post_retainer_tasks(): task_group.save() pool.save() + else: + logger.info("%s has status %s, nothing to do." % (pool, pool.get_status_display())) + # Delete old retainerTasks to keep the listings fresh logger.info('Removing old retainer tasks...') for retainer_task in RetainerTask.objects.filter(active=True): @@ -132,12 +136,16 @@ def post_retainer_tasks(): - timedelta(seconds=settings.RETAINER_TASK_EXPIRATION_SECONDS)) if retainer_task.created_at < old_task_cutoff: try: - # delete the underlying task object - interface, _ = CrowdRegistry.get_registry_entry( - retainer_task.crowd_name) - interface.delete_tasks([retainer_task.task,]) - retainer_task.task.delete() - logger.info("Deleted old task %s" % retainer_task.task) + # delete the underlying task object if no one has accepted it. + if not retainer_task.task.workers.exists(): + interface, _ = CrowdRegistry.get_registry_entry( + retainer_task.crowd_name) + interface.delete_tasks([retainer_task.task,]) + retainer_task.task.delete() + logger.info("Deleted old task %s" % retainer_task.task) + else: + logger.info("Not deleting %s, it has a worker." + % retainer_task.task) # delete the retainer task retainer_task.active = False diff --git a/ampcrowd/basecrowd/templates/basecrowd/retainer.html b/ampcrowd/basecrowd/templates/basecrowd/retainer.html new file mode 100644 index 0000000..0fc9329 --- /dev/null +++ b/ampcrowd/basecrowd/templates/basecrowd/retainer.html @@ -0,0 +1,30 @@ +{% extends base_template_name %} + + +{% block jslibraries %} + {{ block.super }} + +{% endblock jslibraries %} + +{% block customjs %} + {{ block.super }} +{% endblock customjs %} + +{% block default_instruction %} +

This will be a retainer task--we will show you various tasks inside this!

+{% endblock %} + +{% block item_data %} +

Hopefully unnecessary

+{% endblock %} + +{% block item_labels %} +

Hopefully really unnecessary

+{% endblock %} diff --git a/ampcrowd/basecrowd/views.py b/ampcrowd/basecrowd/views.py index 86d19c8..614af3b 100644 --- a/ampcrowd/basecrowd/views.py +++ b/ampcrowd/basecrowd/views.py @@ -181,7 +181,7 @@ def get_assignment(request, crowd_name): template = get_scoped_template(crowd_name, 'unavailable.html') return HttpResponse(template.render(RequestContext(request, {}))) - # Retrieve the tweet based on task_id from the database + # Retrieve the task based on task_id from the database try: current_task = model_spec.task_model.objects.get( task_id=context['task_id']) @@ -196,7 +196,7 @@ def get_assignment(request, crowd_name): worker_id=worker_id) except model_spec.worker_model.DoesNotExist: current_worker = model_spec.worker_model( - worker_id=context['worker_id']) + worker_id=worker_id) # Call the pre-save hook, the save to the database interface.worker_pre_save(current_worker) @@ -211,6 +211,9 @@ def get_assignment(request, crowd_name): if not current_worker.tasks.filter(task_id=current_task.task_id).exists(): current_worker.tasks.add(current_task) + if current_task.task_type == 'retainer': + current_worker.pools.add(current_task.group.retainer_pool) + # Add task data to the context. content = json.loads(current_task.data) group_context = json.loads(current_task.group.group_context)