From e1eb56da34628fd52899db7b1afa0e56cfd8964c Mon Sep 17 00:00:00 2001 From: Andrea Peltrin Date: Fri, 6 Mar 2015 18:53:53 +0100 Subject: [PATCH] Issue #6: initial implementation for feed autodiscovery. --- coldsweat/fetcher.py | 2 - coldsweat/filters.py | 2 +- coldsweat/frontend.py | 51 +++++++++++++++++---- coldsweat/markup.py | 14 ++---- coldsweat/templates/_feed_add_wizard_1.html | 6 +-- coldsweat/templates/_feed_add_wizard_2.html | 30 ++++++++++++ coldsweat/templates/index.html | 2 +- coldsweat/tests/discovery.py | 12 +++-- coldsweat/tests/discovery/xhtml.html | 2 +- 9 files changed, 90 insertions(+), 31 deletions(-) create mode 100644 coldsweat/templates/_feed_add_wizard_2.html diff --git a/coldsweat/fetcher.py b/coldsweat/fetcher.py index ff25753..50c6b40 100644 --- a/coldsweat/fetcher.py +++ b/coldsweat/fetcher.py @@ -161,8 +161,6 @@ def fetch_feed(self): def parse_feed(self, data): - #feed = self.feed - soup = feedparser.parse(data) # Got parsing error? if hasattr(soup, 'bozo') and soup.bozo: diff --git a/coldsweat/filters.py b/coldsweat/filters.py index e69ec43..52cccd9 100644 --- a/coldsweat/filters.py +++ b/coldsweat/filters.py @@ -104,7 +104,7 @@ def alert(message): except ValueError: return text return u'
%s
' % (klass.lower(), text) - + def run_tests(): #t = datetime.utcnow() diff --git a/coldsweat/frontend.py b/coldsweat/frontend.py index a2cda3f..0575d77 100644 --- a/coldsweat/frontend.py +++ b/coldsweat/frontend.py @@ -20,11 +20,9 @@ from controllers import * from utilities import * from fetcher import * - +from markup import * from session import SessionMiddleware - import filters - from plugins import trigger_event, load_plugins ENTRIES_PER_PAGE = 30 @@ -332,21 +330,28 @@ def feed_enable(self, feed_id): return self.redirect_after_post('%s/feeds/' % self.application_url) - @form(r'^/feeds/add$') + @form(r'^/feeds/add/1$') @login_required - def feed_add(self): + def feed_add_1(self): form_message = '' groups = self.get_groups() # URL could be passed via a GET (bookmarklet) or POST self_link = self.request.params.get('self_link', '').strip() + #@@TODO: Allow specify domain.com w/out scheme + if self.request.method == 'GET': return self.respond_with_template('_feed_add_wizard_1.html', locals()) + # Handle POST + + group_id = int(self.request.POST.get('group', 0)) + if not validate_url(self_link): form_message = u'ERROR Error, specify a valid web address' return self.respond_with_template('_feed_add_wizard_1.html', locals()) + try: response = fetch_url(self_link) except RequestException, exc: @@ -356,21 +361,49 @@ def feed_add(self): #form_message = u'ERROR Error, a network error occured' #return self.respond_with_template('_feed_add_wizard_1.html', locals()) + if not sniff_feed(response.text): + links = find_feed_links(response.text) + return self.respond_with_template('_feed_add_wizard_2.html', locals()) + # It's a feed + + #@@TODO: add plugin events + feed = self.add_feed_from_url(self_link, fetch_data=False) + ff = Fetcher(feed) + ff.parse_feed(response.text) + + return self._add_subscription(feed, group_id) + + + @POST(r'^/feeds/add/2$') + @login_required + def feed_add_2(self): + + self_link = self.request.POST.get('self_link', '') group_id = int(self.request.POST.get('group', 0)) + +#@@TODO: handle multiple feed subscription +# urls = self.request.POST.getall('feeds') +# for url in urls: +# pass + + feed = self.add_feed_from_url(self_link, fetch_data=True) + return self._add_subscription(feed, group_id) + + + def _add_subscription(self, feed, group_id): if group_id: group = Group.get(Group.id == group_id) else: - group = Group.get(Group.title == Group.DEFAULT_GROUP) + group = Group.get(Group.title == Group.DEFAULT_GROUP) - feed = self.add_feed_from_url(self_link, fetch_data=True) subscription = self.add_subscription(feed, group) if subscription: self.alert_message = u'SUCCESS Feed has been added to %s group' % group.title else: self.alert_message = u'INFO Feed is already in %s group' % group.title - return self.respond_with_script('_modal_done.js', {'location': '%s/?feed=%d' % (self.application_url, feed.id)}) - + return self.respond_with_script('_modal_done.js', {'location': '%s/?feed=%d' % (self.application_url, feed.id)}) + @GET(r'^/fever/?$') def fever(self): diff --git a/coldsweat/markup.py b/coldsweat/markup.py index d8bcc38..e033768 100644 --- a/coldsweat/markup.py +++ b/coldsweat/markup.py @@ -180,7 +180,8 @@ def start_link(self, attrs): return #@@TODO: check if it's relative URL before join - self.links.append(urlparse.urljoin(self.base_url, d['href'])) + url, title = urlparse.urljoin(self.base_url, d['href']), d['title'] if 'title' in d else u'' + self.links.append((url, title)) class Scrubber(BaseProcessor): @@ -240,7 +241,7 @@ def _parse(parser, data): # Link discovery functions -def find_feed_links(data, base_url): +def find_feed_links(data, base_url=''): ''' Return the feed links found for the page ''' @@ -248,15 +249,6 @@ def find_feed_links(data, base_url): _parse(p, data) return p.links -def find_feed_link(data, base_url): - ''' - Return the first feed link found - ''' - links = find_feed_links(data, base_url) - if links: - return links[0] - return None - def sniff_feed(data): data = data.lower() if data.count(' +
+ + {{else}} + + + {{endif}} +
diff --git a/coldsweat/templates/index.html b/coldsweat/templates/index.html index 21acb61..8c0fce1 100644 --- a/coldsweat/templates/index.html +++ b/coldsweat/templates/index.html @@ -27,7 +27,7 @@ {{endif}}
  • -
  • +