Example #1
0
 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
Example #2
0
def try_commit(session):
    try:
        session.commit()
        return True
    except:
        session.rollback()
        return False
Example #3
0
    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
Example #4
0
 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'
Example #5
0
 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 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')
Example #7
0
 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 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')
Example #9
0
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)
Example #10
0
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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
    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')
Example #15
0
 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
Example #16
0
    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')
Example #17
0
 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
Example #18
0
    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')
Example #19
0
            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)
        
Example #20
0
 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'
Example #21
0
    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'}
Example #22
0
    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')