def api(request): if 'api' not in request.GET: return HttpResponse("-1") elif request.GET['api'] != API_SECRET: return HttpResponse("-1") elif 'action' in request.GET: try: n = Newsletter.objects.get(pk=request.GET['newsletter']) except Newsletter.DoesNotExist: return HttpResponse("-1") try: if request.GET['action'] == 'subscribe': email = unquote_plus(request.GET['email']).strip() if not email_re.match(email): return HttpResponse("C") # Invalid email c = NewsletterSubscriber.objects.filter(email=email, newsletter=n, active=True).count() if c != 0: return HttpResponse("B") # Already subscribed if n.pk == 1: users_count = User.objects.filter(is_active=True, email=email, email_newsletter_optin=True).count() if users_count > 0: return HttpResponse("B") # Already subscribed try: # They've tried to subscribe already, so resend confirmation email p = PendingNewsletterSubscriber.objects.get(email=email, newsletter=n) except PendingNewsletterSubscriber.DoesNotExist: p = PendingNewsletterSubscriber() p.email = email p.uniqid = md5(SECRET_KEY + email + n.name).hexdigest() p.newsletter = n p.save() confirm_url = n.confirm_url + "pid=" + str(p.pk) + "&key=" + p.uniqid message = EmailMessage() message.subject = n.confirm_subject message.body = n.confirm_email.replace('{email}', email).replace('{url}', confirm_url) message.from_address = n.confirm_from_email message.from_name = n.confirm_from_name message.reply_address = n.confirm_from_email message.sender = n.confirm_from_user message.html = n.confirm_html # Don't send it yet until the recipient list is done message.status = -1 # Save to database so we get a value for the primary key, # which we need for entering the recipient entries message.save() recipient = EmailRecipient() recipient.message = message recipient.to_name = "" recipient.to_address = email recipient.save() message.status = 0 message.save() return HttpResponse("A") # Success! elif request.GET['action'] == 'confirm': pid = unquote_plus(request.GET['id']) key = unquote_plus(request.GET['key']) try: p = PendingNewsletterSubscriber.objects.get(pk=pid, newsletter=n, uniqid=key) except PendingNewsletterSubscriber.DoesNotExist: return HttpResponse("B") try: if n.pk != 1: # Only do the user thing for The Amplifier (id = 1) raise User.DoesNotExist try: u = User.objects.get(email=p.email) except User.MultipleObjectsReturned: # Subscribe the first user with this email address u = User.objects.filter(email=p.email)[0] # This user is already a Robogals member u.email_newsletter_optin = True u.save() except User.DoesNotExist: ns = NewsletterSubscriber() ns.newsletter = n ns.email = p.email ns.active = True ns.details_verified = False ns.save() p.delete() return HttpResponse("A") elif request.GET['action'] == 'unsubscribe': email = unquote_plus(request.GET['email']).strip() try: ns = NewsletterSubscriber.objects.get(email=email, newsletter=n, active=True) except NewsletterSubscriber.DoesNotExist: # Not on the list. Perhaps subscribed as a Robogals member? if n.pk != 1: # Only do the user thing for The Amplifier (id = 1) return HttpResponse("B") # Not subscribed try: for u in User.objects.filter(email=email): if u.email_newsletter_optin: u.email_newsletter_optin = False u.save() return HttpResponse("A") return HttpResponse("B") # Not subscribed except User.DoesNotExist: return HttpResponse("B") # Not subscribed ns.unsubscribed_date = datetime.now() ns.active = False ns.save() if n.pk == 1: for u in User.objects.filter(is_active=True, email=email, email_newsletter_optin=True): u.email_newsletter_optin = False u.save() return HttpResponse("A") else: return HttpResponse("-1") except KeyError: return HttpResponse("-1") else: return HttpResponse("-1")
def api(request): if 'api' not in request.GET: return HttpResponse("-1") elif request.GET['api'] != API_SECRET: return HttpResponse("-1") elif 'action' in request.GET: try: n = Newsletter.objects.get(pk=request.GET['newsletter']) except Newsletter.DoesNotExist: return HttpResponse("-1") try: if request.GET['action'] == 'subscribe': email = unquote_plus(request.GET['email']).strip() try: validate_email(email) except ValidationError: valid_email = False else: valid_email = True if not valid_email: return HttpResponse("C") # Invalid email c = NewsletterSubscriber.objects.filter(email=email, newsletter=n, active=True).count() if c != 0: return HttpResponse("B") # Already subscribed if n.pk == 1: users_count = User.objects.filter(is_active=True, email=email, email_newsletter_optin=True).count() if users_count > 0: return HttpResponse("B") # Already subscribed # They've tried to subscribe already, so resend confirmation email p = PendingNewsletterSubscriber.objects.filter(email=email, newsletter=n) if p: p = p[0] else: p = PendingNewsletterSubscriber() p.email = email p.uniqid = md5(SECRET_KEY + email + n.name).hexdigest() p.newsletter = n p.save() confirm_url = n.confirm_url + "pid=" + str(p.pk) + "&key=" + p.uniqid message = EmailMessage() message.subject = n.confirm_subject message.body = n.confirm_email.replace('{email}', email).replace('{url}', confirm_url) message.from_address = n.confirm_from_email message.from_name = n.confirm_from_name message.reply_address = n.confirm_from_email message.sender = n.confirm_from_user message.html = n.confirm_html # Don't send it yet until the recipient list is done message.status = -1 # Save to database so we get a value for the primary key, # which we need for entering the recipient entries message.save() recipient = EmailRecipient() recipient.message = message recipient.to_name = "" recipient.to_address = email recipient.save() message.status = 0 message.save() return HttpResponse("A") # Success! elif request.GET['action'] == 'confirm': pid = unquote_plus(request.GET['id']) key = unquote_plus(request.GET['key']) try: p = PendingNewsletterSubscriber.objects.get(pk=pid, newsletter=n, uniqid=key) except PendingNewsletterSubscriber.DoesNotExist: return HttpResponse("B") try: if n.pk != 1: # Only do the user thing for The Amplifier (id = 1) raise User.DoesNotExist try: u = User.objects.get(email=p.email) except User.MultipleObjectsReturned: # Subscribe the first user with this email address u = User.objects.filter(email=p.email)[0] # This user is already a Robogals member u.email_newsletter_optin = True u.save() except User.DoesNotExist: ns = NewsletterSubscriber() ns.newsletter = n ns.email = p.email ns.active = True ns.details_verified = False ns.save() PendingNewsletterSubscriber.objects.filter(email=p.email, newsletter=n).delete() return HttpResponse("A") elif request.GET['action'] == 'unsubscribe': email = unquote_plus(request.GET['email']).strip() try: ns = NewsletterSubscriber.objects.get(email=email, newsletter=n, active=True) except NewsletterSubscriber.DoesNotExist: # Not on the list. Perhaps subscribed as a Robogals member? if n.pk != 1: # Only do the user thing for The Amplifier (id = 1) return HttpResponse("B") # Not subscribed try: for u in User.objects.filter(email=email): if u.email_newsletter_optin: u.email_newsletter_optin = False u.save() return HttpResponse("A") return HttpResponse("B") # Not subscribed except User.DoesNotExist: return HttpResponse("B") # Not subscribed ns.unsubscribed_date = datetime.now() ns.active = False ns.save() if n.pk == 1: for u in User.objects.filter(is_active=True, email=email, email_newsletter_optin=True): u.email_newsletter_optin = False u.save() return HttpResponse("A") else: return HttpResponse("-1") except KeyError: return HttpResponse("-1") else: return HttpResponse("-1")