def clear_queue(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) if request.method == 'POST': try: queue.empty() messages.info( request, 'You have successfully cleared the queue %s' % queue.name) except ResponseError as e: # pragma: no cover if 'EVALSHA' in e.message: messages.error( request, 'This action is not supported on Redis versions < 2.6.0, please use the bulk delete command instead' ) else: raise e return redirect('rq_jobs', queue_index) context_data = { 'title': 'Are you sure?', 'queue_index': queue_index, 'queue': queue, } return render(request, 'django_rq/clear_queue.html', context_data)
def jobs(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) items_per_page = 100 num_jobs = queue.count page = int(request.GET.get('page', 1)) if num_jobs > 0: last_page = int(ceil(num_jobs / items_per_page)) page_range = range(1, last_page + 1) offset = items_per_page * (page - 1) jobs = queue.get_jobs(offset, items_per_page) for job in jobs: job.created_at = make_aware(job.created_at, utc) job.enqueued_at = make_aware(job.enqueued_at, utc) else: jobs = [] page_range = [] context_data = { 'title': 'Jobs in %s' % queue.name, 'queue': queue, 'queue_index': queue_index, 'jobs': jobs, 'num_jobs': num_jobs, 'page': page, 'page_range': page_range, } return render(request, 'django_rq/templates/jobs.html', context_data)
def jobs(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) items_per_page = 100 num_jobs = queue.count page = int(request.GET.get('page', 1)) if num_jobs > 0: last_page = int(ceil(num_jobs / items_per_page)) page_range = range(1, last_page + 1) offset = items_per_page * (page - 1) jobs = queue.get_jobs(offset, items_per_page) else: jobs = [] page_range = [] ### # Custom logic here for job in jobs: use_actual_name(job) ## context_data = { 'queue': queue, 'queue_index': queue_index, 'jobs': jobs, 'num_jobs': num_jobs, 'page': page, 'page_range': page_range, 'job_status': 'Queued', } return render(request, 'django_rq/jobs.html', context_data)
def actions(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) if request.method == "POST" and request.POST.get("action", False): # Confirmation page for selected Action if request.POST.get("_selected_action", False): context_data = { "title": "Are you sure?", "queue_index": queue_index, "action": request.POST["action"], "job_ids": request.POST.getlist("_selected_action"), "queue": queue, } return render(request, "django_rq/confirm_action.html", context_data) # Performing the actual action elif request.POST.get("job_ids", False): job_ids = request.POST.getlist("job_ids") if request.POST["action"] == "delete": for job_id in job_ids: job = Job.fetch(job_id, connection=queue.connection) # Remove job id from queue and delete the actual job queue.connection._lrem(queue.key, 0, job.id) job.delete() messages.info(request, "You have successfully deleted %s jobs!" % len(job_ids)) elif request.POST["action"] == "requeue": # pragma: no cover for job_id in job_ids: requeue_job(job_id, connection=queue.connection) messages.info(request, "You have successfully requeued %d jobs!" % len(job_ids)) return redirect("rq_jobs", queue_index)
def jobs(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) items_per_page = 100 num_jobs = queue.count page = int(request.GET.get("page", 1)) if num_jobs > 0: last_page = int(ceil(num_jobs / items_per_page)) page_range = range(1, last_page + 1) offset = items_per_page * (page - 1) jobs = queue.get_jobs(offset, items_per_page) for job in jobs: job.created_at = make_aware(job.created_at, utc) job.enqueued_at = make_aware(job.enqueued_at, utc) else: jobs = [] page_range = [] context_data = { "title": "Jobs in %s" % queue.name, "queue": queue, "queue_index": queue_index, "jobs": jobs, "num_jobs": num_jobs, "page": page, "page_range": page_range, } return render(request, "django_rq/templates/jobs.html", context_data)
def clear_queue(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) if request.POST: queue.empty() messages.info(request, "You have successfully cleared the queue %s" % queue.name) return redirect("rq_jobs", queue_index) context_data = {"queue_index": queue_index, "queue": queue} return render(request, "django_rq/clear_queue.html", context_data)
def job_detail(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) try: job = Job.fetch(job_id, connection=queue.connection) except NoSuchJobError: raise Http404("Couldn't find job with this ID: %s" % job_id) context_data = {"queue_index": queue_index, "job": job, "queue": queue} return render(request, "django_rq/job_detail.html", context_data)
def requeue_job_view(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.POST: requeue_job(job_id, connection=queue.connection) messages.info(request, "You have successfully requeued %s" % job.id) return redirect("rq_job_detail", queue_index, job_id) context_data = {"queue_index": queue_index, "job": job, "queue": queue} return render(request, "django_rq/delete_job.html", context_data)
def there_are_busy_workers(worker_name_regex): queue_index = 0 queue = get_queue_by_index(queue_index) workers = Worker.all(queue.connection) if worker_name_regex is not None: workers = [worker for worker in workers if re.match(worker_name_regex, worker.name)] busy_workers = [worker.name for worker in workers if worker.get_state() == 'busy'] print('busy_workers: ', busy_workers) return len(busy_workers) > 0
def job_detail(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) try: job = Job.fetch(job_id, connection=queue.connection) job.created_at = make_aware(job.created_at, utc) job.enqueued_at = make_aware(job.enqueued_at, utc) except NoSuchJobError: raise Http404("Couldn't find job with this ID: %s" % job_id) context_data = {"title": "Job Info", "queue_index": queue_index, "job": job, "queue": queue} return render(request, "django_rq/templates/job_detail.html", context_data)
def info(request, token): """ Return the HireFire json data needed to scale worker dynos """ if not settings.HIREFIRE_TOKEN: return HttpResponseBadRequest('Hirefire not configured. Set the HIREFIRE_TOKEN environment variable on the app to use Hirefire for dyno scaling') if token != settings.HIREFIRE_TOKEN: return HttpResponseForbidden('Invalid token') current_tasks = 0 queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) connection = queue.connection # Only look at the default queue if queue.name != 'default': continue queue_data = { 'name': queue.name, 'jobs': queue.count, 'index': index, 'connection_kwargs': connection.connection_pool.connection_kwargs } connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [worker for worker in all_workers if queue in worker.queues] queue_data['workers'] = len(queue_workers) finished_job_registry = FinishedJobRegistry(queue.name, connection) started_job_registry = StartedJobRegistry(queue.name, connection) deferred_job_registry = DeferredJobRegistry(queue.name, connection) queue_data['finished_jobs'] = len(finished_job_registry) queue_data['started_jobs'] = len(started_job_registry) queue_data['deferred_jobs'] = len(deferred_job_registry) current_tasks += queue_data['jobs'] current_tasks += queue_data['started_jobs'] queues.append(queue_data) payload = [{ 'quantity': current_tasks, 'name': 'worker', }] payload = json.dumps(payload) return HttpResponse(payload, content_type='application/json')
def get_queue_index(name='default'): """ Returns the position of Queue for the named queue in QUEUES_LIST """ queue_index = None connection = get_connection(name) connection_kwargs = connection.connection_pool.connection_kwargs for i in range(0, 100): q = get_queue_by_index(i) if q.name == name and q.connection.connection_pool.connection_kwargs == connection_kwargs: queue_index = i break return queue_index
def info(request, token): """ Return the HireFire json data needed to scale worker dynos """ if not settings.HIREFIRE_TOKEN: return HttpResponseBadRequest( "Hirefire not configured. Set the HIREFIRE_TOKEN environment variable on the app to use Hirefire for dyno scaling" ) if token != settings.HIREFIRE_TOKEN: raise PermissionDenied("Invalid token") current_tasks = 0 queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) connection = queue.connection # Only look at the default queue if queue.name != "default": continue queue_data = { "name": queue.name, "jobs": queue.count, "index": index, "connection_kwargs": connection.connection_pool.connection_kwargs, } connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [worker for worker in all_workers if queue in worker.queues] queue_data["workers"] = len(queue_workers) finished_job_registry = FinishedJobRegistry(queue.name, connection) started_job_registry = StartedJobRegistry(queue.name, connection) deferred_job_registry = DeferredJobRegistry(queue.name, connection) queue_data["finished_jobs"] = len(finished_job_registry) queue_data["started_jobs"] = len(started_job_registry) queue_data["deferred_jobs"] = len(deferred_job_registry) current_tasks += queue_data["jobs"] current_tasks += queue_data["started_jobs"] queues.append(queue_data) payload = [{"quantity": current_tasks, "name": "worker"}] payload = json.dumps(payload) return HttpResponse(payload, content_type="application/json")
def delete_job(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.method == "POST": # Remove job id from queue and delete the actual job queue.connection._lrem(queue.key, 0, job.id) job.delete() messages.info(request, "You have successfully deleted %s" % job.id) return redirect("rq_jobs", queue_index) context_data = {"title": "Are you sure?", "queue_index": queue_index, "job": job, "queue": queue} return render(request, "django_rq/delete_job.html", context_data)
def get_failed_queue_index(name="default"): """ Returns the position of FailedQueue for the named queue in QUEUES_LIST """ # Get the index of FailedQueue for 'default' Queue in QUEUES_LIST queue_index = None connection = get_connection(name) connection_kwargs = connection.connection_pool.connection_kwargs for i in range(0, 100): q = get_queue_by_index(i) if q.name == "failed" and q.connection.connection_pool.connection_kwargs == connection_kwargs: queue_index = i break return queue_index
def requeue_job_view(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.method == "POST": try: # pragma: no cover requeue_job(job_id, connection=queue.connection) messages.info(request, "You have successfully requeued %s" % job.id) return redirect("rq_job_detail", queue_index, job_id) except InvalidJobOperationError as e: messages.error(request, e.message) return redirect("rq_jobs", queue_index) context_data = {"title": "Are you sure?", "queue_index": queue_index, "job": job, "queue": queue} return render(request, "django_rq/delete_job.html", context_data)
def stats(request): queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) queue_data = {"name": queue.name, "jobs": queue.count, "index": index} if queue.name == "failed": queue_data["workers"] = "-" else: connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [worker for worker in all_workers if queue in worker.queues] queue_data["workers"] = len(queue_workers) queues.append(queue_data) context_data = {"queues": queues} return render(request, "django_rq/stats.html", context_data)
def job_detail(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) try: job = Job.fetch(job_id, connection=queue.connection) job.created_at = make_aware(job.created_at, utc) job.enqueued_at = make_aware(job.enqueued_at, utc) except NoSuchJobError: raise Http404("Couldn't find job with this ID: %s" % job_id) context_data = { 'title': 'Job Info', 'queue_index': queue_index, 'job': job, 'queue': queue, } return render(request, 'django_rq/templates/job_detail.html', context_data)
def job_detail(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) try: job = Job.fetch(job_id, connection=queue.connection) except NoSuchJobError: raise Http404("Couldn't find job with this ID: %s" % job_id) ### # Custom logic here use_actual_name(job) ## context_data = { 'queue_index': queue_index, 'job': job, 'queue': queue, } return render(request, 'django_rq/job_detail.html', context_data)
def delete_job(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.method == 'POST': # Remove job id from queue and delete the actual job queue.connection._lrem(queue.key, 0, job.id) job.delete() messages.info(request, 'You have successfully deleted %s' % job.id) return redirect('rq_jobs', queue_index) context_data = { 'title': 'Are you sure?', 'queue_index': queue_index, 'job': job, 'queue': queue, } return render(request, 'django_rq/delete_job.html', context_data)
def deferred_jobs(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) registry = DeferredJobRegistry(queue.name, queue.connection) items_per_page = 100 num_jobs = len(registry) page = int(request.GET.get('page', 1)) jobs = [] if num_jobs > 0: last_page = int(ceil(num_jobs / items_per_page)) page_range = range(1, last_page + 1) offset = items_per_page * (page - 1) job_ids = registry.get_job_ids(offset, items_per_page) for job_id in job_ids: try: jobs.append(Job.fetch(job_id, connection=queue.connection)) except NoSuchJobError: pass else: page_range = [] ### # Custom logic here for job in jobs: use_actual_name(job) ## context_data = { 'queue': queue, 'queue_index': queue_index, 'jobs': jobs, 'num_jobs': num_jobs, 'page': page, 'page_range': page_range, 'job_status': 'Deferred', } return render(request, 'django_rq/jobs.html', context_data)
def clear_queue(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) if request.method == "POST": try: queue.empty() messages.info(request, "You have successfully cleared the queue %s" % queue.name) except ResponseError as e: # pragma: no cover if "EVALSHA" in e.message: messages.error( request, "This action is not supported on Redis versions < 2.6.0, please use the bulk delete command instead", ) else: raise e return redirect("rq_jobs", queue_index) context_data = {"title": "Are you sure?", "queue_index": queue_index, "queue": queue} return render(request, "django_rq/clear_queue.html", context_data)
def requeue_job_view(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.method == 'POST': requeue_job(job_id, connection=queue.connection) messages.info(request, 'You have successfully requeued %s' % job.id) return redirect('rq_job_detail', queue_index, job_id) ### # Custom logic here use_actual_name(job) ## context_data = { 'queue_index': queue_index, 'job': job, 'queue': queue, } return render(request, 'django_rq/delete_job.html', context_data)
def requeue_all(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) jobs = queue.get_jobs() if request.method == 'POST': # Confirmation received for job in jobs: requeue_job(job.id, connection=queue.connection) messages.info( request, 'You have successfully requeued all %d jobs!' % len(jobs)) return redirect('rq_jobs', queue_index) context_data = { 'queue_index': queue_index, 'queue': queue, 'total_jobs': len(jobs), } return render(request, 'django_rq/requeue_all.html', context_data)
def stats(request): queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) connection = queue.connection queue_data = { 'name': queue.name, 'jobs': queue.count, 'index': index, 'connection_kwargs': connection.connection_pool.connection_kwargs } if queue.name == 'failed': queue_data['workers'] = '-' queue_data['finished_jobs'] = '-' queue_data['started_jobs'] = '-' queue_data['deferred_jobs'] = '-' else: connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [ worker for worker in all_workers if queue in worker.queues ] queue_data['workers'] = len(queue_workers) finished_job_registry = FinishedJobRegistry(queue.name, connection) started_job_registry = StartedJobRegistry(queue.name, connection) deferred_job_registry = DeferredJobRegistry(queue.name, connection) queue_data['finished_jobs'] = len(finished_job_registry) queue_data['started_jobs'] = len(started_job_registry) queue_data['deferred_jobs'] = len(deferred_job_registry) queues.append(queue_data) context_data = {'queues': queues} return render(request, 'django_rq/stats.html', context_data)
def queues(request): queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) queue_data = { 'name': queue.name, 'jobs': queue.count, 'index': index, } if queue.name == 'failed': queue_data['workers'] = '-' else: connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [ worker for worker in all_workers if queue in worker.queues ] queue_data['workers'] = len(queue_workers) queues.append(queue_data) context_data = {'title': 'RQ Queues', 'queues': queues} return render(request, 'django_rq/stats.html', context_data)
def requeue_job_view(request, queue_index, job_id): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) job = Job.fetch(job_id, connection=queue.connection) if request.method == 'POST': try: # pragma: no cover requeue_job(job_id, connection=queue.connection) messages.info(request, 'You have successfully requeued %s' % job.id) return redirect('rq_job_detail', queue_index, job_id) except InvalidJobOperationError as e: messages.error(request, e.message) return redirect('rq_jobs', queue_index) context_data = { 'title': 'Are you sure?', 'queue_index': queue_index, 'job': job, 'queue': queue, } return render(request, 'django_rq/delete_job.html', context_data)
def actions(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) if request.method == 'POST' and request.POST.get('action', False): # Confirmation page for selected Action if request.POST.get('_selected_action', False): context_data = { 'title': 'Are you sure?', 'queue_index': queue_index, 'action': request.POST['action'], 'job_ids': request.POST.getlist('_selected_action'), 'queue': queue, } return render(request, 'django_rq/confirm_action.html', context_data) # Performing the actual action elif request.POST.get('job_ids', False): job_ids = request.POST.getlist('job_ids') if request.POST['action'] == 'delete': for job_id in job_ids: job = Job.fetch(job_id, connection=queue.connection) # Remove job id from queue and delete the actual job queue.connection._lrem(queue.key, 0, job.id) job.delete() messages.info( request, 'You have successfully deleted %s jobs!' % len(job_ids)) elif request.POST['action'] == 'requeue': # pragma: no cover for job_id in job_ids: requeue_job(job_id, connection=queue.connection) messages.info( request, 'You have successfully requeued %d jobs!' % len(job_ids)) return redirect('rq_jobs', queue_index)
def queues(request): queues = [] for index, config in enumerate(QUEUES_LIST): queue = get_queue_by_index(index) connection = queue.connection queue_data = { "name": queue.name, "jobs": queue.count, "index": index, "connection_kwargs": connection.connection_pool.connection_kwargs, } if queue.name == "failed": queue_data["workers"] = "-" queue_data["finished_jobs"] = "-" queue_data["started_jobs"] = "-" queue_data["deferred_jobs"] = "-" else: connection = get_connection(queue.name) all_workers = Worker.all(connection=connection) queue_workers = [worker for worker in all_workers if queue in worker.queues] queue_data["workers"] = len(queue_workers) finished_job_registry = FinishedJobRegistry(queue.name, connection) started_job_registry = StartedJobRegistry(queue.name, connection) deferred_job_registry = DeferredJobRegistry(queue.name, connection) queue_data["finished_jobs"] = len(finished_job_registry) queue_data["started_jobs"] = len(started_job_registry) queue_data["deferred_jobs"] = len(deferred_job_registry) queues.append(queue_data) context_data = {"title": "RQ Queues", "queues": queues} return render(request, "django_rq/stats.html", context_data)
def jobs(request, queue_index): queue_index = int(queue_index) queue = get_queue_by_index(queue_index) context_data = {"queue": queue, "queue_index": queue_index, "jobs": queue.jobs} return render(request, "django_rq/jobs.html", context_data)