def user_reinvestment_reminder(): """ Mail worker Send email update to user that eligible for reinvestment. This should execute after month_allocation This how the script do: 1. Read user profile with reinvest_pool >0 and subscribed_to_updates = True 2. For each user send updated email """ SITE_URL = settings.SITE_URL project_reinvest_list_url = SITE_URL + reverse('reinvest_list') project_portfolio_url = SITE_URL + reverse('dashboard') unsubscribe_update_url = SITE_URL + reverse('unsubscribe', kwargs={'action': 'updates'}) for user in RevolvUserProfile.objects.filter(reinvest_pool__gt=0.0, subscribed_to_updates=True): data = dict() amount=user.reinvest_pool if amount > 0.00: data['amount'] = amount data['portfolio_link'] = project_portfolio_url + utils.get_query_string(user.user) data['projects_url'] = project_reinvest_list_url + utils.get_query_string(user.user) data['unsubscribe_url'] = unsubscribe_update_url + utils.get_query_string(user.user) if user.user.first_name: data['first_name'] = user.user.first_name.title() else: data['first_name'] = 'RE-volv Supporter' send_revolv_email( 'reinvestment_reminder', data, [user.user.email] )
def user_reinvestment_reminder(): """ Mail worker Send email update to user that eligible for reinvestment. This should execute after month_allocation This how the script do: 1. Read user profile with reinvest_pool >0 and subscribed_to_repayment_notifications = True 2. For each user send updated email """ SITE_URL = settings.SITE_URL project_reinvest_list_url = SITE_URL + reverse('reinvest_list') project_portfolio_url = SITE_URL + reverse('donor:dashboard') unsubscribe_update_url = SITE_URL + reverse('unsubscribe', kwargs={'action': 'confirmation'}) for user in RevolvUserProfile.objects.filter(reinvest_pool__gt=0.0, subscribed_to_repayment_notifications=True): data = dict() data['amount'] = user.reinvest_pool data['portfolio_link'] = project_portfolio_url + utils.get_query_string(user.user) data['projects_url'] = project_reinvest_list_url + utils.get_query_string(user.user) data['unsubscribe_url'] = unsubscribe_update_url + utils.get_query_string(user.user) if user.user.first_name: data['first_name'] = user.user.first_name.title() else: data['first_name'] = 'RE-volv Supporter' send_revolv_email( 'reinvestment_reminder', data, [user.user.email] )
def form_valid(self, form): project = Project.objects.get(pk=self.kwargs.get('pk')) form.process_payment(project, self.user) context = {} context['user'] = self.user context['project'] = project context['amount'] = form.cleaned_data.get('amount') send_revolv_email('post_donation', context, [self.user.email]) return JsonResponse({ 'amount': form.data['amount'], })
def test_cc_admins(self): """ Test that all admin users will be cc'd if the cc_admins flag is passed to send_revolv_email. """ RevolvUserProfile.objects.create_user_as_admin("a", "*****@*****.**", "apass") RevolvUserProfile.objects.create_user_as_admin("b", "*****@*****.**", "bpass") send_revolv_email(self.email_template_name, self.email_template_context, ["*****@*****.**"], cc_admins=True) self.assertEqual(len(mail.outbox), 1) self.assertIn("*****@*****.**", mail.outbox[0].cc) self.assertIn("*****@*****.**", mail.outbox[0].cc)
def test_fails_silently(self): """Test that invalid email parameters raise an error if we tell them to.""" send_revolv_email(self.email_template_name, self.email_template_context, ["mejksldafs"], from_email="INVALID##&^%%%^*! #Y* #$H*", fail_silently=True) with mock.patch("revolv.lib.mailer.EmailMultiAlternatives.send", side_effect=Exception): with self.assertRaises(Exception): send_revolv_email(self.email_template_name, self.email_template_context, ["mejksldafs"], from_email="INVALID##&^%%%^*! #Y* #$H*", fail_silently=False)
def form_valid(self, form): project = Project.objects.get(pk=self.kwargs.get('pk')) form.process_payment(project, self.user) context = {} context['user'] = self.user context['project'] = project context['amount'] = form.cleaned_data.get('amount') send_revolv_email( 'post_donation', context, [self.user.email] ) return JsonResponse({ 'amount': form.data['amount'], })
def test_cc_admins(self): """ Test that all admin users will be cc'd if the cc_admins flag is passed to send_revolv_email. """ RevolvUserProfile.objects.create_user_as_admin("a", "*****@*****.**", "apass") RevolvUserProfile.objects.create_user_as_admin("b", "*****@*****.**", "bpass") send_revolv_email( self.email_template_name, self.email_template_context, ["*****@*****.**"], cc_admins=True ) self.assertEqual(len(mail.outbox), 1) self.assertIn("*****@*****.**", mail.outbox[0].cc) self.assertIn("*****@*****.**", mail.outbox[0].cc)
def test_fails_silently(self): """Test that invalid email parameters raise an error if we tell them to.""" send_revolv_email( self.email_template_name, self.email_template_context, ["mejksldafs"], from_email="INVALID##&^%%%^*! #Y* #$H*", fail_silently=True ) with mock.patch("revolv.lib.mailer.EmailMultiAlternatives.send", side_effect=Exception): with self.assertRaises(Exception): send_revolv_email( self.email_template_name, self.email_template_context, ["mejksldafs"], from_email="INVALID##&^%%%^*! #Y* #$H*", fail_silently=False )
def form_valid(self, form): project = Project.objects.get(pk=self.kwargs.get('pk')) form.process_payment(project, self.user) context = {} context['user'] = self.user context['project'] = project context['amount'] = form.cleaned_data.get('amount') send_revolv_email('post_donation', context, [self.user.email]) try: amount = form.cleaned_data.get('amount') # send_donation_info.delay(self.user_profile.get_full_name(), float(amount), # project.title, self.user_profile.address) except: pass return JsonResponse({ 'amount': form.data['amount'], })
def handle(self, *args, **options): """ This handle function is run when the command "python manage.py monthlydonationemail" is typed into the command line. To run it on any day which is not the first day, use "python manage.py monthlydonationemail --override". To silence email notifications to administrators as well, add the "--silence_admin_notifications" flag. It iterates through all users, and sends a monthly donation email to any user who donated in the last month. (Specifically the last month, not the last 30 days, it it is run on 4/4, it'll email users who donated on 3/1 but not on 4/2.) It by default will also send an email notification to all administrators. """ if timezone.now().day == 1 or options['override']: # checks if the it is the first day of the month print "Running monthlydonationemail command on " + str(timezone.now()) + "." revolv_user_profiles = RevolvUserProfile.objects.all() num_emails_sent = 0 for revolv_user_profile in revolv_user_profiles: donation_set = revolv_user_profile.payment_set.all() donation_set = get_last_month_donations(donation_set) if len(donation_set) > 0: context = {} user = revolv_user_profile.user context['user'] = user context['payments'] = donation_set send_revolv_email( 'monthly_donation_email', context, [user.email] ) num_emails_sent = num_emails_sent + 1 # Sends an email notification to administrators if not options['silence_admin_notifications']: context = {} context['emails_sent'] = num_emails_sent send_revolv_email( 'monthly_donation_email_admin_notification', context, get_all_administrator_emails() ) else: print "monthlydonationemail command was not run. Use --override to run it if it is currently not the first of the month."
def test_send_email(self): """Test that we can send email correctly.""" success = send_revolv_email(self.email_template_name, self.email_template_context, ["*****@*****.**"]) self.assertEqual(success, 1) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, "What's the best team in Blueprint?") self.assertEqual(len(mail.outbox[0].to), 1) self.assertEqual(mail.outbox[0].to[0], "*****@*****.**")
def user_reinvestment_reminder(): """ Mail worker Send email update to user that eligible for reinvestment. This should execute after month_allocation This how the script do: 1. Read user profile with reinvest_pool >0 and subscribed_to_updates = True 2. For each user send updated email """ SITE_URL = settings.SITE_URL project_reinvest_list_url = SITE_URL + reverse("project:reinvest_list") unsubscribe_update_url = SITE_URL + reverse("unsubscribe", kwargs={"action": "updates"}) for user in RevolvUserProfile.objects.filter(reinvest_pool__gt=0.0, subscribed_to_updates=True): data = dict() data["amount"] = user.reinvest_pool data["projects_url"] = project_reinvest_list_url + utils.get_query_string(user.user) data["unsubscribe_url"] = unsubscribe_update_url + utils.get_query_string(user.user) data["first_name"] = user.user.first_name send_revolv_email("reinvestment_reminder", data, [user.user.email])
def form_valid(self, form): project = Project.objects.get(pk=self.kwargs.get('pk')) form.process_payment(project, self.user) context = {} context['user'] = self.user context['project'] = project context['amount'] = form.cleaned_data.get('amount') send_revolv_email( 'post_donation', context, [self.user.email] ) try: amount = form.cleaned_data.get('amount') # send_donation_info.delay(self.user_profile.get_full_name(), float(amount), # project.title, self.user_profile.address) except: pass return JsonResponse({ 'amount': form.data['amount'], })
def test_send_email(self): """Test that we can send email correctly.""" success = send_revolv_email( self.email_template_name, self.email_template_context, ["*****@*****.**"] ) self.assertEqual(success, 1) self.assertEqual(len(mail.outbox), 1) self.assertEqual( mail.outbox[0].subject, "What's the best team in Blueprint?" ) self.assertEqual(len(mail.outbox[0].to), 1) self.assertEqual(mail.outbox[0].to[0], "*****@*****.**")
def user_reinvestment_reminder(): """ Mail worker Send email update to user that eligible for reinvestment. This should execute after month_allocation This how the script do: 1. Read user profile with reinvest_pool >0 and subscribed_to_updates = True 2. For each user send updated email """ project_reinvest_list_url = SITE_URL + reverse('project:reinvest_list') unsubscribe_update_url = SITE_URL + reverse('unsubscribe', kwargs={'action': 'updates'}) for user in RevolvUserProfile.objects.filter(reinvest_pool__gt=0.0, subscribed_to_updates=True): data = dict() data['amount'] = user.reinvest_pool data['projects_url'] = project_reinvest_list_url + utils.get_query_string(user.user) data['unsubscribe_url'] = unsubscribe_update_url + utils.get_query_string(user.user) data['first_name'] = user.user.first_name send_revolv_email( 'reinvestment_reminder', data, [user.user.email] )
def stripe_payment(request, pk): try: token = request.POST['stripeToken'] tip_cents = request.POST['metadata'] amount_cents = request.POST['amount_cents'] email = request.POST['stripeEmail'] except KeyError: logger.exception('stripe_payment called without required POST data') return HttpResponseBadRequest('bad POST data') try: tip_cents = int(tip_cents) amount_cents = int(amount_cents) if not (0 < amount_cents < MAX_PAYMENT_CENTS): raise ValueError('amount_cents cannot be negative') if not (0 <= tip_cents <= amount_cents): raise ValueError( 'tip_cents cannot be negative or more than project contribution' ) except ValueError: logger.exception('stripe_payment called with improper POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, pk=pk) project_matching_donors = ProjectMatchingDonors.objects.filter( project=project, amount__gt=0) donation_cents = amount_cents - tip_cents error_msg = None try: stripe.Charge.create(source=token, description="Donation for " + project.title, currency="usd", amount=amount_cents) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] except stripe.error.APIConnectionError as e: body = e.json_body error_msg = body['error']['message'] except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) if error_msg: return render(request, "project/project_donate_error.html", { "msg": error_msg, "project": project }) if project_matching_donors: for donor in project_matching_donors: if donor.amount > donation_cents / 100: matching_donation = donation_cents / 100 donor.amount = donor.amount - donation_cents / 100 donor.save() else: matching_donation = donor.amount donor.amount = 0 donor.save() tip = None Payment.objects.create( user=donor.matching_donor, entrant=donor.matching_donor, amount=matching_donation, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) send_donation_info(donor.matching_donor.get_full_name(), matching_donation, donor.matching_donor.user.email, project.title, address='') if request.user.is_authenticated(): user = request.user.revolvuserprofile else: user_id = User.objects.get(username='******').pk user = RevolvUserProfile.objects.get(user_id=user_id) tip = None if tip_cents > 0: tip = Tip.objects.create( amount=tip_cents / 100.0, user=user, ) payment = Payment.objects.create( user=user, entrant=user, amount=donation_cents / 100.0, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) if request.session.has_key("utm_params"): utm_params = request.session.get("utm_params") utm_source = utm_params.get("utm_source") utm_medium = utm_params.get("utm_medium") utm_campaign = utm_params.get("utm_campaign") utm_content = utm_params.get("utm_content") referral_source_track = ReferralSourceTrack.objects.create( source=utm_source, medium=utm_medium, campaign=utm_campaign, content=utm_content, payment=payment) if not request.user.is_authenticated(): my_ip = load(urlopen('http://jsonip.com'))['ip'] url = 'http://api.ipstack.com/' + my_ip + '?access_key=' + settings.IP_STACK_ACCESS_KEY url_timezone = 'http://ip-api.com/json/' + my_ip response = load(urlopen(url)) response_timezone = load(urlopen(url_timezone)) try: AnonymousUserDonation.objects.create( payment=payment, email=email, ip_address=my_ip, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], time_zone=response_timezone['timezone'], country_name=response['country_name'], zip_code=response['zip']) except: AnonymousUserDonation.objects.create(email=email, payment=payment) request.session['payment'] = payment.id SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') context = {} context['project'] = project context['amount'] = donation_cents / 100.0 if tip_cents != 0: context['tip_cents'] = tip_cents / 100.0 else: context['tip_cents'] = False context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link request.session['project'] = project.title previous_url = request.META.get('HTTP_REFERER') request.session['url'] = previous_url context['first_name'] = "RE-volv" context['last_name'] = "supporter" send_donation_info(email, donation_cents / 100.0, email, project.title, address='') send_revolv_email('post_donation', context, [email]) response = redirect('/signin/#signup') response.set_cookie('last_project', payment.project.title) return response else: SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') user = RevolvUserProfile.objects.get(user=request.user) context = {} context['project'] = project context['amount'] = donation_cents / 100.0 if tip_cents != 0: context['tip_cents'] = tip_cents / 100.0 else: context['tip_cents'] = False context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link + utils.get_query_string( request.user) context['first_name'] = request.user.first_name.title context['last_name'] = request.user.last_name.title amount = donation_cents / 100.0 cover_photo = Project.objects.values_list('cover_photo', flat=True).filter(pk=pk) cover_photo = list(cover_photo) request.session['amount'] = str(amount) request.session['project'] = project.title previous_url = request.META.get('HTTP_REFERER') request.session['url'] = previous_url request.session['cover_photo'] = (SITE_URL + '/media/') + ''.join(cover_photo) request.session['social'] = "donation" send_donation_info(user.get_full_name(), donation_cents / 100.0, user.user.email, project.title, address='') send_revolv_email('post_donation', context, [request.user.email]) return redirect('dashboard')
def stripe_payment(request, pk): try: token = request.POST['stripeToken'] tip_cents = request.POST['metadata'] amount_cents = request.POST['amount_cents'] email = request.POST['stripeEmail'] except KeyError: logger.exception('stripe_payment called without required POST data') return HttpResponseBadRequest('bad POST data') try: tip_cents = int(tip_cents) amount_cents = int(amount_cents) if not (0 < amount_cents < MAX_PAYMENT_CENTS): raise ValueError('amount_cents cannot be negative') if not (0 <= tip_cents <= amount_cents): raise ValueError('tip_cents cannot be negative or more than project contribution') except ValueError: logger.exception('stripe_payment called with improper POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, pk=pk) project_matching_donors = ProjectMatchingDonors.objects.filter(project=project, amount__gt=0) donation_cents = amount_cents - tip_cents error_msg = None try: stripe.Charge.create(source=token, description="Donation for " + project.title, currency="usd", amount=amount_cents) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] except stripe.error.APIConnectionError as e: body = e.json_body error_msg = body['error']['message'] except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) if error_msg: return render(request, "project/project_donate_error.html", { "msg": error_msg, "project": project }) if project_matching_donors: for donor in project_matching_donors: if donor.amount > donation_cents / 100: matching_donation = donation_cents / 100 donor.amount = donor.amount - donation_cents / 100 donor.save() else: matching_donation = donor.amount donor.amount = 0 donor.save() tip = None Payment.objects.create( user=donor.matching_donor, entrant=donor.matching_donor, amount=matching_donation, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) send_donation_info(donor.matching_donor.get_full_name(), matching_donation, donor.matching_donor.user.email, project.title, address='') if request.user.is_authenticated(): user = request.user.revolvuserprofile else: user_id = User.objects.get(username='******').pk user = RevolvUserProfile.objects.get(user_id=user_id) tip = None if tip_cents > 0: tip = Tip.objects.create( amount=tip_cents / 100.0, user=user, ) payment = Payment.objects.create( user=user, entrant=user, amount=donation_cents / 100.0, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) if request.session.has_key("utm_params"): utm_params = request.session.get("utm_params") utm_source = utm_params.get("utm_source") utm_medium = utm_params.get("utm_medium") utm_campaign = utm_params.get("utm_campaign") utm_content = utm_params.get("utm_content") referral_source_track = ReferralSourceTrack.objects.create( source=utm_source, medium=utm_medium, campaign=utm_campaign, content=utm_content, payment=payment ) if not request.user.is_authenticated(): my_ip = load(urlopen('http://jsonip.com'))['ip'] url = 'http://api.ipstack.com/' + my_ip + '?access_key=' + settings.IP_STACK_ACCESS_KEY url_timezone = 'http://ip-api.com/json/' + my_ip response = load(urlopen(url)) response_timezone = load(urlopen(url_timezone)) try: AnonymousUserDonation.objects.create( payment=payment, email=email, ip_address=my_ip, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], time_zone=response_timezone['timezone'], country_name=response['country_name'], zip_code=response['zip'] ) except: AnonymousUserDonation.objects.create(email=email, payment=payment) request.session['payment'] = payment.id SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') context = {} context['project'] = project context['amount'] = donation_cents / 100.0 if tip_cents != 0: context['tip_cents'] = tip_cents / 100.0 else: context['tip_cents'] = False context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link request.session['project'] = project.title previous_url = request.META.get('HTTP_REFERER') request.session['url'] = previous_url context['first_name'] = "RE-volv" context['last_name'] = "supporter" send_donation_info(email, donation_cents / 100.0, email, project.title, address='') send_revolv_email( 'post_donation', context, [email] ) response = redirect('/signin/#signup') response.set_cookie('last_project', payment.project.title) return response else: SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') user = RevolvUserProfile.objects.get(user=request.user) context = {} context['project'] = project context['amount'] = donation_cents / 100.0 if tip_cents != 0: context['tip_cents'] = tip_cents / 100.0 else: context['tip_cents'] = False context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link + utils.get_query_string(request.user) context['first_name'] = request.user.first_name.title context['last_name'] = request.user.last_name.title amount = donation_cents / 100.0 cover_photo = Project.objects.values_list('cover_photo', flat=True).filter(pk=pk) cover_photo = list(cover_photo) request.session['amount'] = str(amount) request.session['project'] = project.title previous_url = request.META.get('HTTP_REFERER') request.session['url'] = previous_url request.session['cover_photo'] = (SITE_URL + '/media/') + ''.join(cover_photo) request.session['social'] = "donation" send_donation_info(user.get_full_name(), donation_cents / 100.0, user.user.email, project.title, address='') send_revolv_email( 'post_donation', context, [request.user.email] ) return redirect('dashboard')
def stripe_operation_donation(request): try: token = request.POST['stripeToken'] amount_cents = request.POST.get('donation_amount_cents') if not amount_cents: amount_cents = request.POST.get('donation_amount_in_cents') email = request.POST['stripeEmail'] check = request.POST.get('check') except KeyError: logger.exception('stripe_operation_donation called without required POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, title='Operations') if check == None: amount = round(float(amount_cents) * 100) try: stripe.Charge.create(source=token, description="Donation for RE-volv operations donation", currency="usd", amount=int(amount)) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] return HttpResponseBadRequest('bad POST data') except stripe.error.APIConnectionError as e: return HttpResponseBadRequest('bad POST data') except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) return HttpResponseBadRequest('bad POST data') if amount_cents > 0: if request.user.is_authenticated(): user = RevolvUserProfile.objects.get(user=request.user) tip = None Payment.objects.create( user=user, entrant=user, amount=amount / 100, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) else: my_ip = load(urlopen('http://jsonip.com'))['ip'] url = 'http://api.ipstack.com/' + my_ip + '?access_key=' + settings.IP_STACK_ACCESS_KEY response = load(urlopen(url)) AnonymousUserDetail.objects.create( email=email, ip_address=my_ip, amount=amount / 100, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], country_name=response['country_name'], zip_code=response['zip'] ) anonymous_user = User.objects.get(username='******') user = RevolvUserProfile.objects.get(user=anonymous_user) tip = None Payment.objects.create( user=user, entrant=user, amount=amount / 100, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) send_donation_info(user.get_full_name(), amount / 100, user.user.email, project.title, address='') context = {} if not request.user.is_authenticated(): context['user'] = '******' else: if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title() + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email( 'Post_operations_donation', context, [email] ) return HttpResponse(json.dumps({'status': 'donation_success', 'amount': amount / float(100)}), content_type="application/json") else: if amount_cents > 0: if request.user.is_authenticated(): user = RevolvUserProfile.objects.get(user=request.user) try: stripeDetail = StripeDetails.objects.get(user=user, amount__gt=0.0) except StripeDetails.DoesNotExist: stripeDetail = None if not stripeDetail: amount = round(float(amount_cents) * 100) try: customer = stripe.Customer.create( email=email, description="Donation for RE-volv Operations", source=token # obtained with Stripe.js ) plan = stripe.Plan.create( amount=int(amount), interval="month", name="Operation Donation " + str(amount_cents), currency="usd", id="operation_donation" + "_" + customer["id"] + "_" + str(amount_cents)) subscription = stripe.Subscription.create( customer=customer, plan=plan, ) except stripe.error.CardError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Payment error') return redirect('home') except stripe.error.APIConnectionError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Internet connection error. Please check your internet connection.') return redirect('home') except Exception: error_msg = "Payment error. RE-volv has been notified." logger.exception(error_msg) messages.error(request, 'Payment error. RE-volv has been notified.') return redirect('home') else: return HttpResponse(json.dumps({'status': 'already_exist'}), content_type="application/json") else: amount = round(float(amount_cents) * 100) try: customer = stripe.Customer.create( email=email, description="Donation for RE-volv Operations", source=token # obtained with Stripe.js ) plan = stripe.Plan.create( amount=int(amount), interval="month", name="Operation Donation " + str(amount_cents), currency="usd", id="operation_donation" + "_" + customer["id"] + "_" + str(amount_cents)) subscription = stripe.Subscription.create( customer=customer, plan=plan, ) except stripe.error.CardError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Payment error') return redirect('home') except stripe.error.APIConnectionError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Internet connection error. Please check your internet connection.') return redirect('home') except Exception: error_msg = "Payment error. RE-volv has been notified." logger.exception(error_msg) messages.error(request, 'Payment error. RE-volv has been notified.') return redirect('home') my_ip = load(urlopen('http://jsonip.com'))['ip'] url = 'http://api.ipstack.com/' + my_ip + '?access_key=' + settings.IP_STACK_ACCESS_KEY response = load(urlopen(url)) AnonymousUserDetail.objects.create( email=email, ip_address=my_ip, amount=amount / 100, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], country_name=response['country_name'], zip_code=response['zip'] ) anonymous_user = User.objects.get(username='******') user = RevolvUserProfile.objects.get(user=anonymous_user) StripeDetails.objects.create( user=user, stripe_customer_id=subscription.customer, subscription_id=subscription.id, plan=subscription.plan.id, stripe_email=email, amount=amount / float(100) ) context = {} if not request.user.is_authenticated(): context['user'] = '******' else: if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title() + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email( 'Post_operations_donation', context, [email] ) return HttpResponse(json.dumps({'status': 'subscription_success', 'amount': amount / float(100)}), content_type="application/json")
def stripe_payment(request, pk): try: token = request.POST['stripeToken'] tip_cents = request.POST['metadata'] amount_cents = request.POST['amount_cents'] email = request.POST['stripeEmail'] except KeyError: logger.exception('stripe_payment called without required POST data') return HttpResponseBadRequest('bad POST data') try: tip_cents = int(tip_cents) amount_cents = int(amount_cents) if not (0 < amount_cents < MAX_PAYMENT_CENTS): raise ValueError('amount_cents cannot be negative') if not (0 <= tip_cents < amount_cents): raise ValueError('tip_cents cannot be negative or more than project contribution') except ValueError: logger.exception('stripe_payment called with improper POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, pk=pk) project_matching_donors = ProjectMatchingDonors.objects.filter(project=project, amount__gt=0) donation_cents = amount_cents - tip_cents error_msg = None try: stripe.Charge.create(source=token, description="Donation for "+project.title, currency="usd", amount=amount_cents) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] except stripe.error.APIConnectionError as e: body = e.json_body error_msg = body['error']['message'] except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) if error_msg: return render(request, "project/project_donate_error.html", { "msg": error_msg, "project": project }) if project_matching_donors: for donor in project_matching_donors: if donor.amount > donation_cents / 100: matching_donation = donation_cents / 100 donor.amount = donor.amount - donation_cents / 100 donor.save() else: matching_donation = donor.amount donor.amount = 0 donor.save() tip = None Payment.objects.create( user=donor.matching_donor, entrant=donor.matching_donor, amount=matching_donation, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) send_donation_info(donor.matching_donor.get_full_name(), matching_donation, donor.matching_donor.user.email, project.title, address='') if request.user.is_authenticated(): user = request.user.revolvuserprofile else: user_id = User.objects.get(username='******').pk user = RevolvUserProfile.objects.get(user_id=user_id) tip = None if tip_cents > 0: tip=Tip.objects.create( amount=tip_cents / 100.0, user=user, ) payment=Payment.objects.create( user=user, entrant=user, amount=donation_cents/100.0, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) if not request.user.is_authenticated(): request.session['payment'] = payment.id SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') context = {} context['project'] = project context['amount'] = donation_cents / 100.0 context['tip_cents'] = tip_cents / 100.0 context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link context['first_name'] = "RE-volv" context['last_name'] = "Supporter" send_donation_info(user.get_full_name(), donation_cents / 100.0, user.user.email, project.title, address='') send_revolv_email( 'post_donation', context, [email] ) return redirect('signin') else: SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') user=RevolvUserProfile.objects.get(user=request.user) context = {} context['project'] = project context['amount'] = donation_cents/100.0 context['tip_cents'] = tip_cents / 100.0 context['amount_cents'] = amount_cents/100.0 context['portfolio_link'] = portfolio_link + utils.get_query_string(request.user) context['first_name'] = request.user.first_name context['last_name'] = request.user.last_name amount = donation_cents / 100.0 cover_photo = Project.objects.values_list('cover_photo', flat=True).filter(pk=pk) cover_photo = list(cover_photo) request.session['amount'] = str(amount) request.session['project'] = project.title previous_url = request.META.get('HTTP_REFERER') request.session['url'] = previous_url request.session['cover_photo'] = (SITE_URL + '/media/') + ''.join(cover_photo) request.session['social'] = "donation" send_donation_info(user.get_full_name(), donation_cents/100.0, user.user.email, project.title, address='') send_revolv_email( 'post_donation', context, [request.user.email] ) return redirect('dashboard')
def stripe_operation_donation(request): try: token = request.POST['stripeToken'] amount_cents = request.POST.get('donation_amount_cents') if not amount_cents: amount_cents = request.POST.get('donation_amount_in_cents') email = request.POST['stripeEmail'] check = request.POST.get('check') except KeyError: logger.exception('stripe_operation_donation called without required POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, title='Operations') if check==None: amount = round(float(amount_cents) * 100) try: stripe.Charge.create(source=token, description="Donation for RE-volv operations donation", currency="usd", amount=int(amount)) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] return HttpResponseBadRequest('bad POST data') except stripe.error.APIConnectionError as e: return HttpResponseBadRequest('bad POST data') except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) return HttpResponseBadRequest('bad POST data') if amount_cents > 0: if request.user.is_authenticated(): user = RevolvUserProfile.objects.get(user=request.user) tip = None Payment.objects.create( user=user, entrant=user, amount=amount/100, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) else: from requests import get my_ip = request.META.get('REMOTE_ADDR') url = 'http://freegeoip.net/json/' + my_ip response = load(urlopen(url)) AnonymousUserDetail.objects.create( email=email, ip_address=my_ip, amount=amount / 100, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], time_zone=response['time_zone'], country_name=response['country_name'], zip_code=response['zip_code'] ) anonymous_user = User.objects.get(username='******') user = RevolvUserProfile.objects.get(user=anonymous_user) tip = None Payment.objects.create( user=user, entrant=user, amount=amount/100, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) send_donation_info(user.get_full_name(), amount/100,user.user.email,project.title, address='') context = {} if not request.user.is_authenticated(): context['user'] = '******' else: if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title() + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email( 'Post_operations_donation', context, [email] ) return HttpResponse(json.dumps({'status': 'donation_success','amount':amount/float(100)}), content_type="application/json") else: if amount_cents > 0: if request.user.is_authenticated(): user = RevolvUserProfile.objects.get(user=request.user) try: stripeDetail = StripeDetails.objects.get(user=user, amount__gt=0.0) except StripeDetails.DoesNotExist: stripeDetail = None if not stripeDetail: amount = round(float(amount_cents) * 100) try: customer = stripe.Customer.create( email=email, description="Donation for RE-volv Operations", source=token # obtained with Stripe.js ) plan = stripe.Plan.create( amount=int(amount), interval="month", name="Operation Donation " + str(amount_cents), currency="usd", id="operation_donation" + "_" + customer["id"] + "_" + str(amount_cents)) subscription = stripe.Subscription.create( customer=customer, plan=plan, ) except stripe.error.CardError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Payment error') return redirect('home') except stripe.error.APIConnectionError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Internet connection error. Please check your internet connection.') return redirect('home') except Exception: error_msg = "Payment error. RE-volv has been notified." logger.exception(error_msg) messages.error(request, 'Payment error. RE-volv has been notified.') return redirect('home') else: return HttpResponse(json.dumps({'status': 'already_exist'}), content_type="application/json") else: amount = round(float(amount_cents) * 100) try: customer = stripe.Customer.create( email=email, description="Donation for RE-volv Operations", source=token # obtained with Stripe.js ) plan = stripe.Plan.create( amount=int(amount), interval="month", name="Operation Donation " + str(amount_cents), currency="usd", id="operation_donation" + "_" + customer["id"] + "_" + str(amount_cents)) subscription = stripe.Subscription.create( customer=customer, plan=plan, ) except stripe.error.CardError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Payment error') return redirect('home') except stripe.error.APIConnectionError as e: body = e.json_body # error_msg = body['error']['message'] messages.error(request, 'Internet connection error. Please check your internet connection.') return redirect('home') except Exception: error_msg = "Payment error. RE-volv has been notified." logger.exception(error_msg) messages.error(request, 'Payment error. RE-volv has been notified.') return redirect('home') my_ip = load(urlopen('http://jsonip.com'))['ip'] url = 'http://freegeoip.net/json/' + my_ip response = load(urlopen(url)) AnonymousUserDetail.objects.create( email = email, ip_address = my_ip, amount = amount / 100, city = response['city'], region_code = response['region_code'], region_name = response['region_name'], time_zone = response['time_zone'], country_name = response['country_name'], zip_code = response['zip_code'] ) anonymous_user = User.objects.get(username='******') user = RevolvUserProfile.objects.get(user=anonymous_user) StripeDetails.objects.create( user=user, stripe_customer_id=subscription.customer, subscription_id=subscription.id, plan=subscription.plan.id, stripe_email=email, amount=amount/float(100) ) context = {} if not request.user.is_authenticated(): context['user'] = '******' else: if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title() + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email( 'Post_operations_donation', context, [email] ) return HttpResponse(json.dumps({'status': 'subscription_success','amount':amount/float(100)}), content_type="application/json")
def send_email(template, context): send_revolv_email(template, context, ['*****@*****.**'])
def stripe_payment(request, pk): try: token = request.POST['stripeToken'] tip_cents = request.POST['metadata'] amount_cents = request.POST['amount_cents'] except KeyError: logger.exception('stripe_payment called without required POST data') return HttpResponseBadRequest('bad POST data') try: tip_cents = int(tip_cents) amount_cents = int(amount_cents) if not (0 < amount_cents < MAX_PAYMENT_CENTS): raise ValueError('amount_cents cannot be negative') if not (0 <= tip_cents < amount_cents): raise ValueError( 'tip_cents cannot be negative or more than project contribution' ) except ValueError: logger.exception('stripe_payment called with improper POST data') return HttpResponseBadRequest('bad POST data') project = get_object_or_404(Project, pk=pk) project_matching_donors = ProjectMatchingDonors.objects.filter( project=project, amount__gt=0) donation_cents = amount_cents - tip_cents error_msg = None try: stripe.Charge.create(source=token, description="Donation for " + project.title, currency="usd", amount=amount_cents) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] except stripe.error.APIConnectionError as e: body = e.json_body error_msg = body['error']['message'] except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) if error_msg: return render(request, "project/project_donate_error.html", { "msg": error_msg, "project": project }) if project_matching_donors: for donor in project_matching_donors: if donor.amount > donation_cents / 100: matching_donation = donation_cents / 100 donor.amount = donor.amount - donation_cents / 100 donor.save() else: matching_donation = donor.amount donor.amount = 0 donor.save() tip = None Payment.objects.create( user=donor.matching_donor, entrant=donor.matching_donor, amount=matching_donation, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) tip = None if tip_cents > 0: tip = Tip.objects.create( amount=tip_cents / 100.0, user=request.user.revolvuserprofile, ) Payment.objects.create( user=request.user.revolvuserprofile, entrant=request.user.revolvuserprofile, amount=donation_cents / 100.0, project=project, tip=tip, payment_type=PaymentType.objects.get_stripe(), ) SITE_URL = settings.SITE_URL portfolio_link = SITE_URL + reverse('dashboard') context = {} context['user'] = request.user context['project'] = project context['amount'] = donation_cents / 100.0 context['tip_cents'] = tip_cents / 100.0 context['amount_cents'] = amount_cents / 100.0 context['portfolio_link'] = portfolio_link + utils.get_query_string( request.user) send_revolv_email('post_donation', context, [request.user.email]) return redirect('dashboard')
def stripe_operation_donation(request): try: token = request.POST['stripeToken'] amount_cents = request.POST['donation_amount_cents'] email = request.POST['stripeEmail'] check = request.POST.get('check') except KeyError: logger.exception( 'stripe_operation_donation called without required POST data') return HttpResponseBadRequest('bad POST data') if check == None: amount = round(float(amount_cents) * 100) try: stripe.Charge.create( source=token, description="Donation for RE-volv operations donation", currency="usd", amount=int(amount)) except stripe.error.CardError as e: body = e.json_body error_msg = body['error']['message'] return HttpResponseBadRequest('bad POST data') except stripe.error.APIConnectionError as e: return HttpResponseBadRequest('bad POST data') except Exception: error_msg = "Payment error. Re-volv has been notified." logger.exception(error_msg) return HttpResponseBadRequest('bad POST data') context = {} if not request.user.is_authenticated(): my_ip = request.META.get('REMOTE_ADDR') url = 'http://freegeoip.net/json/' + my_ip response = load(urlopen(url)) AnonymousUserDetail.objects.create( email=email, ip_address=my_ip, amount=amount / 100, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], time_zone=response['time_zone'], country_name=response['country_name'], zip_code=response['zip_code']) context['user'] = '******' else: if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title( ) + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email('Post_operations_donation', context, [email]) #messages.info(request, "Thank you for donating to RE-volv's mission to empower communities with solar energy!") return HttpResponse(json.dumps({'status': 'donation_success'}), content_type="application/json") else: amount = round(float(amount_cents) * 100) try: customer = stripe.Customer.create( email=email, description="Donation for RE-volv Operations", source=token # obtained with Stripe.js ) plan = stripe.Plan.create( amount=int(amount), interval="month", name="Revolv Donation " + str(amount_cents), currency="usd", id="revolv_donation" + "_" + customer["id"] + "_" + str(amount_cents)) stripe.Subscription.create(customer=customer, plan=plan) except stripe.error.CardError as e: body = e.json_body #error_msg = body['error']['message'] messages.error(request, 'Payment error') return redirect('home') except stripe.error.APIConnectionError as e: body = e.json_body # error_msg = body['error']['message'] messages.error( request, 'Internet connection error. Please check your internet connection.' ) return redirect('home') except Exception: error_msg = "Payment error. RE-volv has been notified." logger.exception(error_msg) messages.error(request, 'Payment error. RE-volv has been notified.') return redirect('home') context = {} if not request.user.is_authenticated(): context['user'] = '******' else: my_ip = request.META.get('REMOTE_ADDR') url = 'http://freegeoip.net/json/' + my_ip response = load(urlopen(url)) AnonymousUserDetail.objects.create( email=email, ip_address=my_ip, amount=amount / 100, city=response['city'], region_code=response['region_code'], region_name=response['region_name'], time_zone=response['time_zone'], country_name=response['country_name'], zip_code=response['zip_code']) if not (request.user.first_name and request.user.last_name): context['user'] = '******' else: context['user'] = request.user.first_name.title( ) + ' ' + request.user.last_name.title() context['amount'] = amount / 100.0 send_revolv_email('Post_operations_donation', context, [email]) #messages.info(request, "Thank you for donating monthly to RE-volv's mission to empower communities with solar energy!") return HttpResponse(json.dumps({'status': 'subscription_success'}), content_type="application/json")