예제 #1
0
파일: dj.py 프로젝트: hchapman/WBOR
  def post(self, dj_key):
    dj = Dj.get(dj_key)
    if (dj is None) or (self.request.get("submit") != "Edit DJ" and
                        self.request.get("submit") != "Delete DJ"):
      self.session.add_flash(
          "There was an error processing your request.  Please try again.")

    elif self.request.get("submit") == "Edit DJ":
      fullname = self.request.get("fullname")
      email = self.request.get("email")
      username = self.request.get("username")
      password = self.request.get("password")

      if password is not None:
        if not password == self.request.get("confirm"):
          self.session.add_flash("New passwords do not match.")
          self.redirect("/dj/djs")
          return

      # Edit the dj
      dj = Dj.put(fullname=fullname,
                  email=email,
                  username=username,
                  password=password,)

      self.session.add_flash(fullname + " has been successfully edited.")
    elif self.request.get("submit") == "Delete DJ":
      dj.delete()
      self.session.add_flash(fullname + " has been successfully deleted.")
    self.redirect("/dj/djs/")
예제 #2
0
def create_a_dj():
    """ Create a new dj."""
    is_json = request.get_json(silent=True)
    if is_json is None:
        abort(400, "Not a JSON")
    if 'email' not in is_json:
        abort(400, 'Missing email')
    if 'password' not in is_json:
        abort(400, 'Missing password')
    new_dj = Dj(**is_json)
    new_dj.save()
    return jsonify(new_dj.to_dict()), 201
예제 #3
0
파일: main.py 프로젝트: sglickman/WBOR
  def post(self):
    if self.request.get("submit") != "Register":
      self.session.add_flash(
        "There was an error processing your request.  Please try again.",
        level="error")
      self.redirect(")/signup?token=%s"%token)
      return

    elif self.request.get("submit") == "Register":
      token_str = self.request.get("token")
      fullname = self.request.get("fullname")
      email = self.request.get("email")
      username = self.request.get("username")
      password = self.request.get("password")

      # Assert that the DJ Registration code is valid and available
      token = DjRegistrationToken.get(token_str)
      if not token:
        self.session.add_flash(
          "The secret registration token you have entered is either "
          "invalid, or has already been used up. Double check that "
          "it is correct. If it is not, <a>contact Ruben</a>.",
          level="error")
        self.redirect("/signup?token=%s"%token_str)
        return

      required_fields = [fullname, email, username, password]
      if "" in [field.strip() for field in required_fields]:
        self.session.add_flash("None of the fields may be empty")
        self.redirect("/signup?token=%s"%token_str)
        return

      if password is not None and password != self.request.get("confirm"):
        self.session.add_flash("Passwords do not match.")
        self.redirect("/signup?token=%s"%token_str)
        return

      dj = Dj(fullname=fullname,
              email=email,
              username=username,
              password=password)

      # Putting the DJ with the token will transactionally update the token
      dj.put(token=token)

      self.session.add_flash("%s, you have successfully registered as a DJ."
                             "You may now log in" % dj.fullname,
                             level="success")

    self.redirect("/")
예제 #4
0
파일: dj.py 프로젝트: hchapman/WBOR
  def post(self):
    dj_key = ndb.Key(urlsafe=self.request.get("dj_key"))
    dj = Dj.get(dj_key)

    if not dj:
      self.session.add_flash(
        "An error occurred processing your request.  Please try again.")
      self.redirect("/dj/myself")
      return
    dj.fullname = self.request.get("fullname")

    email = self.request.get("email")
    if email[-1] == "@":
      email += "bowdoin.edu"
    if "@" not in email:
      email += "@bowdoin.edu"
    duplicate_dj_key = Dj.get_key_by_email(email)
    if duplicate_dj_key and duplicate_dj_key != dj.key:
      error = True
      self.session.add_flash(
        "The email specified is already in use by another DJ.  "
        "Please enter a unique one.")
    dj.email = email

    username = self.request.get("username")
    duplicate_dj_key = Dj.get_key_by_username()
    if duplicate_dj_key and duplicate_dj_key != dj.key:
      error = True
      self.session.add_flash(
        "The username specified is already in use by another DJ.  "
        "Please choose another.")
    dj.username = username

    if error:
      self.redirect("/dj/myself")
      return
    if self.request.get("password"):
      if not self.request.get("password") == self.request.get("confirm"):
        self.session.add_flash("New passwords do not match.")
        self.redirect("/dj/myself")
        return
      else:
        dj.password = self.request.get("password")

    dj.put()
    self.session.add_flash("You have successfully updated your profile.")
    self.redirect("/dj/")
예제 #5
0
파일: dj.py 프로젝트: hchapman/WBOR
  def get(self):
    # If we have a reset_key, then try to reset the password.
    reset_key = self.request.get("reset_key")
    if reset_key:
      username = self.request.get("username")

      try:
        reset_dj = Dj.recovery_login(username, reset_key)
      except NoSuchUsername:
        self.session.add_flash("There is no user by that name")
        self.redirect("/dj/reset/")
        return
      except InvalidLogin:
        self.flash = ("This request is no longer valid, or the key provided"
                      "is somehow corrupt. If clicking the link in your email"
                      "does not work again, perhaps request a new reset.")
        self.redirect("/dj/reset")
        return

      self.set_session_user(reset_dj)
      program_list = Program.get_by_dj(dj=reset_dj)

      if not program_list:
        self.session.add_flash(
          "You have been temporarily logged in. Please change your"
          "password so that you may log in in the future!")
        self.session.add_flash(
          "You will not be able to do much until you have a"
          "program.  If you see this message, please email"
          "<a href='mailto:[email protected]'>Connor</a>"
          "immediately.")
        self.redirect('/dj/myself')
        return
      elif len(program_list) == 1:
        self.set_session_program(program_list[0])
        self.session.add_flash(
          "You have been temporarily logged in. Please change your password so "
          "that you may log in in the future!")
        self.session.add_flash(
          "Logged in with program %s"%program_list[0].title)
        self.redirect("/dj/myself")
        return
      else:
        self.session.add_flash(
          "You have been temporarily logged in. Please change your password so "
          "that you may log in in the future!")
        self.redirect("/dj/myself")
        return
    else:
      if self.session_has_login():
        self.redirect("/dj/")
        return
      template_values = {
        'session': self.session,
        'flash': self.flashes,
        }
      self.response.out.write(
        template.render(get_path("dj_reset_password.html"),
                        template_values))
예제 #6
0
파일: main.py 프로젝트: sglickman/WBOR
 def get(self):
   q = self.request.get("query")
   djs = Dj.autocomplete(q)
   self.response.out.write(json.dumps({
         'query': q,
         'suggestions': ["%s - %s"%(dj.fullname, dj.email) for dj in djs],
         'data': [{'key': dj.key.urlsafe(),
                   'name': dj.fullname,
                   'email': dj.email} for dj in djs],}))
예제 #7
0
파일: dj.py 프로젝트: hchapman/WBOR
 def get(self):
   dj = Dj.get(self.dj_key)
   template_values = {
     'session': self.session,
     'flash': self.flashes,
     'dj': dj,
     'posts': BlogPost.get_last(1),
   }
   self.response.out.write(
     template.render(get_path("dj_self.html"), template_values))
예제 #8
0
파일: dj.py 프로젝트: hchapman/WBOR
 def get(self):
   permissions = Permission.get_all()
   template_values = {
     'permissions': [{
       'key': p.key,
       'title': p.title,
       'dj_list': [Dj.get(d) for d in p.dj_list],
       } for p in permissions],
     'session': self.session,
     'flash': self.flashes,
     'posts': BlogPost.get_last(num=2),
   }
   self.response.out.write(
       template.render(get_path("dj_permissions.html"), template_values))
예제 #9
0
파일: dj.py 프로젝트: hchapman/WBOR
  def post(self):
    if self.request.get("submit") != "Request Reset":
      self.session.add_flash("There was an error, please try again")
      self.redirect("/dj/reset/")
      return

    # Check that the user exists and information is valid
    username = self.request.get("username")
    email = self.request.get("email")
    reset_dj = None

    try:
      reset_dj = Dj.get_by_username(username)
    except NoSuchUsername as e:
      self.session.add_flash(str(e))
      self.redirect("/dj/reset")
      return
    if not reset_dj.email_matches(email):
      self.session.add_flash(
        "The email you have entered does not match our records. "
        "Check, and try, again.")

    # Generate a key to be sent to the user and add the
    # new password request to the database
    reset_key = ''.join(random.choice(string.ascii_letters +
                                      string.digits) for x in range(20))
    reset_url="%s/dj/reset/?username=%s&reset_key=%s"%(
      self.request.host_url, username, reset_dj.reset_password())
    mail.send_mail(
      sender="WBOR <*****@*****.**>",
      to=email.strip(),
      subject="You've requested to reset your password!",
      body="""
Hello!

Someone has requested to reset your password for wbor.org. In order to do so,
please click on the following link or paste it into your address bar:
%s

If you were not who requested this password reset, then please just ignore
this email.

Thank you!
The WBOR.org Team
"""%reset_url)
    self.session.add_flash(
      "Request successfully sent! Check your mail, and be sure to doublecheck "
      "the spam folder in case.")
    self.redirect("/")
예제 #10
0
파일: main.py 프로젝트: sglickman/WBOR
 def get(self, slug):
   program = Program.get_by_slug(slug)
   if not program:
     self.session.add_flash("Invalid program slug specified.")
     self.redirect("/")
     return
   template_values = {
     'session': self.session,
     'flash': self.flashes,
     'program': program,
     'djs' :  tuple(Dj.get(program.dj_list) if program.dj_list
                    else None),
     }
   self.response.out.write(
     template.render(get_path("show.html"), template_values))
예제 #11
0
파일: dj.py 프로젝트: hchapman/WBOR
 def get(self, program_key):
   program = Program.get(program_key)
   if not program:
     self.session.add_flash(
       "Unable to find program (" + program_key + ").  Please try again.")
     self.redirect("/dj/programs/")
   else:
     new_programs = Program.get(num=5)
     template_values = {
       'program_djs': [Dj.get(dj) for dj in program.dj_list],
       'program': program,
       'session': self.session,
       'flash': self.flashes,
       'new_programs': new_programs
     }
     self.response.out.write(
       template.render(get_path("dj_manage_programs.html"), template_values))
예제 #12
0
파일: main.py 프로젝트: hchapman/WBOR
 def get(self, slug):
   program = models.getProgramBySlug(slug)
   posts = models.getLastPosts(1)
   if not program:
     self.session.add_flash("Invalid program slug specified.")
     self.redirect("/")
     return
   template_values = {
     'session': self.session,
     'flash': self.flashes,
     'program': program,
     'djs' :  (tuple(Dj.get(dj)
                     for dj in program.dj_list) if program.dj_list
               else None),
     'posts': posts,
     }
   self.response.out.write(
     template.render(get_path("show.html"), template_values))
예제 #13
0
파일: dj.py 프로젝트: hchapman/WBOR
 def post(self):
   self.response.headers['Content-Type'] = 'text/json'
   dj_key = self.request.get("dj_key")
   dj = Dj.get(dj_key)
   errors = "";
   if not dj:
     errors = "Unable to find DJ. "
   permission_key = self.request.get("permission_key")
   permission = Permission.get(keys=permission_key)
   if not permission:
     errors = "Unable to find permission."
   if errors:
     self.response.out.write(json.dumps({
       'err': errors,
     }))
     return
   action = self.request.get("action")
   if action == "add":
     if permission.has_dj(dj):
       errors = ("%s is already in the %s permission list."%
                 (dj.fullname, permission.title))
     else:
       permission.add_dj(dj)
       status = ("Successfully added %s to %s permission list."%
                 (dj.fullname, permission.title))
   if action == "remove":
     if dj.key not in permission.dj_list:
       errors = (dj.fullname + " was not in the " +
                 permission.title + " permission list.")
     else:
       permission.remove_dj(dj.key)
       status = ("Successfully removed " + dj.fullname + " from " +
                 permission.title + " permission list.")
   if errors:
     self.response.out.write(json.dumps({
       'err': errors,
     }))
   else:
     permission.put()
     self.response.out.write(json.dumps({
       'err': '',
       'msg': status
     }))
예제 #14
0
파일: dj.py 프로젝트: hchapman/WBOR
 def get(self, dj_key):
   dj = Dj.get(dj_key)
   # TODO: CRITICAL: CRITICAL: Don't show every goddamn DJ
   dj_list = [] # Seriously screw this crap
   #dj_list = cache.getAllDjs()
   if not dj:
     self.session.add_flash(
         "The DJ specified (" + dj_key +
         ") does not exist.  Please try again.")
     self.redirect("/dj/djs/")
   else:
     template_values = {
       'dj_list': dj_list,
       'dj': dj,
       'session': self.session,
       'flash': self.flashes,
       'posts': BlogPost.get_last(num=3),
     }
     self.response.out.write(
         template.render(get_path("dj_manage_djs.html"), template_values))
예제 #15
0
파일: dj.py 프로젝트: hchapman/WBOR
  def post(self):
    username = self.request.get("username")
    password = self.request.get("password")

    # Try to log in.
    try:
      dj = Dj.login(username, password)
    except NoSuchUsername:
      self.flash = "Invalid username. Please try again."
      self.redirect('/dj/login/')
      return
    except InvalidLogin:
      self.flash = "Invalid username/password combination. Please try again."
      self.redirect('/dj/login/')
      return

    self.user = dj
    program_list = Program.get_by_dj(dj=dj, num=10)
    if not program_list:
      self.flash = ("You have successfully logged in,"
                    "but you have no associated programs."
                    "You will not be able to do much until"
                    "you have a program.  If you see this message,"
                    "please email <a href='mailto:[email protected]'>"
                    "Connor</a> immediately.")
      self.redirect('/dj/')
      return
    elif len(program_list) == 1:
      self.program = program_list[0]
      self.flash = ("Successfully logged in with program %s."%
                    program_list[0].title)
      self.redirect("/dj/")
      return
    else:
      self.redirect("/dj/selectprogram/")
      return
예제 #16
0
파일: main.py 프로젝트: sglickman/WBOR
 def get(self):
   q = self.request.get("query")
   djs = Dj.autocomplete(q)
   self.response.out.write(json.dumps({
     'query': q,
     'data': [dj.to_json() for dj in djs],}))
예제 #17
0
파일: dj.py 프로젝트: hchapman/WBOR
  def post(self):
    if self.request.get("submit") != "Add DJ":
      self.session.add_flash("There was an error, please try again.")
      self.redirect("/dj/djs/")
    else:
      fullname = self.request.get("fullname")
      email = self.request.get("email")
      username = self.request.get("username")
      password = self.request.get("password")

      if not email:
        self.session.add_flash("Please enter a valid email address.")
        self.redirect("/dj/djs")
        return
      if not username:
        self.session.add_flash("Please enter a valid username.")
        self.redirect("/dj/djs")
        return
      if not fullname:
        self.session.add_flash("Please enter a valid full name.")
        self.redirect("/dj/djs")
        return
      if not password:
        self.session.add_flash("Please enter a valid password.")
        self.redirect("/dj/djs")
        return
      if not password == self.request.get("confirm"):
        self.session.add_flash("Passwords do not match.")
        self.redirect("/dj/djs")
        return

      try:
        dj = Dj.get_by_email(email)
      except NoSuchEmail:
        dj = None

      if dj is not None:
        self.session.add_flash(
          "A DJ with email address %s already exists: %s, username %s" %
          (dj.email, dj.fullname, dj.username))
        self.redirect("/dj/djs")
        return

      try:
        dj = Dj.get_by_username(username)
      except NoSuchUsername:
        dj = None

      if dj is not None:
        self.session.add_flash(
          "A DJ with username %s already exists: %s, email address %s" %
          (dj.username, dj.fullname, dj.email))
        self.redirect("/dj/djs")
        return

      # If both username and email address are new, then we can add them
      dj = Dj.new(fullname=fullname,
                  email=email,
                  username=username,
                  password=password)
      dj.put()

      self.session.add_flash(dj.fullname + " successfully added as a DJ.")
      self.redirect("/dj/djs/")
예제 #18
0
파일: main.py 프로젝트: sglickman/WBOR
  def get(self):
    labels = Permission.PERMISSIONS
    try:
      seth = Dj.get_by_email("*****@*****.**")
    except NoSuchEntry:
      seth = Dj.new(fullname='Seth Glickman',
                    email='*****@*****.**', username='******',
                    password='******')
      seth.put()
      hchaps = Dj.new(fullname='Harrison Chapman',
                      email="*****@*****.**", username="******",
                      password="******")

      program = Program.new(
        title='Seth\'s Show', slug='seth',
        desc='This is the show where Seth plays his favorite music.',
        dj_list=[seth.key],
        page_html='a <b>BOLD</b> show!')
      program.put()
    for l in labels:
      try:
        permission = Permission.get_by_title(l)
      except NoSuchEntry:
        permission = Permission.new(l, [])
        permission.put()
      finally:
        if seth.key not in permission.dj_list:
          permission.add_dj(seth.key)
          permission.put()
    if not BlogPost.get_last(num=3):
      post1 = BlogPost.new(
        title="Blog's first post!",
        text="This is really just filler text on the first post.",
        slug="first-post", post_date=datetime.datetime.now())
      post1.put()
      time.sleep(2)
      post2 = BlogPost.new(
        title="Blog's second post!",
        text="More filler text, alas.",
        slug="second-post", post_date=datetime.datetime.now())
      post2.put()
      contactspage = BlogPost.new(
        title="Contacts Page",
        text="This is a dummy stub for the contacts page. Lorem ipsum whatnot",
        slug="contacts-page", post_date=datetime.datetime.now())
      contactspage.put()
    artists = [
      "Bear In Heaven",
      "Beck",
      "Arcade Fire",
      "Andrew Bird",
      "The Antlers",
      "Arcade Fire",
      "The Beach Boys",
      "Brian Wilson",
      "The Beatles",
      "Beethoven",
      "Beirut",
      "Belle & Sebastian",
      "Benji Hughes",
      "Club 8",
      "Crayon Fields",
      ]
    for a in artists:
      if not (ArtistName._RAW.query()
              .filter(ArtistName._RAW.artist_name == a)
              .fetch(1, keys_only=True)):
        ar = ArtistName.new(artist_name=a)
        ar.put()
    self.session.add_flash("Permissions set up, ArtistNames set up, "
                           "Blog posts set up, DJ Seth entered.")
    self.redirect('/')
예제 #19
0
  def test_dj_management(self):
    # Add some Djs
    names = file("./names")
    name_pairs = [(name.strip(),
                  (name[0] + name.split()[1]).lower().strip()) for name in names]

    seen_unames = set()
    for name, uname in name_pairs:
      req = Request.blank('/dj/djs/', POST={
        'username': uname,
        'fullname': name,
        'email': uname,
        'password': "******",
        'confirm': "wbor",
        'submit': "Add DJ"})
      req.headers['Cookie'] = self.cookies.output()
      req.method = 'POST'
      res, ses, flash = get_response(req, app=dj_app)

      if uname in seen_unames:
        self.assertNotEqual(u"success", flash[0][1])
      else:
        self.assertEqual(u"success", flash[0][1])

      seen_unames.add(uname)
      self.set_cookie(res)

    # Run some searches on Djs
    name, uname = name_pairs[1]
    fname = name.split()[0]

    djkey = Dj.get_key_by_username(uname)

    for i in range(len(fname)):
      req = Request.blank('/ajax/djcomplete?query=%s'%fname[:i+1])
      res, ses, flash = get_response(req, app=main_app)
      found = json.loads(res.body)
      res_keys = [data['key'] for data in found['data']]
      self.assertIn(djkey.urlsafe(), res_keys)

    # Run some searches on Djs. Guy should NOT show up
    name = "Guy Fieri"
    fname = name.split()[0]

    for i in range(len(fname)):
      req = Request.blank('/ajax/djcomplete?query=%s'%fname[:i+1])
      res, ses, flash = get_response(req, app=main_app)
      found = json.loads(res.body)
      res_keys = [data['key'] for data in found['data']]
      self.assertNotIn(djkey.urlsafe(), res_keys)

    # Modify this guy so that his name is different
    
    req = Request.blank('/dj/djs/%s'%djkey.urlsafe(), POST={
      'username': "******",
      'fullname': "Guy Fieri",
      'email': "guyguy",
      'submit': "Edit DJ"})
    req.headers['Cookie'] = self.cookies.output()
    req.method = 'POST'
    res, ses, flash = get_response(req, app=dj_app)
    print flash
    self.assertEqual(u"success", flash[0][1])
    self.set_cookie(res)

    # Run some searches on Djs. Our changed guy shouldn't be here.
    name, uname = name_pairs[1]
    fname = name.split()[0]

    for i in range(len(fname)):
      req = Request.blank('/ajax/djcomplete?query=%s'%fname[:i+1])
      res, ses, flash = get_response(req, app=main_app)
      found = json.loads(res.body)
      res_keys = [data['key'] for data in found['data']]
      self.assertNotIn(djkey.urlsafe(), res_keys)

    # Run some searches on Djs. Guy should show up
    name, uname = "Guy Fieri", "gfieri"
    fname = name.split()[0]

    for i in range(len(fname)):
      req = Request.blank('/ajax/djcomplete?query=%s'%fname[:i+1])
      res, ses, flash = get_response(req, app=main_app)
      found = json.loads(res.body)
      res_keys = [data['key'] for data in found['data']]
      self.assertIn(djkey.urlsafe(), res_keys)