def endpoint(self, request): logger.debug('client from %s requested: %s' % (request.remote_addr, request.params)) if 'api' not in request.GET: raise HTTPBadRequest() result = Struct({'api_version':API_VERSION, 'auth':0}) if 'api_key' in request.POST: api_key = request.POST['api_key'] user = User.validate_api_key(api_key) if not user: logger.warn('unknown API key %s, unauthorized' % api_key) return self.respond_with_json(result) else: logger.warn('missing API key, unauthorized') return self.respond_with_json(result) # Authorized result.auth = 1 # It looks like client *can* send multiple commands at time for command, handler in COMMANDS: if command in request.params: handler(request, user, result) result.last_refreshed_on_time = get_last_refreshed_on_time() return self.respond_with_json(result)
def _parse(parser, data): try: parser.feed(data) except HTMLParseError, exc: # Log exception and raise it again logger.debug('could not parse markup (%s)' % exc.msg) raise exc
def endpoint(self, request): logger.debug('client from %s requested: %s' % (request.remote_addr, request.params)) if 'api' not in request.GET: raise HTTPBadRequest() result = Struct({'api_version': API_VERSION, 'auth': 0}) if 'api_key' in request.POST: api_key = request.POST['api_key'] user = User.validate_api_key(api_key) if not user: logger.warn('unknown API key %s, unauthorized' % api_key) return self.respond_with_json(result) else: logger.warn('missing API key, unauthorized') return self.respond_with_json(result) # Authorized result.auth = 1 # It looks like client *can* send multiple commands at time for command, handler in COMMANDS: if command in request.params: handler(request, user, result) result.last_refreshed_on_time = get_last_refreshed_on_time() return self.respond_with_json(result)
def mark_command(request, user, result): try: mark, status, object_id = request.POST['mark'], request.POST['as'], int(request.POST['id']) except (KeyError, ValueError), ex: logger.debug('missing or invalid parameter (%s), ignored' % ex) return
def _parse(parser, data): try: parser.feed(data) except HTMLParseError, exc: # Log exception and raise it again logger.debug(u'could not parse markup (%s)' % exc.msg) raise exc
def mark_command(request, user, result): try: mark, status, object_id = request.POST['mark'], request.POST[ 'as'], int(request.POST['id']) except (KeyError, ValueError), ex: logger.debug('missing or invalid parameter (%s), ignored' % ex) return
def start_img(self, attrs): d = dict(_normalize_attrs(attrs)) if 'src' in d: if self.is_blacklisted(d['src']): self.pieces.append(d['alt'] if 'alt' in d else '') logger.debug(u'matched image with blacklisted src=%s' % d['src']) return # Proceed to default handling self.unknown_starttag('img', attrs)
def start_a(self, attrs): d = dict(_normalize_attrs(attrs)) if 'href' in d: if self.is_blacklisted(d['href']): logger.debug(u'matched anchor with blacklisted href=%s' % d['href']) self.blacklisted += 1 return # Proceed to default handling self.unknown_starttag('a', attrs)
def set_session(sid, value, timeout=SESSION_TIMEOUT): session = get_session(sid) if not session: # New session if sid not present session = Session(key=sid) logger.debug(u"session %s created" % sid) session.expires_on = (datetime.utcnow() + timedelta(seconds=timeout)).replace(microsecond=0) session.value = value session.save()
def get_session(sid, default=None): try: session = Session.get(Session.key==sid) except Session.DoesNotExist: return default # Expired? if session.expires_on < datetime.utcnow().replace(microsecond=0): session.delete_instance() logger.debug(u"session %s is expired, deleted" % sid) return default return session
def get_session(sid, default=None): try: session = Session.get(Session.key == sid) except Session.DoesNotExist: return default # Expired? if session.expires_on < datetime.utcnow().replace(microsecond=0): session.delete_instance() logger.debug(u"session %s is expired, deleted" % sid) return default return session
def add_feeds_from_file(source, user): """ Add feeds to database reading from a file containing OPML data. """ default_group = Group.get(Group.title == Group.DEFAULT_GROUP) feeds = [] groups = [default_group] for event, element in ElementTree.iterparse(source, events=('start','end')): if event == 'start': if (element.tag == 'outline') and ('xmlUrl' not in element.attrib): # Entering a group group = Group() for k, v in element.attrib.items(): if k in group_allowed_attribs: setattr(group, group_allowed_attribs[k], v) try: group = Group.get(Group.title==group.title) except Group.DoesNotExist: group.save() logger.debug('added group %s to database' % group.title) groups.append(group) elif event == 'end': if (element.tag == 'outline') and ('xmlUrl' in element.attrib): # Leaving a feed feed = Feed() for k, v in element.attrib.items(): if k in feed_allowed_attribs: setattr(feed, feed_allowed_attribs[k], v) feed = add_feed(feed, fetch_icon=True, add_entries=True) add_subscription(feed, user, groups[-1]) feeds.append(feed) elif element.tag == 'outline': # Leaving a group groups.pop() return feeds
def add_feeds_from_file(source, user): """ Add feeds to database reading from a file containing OPML data. """ default_group = Group.get(Group.title == Group.DEFAULT_GROUP) feeds = [] groups = [default_group] for event, element in ElementTree.iterparse(source, events=('start', 'end')): if event == 'start': if (element.tag == 'outline') and ('xmlUrl' not in element.attrib): # Entering a group group = Group() for k, v in element.attrib.items(): if k in group_allowed_attribs: setattr(group, group_allowed_attribs[k], v) try: group = Group.get(Group.title == group.title) except Group.DoesNotExist: group.save() logger.debug('added group %s to database' % group.title) groups.append(group) elif event == 'end': if (element.tag == 'outline') and ('xmlUrl' in element.attrib): # Leaving a feed feed = Feed() for k, v in element.attrib.items(): if k in feed_allowed_attribs: setattr(feed, feed_allowed_attribs[k], v) feed = add_feed(feed, fetch_icon=True, add_entries=True) add_subscription(feed, user, groups[-1]) feeds.append(feed) elif element.tag == 'outline': # Leaving a group groups.pop() return feeds
def mark_command(request, user, result): try: mark, status, object_id = request.POST['mark'], request.POST['as'], int(request.POST['id']) except (KeyError, ValueError), ex: logger.debug('missing or invalid parameter (%s), ignored' % ex) return if mark == 'item': try: # Sanity check entry = Entry.get(Entry.id == object_id) except Entry.DoesNotExist: logger.debug('could not find entry %d, ignored' % object_id) return if status == 'read': try: Read.create(user=user, entry=entry) except IntegrityError: logger.debug('entry %d already marked as read, ignored' % object_id) return # Strangely enough 'unread' is not mentioned in # the Fever API, but Reeder app asks for it elif status == 'unread': count = Read.delete().where((Read.user==user) & (Read.entry==entry)).execute() if not count: logger.debug('entry %d never marked as read, ignored' % object_id) return
def unread_recently_command(request, user, result): since = datetime.utcnow() - timedelta(seconds=RECENTLY_READ_DELTA) q = Read.delete().where((Read.user==user) & (Read.read_on > since)) count = q.execute() logger.debug('%d entries marked as unread' % count)
def unread_recently_command(request, user, result): since = datetime.utcnow() - timedelta(seconds=RECENTLY_READ_DELTA) q = Read.delete().where((Read.user == user) & (Read.read_on > since)) count = q.execute() logger.debug('%d entries marked as unread' % count)
def mark_command(request, user, result): try: mark, status, object_id = request.POST['mark'], request.POST[ 'as'], int(request.POST['id']) except (KeyError, ValueError), ex: logger.debug('missing or invalid parameter (%s), ignored' % ex) return if mark == 'item': try: # Sanity check entry = Entry.get(Entry.id == object_id) except Entry.DoesNotExist: logger.debug('could not find entry %d, ignored' % object_id) return if status == 'read': try: Read.create(user=user, entry=entry) except IntegrityError: logger.debug('entry %d already marked as read, ignored' % object_id) return # Strangely enough 'unread' is not mentioned in # the Fever API, but Reeder app asks for it elif status == 'unread': count = Read.delete().where((Read.user == user) & (Read.entry == entry)).execute() if not count: