bodhi/controllers.py | 44 ++++++++++++++------- bodhi/metadata.py | 2 bodhi/metrics.py | 3 + bodhi/rss.py | 90 +++++++++++++++++++++++++++++++++++++++---- bodhi/templates/critpath.kid | 11 ++++- bodhi/templates/pkg.kid | 29 +++++++++++-- bodhi/templates/testing.kid | 3 + bodhi/templates/user.kid | 11 +++++ 8 files changed, 167 insertions(+), 26 deletions(-)
New commits: commit 3181865245f8fe36b82b412043dc5d0cc4ae58c3 Merge: 9aa3b9a... 3c6d2b6... Author: Luke Macken lmacken@redhat.com Date: Thu Jul 15 13:02:07 2010 -0400
Merge branch 'master' of git+ssh://git.fedorahosted.org/git/bodhi
commit 9aa3b9aff1f542cc7b1cefd801e2790eabd3c8a8 Author: Luke Macken lmacken@redhat.com Date: Thu Jul 15 13:01:23 2010 -0400
Add links to our critpath tables from the testing and critpath templates
diff --git a/bodhi/templates/critpath.kid b/bodhi/templates/critpath.kid index 8d1a7d2..4a42506 100644 --- a/bodhi/templates/critpath.kid +++ b/bodhi/templates/critpath.kid @@ -8,7 +8,16 @@ </head>
<body> - <b>${title}</b> + <b>${title}</b> <a href="${tg.url('/rss/rss2.0?critpath=True%s' % (release_name and '&release=%s' % release_name or ''))}"><img src="${tg.url('/static/images/rss.png')}" border="0"/></a> + <ul> + <li py:if="release_name"><a href="${tg.url('/critpath?release=' + release_name)}">Show all critical path updates for ${release_name}</a></li> + <!-- + <li py:if="not release_name"><a href="${tg.url('/critpath')}">Show all critical path updates</a></li> + <li py:if="unapproved"> + <a href="${tg.url('/critpath')}">Show all critical path updates</a> + </li> + --> + </ul> <div class="list"> <span py:for="page in tg.paginate.pages"> <a py:if="page != tg.paginate.current_page" diff --git a/bodhi/templates/testing.kid b/bodhi/templates/testing.kid index 8f63743..36dad0a 100644 --- a/bodhi/templates/testing.kid +++ b/bodhi/templates/testing.kid @@ -9,6 +9,9 @@
<body> <b>${title}</b> + <ul> + <li><a href="${tg.url('/critpath?untested=True&release=' + updates[0].release.name)}">Show unapproved ${updates[0].release.name} Critical Path updates</a> <a href="${tg.url('/rss/rss2.0?critpath=True&release=' + updates[0].release.name)}"><img src="${tg.url('/static/images/rss.png')}" border="0"/></a></li> + </ul> <div class="list"> <span py:for="page in tg.paginate.pages"> <a py:if="page != tg.paginate.current_page"
commit 6baf75eee21a5f69346940cedfa715b9e5b449d1 Author: Luke Macken lmacken@redhat.com Date: Thu Jul 15 13:01:05 2010 -0400
Have our RSS FeeController spit out critpath feeds
diff --git a/bodhi/rss.py b/bodhi/rss.py index 1d19705..fb4849e 100644 --- a/bodhi/rss.py +++ b/bodhi/rss.py @@ -26,15 +26,19 @@ class Feed(FeedController):
def get_feed_data(self, release=None, type=None, status=None, comments=False, submitter=None, builds=None, - user=None, package=None, critpath=False, *args, **kw): + user=None, package=None, critpath=False, + unapproved=None, *args, **kw): query = [] entries = [] date = lambda update: update.date_pushed order = PackageUpdate.q.date_pushed title = [] + critpath = critpath in (True, 'True', 'true') + unapproved = unapproved in (True, 'True', 'true')
if critpath: - return self.get_critpath_updates(release=release) + return self.get_critpath_updates(release=release, + unapproved=unapproved) if comments: return self.get_latest_comments(user=user) if package: @@ -149,25 +153,31 @@ class Feed(FeedController): entries = entries )
- def get_critpath_updates(self, release=None): + def get_critpath_updates(self, release=None, unapproved=None): + i = 0 entries = [] base = config.get('base_address') title = 'Latest Critical Path Updates' + query = [PackageUpdate.q.status != 'obsolete'] if release: release = Release.byName(release) releases = [release] title = title + ' for %s' % release.long_name else: releases = Release.select() - i = 0 + if unapproved: + query.append(PackageUpdate.q.status != 'stable') for update in PackageUpdate.select( - AND(PackageUpdate.q.status != 'obsolete', - OR(*[PackageUpdate.q.releaseID == release.id - for release in releases])), - orderBy=PackageUpdate.q.date_submitted): + AND(OR(*[PackageUpdate.q.releaseID == release.id + for release in releases]), + *query), + orderBy=PackageUpdate.q.date_submitted).reversed(): if i >= 20: break if update.critpath: + if unapproved: + if update.critpath_approved: + continue entries.append({ 'id' : base + url(update.get_url()), 'summary' : update.notes,
commit 6e9503dbcac2ddf4665639b4c1e4d77bfa9ad85d Author: Luke Macken lmacken@redhat.com Date: Thu Jul 15 13:00:37 2010 -0400
Tweak our /critpath controller method a little
diff --git a/bodhi/controllers.py b/bodhi/controllers.py index 730c7ea..ad644c0 100644 --- a/bodhi/controllers.py +++ b/bodhi/controllers.py @@ -1319,26 +1319,40 @@ class Root(controllers.RootController): return builds
@expose(template='bodhi.templates.critpath', allow_json=True) - @validate(validators={'untested': validators.StringBool()}) + @validate(validators={ + 'untested': validators.StringBool(), + 'unapproved': validators.StringBool(), + }) @paginate('updates', limit=1000, max_limit=1000) - def critpath(self, untested=False, release=None, *args, **kw): + def critpath(self, untested=False, unapproved=False, release=None, *args, + **kw): updates = [] + title = '%d %sCritical Path Updates' + query = [PackageUpdate.q.status != 'obsolete'] + release_name = None if release and release != u'None': - releases = [Release.byName(release)] + release = Release.byName(release) + releases = [release] + release_name = release.name + title = title + ' for ' + release.long_name else: releases = Release.select() + if untested or unapproved: + query.append(PackageUpdate.q.status != 'stable') for update in PackageUpdate.select( - AND(PackageUpdate.q.status != 'stable', - PackageUpdate.q.status != 'obsolete', - OR(*[PackageUpdate.q.releaseID == release.id - for release in releases]))): + AND(OR(*[PackageUpdate.q.releaseID == release.id + for release in releases]), + *query), + orderBy=PackageUpdate.q.date_submitted).reversed(): if update.critpath: - if untested: + if untested or unapproved: if not update.critpath_approved: updates.append(update) else: updates.append(update) num_items = len(updates) return dict(updates=updates, num_items=num_items, - title='%d %sCritical Path Updates' % (num_items, - untested and 'Untested ' or '')) + title=title % (num_items, (untested or unapproved) and + 'Unapproved ' or ''), + unapproved=unapproved or untested, + release_name=release_name)
commit 16ad8ab7ba2f63eaac6cd4d59debfa9f53d4c7ad Author: Luke Macken lmacken@redhat.com Date: Thu Jul 15 12:59:15 2010 -0400
Track the number of critpath updates in our metrics generator
diff --git a/bodhi/metrics.py b/bodhi/metrics.py index 09552ea..a93df98 100644 --- a/bodhi/metrics.py +++ b/bodhi/metrics.py @@ -390,12 +390,15 @@ class UpdateTypeMetric(Metric): 'num_bugfix': 0, 'num_enhancement': 0, 'num_newpackage': 0, + 'num_critpath': 0, }
def update(self, update): self.release['num_%s' % update.status] += 1 if update.pushed: self.release['num_%s' % update.type] += 1 + if update.critpath: + self.release['num_critpath'] += 1
def done(self): pass
commit 40f7e65264dad4ac6b520811a74d7e5170bfaaf4 Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 19:15:27 2010 -0400
Add RSS feeds for critpath updates, with the ability to query by release
diff --git a/bodhi/rss.py b/bodhi/rss.py index c444d96..1d19705 100644 --- a/bodhi/rss.py +++ b/bodhi/rss.py @@ -16,7 +16,7 @@ import logging from turbogears.feed import FeedController from turbogears import config, url from sqlobject import SQLObjectNotFound -from sqlobject.sqlbuilder import AND +from sqlobject.sqlbuilder import AND, OR
from bodhi.model import Release, PackageUpdate, Comment, Package
@@ -26,13 +26,15 @@ class Feed(FeedController):
def get_feed_data(self, release=None, type=None, status=None, comments=False, submitter=None, builds=None, - user=None, package=None, *args, **kw): + user=None, package=None, critpath=False, *args, **kw): query = [] entries = [] date = lambda update: update.date_pushed order = PackageUpdate.q.date_pushed title = []
+ if critpath: + return self.get_critpath_updates(release=release) if comments: return self.get_latest_comments(user=user) if package: @@ -146,3 +148,38 @@ class Feed(FeedController): link = config.get('base_address') + url('/'), entries = entries ) + + def get_critpath_updates(self, release=None): + entries = [] + base = config.get('base_address') + title = 'Latest Critical Path Updates' + if release: + release = Release.byName(release) + releases = [release] + title = title + ' for %s' % release.long_name + else: + releases = Release.select() + i = 0 + for update in PackageUpdate.select( + AND(PackageUpdate.q.status != 'obsolete', + OR(*[PackageUpdate.q.releaseID == release.id + for release in releases])), + orderBy=PackageUpdate.q.date_submitted): + if i >= 20: + break + if update.critpath: + entries.append({ + 'id' : base + url(update.get_url()), + 'summary' : update.notes, + 'link' : base + url(update.get_url()), + 'published' : update.date_submitted, + 'updated' : update.date_submitted, + 'title' : update.title, + }) + i += 1 + return dict( + title = title, + subtitle = "", + link = config.get('base_address') + url('/'), + entries = entries + )
commit bb16e3032a9dbce07f6ab04769b8b4caac3901a4 Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 19:09:00 2010 -0400
Allow for /comments?user=$USERNAME web-based queries
diff --git a/bodhi/controllers.py b/bodhi/controllers.py index d26ffc6..730c7ea 100644 --- a/bodhi/controllers.py +++ b/bodhi/controllers.py @@ -1207,9 +1207,13 @@ class Root(controllers.RootController):
@expose(template='bodhi.templates.comments') @paginate('comments', limit=20, max_limit=20) - def comments(self): - data = Comment.select(Comment.q.author != 'bodhi', - orderBy=Comment.q.timestamp).reversed() + def comments(self, user=None): + if user: + data = Comment.select(Comment.q.author == user, + orderBy=Comment.q.timestamp).reversed() + else: + data = Comment.select(Comment.q.author != 'bodhi', + orderBy=Comment.q.timestamp).reversed() return dict(comments=data, num_items=data.count())
@expose(template='bodhi.templates.confirmation')
commit 66d235560529b0a50f80deb214dde35cf0a380ee Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 18:18:24 2010 -0400
Improve our package links
diff --git a/bodhi/templates/pkg.kid b/bodhi/templates/pkg.kid index 18fad91..5540687 100644 --- a/bodhi/templates/pkg.kid +++ b/bodhi/templates/pkg.kid @@ -13,10 +13,31 @@
<blockquote> <h1>${pkg.name}</h1> - <ul> - <li><a href="${tg.url('http://bugz.fedoraproject.org/%s' % (pkg.name,))}">Open Bugs</a></li> - <li><a href="${tg.url('https://admin.fedoraproject.org/pkgdb/acls/name/%s' % (pkg.name,))}">Package Database</a></li> - <li><a href="http://koji.fedoraproject.org/koji/search?terms=${pkg.name}&type=package&match=glob">Koji Buildsystem</a></li> + <ul type="none"> + <li> + <img src="${tg.url('/static/images/rss.png')}" border="0"/> + <a href="${tg.url('/rss/rss2.0?package=%s' % pkg.name)}">RSS Feed</a> + </li> + <li> + <img src="https://admin.fedoraproject.org/community/images/16_bodhi.png"/> + <a href="https://admin.fedoraproject.org/community/?package=${pkg.name}#package_maintenance">Fedora Community</a> + </li> + <li> + <img src="https://admin.fedoraproject.org/community/images/16_bugs.png"/> + <a href="${tg.url('http://bugz.fedoraproject.org/%s' % (pkg.name,))}">Open Bugs</a> + </li> + <li> + <img src="https://fedoraproject.org/static/css/../images/icons/fedora-infra-icon_pkgdb.png"/> + <a href="${tg.url('https://admin.fedoraproject.org/pkgdb/acls/name/%s' % (pkg.name,))}">Package Database</a> + </li> + <li> + <img src="https://fedoraproject.org/static/images/icons/fedora-infra-icon_koji.png"/> + <a href="http://koji.fedoraproject.org/koji/search?terms=${pkg.name}&type=package&match=glob">Koji Buildsystem</a> + </li> + <li> + <img src="https://fedoraproject.org/static/css/../images/icons/fedora-infra-icon_source-control.png"/> + <a href="http://cvs.fedoraproject.org/viewcvs/rpms/${pkg.name}">Package Source</a> + </li> </ul> </blockquote>
commit 79b3a8644a6c88ce28115a860daacbdd2d8d7a0f Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 18:17:29 2010 -0400
Allow for indivudual RSS feeds of updates for each package
diff --git a/bodhi/rss.py b/bodhi/rss.py index ed3f805..c444d96 100644 --- a/bodhi/rss.py +++ b/bodhi/rss.py @@ -18,7 +18,7 @@ from turbogears import config, url from sqlobject import SQLObjectNotFound from sqlobject.sqlbuilder import AND
-from bodhi.model import Release, PackageUpdate, Comment +from bodhi.model import Release, PackageUpdate, Comment, Package
log = logging.getLogger(__name__)
@@ -26,7 +26,7 @@ class Feed(FeedController):
def get_feed_data(self, release=None, type=None, status=None, comments=False, submitter=None, builds=None, - user=None, *args, **kw): + user=None, package=None, *args, **kw): query = [] entries = [] date = lambda update: update.date_pushed @@ -35,6 +35,8 @@ class Feed(FeedController):
if comments: return self.get_latest_comments(user=user) + if package: + return self.get_package_updates(package) if release: try: rel = Release.byName(release.upper()) @@ -122,3 +124,25 @@ class Feed(FeedController): link = config.get('base_address') + url('/'), entries = entries, ) + + def get_package_updates(self, package): + entries = [] + pkg = Package.byName(package) + base = config.get('base_address') + for i, update in enumerate(pkg.updates()): + if i >= 20: + break + entries.append({ + 'id' : base + url(update.get_url()), + 'summary' : update.notes, + 'link' : base + url(update.get_url()), + 'published' : update.date_submitted, + 'updated' : update.date_submitted, + 'title' : update.title, + }) + return dict( + title = 'Latest Updates for %s' % package, + subtitle = "", + link = config.get('base_address') + url('/'), + entries = entries + )
commit a4953930dec4d1020027a7a110ca99ce435953fd Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 18:15:50 2010 -0400
Add ability to our FeedController to query comments by user (#445)
diff --git a/bodhi/rss.py b/bodhi/rss.py index decea86..ed3f805 100644 --- a/bodhi/rss.py +++ b/bodhi/rss.py @@ -25,7 +25,8 @@ log = logging.getLogger(__name__) class Feed(FeedController):
def get_feed_data(self, release=None, type=None, status=None, - comments=False, submitter=None, builds=None, *args, **kw): + comments=False, submitter=None, builds=None, + user=None, *args, **kw): query = [] entries = [] date = lambda update: update.date_pushed @@ -33,7 +34,7 @@ class Feed(FeedController): title = []
if comments: - return self.get_latest_comments() + return self.get_latest_comments(user=user) if release: try: rel = Release.byName(release.upper()) @@ -95,10 +96,14 @@ class Feed(FeedController): entries = entries )
- def get_latest_comments(self): + def get_latest_comments(self, user=None): entries = [] - comments = Comment.select(Comment.q.author != 'bodhi', - orderBy=Comment.q.timestamp).reversed()[:20] + if user: + comments = Comment.select(Comment.q.author == user, + orderBy=Comment.q.timestamp).reversed()[:20] + else: + comments = Comment.select(Comment.q.author != 'bodhi', + orderBy=Comment.q.timestamp).reversed()[:20] for comment in comments: entries.append({ 'id' : config.get('base_address') + \ diff --git a/bodhi/templates/user.kid b/bodhi/templates/user.kid index 2244e3c..1945217 100644 --- a/bodhi/templates/user.kid +++ b/bodhi/templates/user.kid @@ -18,6 +18,17 @@ from bodhi.model import Release, PackageUpdate, Releases
<body> <b>${"%s's %d updates" % (username, num_items)}</b> + + <ul type="none"> + <li> + <img src="${tg.url('/static/images/rss.png')}" border="0"/> + <a href="${tg.url('/rss/rss2.0?submitter=%s' % username)}">RSS Feed of Updates</a> + </li> + <li> + <img src="${tg.url('/static/images/rss.png')}" border="0"/> + <a href="${tg.url('/rss/rss2.0?comments=True&user=%s' % username)}">RSS Feed of Comments</a> + </li> + </ul> <div py:if="num_items" class="list"> <span py:for="page in tg.paginate.pages"> <a py:if="page != tg.paginate.current_page"
commit 5d4233530144b6240ed05236093b0b2502ab268b Author: Luke Macken lmacken@redhat.com Date: Wed Jul 14 18:03:32 2010 -0400
new-style classes are good
diff --git a/bodhi/metadata.py b/bodhi/metadata.py index b996e71..465ada0 100644 --- a/bodhi/metadata.py +++ b/bodhi/metadata.py @@ -33,7 +33,7 @@ from yum.update_md import UpdateMetadata
log = logging.getLogger(__name__)
-class ExtendedMetadata: +class ExtendedMetadata(object):
def __init__(self, repo, cacheduinfo=None): self.tag = get_repo_tag(repo)