def blog_key(name = 'default'):
return db.Key.from_path('blogs', name)
class Post(db.Model):
path = db.StringProperty(required = True)
content = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
last_modified = db.DateTimeProperty(auto_now = True)
def render(self):
self._render_text = self.content.replace('\n', '<br>')
return render_str("post.html", p = self)
def top():
#cache['timer']=int(time.time())
posts = greetings = Post.all().order('-created')
#cache[key]=posts
return posts
class WikiPage(BlogHandler):
def get(self,page):
my_url = str(self.request.url)
path = str(my_url.rstrip('/').split('/')[-1])
posts=top()
post = singlePost(path)
if page == '/':
self.render('front.html', posts = posts)
elif path in posts:
self.render('front.html', post = post)
else:
self.redirect('/_edit/%s'%path)
def singlePost(path):
post = db.GqlQuery("SELECT * FROM Post WHERE path = :1", path)
return post
class EditPage(BlogHandler):
def get(self,page):
if self.user:
self.render("newpost.html")
else:
self.redirect("/login")
def post(self,page):
#change this back after grading
if not self.user:
self.redirect('/')
my_url = str(self.request.url)
path = my_url.rstrip('/').split('/')[-1]
content = self.request.get('content')
if content:
p = Post(parent = blog_key(), path = path, content = content)
p.put()
self.redirect('/%s' % p.path)
else:
error = "content, please!"
self.render("newpost.html", content=content, error=error)
USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_username(username):
return username and USER_RE.match(username)
PASS_RE = re.compile(r"^.{3,20}$")
def valid_password(password):
return password and PASS_RE.match(password)
EMAIL_RE = re.compile(r'^[\S]+@[\S]+\.[\S]+$')
def valid_email(email):
return not email or EMAIL_RE.match(email)
class Signup(BlogHandler):
def get(self):
self.render("signup-form.html")
def post(self):
have_error = False
self.username = self.request.get('username')
self.password = self.request.get('password')
self.verify = self.request.get('verify')
self.email = self.request.get('email')
params = dict(username = self.username,
email = self.email)
if not valid_username(self.username):
params['error_username'] = "That's not a valid username."
have_error = True
if not valid_password(self.password):
params['error_password'] = "That wasn't a valid password."
have_error = True
elif self.password != self.verify:
params['error_verify'] = "Your passwords didn't match."
have_error = True
if not valid_email(self.email):
params['error_email'] = "That's not a valid email."
have_error = True
if have_error:
self.render('signup-form.html', **params)
else:
self.done()
def done(self, *a, **kw):
raise NotImplementedError
class Unit2Signup(Signup):
def done(self):
self.redirect('/welcome?username=' + self.username)
class Register(Signup):
def done(self):
#make sure the user doesn't already exist
u = User.by_name(self.username)
if u:
msg = 'That user already exists.'
self.render('signup-form.html', error_username = msg)
else:
u = User.register(self.username, self.password, self.email)
u.put()
self.login(u)
self.redirect('/welcome')
class Login(BlogHandler):
def get(self):
self.render('login-form.html')
def post(self):
username = self.request.get('username')
password = self.request.get('password')
u = User.login(username, password)
if u:
self.login(u)
self.redirect('/welcome')
else:
msg = 'Invalid login'
self.render('login-form.html', error = msg)
class Logout(BlogHandler):
def get(self):
self.logout()
self.redirect('/')
PAGE_RE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'
app = webapp2.WSGIApplication([('/signup', Register),
('/login', Login),
('/logout', Logout),
('/_edit' + PAGE_RE, EditPage),
(PAGE_RE, WikiPage),
],
debug=True)