def newsletter(cls, *args, **kwargs): cls.organization() options = { "name": cls.rand_tree(), "internal_name": "%s%s" % (cls.rand_tree().lower(), cls.rand_str()), "description": cls.rand_text(), "from_name": "%s %s" % (cls.rand_name(), cls.rand_name()), "from_email": cls.rand_email(), "confirm_message": cls.message( subject="Please confirm your subscription! %s" % cls.rand_text(), body_text_unrendered="Please confirm your subscription! Click here: {{ opt_in_link }}\n%s" % cls.rand_paragraph(), transactional=True, transactional_no_unsubscribe_reason="send opt-in messages to people who fill out the form %s" % cls.rand_text(), transactional_send_reason="someone (hopefully you) entered your email on my website %s" % cls.rand_text(), ), "welcome_message": cls.message( subject="Welcome aboard! %s" % cls.rand_text(), body_text_unrendered="Welcome aboard!\n %s" % cls.rand_paragraph(), ), "unsubscribe_footer": "%s [Click here to unsubscribe]({{ unsubscribe_link }}). \n ExampleCo, Inc is based at {{ organization_address }}" % cls.rand_text(), # noqa } options.update(kwargs) Organization.get() n = Newsletter.objects.create(**options) return n
def start_journey(request, hashid): Organization.get() me = get_me(request) pp = ProductPurchase.objects.get(hashid=hashid) Journey.objects.create(productpurchase=pp, start_date=timezone.now()) if pp.purchase.person != me: return redirect(reverse('logout')) me = get_me(request) return redirect(reverse("products:productpurchase", args=(pp.hashid, )))
def organization(request): o = Organization.get() page_name = "organization" o = Organization.get() if request.method == "POST": form = OrganizationForm(request.POST, request.FILES, instance=o) if form.is_valid(): form.save() saved = True o = Organization.get() form = OrganizationForm(instance=o) else: form = OrganizationForm(instance=o) return locals()
def checkout_help_edition(request, course_slug): o = Organization.get() product = Product.get_from_slug(course_slug) try: me = get_me(request) except: return redirect( "%s?help_edition=1" % reverse("products:course_purchase", args=(product.slug, ))) purchase, purchase_created = Purchase.objects.get_or_create( person=me, help_edition=True, ) purchase.total = Decimal(0.00) purchase.save() pp, pp_created = ProductPurchase.objects.get_or_create( product=product, purchase=purchase, ) pp.send_purchase_email() # pp = ProductPurchase.objects.get(hashid=hashid) # if pp.purchase.person != me: # return redirect(reverse('logout')) return TemplateResponse( request, 'products/%s/checkout_success.html' % (product.slug, ), locals())
def checkout_success(request, course_slug): o = Organization.get() product = Product.get_from_slug(course_slug) p = Person.objects.get(hashid=request.GET['ci']) me = get_me(request) sess = stripe.checkout.Session.retrieve(request.GET['session_id']) # print(sess) assert p == me purchase, purchase_created = Purchase.objects.get_or_create( person=p, stripe_session_id=sess["id"], stripe_payment_intent_id=sess["payment_intent"], ) purchase.total = Decimal(sess["amount_total"] / 100) purchase.save() pp, pp_created = ProductPurchase.objects.get_or_create( product=product, purchase=purchase, ) pp.send_purchase_email() # pp = ProductPurchase.objects.get(hashid=hashid) # if pp.purchase.person != me: # return redirect(reverse('logout')) return TemplateResponse( request, 'products/%s/checkout_success.html' % (product.slug, ), locals())
def course_purchase(request, course_slug): o = Organization.get() product = Product.get_from_slug(course_slug) purchased = False try: me = get_me(request) if me.products.filter(product=product).count() > 0: purchased = True pp = me.products.filter(product=product)[0] return redirect( reverse('products:productpurchase', args=(pp.hashid, ))) except: pass # if not me and request.method == 'GET': # cached_resp = cache.get("%s_purchase_not_logged_in%s" % (course_slug, request.META["QUERY_STRING"])) # if cached_resp: # return cached_resp # else: # resp = TemplateResponse( # request, 'products/%s/purchase.html' % ( # product.slug, # ), # locals() # ) # resp.render() # cache.set("%s_purchase_not_logged_in%s" % (course_slug, request.META["QUERY_STRING"]), resp) # return resp resp = TemplateResponse(request, 'products/%s/purchase.html' % (product.slug, ), locals()) # resp.render() return resp
def refund_confirm(request, hashid): o = Organization.get() me = get_me(request) pp = ProductPurchase.objects.get(hashid=hashid) pp.purchase.refund(feedback=request.POST.get('feedback', None)) return locals()
def account(request): o = Organization.get() me = get_me(request) products = Product.objects.filter() information_updated = False password_changed = False if request.method == "POST": if request.POST.get("type") == "information": # Process info update me.first_name = request.POST["first_name"] me.email = request.POST["email"] me.turned_off_product_emails = request.POST.get( "turned_off_product_emails", None) != "checked" me.save() information_updated = True elif request.POST.get("type") == "password": # Update password if request.POST.get("password"): password_message = "Password changed." me.set_password(request.POST["password"]) me.save() update_session_auth_hash(request, me) else: password_message = "Password was blank." return locals()
def transfer_subscription(request, transfer_code): o = Organization.get() # This is a special link for users to opt-in from an existing newsletter. s = None if "e" in request.GET: hashed_email = lookup_hash(request.GET["e"].replace(" ", "+")) if Newsletter.objects.filter(hashid=transfer_code).count(): n = Newsletter.objects.get(hashid=transfer_code) if Person.objects.filter(hashed_email=hashed_email).count() > 0: p = Person.objects.get(hashed_email=hashed_email) if "f" in request.GET: p.first_name = request.GET["f"] else: p = Person.objects.create(hashed_email=hashed_email, ) p.email = request.GET["e"].replace(" ", "+") if "f" in request.GET: p.first_name = request.GET["f"] p.save() s, created = Subscription.objects.get_or_create( person=p, newsletter=n, ) if created or s.unsubscribed: s.subscribed_at = timezone.now() s.unsubscribed = False s.unsubscribed_at = None s.subscription_url = "transfer-subscription" s.subscribed_from_ip, _ = get_client_ip(request) s.save() already_double_opted_in = True if not s.double_opted_in: already_double_opted_in = False s.double_opted_in = True s.double_opted_in_at = timezone.now() s.save() p = s.person p.email_verified = True p.save() email_confirmed = True if not already_double_opted_in: send_subscription_welcome.delay(s.pk) if s is not None: s = Subscription.objects.get(pk=s.pk) HistoricalEvent.log( person=p, event_type="transfer-subscription", subscription=s, newsletter=s.newsletter, ) else: return HttpResponse(status=422) return locals()
def rendered(self): t = get_template(self.template.name) o = Organization.get() context = self.template.context.copy() context.update(**{ "organization": o, "organization_address": o.address, "organization_name": o.name, "name": self.name, "page_name": self.slug, "section": self.section, "raw_markdown": self.raw_markdown, "slug": self.slug, "title": self.title, "description": self.description, "publish_date": self.publish_date, "published": self.published, "private": self.private, "context": self.context, "links": Link.objects.all().order_by("-publish_date", "-created_at"), "pages": Page.objects.all().order_by("-created_at"), "posts": Post.objects.all().order_by("-publish_date", "-created_at"), "RESOURCES_URL": settings.RESOURCES_URL }) c = Context(context) rendered_string = mistune.html(self.raw_markdown) rendered_string = rendered_string.replace(u"’", '’').replace(u"“", '“') rendered_string = rendered_string.replace(u"”", '”').replace(u"’", "’") content_template = DjangoTemplate(rendered_string) context["rendered_post_html"] = mark_safe(content_template.render(c).encode("utf-8").decode()) return t.render(context)
def confirm_email(request, email_key): o = Organization.get() u = Person.objects.get(email_confirm_key=email_key) u.email_verified = True u.save() email_confirmed = True return locals()
def scheduled_newsletter_message_queued(request, hashid): o = Organization.get() page_name = "scheduled_newsletter_messages" snm = ScheduledNewsletterMessage.objects.get(hashid=hashid) queue_newsletter_message.delay(snm.hashid) return locals()
def confirm_subscription(request, opt_in_key): o = Organization.get() s = Subscription.objects.get(opt_in_key=opt_in_key) already_double_opted_in = True if not s.double_opted_in: already_double_opted_in = False s.double_opted_in = True s.double_opted_in_at = timezone.now() s.save() p = s.person p.email_verified = True p.save() email_confirmed = True if not already_double_opted_in: send_subscription_welcome.delay(s.pk) s = Subscription.objects.get(pk=s.pk) HistoricalEvent.log( person=p, event_type="double-opt-in", subscription=s, newsletter=s.newsletter, ) return locals()
def rendered(self,): t = get_template(self.template.name) o = Organization.get() context = self.template.context.copy() context.update(**{ "organization": o, "organization_address": o.address, "organization_name": o.name, "name": self.name, "page_name": self.slug, "section": self.section, "source_text": self.source_text, "slug": self.slug, "title": self.title, "description": self.description, "keywords": self.keywords, "links": Link.objects.all().order_by("-publish_date", "-created_at"), "pages": Page.objects.all().order_by("-created_at"), "posts": Post.objects.all().order_by("-publish_date", "-created_at"), "RESOURCES_URL": settings.RESOURCES_URL }) c = Context(context) content_template = DjangoTemplate(self.source_text) context["rendered_page_html"] = mark_safe(content_template.render(c).encode("utf-8").decode()) return t.render(context)
def delete_productday(request, hashid): o = Organization.get() productday = ProductDay.objects.get(hashid=hashid) if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE": productday.delete() return redirect(reverse('clubhouse:productdays', host='clubhouse')) return locals()
def delete_journey(request, hashid): o = Organization.get() journey = Journey.objects.get(hashid=hashid) if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE": journey.delete() return redirect(reverse('clubhouse:journeys', host='clubhouse')) return locals()
def delete_link(request, hashid): o = Organization.get() link = Link.objects.get(hashid=hashid) if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE": link.delete() return redirect(reverse('clubhouse:links', host='clubhouse')) return locals()
def delete_bestimator_choice(request, hashid): o = Organization.get() bestimator_choice = BestimatorExperimentChoice.objects.get(hashid=hashid) if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE": bestimator_choice.delete() return redirect(reverse('clubhouse:bestimator_choices', host='clubhouse')) return locals()
def confirm_delete_journey(request, hashid): o = Organization.get() me = get_me(request) journey = Journey.objects.get(hashid=hashid) if journey.productpurchase.purchase.person != me: return redirect(reverse('logout')) return locals()
def delete_purchase(request, hashid): o = Organization.get() purchase = Purchase.objects.get(hashid=hashid) if request.method == "POST" and "delete" in request.POST and request.POST["delete"] == "DO_DELETE": purchase.delete() return redirect(reverse('clubhouse:purchases', host='clubhouse')) return locals()
def home(request): o = Organization.get() me = get_me(request) products = Product.objects.filter() if me.products.count() == 1: return redirect( reverse("products:productpurchase", args=(me.products.first().hashid, ))) return locals()
def people(request): o = Organization.get() page_name = "people" if request.method == "GET" and "q" in request.GET: hashed_email = lookup_hash(request.GET["q"]) people = Person.objects.filter(hashed_email=lookup_hash) else: people = Person.objects.all()[:30] return locals()
def journey(request, hashid): o = Organization.get() me = get_me(request) journey = Journey.objects.get(hashid=hashid) if journey.productpurchase.purchase.person != me: return redirect(reverse('logout')) # TODO: Add auth assertion return locals()
def checkout_cancelled(request, course_slug): o = Organization.get() product = Product.get_from_slug(course_slug) # pp = ProductPurchase.objects.get(hashid=hashid) # me = get_me(request) # if pp.purchase.person != me: # return redirect(reverse('logout')) return TemplateResponse( request, 'products/%s/checkout_cancelled.html' % (product.slug, ), locals())
def confirm_delete_account(request): o = Organization.get() me = get_me(request) if request.POST.get("submit") == "yes": me.delete() user = request.user logout(request) user.delete() return redirect(reverse('products:account_deleted')) return locals()
def resubscribe(request, resubscribe_key): o = Organization.get() om = OutgoingMessage.objects.get(unsubscribe_hash=resubscribe_key) if om.subscription: om.subscription.resubscribe() HistoricalEvent.log( person=om.person, event_type="resubscribe", subscription=om.subscription, outgoingmessage=om, ) return locals()
def course_beta_purchase(request, course_slug): o = Organization.get() product = Product.get_from_slug(course_slug) purchased = False try: me = get_me(request) if me.products.filter(product=product).count() > 0: purchased = True pp = me.products.filter(product=product)[0] except: pass return TemplateResponse( request, 'products/%s/purchase_beta.html' % (product.slug, ), locals())
def delete_account(request, delete_key): o = Organization.get() om = OutgoingMessage.objects.get(delete_hash=delete_key) # if om.subscription: # om.subscription.unsubscribe() om.person.delete() HistoricalEvent.log( person=om.person, event_type="delete_account", subscription=om.subscription, outgoingmessage=om, ) return locals()
def organization(cls): changed = False o = Organization.get() if not o.name: o.name = "%s Inc" % cls.rand_plant_name() changed = True if not o.address: o.address = fake.address() changed = True if not o.transactional_footer: o.transactional_footer = "%s You're receiving this email because {{ transactional_send_reason }}. Normally, there's an unsubscribe link down here, but to be able to {{ transactional_no_unsubscribe_reason }}, there isn't a way to unsubscribe.\n\n However, if you want to completely delete your account, you can do that by [going here]({{ delete_account_link }}).\n\nThis email was sent by me, Jill Example, of {{ organization_address }}." % cls.rand_text() # noqa if changed: o.save() return o
def handle(self, *args, **options): with open("initial_data.yml", encoding='utf8') as f: data = yaml.safe_load(f) print(data) if "organization" in data: o = Organization.get() for k, v in data["organization"].items(): setattr(o, k, v) o.save() if "newsletters" in data: for name, info in data["newsletters"].items(): n, _ = Newsletter.objects.get_or_create( internal_name=info["internal_name"]) for k, v in info.items(): if k not in MESSAGE_FIELDS: setattr(n, k, v) if "confirm_subject" in info and "confirm_body" in info: m, _ = Message.objects.get_or_create( name="%s-confirm" % name) m.subject = info["confirm_subject"] m.body_text_unrendered = info["confirm_body"] m.save() n.confirm_message = m if "welcome_subject" in info and "welcome_body" in info: m, _ = Message.objects.get_or_create( name="%s-welcome" % name) m.subject = info["welcome_subject"] m.body_text_unrendered = info["welcome_body"] m.save() n.welcome_message = m n.save() if "troll_emails" in data: for e in data["troll_emails"]: ee = lookup_hash(e) p, _ = Person.objects.get_or_create(hashed_email=ee) p.mark_troll() if "banned_emails" in data: for e in data["banned_emails"]: ee = lookup_hash(e) p, _ = Person.objects.get_or_create(hashed_email=ee) p.ban()