bodhi/controllers.py
by Luke Macken
bodhi/controllers.py | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
New commits:
commit 1be59afe4aaf042cc80fdde3edbb3423cb61aaf7
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 16:49:10 2011 -0400
Stacked validators work again in TG.
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index e3e781a..7eed513 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -1225,8 +1225,7 @@ class Root(controllers.RootController):
raise redirect("/")
@expose(template='bodhi.templates.show')
- # Stacked validators seem to be broken in TG 1.0.8
- #@validate(validators={'karma': validators.Int()})
+ @validate(validators={'karma': validators.Int()})
@validate(form=comment_captcha_form)
def captcha_comment(self, text, title, author, karma, captcha=None,
tg_errors=None):
@@ -1279,7 +1278,10 @@ class Root(controllers.RootController):
@expose(allow_json=True)
@error_handler()
- #@validate(validators={'karma': validators.Int()})
+ @validate(validators={
+ 'karma': validators.Int(),
+ 'email': validators.StringBool()
+ })
@validate(form=comment_form)
@identity.require(identity.not_anonymous())
def comment(self, text, title, karma=0, tg_errors=None, email=True):
@@ -1289,6 +1291,7 @@ class Root(controllers.RootController):
:text: The text of the comment.
:title: The title of the update comment on.
:karma: The karma of this comment (-1, 0, 1)
+ :email: Whether or not this comment should trigger email notifications
"""
try:
12 years, 11 months
bodhi/controllers.py bodhi/model.py
by Luke Macken
bodhi/controllers.py | 4 ++--
bodhi/model.py | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
New commits:
commit 88d39aac30319c2a2c6c3f2632aa76d4c8ec88aa
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 16:38:42 2011 -0400
Add an email boolean to our comment API so services like AutoQA can choose not
to spam everyone when tests pass
diff --git a/bodhi/controllers.py b/bodhi/controllers.py
index fb1878f..e3e781a 100644
--- a/bodhi/controllers.py
+++ b/bodhi/controllers.py
@@ -1282,7 +1282,7 @@ class Root(controllers.RootController):
#@validate(validators={'karma': validators.Int()})
@validate(form=comment_form)
@identity.require(identity.not_anonymous())
- def comment(self, text, title, karma=0, tg_errors=None):
+ def comment(self, text, title, karma=0, tg_errors=None, email=True):
""" Add a comment to an update.
Arguments:
@@ -1314,7 +1314,7 @@ class Root(controllers.RootController):
else:
text = textwrap.TextWrapper(width=80,
break_long_words=False).fill(text)
- update.comment(text, karma)
+ update.comment(text, karma, email=email)
if request_format() == 'json':
return dict(update=update.__json__())
raise redirect(update.get_url())
diff --git a/bodhi/model.py b/bodhi/model.py
index 0e1fab7..b77d52e 100644
--- a/bodhi/model.py
+++ b/bodhi/model.py
@@ -800,7 +800,7 @@ class PackageUpdate(SQLObject):
color = '#00ff00' # green
return color
- def comment(self, text, karma=0, author=None, anonymous=False):
+ def comment(self, text, karma=0, author=None, anonymous=False, email=True):
""" Add a comment to this update, adjusting the karma appropriately.
Each user has the ability to comment as much as they want, but only
@@ -897,7 +897,8 @@ class PackageUpdate(SQLObject):
mail.send(self.submitter, 'unstable', self)
# Send a notification to everyone that has commented on this update
- mail.send(self.people_to_notify(), 'comment', self)
+ if email:
+ mail.send(self.people_to_notify(), 'comment', self)
def unpush(self):
""" Move this update back to its dist-fX-updates-candidate tag """
12 years, 11 months
Bodhi Patch - Templates and new metric calculation
by Corey Maynard
This patch makes some minor changes to the templates, and fixes how
clicking Add another build for buildroot overrides duplicated the
searchbox instead of the input box.
Also, adds a new metric calculation to find out what updates spent the
longest amount of time in Testing.
Corey Maynard
12 years, 11 months
bodhi/tools
by Luke Macken
bodhi/tools/metrics.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 96c09fd0ea39f425d22007be8878f6223d0c4dbc
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 16:01:52 2011 -0400
fix a bug in our metrics
diff --git a/bodhi/tools/metrics.py b/bodhi/tools/metrics.py
index 7193b46..cd816c5 100755
--- a/bodhi/tools/metrics.py
+++ b/bodhi/tools/metrics.py
@@ -94,7 +94,7 @@ def main():
if comment.text == 'This update has reached the stable karma threshold and will be pushed to the stable updates repository':
data['num_stablekarma'] += 1
- elif comment.text.endswith('days in testing and can be pushed to stable now if the maintainer wishes'):
+ elif comment.text and comment.text.endswith('days in testing and can be pushed to stable now if the maintainer wishes'):
data['num_testingtime'] += 1
# For figuring out if an update has received feedback or not
12 years, 11 months
Question About Updates Testing Metrics
by Tim Flink
I was talking to some of the other Fedora QA people about how to
encourage more testing of F(n-1) so that we don't have quite so many
updates languishing in updates-testing and one of the things that came
up was more data on the testing of updates.
I know that I could write some code to pull data from bodhi but since
there are already some metrics there, I figured that I would ask you all
about it first to see if it might make sense to have them in bodhi
instead of writing my own standalone metrics..
My first thoughts on what we would like to see are:
- Most active proventesters for a release in the last X days
- Possibly in the form of karma given, by tester in the last X days
- Most active proventesters for a given component
- Most active non-proventesters karma givers
Do you have any thoughts on whether these kinds of metrics would be
appropriate to include in bodhi? If not, do you have a suggestion for
gathering the data I would need other than the bodhi client? Pulling
down data through the bodhi client and populating my own database just
seems like a rather long and obtuse way of going about things.
Definitely do-able but not necessarily ideal.
Thanks,
Tim
12 years, 11 months
bodhi/tools
by Luke Macken
bodhi/tools/metrics.py | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
New commits:
commit 174f6f4391eee6cf80628c138d96ebb0c6af3f4c
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 15:34:59 2011 -0400
A couple new metrics:
- # of updates that reached the stable karma threshold
- # of updates that reached the minimum time in testing threshold
diff --git a/bodhi/tools/metrics.py b/bodhi/tools/metrics.py
index 2e9ffeb..7193b46 100755
--- a/bodhi/tools/metrics.py
+++ b/bodhi/tools/metrics.py
@@ -39,6 +39,8 @@ def main():
'num_critpath': 0,
'num_critpath_approved': 0,
'num_critpath_unapproved': 0,
+ 'num_stablekarma': 0,
+ 'num_testingtime': 0,
'critpath_without_karma': set(),
'stable_with_negative_karma': PackageUpdate.select(
AND(PackageUpdate.q.releaseID==release.id,
@@ -90,6 +92,11 @@ def main():
data['proventesters'].add(comment.author_name)
data['proventesters_%d' % comment.karma] += 1
+ if comment.text == 'This update has reached the stable karma threshold and will be pushed to the stable updates repository':
+ data['num_stablekarma'] += 1
+ elif comment.text.endswith('days in testing and can be pushed to stable now if the maintainer wishes'):
+ data['num_testingtime'] += 1
+
# For figuring out if an update has received feedback or not
if not feedback_done:
if (not comment.author.startswith('bodhi')
@@ -172,16 +179,22 @@ def main():
print " * %d anonymous users gave feedback (%0.2f%%)" % (
data['num_anon_feedback'], float(data['num_anon_feedback']) /
(data['num_anon_feedback'] + sum(data['karma'].values())) * 100)
- print " * %d out of %d stable updates went through testing (%0.2f%%)" %(
- data['num_tested'], data['num_stable'],
- float(data['num_tested']) / data['num_stable'] * 100)
+# This does not take into account updates that reach stablekarma before being pushed to testing!
+# print " * %d out of %d stable updates went through testing (%0.2f%%)" %(
+# data['num_tested'], data['num_stable'],
+# float(data['num_tested']) / data['num_stable'] * 100)
+ print " * %d updates reached the stable karma threshold (%0.2f%%)" %(
+ data['num_stablekarma'],
+ float(data['num_stablekarma']) / data['num_stable'] * 100)
+ print " * %d updates reached the minimum time in testing threshold (%0.2f%%)" % (
+ data['num_testingtime'],
+ float(data['num_testingtime']) / data['num_stable'] * 100)
print " * %d went from testing to stable *without* karma (%0.2f%%)" %(
data['num_tested_without_karma'],
float(data['num_tested_without_karma']) /
data['num_tested'] * 100)
print " * %d updates were pushed to stable with negative karma (%0.2f%%)" % (
data['stable_with_negative_karma'], float(data['stable_with_negative_karma']) / data['num_stable'] * 100)
- # TODO: pushed with negative karma
print " * %d critical path updates pushed to stable *without* karma" % (
len(data['critpath_without_karma']))
#for update in data['critpath_without_karma']:
12 years, 11 months
3 commits - bodhi.spec bodhi/tools
by Luke Macken
bodhi.spec | 2 +-
bodhi/tools/metrics.py | 7 ++++---
2 files changed, 5 insertions(+), 4 deletions(-)
New commits:
commit 79b689700e4141178512a7a7e4ff965effb781d5
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 14:25:34 2011 -0400
Minor tweak
diff --git a/bodhi/tools/metrics.py b/bodhi/tools/metrics.py
index 059b8c1..2e9ffeb 100755
--- a/bodhi/tools/metrics.py
+++ b/bodhi/tools/metrics.py
@@ -145,6 +145,7 @@ def main():
data['deltas'].sort()
print " * %d updates" % data['num_updates']
+ print " * %d packages updated" % (len(data['packages']))
for status in statuses:
print " * %d %s updates" % (data['num_%s' % status], status)
for type in types:
@@ -192,7 +193,6 @@ def main():
data['deltas'][len(data['deltas']) / 2].days)
print " * mode = %d days" % (
sorted(data['occurrences'].items(), key=itemgetter(1))[-1][0])
- print " * %d packages updated" % (len(data['packages']))
#for package in sorted(data['packages'].items(), key=itemgetter(1), reverse=True):
# print " * %s: %d" % (package[0].name, package[1])
print
commit 8276228bf02f2fc95bd24e350b707c75950a3988
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 14:25:10 2011 -0400
Fix our "critpath pushed to stable w/o karma" metric
diff --git a/bodhi/tools/metrics.py b/bodhi/tools/metrics.py
index bd40eff..059b8c1 100755
--- a/bodhi/tools/metrics.py
+++ b/bodhi/tools/metrics.py
@@ -134,7 +134,8 @@ def main():
if status in ('testing', 'pending'):
data['num_critpath_unapproved'] += 1
data['num_critpath'] += 1
- if not feedback_done:
+ #if not feedback_done:
+ if update.status == 'stable' and update.karma == 0:
data['critpath_without_karma'].add(update)
if testingtime_done:
data['num_tested'] += 1
@@ -180,7 +181,7 @@ def main():
print " * %d updates were pushed to stable with negative karma (%0.2f%%)" % (
data['stable_with_negative_karma'], float(data['stable_with_negative_karma']) / data['num_stable'] * 100)
# TODO: pushed with negative karma
- print " * %d critical path updates pushed *without* karma" % (
+ print " * %d critical path updates pushed to stable *without* karma" % (
len(data['critpath_without_karma']))
#for update in data['critpath_without_karma']:
# print " * %s submitted by %s" % (update.title, update.submitter)
commit b6a4858af5e39f0d918426e440b02a6ae48adf86
Author: Luke Macken <lmacken(a)redhat.com>
Date: Thu Apr 28 14:24:32 2011 -0400
Set our mod_wsgi config to noreplace in our spec
diff --git a/bodhi.spec b/bodhi.spec
index c1bcaea..6c66491 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -106,7 +106,7 @@ rm -rf bodhi/tests bodhi/tools/test-bodhi.py
%{python_sitelib}/%{name}/
%{_bindir}/start-%{name}
%{_bindir}/%{name}-*
-%{_sysconfdir}/httpd/conf.d/bodhi.conf
+%config(noreplace) %{_sysconfdir}/httpd/conf.d/bodhi.conf
%dir %{_sysconfdir}/bodhi/
%attr(-,apache,root) %{_datadir}/%{name}
%attr(-,apache,root) %config(noreplace) %{_sysconfdir}/bodhi/*
12 years, 11 months
bodhi/overrides.py
by Luke Macken
bodhi/overrides.py | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
New commits:
commit ab0a20f4e07fa79803c7ce1ca06552e7ad4ef14e
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Apr 26 17:25:38 2011 -0400
Some identity fixes for buildroot overrides
diff --git a/bodhi/overrides.py b/bodhi/overrides.py
index d443645..6b75a25 100644
--- a/bodhi/overrides.py
+++ b/bodhi/overrides.py
@@ -33,8 +33,8 @@ log = logging.getLogger(__name__)
override_form = BuildRootOverrideForm()
class BuildRootOverrideController(Controller):
- require = identity.not_anonymous()
+ @identity.require(identity.not_anonymous())
@expose(template="bodhi.templates.overrides")
@paginate('overrides', default_order='-date_submitted',
limit=20, max_limit=1000)
@@ -47,6 +47,7 @@ class BuildRootOverrideController(Controller):
return dict(overrides=overrides, title='Buildroot Overrides',
num_items=overrides.count())
+ @identity.require(identity.not_anonymous())
@expose(template="bodhi.templates.form")
def new(self, tg_errors=None, *args, **kw):
#if tg_errors:
@@ -56,6 +57,7 @@ class BuildRootOverrideController(Controller):
return dict(form=override_form, values={'expiration': expiration},
action=url('/override/save'), title='Buildroot Overrides')
+ @identity.require(identity.not_anonymous())
@expose(allow_json=True)
def expire(self, build, *args, **kw):
""" Expire a given override """
@@ -74,6 +76,7 @@ class BuildRootOverrideController(Controller):
return dict()
raise redirect('/override')
+ @identity.require(identity.not_anonymous())
@expose('json')
@validate(form=override_form)
@error_handler(new)
@@ -96,6 +99,9 @@ class BuildRootOverrideController(Controller):
people, groups = get_pkg_pushers(n)
if identity.current.user_name not in people[0]:
flash("Error: You do not have commit privileges to %s" % n)
+ if request_format() == 'json':
+ return dict()
+ raise redirect('/override/new')
# Make sure the build is tagged correctly
try:
12 years, 11 months
bodhi.egg-info/PKG-INFO bodhi.egg-info/SOURCES.txt bodhi/release.py bodhi.spec
by Luke Macken
bodhi.egg-info/PKG-INFO | 2 +-
bodhi.egg-info/SOURCES.txt | 3 +++
bodhi.spec | 2 +-
bodhi/release.py | 2 +-
4 files changed, 6 insertions(+), 3 deletions(-)
New commits:
commit 9f8a64eeb4351b6b7ee9cc7c7cae53bbe981d41f
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Apr 26 17:00:27 2011 -0400
prep for 0.7.16
diff --git a/bodhi.egg-info/PKG-INFO b/bodhi.egg-info/PKG-INFO
index b673b50..a057c64 100644
--- a/bodhi.egg-info/PKG-INFO
+++ b/bodhi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: bodhi
-Version: 0.7.15
+Version: 0.7.16
Summary: Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution
Home-page: https://fedorahosted.org/bodhi
Author: Luke Macken
diff --git a/bodhi.egg-info/SOURCES.txt b/bodhi.egg-info/SOURCES.txt
index d6812bf..41a07b8 100644
--- a/bodhi.egg-info/SOURCES.txt
+++ b/bodhi.egg-info/SOURCES.txt
@@ -25,6 +25,7 @@ bodhi/metrics.py
bodhi/model.py
bodhi/modifyrepo.py
bodhi/new.py
+bodhi/overrides.py
bodhi/release.py
bodhi/rss.py
bodhi/search.py
@@ -145,6 +146,8 @@ bodhi/templates/metrics.kid
bodhi/templates/mine.kid
bodhi/templates/new.kid
bodhi/templates/obsolete.kid
+bodhi/templates/overrideform.kid
+bodhi/templates/overrides.kid
bodhi/templates/packagefield.kid
bodhi/templates/pending.kid
bodhi/templates/pkg.kid
diff --git a/bodhi.spec b/bodhi.spec
index b104095..c1bcaea 100644
--- a/bodhi.spec
+++ b/bodhi.spec
@@ -2,7 +2,7 @@
%{!?pyver: %define pyver %(%{__python} -c "import sys ; print sys.version[:3]")}
Name: bodhi
-Version: 0.7.15
+Version: 0.7.16
Release: 1%{?dist}
Summary: A modular framework that facilitates publishing software updates
Group: Applications/Internet
diff --git a/bodhi/release.py b/bodhi/release.py
index 1f5bb51..a70b9ef 100644
--- a/bodhi/release.py
+++ b/bodhi/release.py
@@ -1,4 +1,4 @@
-VERSION = '0.7.15'
+VERSION = '0.7.16'
NAME = 'bodhi'
DESCRIPTION = 'Bodhi is a modular web-system that facilitates the process of publishing updates for a Fedora-based software distribution'
AUTHOR = 'Luke Macken'
12 years, 11 months
bodhi/config bodhi/jobs.py bodhi/masher.py bodhi/overrides.py bodhi/widgets.py
by Luke Macken
bodhi/config/app.cfg | 2 +-
bodhi/jobs.py | 4 ++--
bodhi/masher.py | 17 +++++++++--------
bodhi/overrides.py | 43 +++++++++++++++++++++++++------------------
bodhi/widgets.py | 3 ++-
5 files changed, 39 insertions(+), 30 deletions(-)
New commits:
commit 2b96812f14bb9320b7d40a192dede24cd4c55b85
Author: Luke Macken <lmacken(a)redhat.com>
Date: Tue Apr 26 16:58:56 2011 -0400
More buildroot override changes
- Add a calendar date picker for expiration (defaults to 1 day)
- Make our koji handling more robust
- Improved error handling
- Auto expire updates once they go to stable (not testing)
- Run the auto-expiration job every hour
diff --git a/bodhi/config/app.cfg b/bodhi/config/app.cfg
index 73d8911..a500b02 100644
--- a/bodhi/config/app.cfg
+++ b/bodhi/config/app.cfg
@@ -220,7 +220,7 @@ feeds.max_entries = 20
## Buildroot Override Settings
# Number of days before expiring overrides
-buildroot_overrides.expire_after = 4
+buildroot_overrides.expire_after = 1
# VIEW
diff --git a/bodhi/jobs.py b/bodhi/jobs.py
index 4b0bbf3..6e65508 100644
--- a/bodhi/jobs.py
+++ b/bodhi/jobs.py
@@ -272,7 +272,7 @@ def schedule():
log.debug("Scheduling expire_buildroot_overrides job")
scheduler.add_interval_task(action=expire_buildroot_overrides,
# Run every 6 hours
- initialdelay=21600,
- interval=21600)
+ initialdelay=3600,
+ interval=3600)
#weekdays=range(1,8),
#timeonday=(0,0))
diff --git a/bodhi/masher.py b/bodhi/masher.py
index 3247df9..cc4553f 100644
--- a/bodhi/masher.py
+++ b/bodhi/masher.py
@@ -476,14 +476,15 @@ class MashTask(Thread):
def obsolete_buildroot_overrides(self):
""" Obsolete any buildroot overrides that are in this push """
for update in self.updates:
- for build in update.builds:
- try:
- override = BuildRootOverride.byBuild(build.nvr)
- log.info('Expiring buildroot override: %s' % build.nvr)
- override.untag()
- override.destroySelf()
- except SQLObjectNotFound:
- pass
+ if update.request == 'stable':
+ for build in update.builds:
+ try:
+ override = BuildRootOverride.byBuild(build.nvr)
+ log.info('Expiring buildroot override: %s' % build.nvr)
+ override.untag()
+ override.destroySelf()
+ except SQLObjectNotFound:
+ pass
# With a large pushes, this tends to cause much buildsystem churn, as well
# as polluting the tag history.
diff --git a/bodhi/overrides.py b/bodhi/overrides.py
index 2bc9a80..d443645 100644
--- a/bodhi/overrides.py
+++ b/bodhi/overrides.py
@@ -39,19 +39,22 @@ class BuildRootOverrideController(Controller):
@paginate('overrides', default_order='-date_submitted',
limit=20, max_limit=1000)
def index(self, build=None, tg_errors=None, *args, **kw):
- overrides = BuildRootOverride.select()
+ if 'releng' in identity.current.groups:
+ overrides = BuildRootOverride.select()
+ else:
+ overrides = BuildRootOverride.select(
+ BuildRootOverride.q.submitter == identity.current.user_name)
return dict(overrides=overrides, title='Buildroot Overrides',
num_items=overrides.count())
@expose(template="bodhi.templates.form")
- def new(self, build=None, tg_errors=None, *args, **kw):
- if tg_errors:
- flash(tg_errors)
- if build:
- log.debug('redirecting!')
- raise redirect('/override/%s' % build)
- return dict(form=override_form, values={}, action=url('/override/save'),
- title='Buildroot Overrides')
+ def new(self, tg_errors=None, *args, **kw):
+ #if tg_errors:
+ # flash(tg_errors)
+ expiration = datetime.utcnow() + \
+ timedelta(days=config.get('buildroot_overrides.expire_after', 1))
+ return dict(form=override_form, values={'expiration': expiration},
+ action=url('/override/save'), title='Buildroot Overrides')
@expose(allow_json=True)
def expire(self, build, *args, **kw):
@@ -74,8 +77,17 @@ class BuildRootOverrideController(Controller):
@expose('json')
@validate(form=override_form)
@error_handler(new)
- def save(self, builds, notes, *args, **kw):
+ def save(self, builds, notes, expiration, *args, **kw):
log.debug('BuildRootOverrideController.save(%s)' % builds)
+
+ try:
+ koji = get_session()
+ except Exception, e:
+ flash('Unable to connect to Koji')
+ if request_format() == 'json':
+ return dict()
+ raise redirect('/override/new')
+
for build in builds:
release = None
n, v, r = get_nvr(build)
@@ -86,7 +98,6 @@ class BuildRootOverrideController(Controller):
flash("Error: You do not have commit privileges to %s" % n)
# Make sure the build is tagged correctly
- koji = get_session()
try:
tags = [tag['name'] for tag in koji.listTags(build)]
except Exception, e:
@@ -109,19 +120,15 @@ class BuildRootOverrideController(Controller):
if not release:
flash('Error: Could not determine release for %s with tags %s' %
- (builds, tags))
+ (build, map(str, tags)))
if request_format() == 'json':
return dict()
- raise redirect('/override')
+ raise redirect('/override/new')
# Create a new overrides object
override = BuildRootOverride(build=build,
notes=notes, submitter=identity.current.user_name,
- releaseID=release.id)
-
- now = datetime.utcnow()
- override.expiration = now + \
- timedelta(days=config.get('buildroot_overrides.expire_after'))
+ expiration=expiration, releaseID=release.id)
# Tag the build
override.tag()
diff --git a/bodhi/widgets.py b/bodhi/widgets.py
index 3f294f1..3b897e9 100644
--- a/bodhi/widgets.py
+++ b/bodhi/widgets.py
@@ -17,7 +17,7 @@ from turbogears import validators, config
from turbogears.widgets import (Form, TextField, SubmitButton, TextArea,
AutoCompleteField, SingleSelectField, CheckBox,
HiddenField, RemoteForm, CheckBoxList, JSLink,
- DataGrid, CSSLink)
+ DataGrid, CSSLink, CalendarDatePicker)
from bodhi.util import make_update_link, url
from bodhi.validators import *
@@ -203,5 +203,6 @@ class BuildRootOverrideForm(Form):
validator=AutoCompleteValidator()),
TextArea('notes', validator=validators.UnicodeString(),
rows=13, cols=65),
+ CalendarDatePicker('expiration')
]
submit_text = "Submit"
12 years, 11 months