def get_config_info_by_tag(self, datamodel, dbsession, tag): """Return a list of dictionaries containing configuration information from notes with *tag* which are formatted like this:: * url: https://bladiblah * color: #4433cc """ tags = dbsession.query(Tag).filter_by(name=tag) entries = [] if tags.count(): google_calendar_tag = tags.one() from sqlalchemy.sql import select qry = select([datamodel.itemversions], from_obj=get_current_itemversions_join(datamodel)) \ .where(ItemVersion.tags.any(id=google_calendar_tag.id)) import re config_entry_re = re.compile( r"^\s*(?:\*\s+)?([a-zA-Z0-9]+)\s*:\s*(.*)\s*$", re.MULTILINE) for item_ver in dbsession.query(ItemVersion).from_statement(qry): entry = {} entries.append(entry) for match in config_entry_re.finditer(item_ver.contents): entry[match.group(1)] = match.group(2) return entries
def get_tags_with_usecounts(self, session, model, parsed_query=None, max_timestamp=None, startswith=None, limit=None): from sqlalchemy.sql import select, func if parsed_query is not None: itemversions_q = query_itemversions(session, model, parsed_query, max_timestamp) else: itemversions_q = select([model.itemversions], from_obj=[get_current_itemversions_join( model, max_timestamp) ]) itemversions_q = itemversions_q.alias("currentversions") # twuc_q stands for tags_with_usecount_query twuc_q = ( select([ model.tags.c.name, func.count(itemversions_q.c.id).label("use_count"), ], from_obj=[ model.itemversions_tags .join(itemversions_q, itemversions_q.c.id == model.itemversions_tags.c.itemversion_id) .join(model.tags) ]) ) if startswith: twuc_q = twuc_q.where(model.tags.c.name.startswith(startswith)) twuc_q = ( twuc_q .group_by(model.tags.c.id) .having(func.count(itemversions_q.c.id) > 0) .order_by(model.tags.c.name) ) if limit is not None: twuc_q = twuc_q.limit(limit) return session.execute(twuc_q)
def http_calendar_data(self, request): start = float(request.GET.get("start", 0)) end = float(request.GET.get("end", 0)) max_timestamp = None # FIXME from_obj = get_current_itemversions_join( request.datamodel, max_timestamp) from sqlalchemy.sql import select, or_, and_ where = or_( # start_date in range and_( start <= ItemVersion.start_date, ItemVersion.start_date <= end), # end_date in range and_( start <= ItemVersion.end_date, ItemVersion.end_date <= end), # span entire range and_( ItemVersion.start_date <= start, ItemVersion.end_date <= end) ) qry = select([request.datamodel.itemversions], from_obj=from_obj) \ .where(where) data = [] for item_ver in (request.dbsession.query(ItemVersion).from_statement(qry)): if item_ver.all_day: from time import gmtime, mktime if item_ver.start_date is not None: start = mktime( kill_hms_in_time_struct( gmtime(item_ver.start_date))) else: start = None if item_ver.end_date is not None: end = mktime( kill_hms_in_time_struct( gmtime(item_ver.end_date))) else: end = None else: start = item_ver.start_date end = item_ver.end_date contents = item_ver.contents if len(contents) > 40: contents = contents[:40] + "..." from urllib import quote data.append(dict( id=item_ver.id, title=contents, start=start, end=end, allDay=item_ver.all_day, className=["tag-%s" % tag.name for tag in item_ver.tags], url="/#"+quote('{"query": "id(%d) nohide"}' % item_ver.item_id), )) from time import time now = time() data.append(dict( id="-1", title="NOW", start=now, end=now + 7.5 * 60, allDay=False, className=["calendar-now"], )) return request.respond( json.dumps(data), mimetype="text/plain")