def api_datatables(unit): # import time # time.sleep(5) collection = None sort = None skip = int(request.args.get("iDisplayStart", 0)) limit = int(request.args.get("iDisplayLength", 20)) if unit == "queues": queues = [] for name in Queue.all_known(): queue = Queue(name) q = { "name": name, "size": queue.size(), # Redis size "is_sorted": queue.is_sorted, "is_timed": queue.is_timed, "is_raw": queue.is_raw, "is_set": queue.is_set } if queue.is_sorted: raw_config = queue.get_config() q["graph_config"] = raw_config.get( "dashboard_graph", lambda: { "start": time.time() - (7 * 24 * 3600), "stop": time.time() + (7 * 24 * 3600), "slices": 30 } if queue.is_timed else { "start": 0, "stop": 100, "slices": 30 })() if q["graph_config"]: q["graph"] = queue.get_sorted_graph(**q["graph_config"]) if queue.is_timed: q["jobs_to_dequeue"] = queue.count_jobs_to_dequeue() queues.append(q) queues.sort(key=lambda x: -x["size"]) data = {"aaData": queues, "iTotalDisplayRecords": len(queues)} elif unit == "workers": fields = None collection = connections.mongodb_jobs.mrq_workers sort = [("datestarted", -1)] query = {} if request.args.get("id"): query["_id"] = ObjectId(request.args["id"]) else: if request.args.get("status"): statuses = request.args["status"].split("-") query["status"] = {"$in": statuses} if request.args.get("ip"): query["$or"] = [{ "config.local_ip": request.args["ip"] }, { "config.external_ip": request.args["ip"] }] if request.args.get("queue"): query["config.queues"] = request.args["queue"] elif unit == "agents": fields = None query = {"status": {"$nin": ["stop"]}} collection = connections.mongodb_jobs.mrq_agents sort = [("datestarted", -1)] if request.args.get("showstopped"): query = {} elif unit == "scheduled_jobs": collection = connections.mongodb_jobs.mrq_scheduled_jobs fields = None query = {} elif unit == "jobs": fields = None query = build_api_datatables_query(request) sort = None # TODO [("_id", 1)] # We can't search easily params because we store it as decoded JSON in mongo :( # Add a string index? # if request.args.get("sSearch"): # query.update(json.loads(request.args.get("sSearch"))) collection = connections.mongodb_jobs.mrq_jobs if collection is not None: cursor = collection.find(query, projection=fields) if sort: cursor.sort(sort) if skip is not None: cursor.skip(skip) if limit is not None: cursor.limit(limit) data = { "aaData": list(cursor), "iTotalDisplayRecords": collection.find(query).count() } data["sEcho"] = request.args["sEcho"] return jsonify(data)