def test_template_unsupported(self): """A lot of options are not compatible with SendBulkTemplatedEmail""" message = AnymailMessage(template_id="welcome_template", to=['*****@*****.**']) message.subject = "nope, can't change template subject" with self.assertRaisesMessage(AnymailUnsupportedFeature, "overriding template subject"): message.send() message.subject = None message.body = "nope, can't change text body" with self.assertRaisesMessage(AnymailUnsupportedFeature, "overriding template body content"): message.send() message.content_subtype = "html" with self.assertRaisesMessage(AnymailUnsupportedFeature, "overriding template body content"): message.send() message.body = None message.attach("attachment.txt", "this is an attachment", "text/plain") with self.assertRaisesMessage(AnymailUnsupportedFeature, "attachments with template"): message.send() message.attachments = [] message.extra_headers = {"X-Custom": "header"} with self.assertRaisesMessage(AnymailUnsupportedFeature, "extra_headers with template"): message.send() message.extra_headers = {} message.metadata = {"meta": "data"} with self.assertRaisesMessage(AnymailUnsupportedFeature, "metadata with template"): message.send() message.metadata = None message.tags = ["tag 1", "tag 2"] with self.assertRaisesMessage(AnymailUnsupportedFeature, "tags with template"): message.send() message.tags = None
def password_reset_prelim(request): if request.method == 'POST': _password_reset_prelim_form = PasswordResetPrelimForm(request.POST) if _password_reset_prelim_form.is_valid(): _email = _password_reset_prelim_form.cleaned_data.get('email') _user = get_user_model() if _user.objects.user_exists(_email): _timedSigner = TimestampSigner() _signed_email = _timedSigner.sign(_email) _message = AnymailMessage(to=[_email], tags=['Account']) _message.template_id = 'a4753e4f-f898-4a97-8ca1-a52ef8cc7aeb' _message.merge_global_data = { 'signed_email': _signed_email, } _message.metadata = {'signed-email': _signed_email} _message.track_clicks = True _message.send() return redirect('accounts:password-reset-prelim-success') else: _password_reset_prelim_form.add_error( None, mark_safe( 'This email is not registered with us. Do you want to <a href="' + reverse('accounts:signup-prelim') + '">signup</a> instead?')) return render(request, 'accounts/password_reset_prelim.html', { 'password_reset_prelim_form': _password_reset_prelim_form, }) else: return render( request, 'accounts/password_reset_prelim.html', { 'password_reset_prelim_form': _password_reset_prelim_form, }) else: auth.logout(request) _password_reset_prelim_form = PasswordResetPrelimForm() return render( request, 'accounts/password_reset_prelim.html', { 'password_reset_prelim_form': _password_reset_prelim_form, })
def signup_prelim(request): if request.method == 'POST': _signup_form = SignupPrelimForm(request.POST) if _signup_form.is_valid(): _email = _signup_form.cleaned_data.get('email') _user = get_user_model() if _user.objects.user_exists(_email): _signup_form.add_error( None, mark_safe( 'This email you entered is already registered with us. Do you want to <a href="' + reverse('accounts:login') + '">login</a> instead?')) return render(request, 'accounts/signup_prelim.html', {'signup_form': _signup_form}) else: _timedSigner = TimestampSigner() _signed_email = _timedSigner.sign(_email) _message = AnymailMessage(to=[_email], tags=['Onboarding']) _message.template_id = '4865e7c4-3b5a-498d-8487-c7a3ea593085' _message.merge_global_data = { 'signed_email': _signed_email, } _message.metadata = {'signed-email': _signed_email} _message.track_clicks = True _message.send() return redirect('accounts:signup-prelim-success') else: return render(request, 'accounts/signup_prelim.html', {'signup_form': _signup_form}) else: _signup_form = SignupPrelimForm() return render(request, 'accounts/signup_prelim.html', {'signup_form': _signup_form})
def update(request): if request.method == 'POST': _param_errors = [] _send_success_email = False _send_cancel_email = False if 'merchant' not in request.POST or request.POST.get('merchant') != env('COINPAYMENTS_MERCHANT_ID'): _param_errors.append('merchant') if not _param_errors: if request.POST.get('ipn_type') == 'api': _txn_id = request.POST.get('txn_id') _status = int(request.POST.get('status')) _status_text = request.POST.get('status_text') _email = request.POST.get('email') try: with transaction.atomic(): _order = TokenOrders.objects.order_from_txn(txn_id=_txn_id).get() _order.payment_status = _status _order.payment_status_text = _status_text if _status >= 1: if not _order.tokens_credited: _transaction = TokenTransactions( token_transaction_external_id=token_urlsafe(32), customer_external_id=_order.customer_external_id, transaction_type='Deposit', token_value=_order.token_value, ) _transaction.save() _send_success_email = True _order.payment_received = True _order.tokens_credited = True elif _status == -1: _send_cancel_email = True _order.save() if _send_success_email: _message = AnymailMessage( to=[_email], tags=['Orders'] ) _message.template_id = 'a33525c2-8c99-4f8e-b7cd-b943e874c318' _message.merge_global_data = { 'token_value': ' '.join([str("{:,.2f}".format(float(_order.token_value))), 'XTV']), } _message.metadata = {'payment-address': _order.payment_address} _message.track_clicks = True _message.send() elif _send_cancel_email: _message = AnymailMessage( to=[_email], tags=['Orders'] ) _message.template_id = 'f39a80c3-a381-4a15-822b-32fb08debbe4' _message.merge_global_data = { 'token_value': ' '.join([str("{:,.2f}".format(float(_order.token_value))), 'XTV']), 'payment_currency_value': ' '.join([str(_order.payment_currency_value), _order.payment_currency]), 'payment_address': _order.payment_address, } _message.metadata = {'payment-address': _order.payment_address} _message.track_clicks = True _message.send() return standard_response() except IntegrityError: # TODO: Notify us of error return standard_response() else: return HttpResponse('Missing required parameters: %s' % ', '.join(_param_errors), status=400) else: return HttpResponse('Method Not Allowed', status=405)
def buy(request): _user_id_external = request.user.id_external _user_email = request.user.email _user_eligibility_latest = UserEligibilityRegistry.objects.last_consent( external_id=_user_id_external) _token_cost_usd = 0.1 if len(_user_eligibility_latest) == 0: return redirect('launchpad:eligibility') if request.method == 'POST': _buy_form = BuyForm(request.POST) if _buy_form.is_valid(): _usd_value = _buy_form.cleaned_data.get('usd_value') _payment_currency = _buy_form.cleaned_data.get('payment_currency') _token_value = int(_usd_value) / _token_cost_usd _token_order_external_id = token_urlsafe(32) _cp_client = CryptoPayments( env('COINPAYMENTS_API_KEY'), env('COINPAYMENTS_API_SECRET'), env('COINPAYMENTS_IPN_URL'), ) _token_order = TokenOrders( token_order_external_id=_token_order_external_id, customer_external_id=_user_id_external, usd_value=_usd_value, token_value=_token_value, payment_currency=_payment_currency, ) _token_order.save() _token_order_id = _token_order.token_order_id _item_name = 'Centive Tokens (XTV)' _item_number = str(random.randint( 10, 100)) + str(_token_order_id) + str(random.randint(10, 100)) _cp_transaction = _cp_client.createTransaction({ 'amount': _usd_value, 'currency1': 'USD', 'currency2': _payment_currency, 'buyer_email': _user_email, 'item_name': _item_name, 'item_number': _item_number, }) _token_order.payment_currency_value = _cp_transaction.amount _token_order.payment_address = _cp_transaction.address _token_order.txn_id = _cp_transaction.txn_id _token_order.confirms_needed = _cp_transaction.confirms_needed _token_order.timeout = _cp_transaction.timeout _token_order.status_url = _cp_transaction.status_url _token_order.qrcode_url = _cp_transaction.qrcode_url _token_order.save() _message = AnymailMessage(to=[_user_email], tags=['Orders']) _message.template_id = '9125877d-e602-4375-8ad2-74dbad9ec04d' _message.merge_global_data = { 'token_value': ' '.join([str("{:,.2f}".format(float(_token_value))), 'XTV']), 'confirms_needed': _cp_transaction.confirms_needed, 'payment_currency_value': ' '.join([str(_cp_transaction.amount), _payment_currency]), 'payment_address': _cp_transaction.address, 'status_url': _cp_transaction.status_url, } _message.metadata = {'payment-address': _cp_transaction.address} _message.track_clicks = True _message.send() return redirect('launchpad:payment', order_id=_token_order_external_id) else: return render(request, 'launchpad/buy.html', {'buy_form': _buy_form}) else: _buy_form = BuyForm() return render(request, 'launchpad/buy.html', {'buy_form': _buy_form})