## $Id: browser.py 12808 2015-03-21 13:22:39Z henrik $ ## ## Copyright (C) 2015 Uli Fouquet & Henrik Bettermann ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## """UI components for payments. """ import grok from waeup.ikoba.browser.breadcrumbs import Breadcrumb from waeup.ikoba.interfaces import IIkobaObject from waeup.ikoba.interfaces import MessageFactory as _ from waeup.ikoba.browser.viewlets import PrimaryNavTab, ManageActionButton from waeup.ikoba.browser.layout import IkobaPage from waeup.ikoba.payments.interfaces import ( IPaymentsContainer, IPayment, payment_states ) from waeup.ikoba.payments.payment import ( find_payable_from_payable_id, get_payment_providers ) from waeup.ikoba.payments.catalog import search grok.context(IIkobaObject) # Make IIkobaObject the default context grok.templatedir('browser_templates') class PaymentsTab(PrimaryNavTab): """Payments tab in primary navigation. """ grok.context(IIkobaObject) grok.order(3) grok.require('waeup.viewPayments') grok.name('paymentstab') pnav = 5 tab_title = _(u'Payments') @property def link_target(self): return self.view.application_url('payments') class PaymentsBreadcrumb(Breadcrumb): """A breadcrumb for the payments container. """ grok.context(IPaymentsContainer) title = _('Payments') class PaymentBreadcrumb(Breadcrumb): """A breadcrumb for payment. """ grok.context(IPayment) target = None @property def title(self): id_part = self.context.payment_id[:9] return _(u"Payment ${id}", mapping={'id': id_part}) @property def parent(self): """We display the payments payable as parent. """ payment = self.context payable = find_payable_from_payable_id(payment.payable_id) if payable is None: # fallback: display site home as parent return (grok.getSite(), 'index') return (payable, 'index') class PaymentsContainerPage(IkobaPage): """The standard view for payment containers. """ grok.context(IPaymentsContainer) grok.name('index') grok.require('waeup.viewPayments') grok.template('containerpage') label = _('Find payments') search_button = _('Find payment(s)') pnav = 5 @property def gateway_services(self): return get_payment_providers() @property def payment_states(self): return payment_states def update(self, *args, **kw): form = self.request.form self.hitlist = [] if 'searchterm' in form and form['searchterm']: self.searchterm = form['searchterm'] self.searchtype = form['searchtype'] elif 'old_searchterm' in form: self.searchterm = form['old_searchterm'] self.searchtype = form['old_searchtype'] else: if 'search' in form: self.flash(_('Empty search string'), type="warning") return self.hitlist = search(query=self.searchterm, searchtype=self.searchtype) if not self.hitlist: self.flash(_('No payment found.'), type="warning") return class PaymentsManageActionButton(ManageActionButton): grok.order(1) grok.context(IPaymentsContainer) grok.view(PaymentsContainerPage) grok.require('waeup.managePayments') text = _('Manage') target = 'manage' class PaymentsContainerManagePage(IkobaPage): """The manage page for payment containers. """ grok.context(IPaymentsContainer) grok.name('manage') grok.require('waeup.managePayments') grok.template('containermanagepage') pnav = 5 label = _('Manage payment section') search_button = _('Find payment(s)') remove_button = _('Remove selected') @property def gateway_services(self): return get_payment_providers() @property def payment_states(self): return payment_states def update(self, *args, **kw): form = self.request.form self.hitlist = [] if 'searchterm' in form and form['searchterm']: self.searchterm = form['searchterm'] self.searchtype = form['searchtype'] elif 'old_searchterm' in form: self.searchterm = form['old_searchterm'] self.searchtype = form['old_searchtype'] else: if 'search' in form: self.flash(_('Empty search string'), type="warning") return if not 'entries' in form: self.hitlist = search(query=self.searchterm, searchtype=self.searchtype) if not self.hitlist: self.flash(_('No payment found.'), type="warning") if 'remove' in form: self.flash(_('No item selected.'), type="warning") return entries = form['entries'] if isinstance(entries, basestring): entries = [entries] deleted = [] for entry in entries: if 'remove' in form: del self.context[entry] deleted.append(entry) self.hitlist = search(query=self.searchterm, searchtype=self.searchtype) if len(deleted): self.flash(_('Successfully removed: ${a}', mapping={'a': ','.join(deleted)})) ob_class = self.__implemented__.__name__.replace( 'waeup.ikoba.', '') self.context.logger.info( '%s - removed: %s' % (ob_class, ','.join(deleted))) return