--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -14,13 +14,14 @@
from bson import ObjectId
from webhelpers import feedgenerator as FG
+from ming import schema
from ming.orm.ormsession import ThreadLocalORMSession
from ming.utils import LazyProperty
# Pyforge-specific imports
from allura import model as M
from allura.lib import helpers as h
-from allura.app import Application, SitemapEntry, DefaultAdminController
+from allura.app import Application, SitemapEntry, DefaultAdminController, ConfigOption
from allura.lib.search import search_artifact
from allura.lib.decorators import require_post
from allura.lib.security import require_access, has_access, require
@@ -36,6 +37,7 @@
from forgetracker import model as TM
from forgetracker import version
+from forgetracker.widgets.admin import OptionsAdmin
from forgetracker.widgets.ticket_form import TicketForm, TicketCustomField
from forgetracker.widgets.bin_form import BinForm
from forgetracker.widgets.ticket_search import TicketSearchResults, MassEdit, MassEditForm
@@ -72,11 +74,17 @@
field_admin = TrackerFieldAdmin()
field_display = TrackerFieldDisplay()
ticket_custom_field = TicketCustomField
+ options_admin = OptionsAdmin()
class ForgeTrackerApp(Application):
__version__ = version.__version__
permissions = ['configure', 'read', 'write', 'save_searches',
'unmoderated_post', 'post', 'moderate', 'admin']
+ config_options = Application.config_options + [
+ ConfigOption('TicketMonitoringEmail', str, ''),
+ ConfigOption('TicketMonitoringType',
+ schema.OneOf('NewTicketsOnly', 'AllTicketChanges'), None)
+ ]
searchable=True
tool_label='Tickets'
default_mount_label='Tickets'
@@ -132,7 +140,8 @@
def admin_menu(self):
admin_url = c.project.url()+'admin/'+self.config.options.mount_point+'/'
links = [SitemapEntry('Field Management', admin_url + 'fields'),
- SitemapEntry('Edit Searches', admin_url + 'bins/')]
+ SitemapEntry('Edit Searches', admin_url + 'bins/'),
+ SitemapEntry('Options', admin_url + 'options', className='admin_modal')]
if self.permissions and has_access(self, 'configure')():
links.append(SitemapEntry('Permissions', admin_url + 'permissions', className='nav_child'))
return links
@@ -877,7 +886,7 @@
for k in data['custom_fields']:
data['custom_fields.'+k] = data['custom_fields'][k]
self._update_ticket(data)
-
+
@require_post()
def _update_ticket(self, post_data):
require_access(self.ticket, 'write')
@@ -950,6 +959,15 @@
changelist=changes.get_changed())
if post is None:
post = thread.add_post(text=change_text)
+ monitoring_email = c.app.config.options.get('TicketMonitoringEmail')
+ monitoring_type = c.app.config.options.get('TicketMonitoringType')
+ if monitoring_email and monitoring_type == 'AllTicketChanges':
+ artifact = post.thread.artifact or post.thread
+ n = M.Notification.query.get(_id=artifact.url() + post._id)
+ if not n:
+ n = M.Notification._make_notification(artifact, 'message',
+ post=post)
+ n.send_simple(monitoring_email)
else:
post.text += '\n\n' + change_text
self.ticket.commit()
@@ -997,6 +1015,14 @@
def fields(self, **kw):
c.form = W.field_admin
return dict(app=self.app, globals=self.app.globals)
+
+ @expose('jinja:forgetracker:templates/tracker/admin_options.html')
+ def options(self):
+ c.options_admin = W.options_admin
+ return dict(app=self.app, form_value=dict(
+ TicketMonitoringType=self.app.config.options.get('TicketMonitoringType'),
+ TicketMonitoringEmail=self.app.config.options.get('TicketMonitoringEmail')
+ ))
@expose()
def update_tickets(self, **post_data):