def _render_editor(self, req, milestone): # Suggest a default due time of 18:00 in the user's timezone now = datetime.now(req.tz) default_due = datetime(now.year, now.month, now.day, 18) if now.hour > 18: default_due += timedelta(days=1) default_due = to_datetime(default_due, req.tz) data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': default_due, 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource)] data['milestone_groups'] = group_milestones(milestones, 'TICKET_ADMIN' in req.perm) else: req.perm(milestone.resource).require('MILESTONE_CREATE') chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) return 'milestone_edit.html', data, None
def _render_editor(self, req, milestone): data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': self.get_default_due(req), 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource)] data['milestone_groups'] = \ group_milestones(milestones, 'TICKET_ADMIN' in req.perm) data['num_open_tickets'] = \ get_num_tickets_for_milestone(self.env, milestone, exclude_closed=True) data['retarget_to'] = self.default_retarget_to else: req.perm(milestone.resource).require('MILESTONE_CREATE') if milestone.name: add_notice(req, _("Milestone %(name)s does not exist. You " "can create it here.", name=milestone.name)) chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) add_stylesheet(req, 'common/css/roadmap.css') return 'milestone_edit.html', data
def _render_editor(self, req, milestone): # Suggest a default due time of 18:00 in the user's timezone default_due = datetime.now(req.tz).replace(hour=18, minute=0, second=0, microsecond=0) if default_due <= datetime.now(utc): default_due += timedelta(days=1) data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': default_due, 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [ m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource) ] data['milestone_groups'] = group_milestones( milestones, 'TICKET_ADMIN' in req.perm) else: req.perm(milestone.resource).require('MILESTONE_CREATE') chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) return 'milestone_edit.html', data, None
def render_admin_panel(self, req, cat, page, path_info): req.perm(Resource('blog')).require('BLOG_ADMIN') blog_admin = {} blog_core = FullBlogCore(self.env) if req.method == 'POST': self.config.set('fullblog', 'num_items_front', req.args.getint('numpostsfront')) self.config.set('fullblog', 'default_postname', req.args.get('defaultpostname')) self.config.save() blog_core.set_bloginfotext(req.args.get('bloginfotext')) req.redirect( req.href.admin(req.args['cat_id'], req.args['panel_id'])) blog_admin['bloginfotext'] = blog_core.get_bloginfotext() blog_admin['numpostsfront'] = \ self.config.getint('fullblog', 'num_items_front') blog_admin['defaultpostname'] = \ self.config.get('fullblog', 'default_postname') chrome = Chrome(self.env) chrome.add_auto_preview(req) chrome.add_wiki_toolbars(req) return 'fullblog_admin.html', {'blog_admin': blog_admin}
def _render_editor(self, req, milestone): data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': self.get_default_due(req), 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource)] data['milestone_groups'] = group_milestones(milestones, 'TICKET_ADMIN' in req.perm) data['num_open_tickets'] = milestone \ .get_num_tickets(exclude_closed=True) data['retarget_to'] = self.default_retarget_to else: req.perm(milestone.resource).require('MILESTONE_CREATE') if milestone.name: add_notice(req, _("Milestone %(name)s does not exist. You can" " create it here.", name=milestone.name)) chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) add_stylesheet(req, 'common/css/roadmap.css') return 'milestone_edit.html', data, None
def _render_editor(self, req, id, copy): if id != self.REPORT_LIST_ID: req.perm(self.realm, id).require('REPORT_MODIFY') r = Report(self.env, id) title, description, query = r.title, r.description, r.query else: req.perm(self.realm).require('REPORT_CREATE') title = description = query = '' # an explicitly given 'query' parameter will override the saved query query = req.args.get('query', query) if copy: title += ' (copy)' if copy or id == self.REPORT_LIST_ID: data = {'action': 'new', 'error': None} else: data = {'action': 'edit', 'error': req.args.get('error')} data['report'] = {'id': id, 'title': title, 'sql': query, 'description': description} chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) return data
def post_process_request(self, req, template, data, metadata): if req.path_info == '/query' and data is not None and \ 'TICKET_BATCH_MODIFY' in req.perm('ticket'): self.add_template_data(req, data, data['tickets']) chrome = Chrome(self.env) chrome.add_auto_preview(req) chrome.add_wiki_toolbars(req) return template, data, metadata
def _render_editor(self, req, product): """common processing for creating rendering the edit page""" if product._exists: req.perm(product.resource).require('PRODUCT_MODIFY') else: req.perm(product.resource).require('PRODUCT_CREATE') chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) data = {'product': product} return 'product_edit.html', data, None
def render_admin_panel(self, req, cat, page, path_info, user='******'): req.perm(Resource('portfolio')).require('TRAC_ADMIN') data = {} if req.method == "POST": submit = req.args.get('submit').strip() if submit == 'Add': name = req.args.get('name').strip() description = req.args.get('description').strip() sql = "INSERT INTO portfolios (name, description, createtime, user) " \ " VALUES('{}','{}',now(),'{}')".format(name, description, user) self.env.db_transaction(sql) add_notice(req, 'Portfolio has been added.') elif submit == 'Remove': sels = req.args.getlist('sels') if sels is not None and len(sels) > 0: for sel in sels: sql = "DELETE FROM portfolios WHERE id ={}".format( int(sel)) self.env.db_transaction(sql) add_notice(req, 'Portfolio has been deleted.') elif submit == 'Save': sel = req.args.get('sel').strip() name = req.args.get('name').strip() description = req.args.get('description').strip() sql = "UPDATE portfolios SET name='{}', description='{}', createtime=now(), user='******' " \ " WHERE id={}".format(name, description, user, int(sel)) self.env.db_transaction(sql) add_notice(req, 'Portfolio has been saved.') else: sel = req.args.get('sel') if sel is not None: sql = "SELECT id, name, description, createtime, user FROM portfolios where id={}".format( int(sel)) cursor = self.env.db_query(sql) if len(cursor) > 0: data['view'] = 'detail' data['sel'] = sel data['name'] = cursor[0][1] data['description'] = cursor[0][2] cursor = self.env.db_query( "SELECT id, name, description, createtime, user FROM portfolios ORDER BY name" ) data['portfolios'] = [(row[0], row[1], row[2], row[3], row[4]) for row in cursor] chrome = Chrome(self.env) chrome.add_auto_preview(req) chrome.add_wiki_toolbars(req) return 'portfolio_admin.html', data, {}
def _render_editor(self, req, product): """common processing for creating rendering the edit page""" if product._exists: req.perm(product.resource).require('PRODUCT_MODIFY') else: req.perm(product.resource).require('PRODUCT_CREATE') chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) data = {'product': product, 'context': web_context(req, product.resource)} return 'product_edit.html', data, None
def _render_editor(self, req, milestone): # Suggest a default due time of 18:00 in the user's timezone now = datetime.now(req.tz) default_due = datetime(now.year, now.month, now.day, 18) if now.hour > 18: default_due += timedelta(days=1) default_due = to_datetime(default_due, req.tz) data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': default_due, 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [ m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource) ] num_tickets = self.env.db_query( """ SELECT COUNT(*) FROM ticket WHERE milestone=%s""", (milestone.name, ))[0][0] data['milestone_groups'] = group_milestones( milestones, 'TICKET_ADMIN' in req.perm) data['num_tickets'] = num_tickets data['retarget_to'] = self.default_retarget_to else: req.perm(milestone.resource).require('MILESTONE_CREATE') if milestone.name: add_notice( req, _( "Milestone %(name)s does not exist. You can" " create it here.", name=milestone.name)) chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) add_stylesheet(req, 'common/css/roadmap.css') return 'milestone_edit.html', data, None
def _render_editor(self, req, milestone): # Suggest a default due time of 18:00 in the user's timezone now = datetime_now(req.tz) default_due = datetime(now.year, now.month, now.day, 18) if now.hour > 18: default_due += timedelta(days=1) default_due = to_datetime(default_due, req.tz) data = { 'milestone': milestone, 'datetime_hint': get_datetime_format_hint(req.lc_time), 'default_due': default_due, 'milestone_groups': [], } if milestone.exists: req.perm(milestone.resource).require('MILESTONE_MODIFY') milestones = [ m for m in Milestone.select(self.env) if m.name != milestone.name and 'MILESTONE_VIEW' in req.perm(m.resource) ] data['milestone_groups'] = group_milestones( milestones, 'TICKET_ADMIN' in req.perm) else: req.perm(milestone.resource).require('MILESTONE_CREATE') if milestone.name: add_notice( req, _( "Milestone %(name)s does not exist. You can" " create it here.", name=milestone.name)) chrome = Chrome(self.env) chrome.add_jquery_ui(req) chrome.add_wiki_toolbars(req) return 'milestone_edit.html', data, None
def _render_admin_panel(self, req, cat, page, component): # Detail view? if component: comp = model.Component(self.env, component) if req.method == 'POST': if req.args.get('save'): comp.name = req.args.get('name') comp.owner = req.args.get('owner') comp.description = req.args.get('description') comp.update() add_notice(req, _("Your changes have been saved.")) req.redirect(req.href.admin(cat, page)) elif req.args.get('cancel'): req.redirect(req.href.admin(cat, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data = {'view': 'detail', 'component': comp} else: default = self.config.get('ticket', 'default_component') if req.method == 'POST': # Add Component if req.args.get('add') and req.args.get('name'): comp = model.Component(self.env) comp.name = req.args.get('name') comp.owner = req.args.get('owner') comp.insert() add_notice(req, _('The component "%(name)s" has been ' 'added.', name=comp.name)) req.redirect(req.href.admin(cat, page)) # Remove components elif req.args.get('remove'): sel = req.args.getlist('sel') if not sel: raise TracError(_("No component selected")) with self.env.db_transaction: for name in sel: model.Component(self.env, name).delete() if name == default: self.config.set('ticket', 'default_component', '') self._save_config(req) add_notice(req, _("The selected components have been " "removed.")) req.redirect(req.href.admin(cat, page)) # Set default component elif req.args.get('apply'): name = req.args.get('default') if name and name != default: self.log.info("Setting default component to %s", name) self.config.set('ticket', 'default_component', name) self._save_config(req) req.redirect(req.href.admin(cat, page)) # Clear default component elif req.args.get('clear'): self.log.info("Clearing default component") self.config.set('ticket', 'default_component', '') self._save_config(req) req.redirect(req.href.admin(cat, page)) data = {'view': 'list', 'components': list(model.Component.select(self.env)), 'default': default} owners = TicketSystem(self.env).get_allowed_owners() if owners is not None: owners.insert(0, '') data.update({'owners': owners}) return 'admin_components.html', data
def _render_admin_panel(self, req, cat, page, path_info): label = [gettext(each) for each in self._label] data = {'label_singular': label[0], 'label_plural': label[1], 'type': self._type} # Detail view? if path_info: enum = self._enum_cls(self.env, path_info) if req.method == 'POST': if req.args.get('save'): enum.name = req.args.get('name') enum.description = req.args.get('description') enum.update() add_notice(req, _("Your changes have been saved.")) req.redirect(req.href.admin(cat, page)) elif req.args.get('cancel'): req.redirect(req.href.admin(cat, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data.update({'view': 'detail', 'enum': enum}) else: default = self.config.get('ticket', 'default_%s' % self._type) if req.method == 'POST': # Add enum if req.args.get('add') and req.args.get('name'): enum = self._enum_cls(self.env) enum.name = req.args.get('name') enum.insert() add_notice(req, _('The %(field)s value "%(name)s" ' 'has been added.', field=label[0], name=enum.name)) req.redirect(req.href.admin(cat, page)) # Remove enums elif req.args.get('remove'): sel = req.args.getlist('sel') if not sel: raise TracError(_("No %s selected") % self._type) with self.env.db_transaction: for name in sel: self._enum_cls(self.env, name).delete() if name == default: self.config.set('ticket', 'default_%s' % self._type, '') self.config.save() add_notice(req, _("The selected %(field)s values have " "been removed.", field=label[0])) req.redirect(req.href.admin(cat, page)) # Apply changes elif req.args.get('apply'): # Set default value name = req.args.get('default') if name and name != default: self.log.info("Setting default %s to %s", self._type, name) self.config.set('ticket', 'default_%s' % self._type, name) self._save_config(req) # Change enum values order = {str(int(key[6:])): str(req.args.getint(key)) for key in req.args if key.startswith('value_')} values = {val: True for val in order.values()} if len(order) != len(values): raise TracError(_("Order numbers must be unique")) changed = False with self.env.db_transaction: for enum in self._enum_cls.select(self.env): new_value = order[enum.value] if new_value != enum.value: enum.value = new_value enum.update() changed = True if changed: add_notice(req, _("Your changes have been saved.")) req.redirect(req.href.admin(cat, page)) # Clear default elif req.args.get('clear'): self.log.info("Clearing default %s", self._type) self.config.set('ticket', 'default_%s' % self._type, '') self._save_config(req) req.redirect(req.href.admin(cat, page)) Chrome(self.env).add_jquery_ui(req) add_script(req, 'common/js/admin_enums.js') data.update(dict(enums=list(self._enum_cls.select(self.env)), default=default, view='list')) return 'admin_enums.html', data
def _render_admin_panel(self, req, cat, page, version): # Detail view? if version: ver = model.Version(self.env, version) if req.method == 'POST': if req.args.get('save'): ver.name = req.args.get('name') if req.args.get('time'): ver.time = user_time(req, parse_date, req.args.get('time'), hint='datetime') else: ver.time = None # unset ver.description = req.args.get('description') ver.update() add_notice(req, _("Your changes have been saved.")) req.redirect(req.href.admin(cat, page)) elif req.args.get('cancel'): req.redirect(req.href.admin(cat, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data = {'view': 'detail', 'version': ver} else: default = self.config.get('ticket', 'default_version') if req.method == 'POST': # Add Version if req.args.get('add') and req.args.get('name'): ver = model.Version(self.env) ver.name = req.args.get('name') if req.args.get('time'): ver.time = user_time(req, parse_date, req.args.get('time'), hint='datetime') ver.insert() add_notice(req, _('The version "%(name)s" has been ' 'added.', name=ver.name)) req.redirect(req.href.admin(cat, page)) # Remove versions elif req.args.get('remove'): sel = req.args.getlist('sel') if not sel: raise TracError(_("No version selected")) with self.env.db_transaction: for name in sel: model.Version(self.env, name).delete() if name == default: self.config.set('ticket', 'default_version', '') self._save_config(req) add_notice(req, _("The selected versions have been " "removed.")) req.redirect(req.href.admin(cat, page)) # Set default version elif req.args.get('apply'): name = req.args.get('default') if name and name != default: self.log.info("Setting default version to %s", name) self.config.set('ticket', 'default_version', name) self._save_config(req) req.redirect(req.href.admin(cat, page)) # Clear default version elif req.args.get('clear'): self.log.info("Clearing default version") self.config.set('ticket', 'default_version', '') self._save_config(req) req.redirect(req.href.admin(cat, page)) data = {'view': 'list', 'versions': list(model.Version.select(self.env)), 'default': default} Chrome(self.env).add_jquery_ui(req) data.update({'datetime_hint': get_datetime_format_hint(req.lc_time)}) return 'admin_versions.html', data
def _render_admin_panel(self, req, cat, page, milestone_name): perm_cache = req.perm('admin', 'ticket/' + self._type) # Detail view if milestone_name: milestone = model.Milestone(self.env, milestone_name) milestone_module = MilestoneModule(self.env) if req.method == 'POST': if 'save' in req.args: perm_cache.require('MILESTONE_MODIFY') if milestone_module.save_milestone(req, milestone): req.redirect(req.href.admin(cat, page)) elif 'cancel' in req.args: req.redirect(req.href.admin(cat, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data = {'view': 'detail', 'milestone': milestone, 'default_due': milestone_module.get_default_due(req)} # List view else: ticket_default = self.config.get('ticket', 'default_milestone') retarget_default = self.config.get('milestone', 'default_retarget_to') if req.method == 'POST': # Add milestone if 'add' in req.args and req.args.get('name'): perm_cache.require('MILESTONE_CREATE') name = req.args.get('name') try: model.Milestone(self.env, name=name) except ResourceNotFound: milestone = model.Milestone(self.env) milestone.name = name MilestoneModule(self.env).save_milestone(req, milestone) req.redirect(req.href.admin(cat, page)) else: add_warning(req, _('Milestone "%(name)s" already ' 'exists, please choose another ' 'name.', name=name)) # Remove milestone elif 'remove' in req.args: save = False perm_cache.require('MILESTONE_DELETE') sel = req.args.getlist('sel') if not sel: raise TracError(_("No milestone selected")) with self.env.db_transaction: for name in sel: milestone = model.Milestone(self.env, name) milestone.move_tickets(None, req.authname, "Milestone deleted") milestone.delete() if name == ticket_default: self.config.set('ticket', 'default_milestone', '') save = True if name == retarget_default: self.config.set('milestone', 'default_retarget_to', '') save = True if save: self._save_config(req) add_notice(req, _("The selected milestones have been " "removed.")) req.redirect(req.href.admin(cat, page)) # Set default milestone elif 'apply' in req.args: save = False name = req.args.get('ticket_default') if name and name != ticket_default: self.log.info("Setting default ticket " "milestone to %s", name) self.config.set('ticket', 'default_milestone', name) save = True retarget = req.args.get('retarget_default') if retarget and retarget != retarget_default: self.log.info("Setting default retargeting " "milestone to %s", retarget) self.config.set('milestone', 'default_retarget_to', retarget) save = True if save: self._save_config(req) req.redirect(req.href.admin(cat, page)) # Clear default milestone elif 'clear' in req.args: self.log.info("Clearing default ticket milestone " "and default retarget milestone") self.config.set('ticket', 'default_milestone', '') self.config.set('milestone', 'default_retarget_to', '') self._save_config(req) req.redirect(req.href.admin(cat, page)) # Get ticket count num_tickets = dict(self.env.db_query(""" SELECT milestone, COUNT(milestone) FROM ticket WHERE milestone != '' GROUP BY milestone """)) query_href = lambda name: req.href.query([('group', 'status'), ('milestone', name)]) data = {'view': 'list', 'milestones': model.Milestone.select(self.env), 'query_href': query_href, 'num_tickets': lambda m: num_tickets.get(m.name, 0), 'ticket_default': ticket_default, 'retarget_default': retarget_default} Chrome(self.env).add_jquery_ui(req) data.update({ 'datetime_hint': get_datetime_format_hint(req.lc_time), }) return 'admin_milestones.html', data
def render_admin_panel(self, req, category, page, path_info): # Retrieve info for all repositories rm = RepositoryManager(self.env) all_repos = rm.get_all_repositories() db_provider = self.env[DbRepositoryProvider] if path_info: # Detail view reponame = path_info if not is_default(path_info) else '' info = all_repos.get(reponame) if info is None: raise TracError( _("Repository '%(repo)s' not found", repo=path_info)) if req.method == 'POST': if req.args.get('cancel'): req.redirect(req.href.admin(category, page)) elif db_provider and req.args.get('save'): # Modify repository changes = {} valid = True for field in db_provider.repository_attrs: value = normalize_whitespace(req.args.get(field)) if (value is not None or field in ('hidden', 'sync_per_request')) \ and value != info.get(field): changes[field] = value if 'dir' in changes and not \ self._check_dir(req, changes['dir']): valid = False if valid and changes: db_provider.modify_repository(reponame, changes) add_notice(req, _('Your changes have been saved.')) name = req.args.get('name') pretty_name = name or '(default)' resync = tag.code('trac-admin "%s" repository resync ' '"%s"' % (self.env.path, pretty_name)) if 'dir' in changes: msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) elif 'type' in changes: msg = tag_( 'You may have to run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) if name and name != path_info and 'alias' not in info: cset_added = tag.code('trac-admin "%s" changeset ' 'added "%s" $REV' % (self.env.path, pretty_name)) msg = tag_( 'You will need to update your ' 'post-commit hook to call ' '%(cset_added)s with the new ' 'repository name.', cset_added=cset_added) add_notice(req, msg) if valid: req.redirect(req.href.admin(category, page)) chrome = Chrome(self.env) chrome.add_wiki_toolbars(req) chrome.add_auto_preview(req) data = {'view': 'detail', 'reponame': reponame} else: # List view if req.method == 'POST': # Add a repository if db_provider and req.args.get('add_repos'): name = req.args.get('name') pretty_name = name or '(default)' if name in all_repos: raise TracError( _('The repository "%(name)s" already ' 'exists.', name=pretty_name)) type_ = req.args.get('type') # Avoid errors when copy/pasting paths dir = normalize_whitespace(req.args.get('dir', '')) if name is None or type_ is None or not dir: add_warning( req, _('Missing arguments to add a ' 'repository.')) elif self._check_dir(req, dir): db_provider.add_repository(name, dir, type_) add_notice( req, _('The repository "%(name)s" has been ' 'added.', name=pretty_name)) resync = tag.code('trac-admin "%s" repository resync ' '"%s"' % (self.env.path, pretty_name)) msg = tag_( 'You should now run %(resync)s to ' 'synchronize Trac with the repository.', resync=resync) add_notice(req, msg) cset_added = tag.code('trac-admin "%s" changeset ' 'added "%s" $REV' % (self.env.path, pretty_name)) doc = tag.a(_("documentation"), href=req.href.wiki('TracRepositoryAdmin') + '#Synchronization') msg = tag_( 'You should also set up a post-commit hook ' 'on the repository to call %(cset_added)s ' 'for each committed changeset. See the ' '%(doc)s for more information.', cset_added=cset_added, doc=doc) add_notice(req, msg) # Add a repository alias elif db_provider and req.args.get('add_alias'): name = req.args.get('name') pretty_name = name or '(default)' alias = req.args.get('alias') if name is not None and alias is not None: try: db_provider.add_alias(name, alias) except self.env.db_exc.IntegrityError: raise TracError( _('The alias "%(name)s" already ' 'exists.', name=pretty_name)) add_notice( req, _('The alias "%(name)s" has been ' 'added.', name=pretty_name)) else: add_warning(req, _('Missing arguments to add an ' 'alias.')) # Refresh the list of repositories elif req.args.get('refresh'): pass # Remove repositories elif db_provider and req.args.get('remove'): sel = req.args.getlist('sel') if sel: for name in sel: db_provider.remove_repository(name) add_notice( req, _('The selected repositories have ' 'been removed.')) else: add_warning(req, _('No repositories were selected.')) req.redirect(req.href.admin(category, page)) data = {'view': 'list'} # Find repositories that are editable db_repos = {} if db_provider is not None: db_repos = dict(db_provider.get_repositories()) # Prepare common rendering data repositories = { reponame: self._extend_info(reponame, info.copy(), reponame in db_repos) for (reponame, info) in all_repos.iteritems() } types = sorted([''] + rm.get_supported_types()) data.update({ 'types': types, 'default_type': rm.default_repository_type, 'repositories': repositories, 'can_add_alias': any('alias' not in info for info in repositories.itervalues()) }) return 'admin_repositories.html', data
def process_request(self, req): if req.path_info.find('/trade/list') == 0: data = {} cursor = self.env.db_query( "SELECT id, portfolio, buysell, quantity, exchange, symbol, cash, currency, tradedate, tradeid FROM trades ORDER BY id" ) data['trades'] = [(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9]) for row in cursor] return 'trade_list.html', data, {} else: data = {} cursor = self.env.db_query( "SELECT value FROM parameters WHERE type='tolerance' and metric='quantity' LIMIT 1" ) data['tolerance'] = [(row[0]) for row in cursor] cursor = self.env.db_query( "SELECT metric, value FROM codes WHERE type='buysell' ORDER BY metric" ) data['buysellList'] = [(row[0], row[1]) for row in cursor] cursor = self.env.db_query( "SELECT metric, value FROM codes WHERE type='currency' ORDER BY metric" ) data['currencyList'] = [(row[0], row[1]) for row in cursor] cursor = self.env.db_query( "SELECT metric, value FROM codes WHERE type='exchange' ORDER BY metric" ) data['exchangeList'] = [(row[0], row[1]) for row in cursor] cursor = self.env.db_query( "SELECT name FROM portfolios ORDER BY name") data['portfolioList'] = [(row[0]) for row in cursor] cursor = self.env.db_query( "SELECT exchange, symbol, name FROM components ORDER BY exchange, symbol" ) data['symbolList'] = [(row[0], row[1], row[2]) for row in cursor] data['tradedate'] = datetime.now().strftime('%Y-%m-%d') if req.method == 'POST': portfolio = req.args.get('portfolio').strip() buysell = req.args.get('buysell').strip() quantity = req.args.get('quantity').strip() exchange = req.args.get('exchange').strip() cash = req.args.get('cash').strip() currency = req.args.get('currency').strip() temp = req.args.get('symbol').strip() tradedate = req.args.get('tradedate').strip() symbol = '' for row in cursor: if row[0] == exchange: if row[1] == temp: symbol = temp break elif row[2] == temp: symbol = row[1] break if symbol == '': data['portfolio'] = portfolio data['buysell'] = buysell data['quantity'] = quantity data['exchange'] = exchange data['currency'] = currency data['cash'] = cash data['symbol'] = temp data['tradedate'] = tradedate add_warning(req, 'Please enter valid symbol or name.') else: sql = "SELECT IFNULL(avg(close),0)*(1+(SELECT avg(value) FROM parameters WHERE type='tolerance' and metric='cash')) " \ " FROM prices WHERE exchange=%s and symbol=%s and datediff(now(), date) < 10" args = (exchange, symbol) cursor = self.env.db_query(sql, args) data['price'] = [(row[0]) for row in cursor] if float(data['price'][0]) <= 0: data['portfolio'] = portfolio data['buysell'] = buysell data['quantity'] = quantity data['exchange'] = exchange data['currency'] = currency data['cash'] = cash data['symbol'] = temp data['tradedate'] = tradedate add_warning(req, 'The security is no longer tradeable.') elif float(cash) / int(quantity) > float(data['price'][0]): data['portfolio'] = portfolio data['buysell'] = buysell data['quantity'] = quantity data['exchange'] = exchange data['currency'] = currency data['cash'] = cash data['symbol'] = temp data['tradedate'] = tradedate add_warning( req, 'The cash/quantity exceeds the price tolerance of the last 10 days.' ) else: sql = "INSERT INTO trades (portfolio,buysell,quantity,exchange,symbol,cash,currency,tradedate,tradeid) " \ " VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)" args = (portfolio, buysell, quantity, exchange, symbol, cash, currency, tradedate, user) self.env.db_transaction(sql, args) add_notice(req, 'Your trade has been saved.') chrome = Chrome(self.env) chrome.add_auto_preview(req) chrome.add_wiki_toolbars(req) return 'trade_view.html', data, {}
def process_request(self, req): """ Processing the request. """ req.perm('blog').assert_permission('BLOG_VIEW') blog_core = FullBlogCore(self.env) format = req.args.get('format', '').lower() command, pagename, path_items, listing_data = self._parse_path(req) action = req.args.get('action', 'view').lower() version = req.args.getint('version', 0) data = {} template = 'fullblog_view.html' data['blog_about'] = BlogPost(self.env, 'about') data['blog_infotext'] = blog_core.get_bloginfotext() blog_month_names = map_month_names( self.env.config.getlist('fullblog', 'month_names')) data['blog_month_names'] = blog_month_names self.log.debug("Blog debug: command=%r, pagename=%r, path_items=%r", command, pagename, path_items) if not command: # Request for just root (display latest) data['blog_post_list'] = [] count = 0 maxcount = self.num_items blog_posts = get_blog_posts(self.env) for post in blog_posts: bp = BlogPost(self.env, post[0], post[1]) if 'BLOG_VIEW' in req.perm(bp.resource): data['blog_post_list'].append(bp) count += 1 if maxcount and count == maxcount: # Only display a certain number on front page (from config) break data['blog_list_title'] = "Recent posts" + \ (len(blog_posts) > maxcount and \ " (max %d) - Browse or Archive for more" % (maxcount,) \ or '') add_link(req, 'alternate', req.href.blog(format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') elif command == 'archive': # Requesting the archive page template = 'fullblog_archive.html' data['blog_archive'] = [] for period, period_posts in group_posts_by_month( get_blog_posts(self.env)): allowed_posts = [] for post in period_posts: bp = BlogPost(self.env, post[0], post[1]) if 'BLOG_VIEW' in req.perm(bp.resource): allowed_posts.append(post) if allowed_posts: data['blog_archive'].append((period, allowed_posts)) add_link(req, 'alternate', req.href.blog(format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') elif command == 'view' and pagename: # Requesting a specific blog post the_post = BlogPost(self.env, pagename, version) req.perm(the_post.resource).require('BLOG_VIEW') if not the_post.version: raise HTTPNotFound("No blog post named '%s'." % pagename) if req.method == 'POST': # Adding/Previewing a comment # Permission? req.perm(the_post.resource).require('BLOG_COMMENT') comment = BlogComment(self.env, pagename) comment.comment = req.args.get('comment', '') comment.author = (req.authname != 'anonymous' and req.authname) \ or req.args.get('author') comment.time = datetime.datetime.now(utc) warnings = [] if 'cancelcomment' in req.args: req.redirect(req.href.blog(pagename)) elif 'previewcomment' in req.args: data['comment_preview'] = True warnings.extend( blog_core.create_comment(req, comment, verify_only=True)) elif 'submitcomment' in req.args and not warnings: warnings.extend(blog_core.create_comment(req, comment)) if not warnings: req.redirect( req.href.blog(pagename) + '#comment-' + str(comment.number)) data['blog_comment'] = comment # Push all warnings out to the user. for field, reason in warnings: if field: add_warning(req, "Field '%s': %s" % (field, reason)) else: add_warning(req, reason) data['blog_post'] = the_post context = web_context(req, the_post.resource, absurls=format == 'rss' and True or False) data['context'] = context if format == 'rss': return 'fullblog_post.rss', data, 'application/rss+xml' # Regular web response context = web_context(req, the_post.resource) data['blog_attachments'] = AttachmentModule( self.env).attachment_data(context) # Previous and Next ctxtnav prev, next = blog_core.get_prev_next_posts(req.perm, the_post.name) if prev: add_link(req, 'prev', req.href.blog(prev), prev) if next: add_link(req, 'next', req.href.blog(next), next) if arity(prevnext_nav) == 4: # 0.12 compat following trac:changeset:8597 prevnext_nav(req, 'Previous Post', 'Next Post') else: prevnext_nav(req, 'Post') # RSS feed for post and comments add_link(req, 'alternate', req.href.blog(pagename, format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') elif command in ['create', 'edit']: template = 'fullblog_edit.html' default_pagename = blog_core._get_default_postname(req.authname) the_post = BlogPost(self.env, pagename or default_pagename) warnings = [] if command == 'create' and req.method == 'GET' and not the_post.version: # Support appending query arguments for populating intial fields the_post.update_fields(req.args) if command == 'create' and the_post.version: # Post with name or suggested name already exists if 'BLOG_CREATE' in req.perm and the_post.name == default_pagename \ and not req.method == 'POST': if default_pagename: add_notice( req, "Suggestion for new name already exists " "('%s'). Please make a new name." % the_post.name) elif pagename: warnings.append( ('', "A post named '%s' already exists. Enter new name." % the_post.name)) the_post = BlogPost(self.env, '') if command == 'edit': req.perm(the_post.resource).require( 'BLOG_VIEW') # Starting point if req.method == 'POST': # Create or edit a blog post if 'blog-cancel' in req.args: if req.args.get('action', '') == 'edit': req.redirect(req.href.blog(pagename)) else: req.redirect(req.href.blog()) # Assert permissions if command == 'create': req.perm(Resource('blog', None)).require('BLOG_CREATE') elif command == 'edit': if the_post.author == req.authname: req.perm(the_post.resource).require('BLOG_MODIFY_OWN') else: req.perm(the_post.resource).require('BLOG_MODIFY_ALL') # Check input orig_author = the_post.author if not the_post.update_fields(req.args): warnings.append(('', "None of the fields have changed.")) version_comment = req.args.get('new_version_comment', '') if 'blog-preview' in req.args: warnings.extend( blog_core.create_post(req, the_post, req.authname, version_comment, verify_only=True)) elif 'blog-save' in req.args and not warnings: warnings.extend( blog_core.create_post(req, the_post, req.authname, version_comment)) if not warnings: req.redirect(req.href.blog(the_post.name)) context = web_context(req, the_post.resource) data['context'] = context data['blog_attachments'] = AttachmentModule( self.env).attachment_data(context) data['blog_action'] = 'preview' data['blog_version_comment'] = version_comment if (orig_author and orig_author != the_post.author) and ( not 'BLOG_MODIFY_ALL' in req.perm(the_post.resource)): add_notice(req, "If you change the author you cannot " \ "edit the post again due to restricted permissions.") data['blog_orig_author'] = orig_author for field, reason in warnings: if field: add_warning(req, "Field '%s': %s" % (field, reason)) else: add_warning(req, reason) data['blog_edit'] = the_post elif command == 'delete': bp = BlogPost(self.env, pagename) req.perm(bp.resource).require('BLOG_DELETE') if 'blog-cancel' in req.args: req.redirect(req.href.blog(pagename)) comment = req.args.getint('comment', 0) warnings = [] if comment: # Deleting a specific comment bc = BlogComment(self.env, pagename, comment) if not bc.number: raise TracError( "Cannot delete. Blog post name and/or comment number missing." ) if req.method == 'POST' and comment and pagename: warnings.extend(blog_core.delete_comment(bc)) if not warnings: add_notice(req, "Blog comment %d deleted." % comment) req.redirect(req.href.blog(pagename)) template = 'fullblog_delete.html' data['blog_comment'] = bc else: # Delete a version of a blog post or all versions # with comments and attachments if only version. if not bp.version: raise TracError( "Cannot delete. Blog post '%s' does not exist." % (bp.name)) version = req.args.getint('version', 0) if req.method == 'POST': if 'blog-version-delete' in req.args: if bp.version != version: raise TracError( "Cannot delete. Can only delete most recent version." ) warnings.extend( blog_core.delete_post(bp, version=bp.versions[-1])) elif 'blog-delete' in req.args: version = 0 warnings.extend( blog_core.delete_post(bp, version=version)) if not warnings: if version > 1: add_notice( req, "Blog post '%s' version %d deleted." % (pagename, version)) req.redirect(req.href.blog(pagename)) else: add_notice(req, "Blog post '%s' deleted." % pagename) req.redirect(req.href.blog()) template = 'fullblog_delete.html' data['blog_post'] = bp for field, reason in warnings: if field: add_warning(req, "Field '%s': %s" % (field, reason)) else: add_warning(req, reason) elif command.startswith('listing-'): # 2007/10 or category/something or author/theuser title = category = author = '' from_dt = to_dt = None if command == 'listing-month': from_dt = listing_data['from_dt'] to_dt = listing_data['to_dt'] title = "Posts for the month of %s %d" % ( blog_month_names[from_dt.month - 1], from_dt.year) add_link(req, 'alternate', req.href.blog(format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') elif command == 'listing-category': category = listing_data['category'] if category: title = "Posts in category %s" % category add_link(req, 'alternate', req.href.blog('category', category, format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') elif command == 'listing-author': author = listing_data['author'] if author: title = "Posts by author %s" % author add_link(req, 'alternate', req.href.blog('author', author, format='rss'), 'RSS Feed', 'application/rss+xml', 'rss') if not (author or category or (from_dt and to_dt)): raise HTTPNotFound("Not a valid path for viewing blog posts.") blog_posts = [] for post in get_blog_posts(self.env, category=category, author=author, from_dt=from_dt, to_dt=to_dt): bp = BlogPost(self.env, post[0], post[1]) if 'BLOG_VIEW' in req.perm(bp.resource): blog_posts.append(bp) data['blog_post_list'] = blog_posts data['blog_list_title'] = title else: raise HTTPNotFound("Not a valid blog path.") if (not command or command.startswith('listing-')) and format == 'rss': data['context'] = web_context(req, absurls=True) data['blog_num_items'] = self.num_items return 'fullblog.rss', data, 'application/rss+xml' data['blog_months'], data['blog_authors'], data['blog_categories'], \ data['blog_total'] = \ blog_core.get_months_authors_categories( user=req.authname, perm=req.perm) if 'BLOG_CREATE' in req.perm('blog'): add_ctxtnav(req, 'New Post', href=req.href.blog('create'), title="Create new Blog Post") chrome = Chrome(self.env) chrome.add_auto_preview(req) chrome.add_wiki_toolbars(req) add_stylesheet(req, 'tracfullblog/css/fullblog.css') add_stylesheet(req, 'common/css/code.css') data['blog_personal_blog'] = self.env.config.getbool( 'fullblog', 'personal_blog') data['blog_archive_rss_icon'] = self.all_rss_icons \ or self.archive_rss_icon data['blog_all_rss_icons'] = self.all_rss_icons return template, data, None