Skip to content

Commit

Permalink
Fix Bug 1359037 - Provide some syndication feature to Nightly release…
Browse files Browse the repository at this point in the history
… notes
  • Loading branch information
kyoshino committed May 9, 2017
1 parent 024ee2a commit 0ee0317
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 2 deletions.
32 changes: 32 additions & 0 deletions bedrock/firefox/templates/firefox/releases/nightly-feed.xml
@@ -0,0 +1,32 @@
{# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. -#}

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>{{ _('Firefox Nightly Notes') }}</title>
<subtitle>{{ _('Firefox Nightly gets a new version every day and as a consequence, the release notes for the Nightly channel are updated continuously to reflect features that have reached sufficient maturity to benefit from community feedback and bug reports.') }}</subtitle>
<author>
<name>{{ _('Mozilla') }}</name>
</author>
<id>{{ url('firefox.nightly.notes.feed')|absolute_url }}</id>
<link rel="self" type="application/atom+xml" href="{{ url('firefox.nightly.notes.feed')|absolute_url }}"/>
<link rel="alternate" type="text/html" href="{{ url('firefox.notes', channel='nightly')|absolute_url }}"/>
<icon>{{ static('img/firefox/nightly/favicon.png')|absolute_url }}</icon>
<updated>{{ notes[0].modified.isoformat() }}</updated>
{% for note in notes %}
<entry>
<title>{{ note.note|markdown|striptags|truncate(100) }}</title>
<id>{{ note.link|absolute_url }}</id>
<link rel="alternate" type="text/html" href="{{ note.link|absolute_url }}"/>
<updated>{{ note.modified.isoformat() }}</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
{{ note.version }} / {{ note.tag }}
{%- if note.bug %} / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id={{ note.bug }}">{{ _('Bug %d')|format(note.bug) }}</a>{% endif %}
{{ note.note|markdown|safe }}
</div>
</content>
</entry>
{% endfor %}
</feed>
4 changes: 4 additions & 0 deletions bedrock/firefox/templates/firefox/releases/nightly-notes.html
Expand Up @@ -3,3 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/. #}

{% extends "firefox/releases/release-notes.html" %}

{% block extrahead %}
<link rel="alternate" type="application/atom+xml" title="{{ _('Firefox Nightly Notes Feed') }}" href="{{ url('firefox.nightly.notes.feed') }}">
{% endblock %}
2 changes: 2 additions & 0 deletions bedrock/firefox/urls.py
Expand Up @@ -106,6 +106,8 @@
# Release notes
url('^firefox/(?:%s/)?(?:%s/)?notes/$' % (platform_re, channel_re),
bedrock.releasenotes.views.latest_notes, name='firefox.notes'),
url('^firefox/nightly/notes/feed/$',
bedrock.releasenotes.views.nightly_feed, name='firefox.nightly.notes.feed'),
url('firefox/(?:latest/)?releasenotes/$', bedrock.releasenotes.views.latest_notes,
{'product': 'firefox'}),
url('^firefox/(?:%s/)?system-requirements/$' % channel_re,
Expand Down
46 changes: 45 additions & 1 deletion bedrock/releasenotes/tests/test_base.py
@@ -1,6 +1,8 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from dateutil.parser import parse as date_parse

from django.core.cache import caches
from django.http import Http404
from django.test.client import RequestFactory
Expand All @@ -11,7 +13,7 @@
from nose.tools import eq_, ok_
from pathlib2 import Path
from pyquery import PyQuery as pq
from rna.models import Release
from rna.models import Release, Note

from bedrock.firefox.firefox_details import FirefoxDesktop
from bedrock.mozorg.tests import TestCase
Expand Down Expand Up @@ -252,6 +254,48 @@ def test_check_url(self):
eq_(views.check_url('Firefox', '42.0'),
'/en-US/firefox/42.0/system-requirements/')

@patch('bedrock.releasenotes.views.get_list_or_404')
def test_nightly_feed(self, get_list_or_404):
"""Nightly Notes feed should be served with public changes"""
release_1 = Mock()
release_1.version = '55.0a1'
release_1.is_public = True
release_1.release_date = date_parse('2017-03-06T00:00:00')
release_1.notes.return_value = ([
Note(id=1, tag='New', note='New 1', is_public=True,
modified=date_parse('2017-04-20T13:27:28')),
Note(id=2, tag='New', note='New 2', is_public=True,
modified=date_parse('2017-04-20T13:28:32')),
Note(id=11, tag='Changed', note='Change 1', is_public=True,
modified=date_parse('2017-04-20T13:27:50')),
Note(id=12, tag='Changed', note='Change 2', is_public=True,
modified=date_parse('2017-04-20T13:28:03')),
Note(id=13, tag='Changed', note='Change 3', is_public=False,
modified=date_parse('2017-04-20T13:28:16')),
], [
Note(id=21, tag='', note='Known issue 1', is_public=True,
modified=date_parse('2017-04-20T13:30:12')),
])

release_2 = Mock()
release_2.version = '56.0a1'
release_2.is_public = True
release_2.release_date = date_parse('2017-05-08T00:00:00')
release_2.notes.return_value = ([
Note(id=31, tag='New', note='New 1', is_public=True,
modified=date_parse('2017-05-08T13:27:28')),
], [])

get_list_or_404.return_value = [release_1, release_2]
views.nightly_feed(self.request)

eq_(len(self.last_ctx['notes']), 5)
eq_(self.last_ctx['notes'][0].id, 31)
eq_(self.last_ctx['notes'][1].id, 2)
eq_(self.last_ctx['notes'][2].id, 12)
eq_(self.last_ctx['notes'][3].id, 11)
eq_(self.last_ctx['notes'][4].id, 1)


class TestReleaseNotesIndex(TestCase):
pd_cache = caches['product-details']
Expand Down
28 changes: 27 additions & 1 deletion bedrock/releasenotes/views.py
Expand Up @@ -6,7 +6,7 @@
from django.conf import settings
from django.db.models import Q
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.shortcuts import get_object_or_404, get_list_or_404

from bedrock.base.urlresolvers import reverse
from lib import l10n_utils
Expand Down Expand Up @@ -234,3 +234,29 @@ def releases_index(request, product):
request, '{product}/releases/index.html'.format(product=product.lower()),
{'releases': sorted(releases.items(), reverse=True)}
)


def nightly_feed(request):
"""Serve an Atom feed with the latest changes in Firefox Nightly"""
notes = []
query = Q(product='Firefox', channel='Nightly')
releases = sorted(get_list_or_404(Release, query),
key=lambda x: x.release_date, reverse=True)[0:5]

for release in releases:
if release.is_public:
link = reverse('firefox.desktop.releasenotes',
args=(release.version, 'release'))

for note in release.notes()[0]:
if note.is_public and note.tag:
note.link = link + '#note-' + str(note.id)
note.version = release.version
notes.append(note)

# Sort by date in descending order
notes = sorted(notes, key=lambda x: x.modified, reverse=True)

return l10n_utils.render(request, 'firefox/releases/nightly-feed.xml',
{'notes': notes},
content_type='application/atom+xml')

0 comments on commit 0ee0317

Please sign in to comment.