def delete(self, parameters): session = meta.Session() deleteCount = 1 jdata = json.loads(parameters) ids = [] for key, value in jdata.iteritems(): if key == 'deleteId': my_splitter = shlex.shlex(value, posix=True) my_splitter.whitespace += ',' my_splitter.whitespace_split = True ids = list(my_splitter) break for id in ids: id = id.replace("\0", "") if id: id = int(id) resourceObj = meta.Session.query(Resource).filter(Resource.id == id).first() session.delete(resourceObj) if app_globals.available_resources.has_key(resourceObj.hostname): del(app_globals.available_resources[resourceObj.hostname]) deleteCount = deleteCount + 1 session.commit() return '{"message":"%d records deleted"}' % deleteCount
def try_commit(session): try: session.commit() return True except: session.rollback() return False
def userDelete(self, parameters): deleteCount = 1 session = meta.Session() jdata = json.loads(parameters) ids = [] for key, value in jdata.iteritems(): if key == 'deleteId': my_splitter = shlex.shlex(value, posix=True) my_splitter.whitespace += ',' my_splitter.whitespace_split = True ids = list(my_splitter) break for id in ids: id = id.replace("\0", "") if id: id = int(id) accountObj = meta.Session.query(Account).filter(Account.id == id).one() accountObj.active = 0 session.commit() self.jodis_connect(accountObj.id) deleteCount = deleteCount + 1 session.commit() #meta.Session.close() return '{"message":"%d records deleted"}' % deleteCount
def touch_fb_userpersona(self): uid = request.params.get('uid') if uid is None: return 'Please specify uid' session = meta.Session() fb_user = user_logic.get_fb_userpersona(session, uid, create_if_missing=True) session.commit() return 'done'
def add_player(self): first = self.form_result['first'] last = self.form_result['last'] position = self.form_result['position'] session = Session() if session.query(Player).filter_by(first=first, last=last).count() > 0: h.flash("Player already exists!") return h.redirect_to(controller='roster') player = Player(first, last, position) session.add(player) session.commit() return h.redirect_to(controller='roster', action='index')
def save_player(self): id = self.form_result['id'] first = self.form_result['first'] last = self.form_result['last'] position = self.form_result['position'] session = Session() player = session.query(Player).filter_by(id=id).one() player.first = first player.last = last player.last = last player.position = position session.commit() return h.redirect_to(controller='roster')
def process_release_results(context, msg, result, session): "Process the results of a release task" html = [] context.id = msg.messageid errors = dict(result['errors']) templates = dict( release='/messages/includes/released.html', learn='/messages/includes/salearn.html', delete='/messages/includes/delete.html' ) def rendertemplate(error_msg, action): "Render template" context.msg = error_msg context.success = error_msg == '' html.append(render(templates[action])) if context.form.release.data: #release if context.form.usealt.data: to_addr = context.form.altrecipients.data else: to_addr = msg.to_address to_addr = to_addr.split(',') error_msg = '' if not result['release']: error_msg = errors['release'] context.addrs = to_addr rendertemplate(error_msg, 'release') if context.form.learn.data: #salean error_msg = '' if not result['learn']: ['learn'] error_msg = errors['learn'] rendertemplate(error_msg, 'learn') if context.form.delete.data: #delete error_msg = '' if not result['delete']: error_msg = errors['delete'] else: msg.isquarantined = True session.add(msg) session.commit() rendertemplate(error_msg, 'delete') return '<br />'.join(html)
def register(self): user = model.DKUser() user.username = request.POST["username"] user.passwd = md5(request.POST["passwd"]).hexdigest() user.master_email = request.POST["email"] user.phone_mobile = request.POST["phone_mobile"] user.phone_office = request.POST["phone_office"] user.phone_home = request.POST["phone_home"] user.org = request.POST["org"] user.title = request.POST["title"] user.addr = request.POST["addr"] #roles is stored as ":" seperated string user.roles = ":".join((meta.ROLE_USER, )) session = model.meta.Session session.add(user) session.commit() return pack_result(RS_SUCCESS)
def delete_player(self): session = Session() id = self.form_result['id'] first = self.form_result['first'] last = self.form_result['last'] position = self.form_result['position'] players = session.query(Player).filter_by(id=id, first=first, last=last, position=position).all() if len(players) <> 1: h.flash("The player was modified by someone else while you were staring at the screen!") else: player = players[0] session.delete(player) session.commit() h.flash("Player %s was deleted" % player.id) return h.redirect_to(controller='roster')
def delete_player(self): session = Session() id = self.form_result['id'] first = self.form_result['first'] last = self.form_result['last'] position = self.form_result['position'] players = session.query(Player).filter_by(id=id, first=first, last=last, position=position).all() if len(players) <> 1: h.flash( "The player was modified by someone else while you were staring at the screen!" ) else: player = players[0] session.delete(player) session.commit() h.flash("Player %s was deleted" % player.id) return h.redirect_to(controller='roster')
def delete(self, parameters): session = meta.Session() deleteCount = 1 jdata = json.loads(parameters) ids = [] for key, value in jdata.iteritems(): if key == 'deleteId': my_splitter = shlex.shlex(value, posix=True) my_splitter.whitespace += ',' my_splitter.whitespace_split = True ids = list(my_splitter) break for id in ids: id = id.replace("\0", "") if id: id = int(id) queueTypeObj = meta.Session.query(QueueType).filter(QueueType.id == id).first() session.delete(queueTypeObj) deleteCount = deleteCount + 1 session.commit() return '{"message":"%d records deleted"}' % deleteCount
def index(self): realstart = start = time.time() log_fb_request(request) log.debug('time to log request: %.3f ms' % ((time.time() - start)*1000.0)) # # TODOs for canvas page: # - if not added, show message: "To send a gift, add this application" # - if not added but received gift(s), show gifts and message "Add application and to profile to display gifts" # - if added, and there are pending gifts, show these # current_user = None start = time.time() facebook.process_request() log.debug('time to do facebook.process_request(): %.3f ms' % ((time.time() - start)*1000.0)) c.is_app_user = facebook.api_client.added if facebook.user: log.debug('user: %s' % facebook.user) current_user = facebook.user elif facebook.canvas_user: log.debug('canvas_user: %s' % facebook.canvas_user) current_user = facebook.canvas_user c.just_installed = (request.GET.get('installed') == '1') c.gift_count = None if current_user: start = time.time() """ Removing unnecessary Facebook API calls # TODO: need to handle "URLError: urlopen error" exceptions thrown from api calls info = facebook.api_client.users.getInfo([current_user], ['name', 'first_name', 'last_name', 'pic_square', 'locale'])[0] log.debug('name: %s, pic: %s, locale: %s' % (info['name'], info['pic_square'], info['locale']) ) friends = facebook.api_client.friends.get(uid=current_user) friends = facebook.api_client.users.getInfo(friends, ['uid', 'name', 'pic_square', 'locale']) c.friends = friends log.debug('time to make facebook API calls: %.3f ms' % ((time.time() - start)*1000.0)) """ # TODO: we cannot store the first_name, last_name - the user needs to provide it to us # TODO: need a way to map existing Users to Facebook users start = time.time() session = meta.Session() # Look up current_user in UserPersona table # if exists: # - update 'is_app_user' status? # if not exists: # - add new row in User table (even if it ends up being a dummy) # - add new row in UserPersona table fb_user = user_logic.get_fb_userpersona(session, current_user, create_if_missing=True) # update is_app_user if persisted value is inaccurate if fb_user.is_app_user != facebook.api_client.added: fb_user.is_app_user = facebook.api_client.added session.flush() if c.just_installed: c.gift_count = len(fb_user.user.received_gifts) fbml_start = time.time() if fb_user.is_app_user and not fb_logic.has_profile_fbml(current_user): ALLOW_FBML_INIT_ON_FIRST_VISIT = True if ALLOW_FBML_INIT_ON_FIRST_VISIT: fb_logic.update_user_fbml_by_userpersona(fb_user) else: log.debug("Updating profile FBML on canvas-page views is currently de-fanged, so that I can properly test handling users w/o FBML!") log.debug('time for has_profile_fbml call: %.3f ms' % ((time.time() - fbml_start)*1000.0)) # will commit new user if call to get_fb_userpersona added row session.commit() # query DB for list of gifts gifts_mkey = 'Cols.gifts-page1' mc_start = time.time() gifts = g.mc.get(gifts_mkey) log.debug('time for memcached calls: %.3f ms' % ((time.time() - mc_start)*1000.0)) if gifts: log.debug('got gifts from memcached!') c.gifts = gifts else: gift_q = meta.Session.query(Gift) c.gifts = gift_q.filter_by(for_sale=True).order_by(Gift.created)[:18] if g.mc.set(gifts_mkey, c.gifts, time=86400): log.debug('stored gifts in memcached!') else: log.debug('unable to store gifts in memcached. make sure memcached server is running!') # get list of charities that have registered thru CBUI as payment recipients c.charities = self._get_active_charities() c.preselected_charity_id = None c.preselected_charity = None if len(c.charities) == 1: # TODO: temporary logic until we have more than 1 charity c.preselected_charity_id = c.charities[0].id c.preselected_charity = c.charities[0] else: co_param = request.params.get('co') if co_param is not None: for charity in c.charities: if charity.short_code == co_param: c.preselected_charity_id = charity.id c.preselected_charity = charity break log.debug('preselected_charity_id: %s' % c.preselected_charity_id) log.debug('time for all DB calls: %.3f ms' % ((time.time() - start)*1000.0)) c.form_uuid = uuid.uuid1().hex # for (offset, item) in enumerate(c.gifts): # do something on item and offset # or: list comprehension: [c * i for (i, c) in enumerate(c.gifts)] log.debug('total time: %.3f ms' % ((time.time() - realstart)*1000.0)) ext_perms = request.params.get('fb_sig_ext_perms', '').split(',') c.has_publish_stream = ('publish_stream' in ext_perms) c.has_email_perm = ('email' in ext_perms) if 'publish_stream' in ext_perms: c.show_prompt_perm = False elif current_user is not None: # show link for Tracy and me c.show_prompt_perm = (int(current_user) == 541265766 or int(current_user) == 1004760) else: c.show_prompt_perm = False return render('/facebook/index.tmpl')
def process_multi(self): log_fb_request(request) facebook.process_request() c.is_app_user = facebook.api_client.added if not c.is_app_user: return '<fb:redirect url="index" />' current_user = facebook.user if not current_user: return '<fb:redirect url="index" />' session = meta.Session() fb_user = user_logic.get_fb_userpersona(session, current_user) if fb_user is None: return '<fb:redirect url="index" />' # validate total_amount = request.POST.get('total_amount') charity_ids = request.POST.getall('charity_val') if charity_ids is None or len(charity_ids) == 0: c.error_msg = 'No charities were specified.' return render('/facebook/setup_multi.tmpl') # save (pending) multi-use token info to DB multiuse_token = MultiUseToken(fb_user.user.id, float(total_amount)) session.add(multiuse_token) session.flush() caller_ref = 'wgmultiuse_%d_%s' % (multiuse_token.id, uuid.uuid1().hex) multiuse_token.caller_reference = caller_ref session.commit() log_payment_event('APP', 'Created multi-use token', caller_ref=caller_ref, new_status='new') # compute parameters for request to Co-Branded FPS pages reason = 'Authorize multiple donations' charity_tokens = [] for charity_id in charity_ids: charity = self._get_charity(charity_id) if FPS_PROMO_ACTIVE: recipient_token = charity.promo_recipient_token_id else: recipient_token = charity.recipient_token_id charity_tokens.append(recipient_token) recipient_token_list = ",".join(charity_tokens) # info for multi-use token CBUI call: # # - minimum transaction amount: 1.00 # - expiration: default 1 year # - maximum amount limit: total amount (from user) # - recipients: list of tokens from charities # direct_url = fps_logic.get_multiuse_cbui_url(caller_ref, reason, total_amount, minimum_amount=1.0, recipient_token_list=recipient_token_list, return_url = c.canvas_url + '/multiuse_return', website_desc='We Give Facebook application') return '<fb:redirect url="%s" />' % direct_url
def send_gift(self): """Render gift preview for user to review and then click 'Continue with donation'""" log_fb_request(request) facebook.process_request() c.is_app_user = facebook.api_client.added if not c.is_app_user: c.error_msg = 'You need to add this app before you can send gifts.' return render('/facebook/send_gift.tmpl') current_user = facebook.user if not current_user: c.error_msg = 'Error getting your user info.' return render('/facebook/send_gift.tmpl') session = meta.Session() fb_user = user_logic.get_fb_userpersona(session, current_user) if fb_user is None: # TODO: make sure use has added app # TODO: make sure user exists c.error_msg = 'You need to add this app before you can send gifts.' return render('/facebook/send_gift.tmpl') # validate c.recipient_id = request.POST.get('friend_selector_id') charity_id = request.params.get('charity_val') gift_id = request.params.get('gift_id') c.message = request.params.get('message') c.donation_amt = request.params.get('amount','1.00') stream_short_msg = request.params.get('stream_short_msg') form_uuid = request.params.get('uuid') # TODO: store & lookup uuid in memcached, to see if user is resubmitting form. at least log the UUID. if c.recipient_id: recipient_info = facebook.api_client.users.getInfo([c.recipient_id], ['name', 'pic_square', 'locale'])[0] log.debug('recipient name: %s, pic: %s, locale: %s' % (recipient_info['name'], recipient_info['pic_square'], recipient_info['locale']) ) recipient_userpersona = user_logic.get_fb_userpersona(session, c.recipient_id, create_if_missing=True) gift_q = meta.Session.query(Gift) charity_q = meta.Session.query(Charity) charity = charity_q.get(charity_id) if charity is None: c.error_msg = 'Charity not found' return render('/facebook/send_gift.tmpl') c.charity_name = charity.name c.gift = gift_q.get(gift_id) # save (pending) donation info to DB or session or memcache or something wg_user_id = fb_user.user.id donation = Donation(wg_user_id, recipient_userpersona.user.id, float(c.donation_amt), gift_id, charity_id) donation.message = c.message if stream_short_msg is not None and stream_short_msg.strip() != '': donation.stream_short_msg = stream_short_msg session.add(donation) session.commit() # check if user has multi-use token active multiuse_token_q = meta.Session.query(MultiUseToken) c.multiuse_token = multiuse_token_q.filter_by(user_id=wg_user_id).filter_by(is_active=True).filter(MultiUseToken.est_amount_remaining >= float(c.donation_amt)).first() # TODO: to prevent form resubmission, commit, then redirect to review_gift page with donation ID?? # compute parameters for request to Co-Branded FPS pages c.caller_ref = 'wgdonation_%d_%s' % (donation.id, uuid.uuid1().hex) reason = 'Donation to %s' % charity.name if FPS_PROMO_ACTIVE: recipient_token = charity.promo_recipient_token_id else: recipient_token = charity.recipient_token_id c.direct_url = fps_logic.get_cbui_url(c.caller_ref, reason, c.donation_amt, recipient_token=recipient_token, website_desc='We Give Facebook application') log_payment_event('APP', 'Created donation', donation_id=donation.id, caller_ref=c.caller_ref, new_status='new') return render('/facebook/send_gift.tmpl')
log_payment_event('CBUI', 'Multi-use token information could not be found', caller_ref=caller_reference, new_status='error') c.error_msg = 'Multi-use token information could not be found.' return render('/facebook/setup_multi.tmpl') # Check if multi-use token is already active. # This may be the case if a user refreshes the page or revisits it using the Back button if c.multiuse_token.is_active: log.debug('Multi-use token %d is already active.' % c.multiuse_token.id) return render('/facebook/activate_multiple.tmpl') c.multiuse_token.is_active = True c.multiuse_token.token_id = request.params.get('tokenID') c.multiuse_token.payment_method = {'SA':'ABT', 'SB':'ACH', 'SC':'CC'}[status] session.commit() log_payment_event('CBUI', 'Return from Co-branded pipeline; Multi-use token %d is active' % c.multiuse_token.id, caller_ref=caller_reference, new_status='success') return render('/facebook/activate_multiple.tmpl') def allgifts(self): log_fb_request(request) facebook.process_request() c.is_app_user = facebook.api_client.added c.recipient_id = request.params.get('uid') if not c.recipient_id: c.error_msg = 'No user specified' return(c.error_msg)
def process_ipn(self): log_ipn_notification(request) # verify signature parameters = request.POST.copy() if 'signature' in parameters: sig = parameters['signature'] del parameters['signature'] else: log.debug("FPS signature not found") return("signature not found") log.debug('FPS sig: ' + sig); if not self.fps_client.validate_pipeline_signature(sig, None, parameters): transaction_id = request.POST.get('transactionId') log_payment_event('IPN', "Invalid signature", fps_transaction_id=transaction_id, new_status='error') return("invalid signature") transaction_status = request.POST.get('transactionStatus') if transaction_status is None: log.error('No transactionStatus found in IPN.') return('transactionStatus not found') transaction_id = request.POST.get('transactionId') if transaction_id is None: log.error('No transactionId found in IPN.') return('transactionId not found') status_code = request.POST.get('statusCode') status_message = request.POST.get('statusMessage') # logged for failures buyer_name = request.POST.get('buyerName') caller_reference = request.POST.get('callerReference') # look up transaction in DB session = meta.Session() txn_q = meta.Session.query(Transaction) transaction = txn_q.with_lockmode('update').filter_by(fps_transaction_id=transaction_id).first() # TODO: use one() and catch exceptions? if transaction is None: log.error('Transaction %s could not be found in DB' % transaction_id) log_payment_event('IPN', "Transaction could not be found in DB", fps_transaction_id=transaction_id, new_status='error') # TODO: record detailed info in case DB insert was not committed before IPN was received! return('transaction info not found') if transaction_status.upper() == 'FAILURE' or transaction_status.upper() == 'CANCELLED': log_payment_event('IPN', "Notification received: %s" % status_message, fps_transaction_id=transaction_id, donation_id=transaction.donation.id, transaction_id=transaction.id, caller_ref=caller_reference, new_status=status_code) else: log_payment_event('IPN', "Notification received", fps_transaction_id=transaction_id, donation_id=transaction.donation.id, transaction_id=transaction.id, caller_ref=caller_reference, new_status=status_code) if transaction_status.upper() == 'PENDING': # if status is pending, look up transaction in DB. # If info in DB: # - transaction cannot be found, log error # - status pending, capture buyer name to DB if needed # - status succeeded, IPN must be out of order, log it if transaction.fps_transaction_status is None: log.debug('Found transaction that has no value for fps_transaction_status, ID: %s' % transaction_id) transaction.fps_transaction_status = 'Pending' session.commit() elif transaction.fps_transaction_status == 'Pending': if status_code is not None: transaction.fps_status_code = status_code # update buyer name if empty if transaction.buyer_name is None and buyer_name is not None: transaction.buyer_name = buyer_name session.commit() elif transaction.fps_transaction_status == 'Success': log.debug('Received IPN for pending status out of order - txn already succeeded. Ignoring.') elif transaction_status.upper() == 'SUCCESS': # if status is success, look up transaction in DB. # If: # - transaction is pending, update to success and deliver gift # - transaction is already success, log it (duplicate notification?) if transaction.fps_transaction_status is None or transaction.fps_transaction_status == 'Pending': transaction.fps_transaction_status = 'Success' if status_code is not None: transaction.fps_status_code = status_code transaction.success_date = model.now() transaction.donation.delivered = True transaction.donation.transaction_status = 'paid' # update buyer name if empty if transaction.buyer_name is None and buyer_name is not None: transaction.buyer_name = buyer_name fb_logic.update_user_fbml_by_wg_userid(transaction.donation.recipient_id) # update estimated amount in multi-use token fps_logic.update_multiuse_token_estimate(session, transaction.sender_token_id, transaction.amount) # stash some info for the feed entry donor_fb_uid = user_logic.get_network_uid(session, transaction.donation.donor_id) recipient_fb_uid = user_logic.get_network_uid(session, transaction.donation.recipient_id) donation_id = transaction.donation.id gift_name = transaction.donation.gift.name charity_name = transaction.donation.charity.name session.commit() # try to send feed update user_session_mkey = "User-fb-sk.%s" % donor_fb_uid session_key = g.mc.get(user_session_mkey) if session_key: log.debug('going to publish feed item, user session: %s' % session_key) # publish feed item facebook.api_client.user = donor_fb_uid facebook.api_client.session_key = session_key fb_logic.publish_feed_item(donor_fb_uid, recipient_fb_uid, donation_id, gift_name, charity_name) has_publish_stream = facebook.api_client.users.hasAppPermission(ext_perm='publish_stream') #log.debug('has_publish_stream: %s' % has_publish_stream) if has_publish_stream == 1: # publish story to recipient's Wall and to News Feeds post_id = fb_logic.publish_stream_item(donor_fb_uid, recipient_fb_uid, transaction.donation) if post_id is not None: transaction.donation.fb_post_id = post_id session.commit() else: log.debug("User %s does not have 'publish_stream' permission. Not publishing to stream." % donor_fb_uid) else: log.debug('unable to find user session key in memcached') elif transaction.fps_transaction_status == 'Success': log.info('Transaction %s is already in Success state. ABT payment or duplicate IPN notification?' % transaction_id) elif transaction_status.upper() == 'FAILURE': if transaction.fps_transaction_status is None or transaction.fps_transaction_status == 'Pending': # TODO: log more info? transaction.fps_transaction_status = 'Failure' transaction.donation.transaction_status = 'failed' if status_code is not None: transaction.fps_status_code = status_code # update buyer name if empty if transaction.buyer_name is None and buyer_name is not None: transaction.buyer_name = buyer_name session.commit() elif transaction.fps_transaction_status == 'Failure' or transaction.fps_transaction_status == 'Cancelled': log.debug('Transaction %s is already in Failure/Cancelled state. Duplicate IPN notification?' % transaction_id) elif transaction.fps_transaction_status == 'Success': log.error('Transaction %s is in Success state. IPN notification received for FAILURE. Status code: %s' % (transaction_id, status_code)) elif transaction_status.upper() == 'CANCELLED': if transaction.fps_transaction_status is None or transaction.fps_transaction_status == 'Pending': # TODO: log more info? transaction.fps_transaction_status = 'Cancelled' transaction.donation.transaction_status = 'cancelled' # TODO: do we need to "undeliver" the gift if a user cancels a payment after it went through? if status_code is not None: transaction.fps_status_code = status_code # update buyer name if empty if transaction.buyer_name is None and buyer_name is not None: transaction.buyer_name = buyer_name session.commit() elif transaction.fps_transaction_status == 'Failure' or transaction.fps_transaction_status == 'Cancelled': log.debug('Transaction %s is already in Failure/Cancelled state. Duplicate IPN notification?' % transaction_id) elif transaction.fps_transaction_status == 'Success': log.error('Transaction %s is in Success state. IPN notification received for CANCELLED. Status code: %s' % (transaction_id, status_code)) return 'roger that'
def players(self): session = Session() players = [{ 'first': p.first, 'last': p.last, 'position': p.position, 'id': p.id } for p in session.query(Player).all()] return players @jsonify def add_player(self): obj = json.loads(request.body) schema = PlayerForm() try: form_result = schema.to_python(obj) except formencode.Invalid, error: response.content_type = 'text/plain' return 'Invalid: ' + unicode(error) else: session = Session() first, last, position = obj['first'], obj['last'], obj['position'] if session.query(Player).filter_by(last=last, first=first, position=position).count() == 0: session.add(Player(first, last, position)) session.commit() return {'result': 'OK'} else: return {'result': 'fail', 'msg': 'Player already exists'}
def reg_recipient_return(self): log_admin_req(request) # log transaction and/or request id parameters = request.GET.copy() # verify CBUI return signature if 'awsSignature' in parameters: sig = parameters['awsSignature'] log.debug("using params['awsSignature'] for FPS sig") elif 'signature' in parameters: sig = parameters['signature'] log.debug("using params['signature'] for FPS sig") del parameters['signature'] parameters['awsSignature'] = sig else: log.debug("FPS signature not found") return("signature not found") log.debug('FPS sig: ' + sig); if not self.fps_client.validate_pipeline_signature(sig, None, parameters): return("invalid signature") status = parameters.get('status') log.debug('Return status from CBUI: ' + status) if 'errorMessage' in request.GET: log.error('Error in return from CBUI: ' + request.GET['errorMessage']) c.error_msg = 'There was a problem with your payment authorization.' return render('/web/admin/reg_recipient_return.tmpl') if not status == 'SR': return("status not success") caller_reference = request.params.get('callerReference') charity_id = int(caller_reference.split('_')[1]) session = meta.Session() charity = meta.Session.query(Charity).get(charity_id) if charity is None: log.error('Error in return from CBUI: charity information could not be found') c.error_msg = 'Charity information could not be found.' return render('/web/admin/reg_recipient_return.tmpl') token_id = request.params.get('tokenID') if token_id is None: c.error_msg = 'No recipient token ID found.' return render('/web/admin/reg_recipient_return.tmpl') if FPS_PROMO_ACTIVE: charity.promo_recipient_token_id = token_id else: charity.recipient_token_id = token_id session.commit() # clear out relevant data from memcached charities_mkey = 'Cols.active-charities' if g.mc.delete(charities_mkey): log.debug('Cleared active charities from memcached') else: log.debug('Unable to clear active charities from memcached!') c.charity = charity return render('/web/admin/reg_recipient_return.tmpl')