def process_payment(db, raw_message, payment_message): parrot = Parrots.findOne(db, {'_id': ObjectId(payment_message.get('parrot_id'))}) if parrot: message = get_message_to_share(db, payment_message) twitter_json = tweet_message(parrot, message, raw_message.id) payment = store_payment(db, twitter_json, payment_message, message, raw_message) if payment.success: if Queue.delete_message('payments', raw_message): log('cron2', 'Payments succeded', payment_message.get('subscription_id')) send_notification(db, payment, 'payment_success') log('cron2', 'Notification sent', payment_message.get('subscription_id')) create_next_payment(db, payment) log('cron2', 'Next payment created', payment_message.get('subscription_id')) add_payment_to_parrot(db, parrot, payment_message, twitter_json) else: log('cron2', 'ERROR: Couldnt delete message', payment_message.get('subscription_id')) else: total_payments_attempts = Payments.find(db, {'message_id_sqs': raw_message.id}).count() subscription = Subscriptions.findOne(db, {'account_id': payment.account_id, 'parrot_id': payment.parrot_id}) if subscription: if total_payments_attempts > 3: log('cron2', 'Too many payments attempts', payment_message.get('subscription_id')) subscription.update({'active': False}) if Queue.delete_message('payments', raw_message): send_notification(db, payment,'subscription_deactivated') else: log('cron2', 'ERROR: Couldnt delete message', payment_message.get('subscription_id')) else: log('cron2', 'Attempt %s' % total_payments_attempts, payment_message.get('subscription_id'))
def main(): connection = None log('cron4', 'Starting') try: connection, db = connect() next_payments = NextPayments.find( db, {'action_date': {'$lte': datetime.now()}}, {'parrot_id':1,'account_id':1,'_id':1} ).sort([('_id', -1)]) for next_payment in next_payments: subscription = Subscriptions.findOne(db, {'account_id': next_payment.get('account_id'), 'parrot_id': next_payment.get('parrot_id')}) if subscription and subscription.active: created_message = Queue.insert( 'payments', { 'subscription_id': str(subscription.id), 'account_id': str(subscription.account_id), 'parrot_id': str(subscription.parrot_id) } ) if created_message: db.next_payments.remove({'_id': next_payment.get('_id')}) else: db.next_payments.remove({'_id': next_payment.get('_id')}) finally: if connection: connection.close() log('cron4', 'Finishing')
def get_valid_parrot(db, account_id, parrot_id): account = Accounts.findOne(db,account_id) if account: subscription = Subscriptions.findOne(db, {'parrot_id': ObjectId(parrot_id), 'account_id': ObjectId(account_id)}) if subscription: parrot = Parrots.findOne(db, parrot_id) if parrot: return parrot
def parrots_finish(db): if request.query.denied: redirect('/twitter_denied.html') session = Sessions.findOne(db, {'oauth_token': request.query.oauth_token}) if session: account = Accounts.findOne(db, session.account_id) if not account: response.status = 404 return {'error': 'Invalid token'} twitter = Twitter() try: access_tokens = twitter.get_access_tokens(request.query.oauth_verifier,{'oauth_token': session.oauth_token, 'oauth_token_secret': session.oauth_token_secret}) twitter.create_client(access_tokens.get('oauth_token'),access_tokens.get('oauth_token_secret')) headers, body = twitter.get('https://api.twitter.com/1/account/verify_credentials.json') except: redirect('/twitter_auth_problem.html') return if headers.status == 200: body = json.loads(body) parrot = Parrots.findOne(db, {'twitter_id': body.get('id')}) if not parrot: new_parrot = Parrots(db, { 'twitter_info': body, 'twitter_id': body.get('id'), 'oauth_token': access_tokens.get('oauth_token'), 'oauth_token_secret': access_tokens.get('oauth_token_secret') }) new_parrot.insert() parrot = new_parrot else: parrot.update({ 'oauth_token': access_tokens.get('oauth_token'), 'oauth_token_secret': access_tokens.get('oauth_token_secret') }) subscription = Subscriptions.findOne(db, {'account_id': account.id, 'parrot_id': parrot.id}) subscription_parameters = { 'parrot_id': parrot.id, 'account_id': account.id, 'active': True, 'external_id': session.external_id, 'twitter_screen_name': body.get("screen_name") } if not subscription: subscription = Subscriptions(db, subscription_parameters) subscription.insert() else: subscription.update(subscription_parameters) notification_id = _create_notification(db, account, parrot, subscription) if notification_id: redirect_url = generate_redirect_url(account.callback_url, session.external_id, subscription.id, notification_id) redirect(redirect_url) else: response.status = 404 return {'error': 'Expired token'}
def send_notification(db, payment, notification_type): subscription = Subscriptions.findOne(db, {'account_id': payment.account_id, 'parrot_id': payment.parrot_id}) if subscription: account = Accounts.findOne(db, payment.account_id) if account: notification = Notifications(db, { 'account_id': payment.account_id, 'parrot_id': payment.parrot_id, 'type': notification_type, 'subscription_id': subscription.id, 'external_id': subscription.external_id, 'request_url': account.notification_url }) notification.insert()
def store_payment(db, twitter_json, payment_message, message, raw_message): subscription = Subscriptions.findOne(db, {'account_id': ObjectId(payment_message.get('account_id')),'parrot_id': ObjectId(payment_message.get('parrot_id'))}) payment_data = { 'twitter_response': twitter_json, # action date means when this payment has to be tweeted 'action_date': datetime.now(), 'account_id': ObjectId(payment_message.get('account_id')), 'subscription_id': ObjectId(subscription.id), 'parrot_id': ObjectId(payment_message.get('parrot_id')), 'message_id': ObjectId(message.get('id')), 'message_id_sqs': raw_message.id, 'callback_url': message.get('url', ''), 'success': True } if twitter_json.get('error'): payment_data['success'] = False log('cron2', 'ERROR: Payment coulndt be processed because of twitter error %s' % json.dumps(twitter_json), payment_message.get('subscription_id')) else: log('cron2', 'Payment executed successfully', payment_message.get('subscription_id')) payment = Payments(db, payment_data) payment.insert() return payment