def test_already_existing(self): # Make a user in the datastore with the same email, but a different name so # we can see whether it overrides. existing_user = Membership(first_name="Michael", last_name="Scarn", email=self._TEST_PARAMS["email"], status="active") existing_user.put() # Because the user is active, it should prohibit us from overriding. response = self.test_app.post("/", self._TEST_PARAMS, expect_errors=True) self.assertEqual(422, response.status_int) self.assertIn("already exists", response.body) # User should stay the same. user = Membership.get_by_email(self._TEST_PARAMS["email"]) self.assertEqual("Michael", user.first_name) self.assertEqual("Scarn", user.last_name) existing_user.status = "suspended" existing_user.put() # Even though the user is suspended, it should still prohibit us from # overriding. response = self.test_app.post("/", self._TEST_PARAMS, expect_errors=True) self.assertEqual(422, response.status_int) self.assertIn("suspended", response.body) # User should stay the same. user = Membership.get_by_email(self._TEST_PARAMS["email"]) self.assertEqual("Michael", user.first_name) self.assertEqual("Scarn", user.last_name) existing_user.status = None existing_user.put() # Now the user should get silently overriden. response = self.test_app.post("/", self._TEST_PARAMS) self.assertEqual(302, response.status_int) # User should not stay the same. user = Membership.get_by_email(self._TEST_PARAMS["email"]) self.assertEqual(self._TEST_PARAMS["first_name"], user.first_name) self.assertEqual(self._TEST_PARAMS["last_name"], user.last_name)
def get(self): user = users.get_current_user() if not user: self.redirect(users.create_login_url(self.request.uri)) return member = Membership.get_by_email(user.email()) if not member: # User is not (yet) a member. self.redirect("/") return else: # Open billing information. url = member.spreedly_url() plan = Plan.get_by_name(member.plan) if plan.legacy: # Show the legacy plan warning. current = plan.get_legacy_pair() self.response.out.write(self.render( "templates/billing_popup.html", url=url, legacy=plan, current=current)) return else: self.redirect(url) return
def test_user_suspending(self): user = Membership.get_by_email("*****@*****.**") # The next one should suspend us. user.signins = Config().LITE_VISITS - 1 user.put() params = {"email": "*****@*****.**"} response = self.test_app.post("/api/v1/signin", params) result = json.loads(response.body) self.assertEqual(200, response.status_int) self.assertEqual(0, result["visits_remaining"]) user = Membership.get_by_email("*****@*****.**") self.assertEqual(Config().LITE_VISITS, user.signins) self.assertEqual("no_visits", user.status)
def get(self): user = users.get_current_user() if not user: self.redirect(users.create_login_url(self.request.uri)) return member = Membership.get_by_email(user.email()) if not member: # User is not (yet) a member. self.redirect("/") return else: # Open billing information. url = member.spreedly_url() plan = Plan.get_by_name(member.plan) if plan.legacy: # Show the legacy plan warning. current = plan.get_legacy_pair() self.response.out.write( self.render("templates/billing_popup.html", url=url, legacy=plan, current=current)) return else: self.redirect(url) return
def test_user_suspending(self): user = Membership.get_by_email("*****@*****.**") # The next one should suspend us. user.signins = 9 user.rfid_tag = "1337" user.put() params = {"id": "1337"} response = self.test_app.post("/api/v1/rfid", params) result = json.loads(response.body) self.assertEqual(200, response.status_int) self.assertEqual(0, result["visits_remaining"]) user = Membership.get_by_email("*****@*****.**") self.assertEqual(10, user.signins) self.assertEqual("no_visits", user.status)
def test_signin(self): params = {"email": "*****@*****.**"} response = self.test_app.post("/api/v1/signin", params) result = json.loads(response.body) self.assertEqual(9, result["visits_remaining"]) # Check that our user signing in got recorded. user = Membership.get_by_email("*****@*****.**") self.assertEqual(1, user.signins)
def get(self): user = users.get_current_user() if not user: self.redirect(users.create_login_url("/profile")) return else: account = Membership.get_by_email(user.email()) email = "%s@%s" % (account.username, Config().APPS_DOMAIN) gravatar_url = "http://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() self.response.out.write(self.render("templates/profile.html", locals()))
def test_signin(self): params = {"email": "*****@*****.**"} response = self.test_app.post("/api/v1/signin", params) result = json.loads(response.body) self.assertEqual(Config().LITE_VISITS - 1, result["visits_remaining"]) # Check that our user signing in got recorded. user = Membership.get_by_email("*****@*****.**") self.assertEqual(1, user.signins)
def test_suspended_user(self): user = Membership.get_by_email("*****@*****.**") user.status = "suspended" user.put() params = {"email": "*****@*****.**"} response = self.test_app.post("/api/v1/signin", params, expect_errors=True) result = json.loads(response.body) self.assertEqual(422, response.status_int) self.assertIn("Could not find", result["message"])
def test_user_restore(self): self.user.signins = Config().LITE_VISITS + 2 self.user.status = "no_visits" self.user.put() response = self.test_app.get("/cron/reset_signins") self.assertEqual(200, response.status_int) user = Membership.get_by_email("*****@*****.**") self.assertEqual(0, user.signins) self.assertEqual("active", user.status)
def test_post(self): response = self.test_app.post("/", self._TEST_PARAMS) self.assertEqual(302, response.status_int) # It should have put an entry in the datastore. user = Membership.get_by_email("*****@*****.**") self.assertNotEqual(None, user) self.assertEqual("Testy", user.first_name) self.assertEqual("Testerson", user.last_name) self.assertEqual("ttesterson", user.twitter) self.assertEqual("My mom", user.referrer) self.assertNotEqual(None, user.hash)
def get(self): user = users.get_current_user() if not user: self.redirect(users.create_login_url("/profile")) return else: account = Membership.get_by_email(user.email()) email = "%s@%s" % (account.username, Config().APPS_DOMAIN) gravatar_url = "http://www.gravatar.com/avatar/" + \ hashlib.md5(email.lower()).hexdigest() self.response.out.write( self.render("templates/profile.html", locals()))
def get(self): user = users.get_current_user() member = Membership.get_by_email(user.email()) if not member: # User is not (yet) a member. self.redirect("/") else: # Open billing information. url = member.spreedly_url() plan = Plan.get_by_name(member.plan) if plan.legacy: self.response.out.write(self.render( "templates/billing_popup.html", url=url)) else: self.redirect(url)
def post(self): email = self._get_parameters("email") if not email: return # Get information on the user from the datastore. user = Membership.get_by_email(email) if (not user or user.status not in ("active", "no_visits")): self._rest_error("InvalidEmail", "Could not find an active user with email '%s'." % (email), 422) return remaining = _increment_signins(user) response = json.dumps({"visits_remaining": remaining}) self.response.out.write(response)
def test_rollover(self): self.user.signins = Config().LITE_VISITS - 2 self.user.status = "active" self.user.put() response = self.test_app.get("/cron/reset_signins") self.assertEqual(200, response.status_int) user = Membership.get_by_email("*****@*****.**") self.assertEqual(-2, user.signins) self.assertEqual("active", user.status) # Test that signins_remaining gives us the right number. test_plan = Plan("test_lite", 1, 100, "A test plan", signin_limit = Config().LITE_VISITS) user.plan = "test_lite" remaining = Plan.signins_remaining(user) self.assertEqual(Config().LITE_VISITS + 2, remaining)
def get(self): email, properties = self._get_parameters("email", "properties") if type(properties) is unicode: # A singleton property. properties = [properties] if not email: return logging.info("Fetching properties for user '%s'." % (email)) # Get the user data. found_user = Membership.get_by_email(email) if not found_user: logging.error("Found no user with email '%s'." % (email)) self._rest_error("InvalidParameters", "Found no user with that email.", 422) return all_properties = {} # Get the actual value of all the properties. for key in found_user.properties().keys(): all_properties[key] = getattr(found_user, key) use_properties = {} for prop in properties: if prop == "": # We don't actually want any properties. break if prop not in all_properties.keys(): logging.error("User has no property '%s'." % (prop)) self._rest_error("InvalidParameters", "User has no property '%s'." % \ (prop), 422) return use_properties[prop] = all_properties[prop] # Pickle datetime objects so we can send them more easily. if type(use_properties[prop]) == datetime.datetime: logging.debug("Pickling datetime object.") use_properties[prop] = pickle.dumps(use_properties[prop]) response = json.dumps(use_properties) logging.debug("Writing response: %s." % (response)) self.response.out.write(response)
def post(self): email = self._get_parameters("email") if not email: return # Get information on the user from the datastore. user = Membership.get_by_email(email) if (not user or user.status not in ("active", "no_visits")): self._rest_error( "InvalidEmail", "Could not find an active user with email '%s'." % (email), 422) return remaining = _increment_signins(user) response = json.dumps({"visits_remaining": remaining}) self.response.out.write(response)
def post(self): email = self._get_parameters("email") if not email: return # Get information on the user from the datastore. user = Membership.get_by_email(email) if not user: self._rest_error("InvalidParameters", "Could not find user with email '%s'." % (email), 422) return # Increment signins. user.signins += 1 user.put() remaining = plans.Plan.signins_remaining(user) response = json.dumps({"visits_remaining": remaining}) self.response.out.write(response)
def get(self): user = users.get_current_user() if not user: logging.debug("Need to login.") self.redirect(users.create_login_url(self.request.uri)) return member = Membership.get_by_email(user.email()) if not member: # This member doesn't exist. logging.error("No member with email '%s'." % (user.email())) logout_url = users.create_logout_url(self.request.uri) error = self.render("templates/error.html", message="No member with your email was found.<br>" \ "<a href=%s>Try Again</a>" % (logout_url)) self.response.out.write(error) self.response.set_status(422) return self._plan_switch_page(member)
def test_rollover(self): self.user.signins = Config().LITE_VISITS - 2 self.user.status = "active" self.user.put() response = self.test_app.get("/cron/reset_signins") self.assertEqual(200, response.status_int) user = Membership.get_by_email("*****@*****.**") self.assertEqual(-2, user.signins) self.assertEqual("active", user.status) # Test that signins_remaining gives us the right number. test_plan = Plan("test_lite", 1, 100, "A test plan", signin_limit=Config().LITE_VISITS) user.plan = "test_lite" remaining = Plan.signins_remaining(user) self.assertEqual(Config().LITE_VISITS + 2, remaining)
def get(self): user = users.get_current_user() conf = Config() message = escape(self.request.get("message")) if not user: self.redirect(users.create_login_url("/key")) return else: account = Membership.get_by_email(user.email()) if not account or not account.spreedly_token: message = """<p>It appears that you have an account on @%(domain)s, but you do not have a corresponding account in the signup application.</p> <p>How to remedy:</p> <ol><li>If you <b>are not</b> in the Spreedly system yet, <a href=\"/\">sign up</a> now.</li> <li>If you <b>are</b> in Spreedly already, please contact <a href=\"mailto:%(signup_email)s?Subject=Spreedly+account+not+linked+to+account\">%(signup_email)s</a>.</li></ol> <pre>Nick: %(nick)s</pre> <pre>Email: %(email)s</pre> <pre>Account: %(account)s</pre> """ % { "domain": conf.APPS_DOMAIN, "signup_email": conf.SIGNUP_HELP_EMAIL, "nick": user.nickname().split("@")[0], "email": user.email(), "account": account, } if account: message += "<pre>Token: %s</pre>" % account.spreedly_token internal = False self.response.out.write(self.render("templates/error.html", locals())) return if account.status != "active": url = ( "https://subs.pinpayments.com/" + conf.SPREEDLY_ACCOUNT + "/subscriber_accounts/" + account.spreedly_token ) message = """<p>Your Spreedly account status does not appear to me marked as active. This might be a mistake, in which case we apologize. </p> <p>To investigate your account, you may go here: <a href=\"%(url)s\">%(url)s</a> </p> <p>If you believe this message is in error, please contact <a href=\"mailto:%(signup_email)s?Subject=Spreedly+account+not+linked+to+account\">%(signup_email)s</a></p> """ % { "url": url, "signup_email": conf.SIGNUP_HELP_EMAIL, } internal = False self.response.out.write(self.render("templates/error.html", locals())) return delta = datetime.datetime.utcnow() - account.created if delta.days < conf.DAYS_FOR_KEY: message = """<p>You have been a member for %(deltadays)s days. After %(days)s days you qualify for a key. Check back in %(delta)s days!</p> <p>If you believe this message is in error, please contact <a href=\"mailto:%(signup_email)s?Subject=Membership+create+date+not+correct\">%(signup_email)s</a>.</p> """ % { "deltadays": delta.days, "days": conf.DAYS_FOR_KEY, "delta": conf.DAYS_FOR_KEY - delta.days, "signup_email": SIGNUP_HELP_EMAIL, } internal = False self.response.out.write(self.render("templates/error.html", locals())) return bc = BadgeChange.all().filter("username ="******"templates/key.html", locals()))
def get(self): user = users.get_current_user() conf = Config() message = escape(self.request.get("message")) if not user: self.redirect(users.create_login_url("/key")) return else: account = Membership.get_by_email(user.email()) if not account or not account.spreedly_token: message = """<p>It appears that you have an account on @%(domain)s, but you do not have a corresponding account in the signup application.</p> <p>How to remedy:</p> <ol><li>If you <b>are not</b> in the Spreedly system yet, <a href=\"/\">sign up</a> now.</li> <li>If you <b>are</b> in Spreedly already, please contact <a href=\"mailto:%(signup_email)s?Subject=Spreedly+account+not+linked+to+account\">%(signup_email)s</a>.</li></ol> <pre>Nick: %(nick)s</pre> <pre>Email: %(email)s</pre> <pre>Account: %(account)s</pre> """ % { "domain": conf.APPS_DOMAIN, "signup_email": conf.SIGNUP_HELP_EMAIL, "nick": user.nickname().split("@")[0], "email": user.email(), "account": account } if account: message += "<pre>Token: %s</pre>" % account.spreedly_token internal = False self.response.out.write( self.render("templates/error.html", locals())) return if account.status != "active": url = "https://subs.pinpayments.com/" + conf.SPREEDLY_ACCOUNT + "/subscriber_accounts/" + account.spreedly_token message = """<p>Your Spreedly account status does not appear to me marked as active. This might be a mistake, in which case we apologize. </p> <p>To investigate your account, you may go here: <a href=\"%(url)s\">%(url)s</a> </p> <p>If you believe this message is in error, please contact <a href=\"mailto:%(signup_email)s?Subject=Spreedly+account+not+linked+to+account\">%(signup_email)s</a></p> """ % { "url": url, "signup_email": conf.SIGNUP_HELP_EMAIL } internal = False self.response.out.write( self.render("templates/error.html", locals())) return delta = datetime.datetime.utcnow() - account.created if delta.days < conf.DAYS_FOR_KEY: message = """<p>You have been a member for %(deltadays)s days. After %(days)s days you qualify for a key. Check back in %(delta)s days!</p> <p>If you believe this message is in error, please contact <a href=\"mailto:%(signup_email)s?Subject=Membership+create+date+not+correct\">%(signup_email)s</a>.</p> """ % { "deltadays": delta.days, "days": conf.DAYS_FOR_KEY, "delta": conf.DAYS_FOR_KEY - delta.days, "signup_email": SIGNUP_HELP_EMAIL } internal = False self.response.out.write( self.render("templates/error.html", locals())) return bc = BadgeChange.all().filter("username ="******"templates/key.html", locals()))