Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
  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
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
  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)
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
  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)
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
  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)
Ejemplo n.º 9
0
 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()))
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
  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)
Ejemplo n.º 12
0
  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"])
Ejemplo n.º 13
0
  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)
Ejemplo n.º 14
0
    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)
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
 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()))
Ejemplo n.º 17
0
  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)
Ejemplo n.º 18
0
    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"])
Ejemplo n.º 19
0
 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)
Ejemplo n.º 20
0
  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)
Ejemplo n.º 21
0
  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)
Ejemplo n.º 22
0
  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)
Ejemplo n.º 23
0
    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)
Ejemplo n.º 24
0
    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)
Ejemplo n.º 25
0
  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)
Ejemplo n.º 26
0
  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)
Ejemplo n.º 27
0
    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)
Ejemplo n.º 28
0
    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)
Ejemplo n.º 29
0
    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()))
Ejemplo n.º 30
0
    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()))