def http_get_tags_for_query(self, request): if "max_timestamp" in request.GET: max_timestamp = float(request.GET["max_timestamp"]) else: max_timestamp = None query = request.GET.get("query", "") if query != "": from synoptic.query import parse_query parsed_query = parse_query(query) from synoptic.query import TagListVisitor query_tags = parsed_query.visit(TagListVisitor()) else: parsed_query = None query_tags = [] result = self.get_tags_with_usecounts( request.dbsession, request.datamodel, parsed_query, max_timestamp) tags = [list(row) for row in result] return request.respond( json.dumps({ "tags": tags, "query_tags": query_tags, }), mimetype="text/plain")
def http_get_items(self, request): qry = request.GET.get("query", "") from synoptic.query import parse_query parsed_query = parse_query(qry) if "max_timestamp" in request.GET: max_timestamp = float(request.GET["max_timestamp"]) else: max_timestamp = None json_items = self.get_json_items( request.dbsession, request.datamodel, parsed_query, max_timestamp) if qry != "": tag_counter = {} for it in json_items: for tag in it["tags"]: tag_counter[tag] = tag_counter.get(tag, 0) + 1 tags = [list(it) for it in six.iteritems(tag_counter)] tags.sort() from synoptic.query import TagListVisitor query_tags = parsed_query.visit(TagListVisitor()) else: # the empty query parses as "home", but we need to show # all tags, not just the ones relative to that, if "max_timestamp" in request.GET: max_timestamp = float(request.GET["max_timestamp"]) else: max_timestamp = None tags = [list(row) for row in self.get_tags_with_usecounts( request.dbsession, request.datamodel, max_timestamp=max_timestamp)] query_tags = [] # kind of silly to do two JSON encodes, but what the heck result_hash = hash(json.dumps(json_items)) # and ship them out by JSON return request.respond(json.dumps({ "items": json_items, "result_hash": result_hash, "tags": tags, "query_tags": query_tags, }), mimetype="text/plain")
def http_store_item(self, request): data = json.loads(request.POST["json"]) current_query = data.pop("current_query", None) deleting = data["contents"] is None # if view ordering is present for current query, # make sure this entry shows up last if not deleting: # if we're not deleting from synoptic.datamodel import ViewOrderingHandler from synoptic.query import parse_query voh = ViewOrderingHandler( request.dbsession, request.datamodel, parse_query(current_query)) if voh.has_ordering(): voh.load() if data["id"] in voh: # we already have a spot in the ordering, don't bother voh = None else: voh = None else: voh = None if not deleting: set_with_parsed_datetime(data, "start_date", use_utc=data["all_day"]) set_with_parsed_datetime(data, "end_date", "start_date", use_utc=data["all_day"]) set_with_parsed_datetime(data, "hide_until", "start_date") set_with_parsed_datetime(data, "highlight_at", "start_date") if not deleting: from synoptic.datamodel import is_valid_tag for tag in data["tags"]: if not is_valid_tag(tag): raise RuntimeError("invalid tag") itemversion = store_itemversion(request.dbsession, **data) request.dbsession.commit() # fills in the item_id if voh is not None: voh.insert(len(voh), itemversion.item_id) voh.save() # send response return request.respond( json.dumps(self.item_to_json(itemversion)), mimetype="text/plain")
def http_reorder_item(self, request): data = json.loads(request.POST["json"]) from synoptic.query import parse_query from synoptic.datamodel import ViewOrderingHandler if data["new_order"]: voh = ViewOrderingHandler( request.dbsession, request.datamodel, parse_query(data["current_search"])) voh.load() voh.set_order([int(x) for x in data["new_order"].split(",")]) voh.save() return request.respond("", mimetype="text/plain")
def get_itemversions_for_request(self, request): from synoptic.query import parse_query parsed_query = parse_query(request.GET.get("query", "")) if "max_timestamp" in request.GET: max_timestamp = float(request.GET["max_timestamp"]) else: max_timestamp = None session = request.dbsession model = request.datamodel # grab the ORMed instances return (session .query(ItemVersion) .from_statement(query_itemversions( session, model, parsed_query, max_timestamp)))
def http_get_result_hash(self, request): qry = request.GET.get("query", "") from synoptic.query import parse_query parsed_query = parse_query(qry) if "max_timestamp" in request.GET: max_timestamp = float(request.GET["max_timestamp"]) else: max_timestamp = None json_items = self.get_json_items( request.dbsession, request.datamodel, parsed_query, max_timestamp) result_hash = hash(json.dumps(json_items)) # and ship them out by JSON return request.respond(json.dumps(result_hash), mimetype="text/plain")