import os
import wsgiref.handlers
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext import db
from google.appengine.ext import webapp
class Post(db.Model):
title = db.StringProperty()
author = db.UserProperty()
body = db.TextProperty()
date = db.DateTimeProperty(auto_now_add=True)
comments = db.IntegerProperty(default=0)
class Comment(db.Model):
comment = db.StringProperty()
author = db.UserProperty()
reference = db.ReferenceProperty(Post)
date = db.DateTimeProperty(auto_now_add=True)
def render_page(webob, tmpl_file, params):
params['user'] = users.get_current_user()
if params['user']:
params['url'] = '<a href="%s">Sign out</a>' % \
users.create_logout_url(webob.request.uri)
else:
params['url'] = '<a href="%s">Sign in</a>' % \
users.create_login_url(webob.request.uri)
params['admin'] = users.is_current_user_admin()
path = os.path.join(os.path.dirname(__file__), tmpl_file)
webob.response.out.write(template.render(path, params))
class MainPage(webapp.RequestHandler):
def get(self):
posts = Post.all().order('-date')[:5]
params = { 'posts': posts, }
render_page(self, 'index.html', params)
class BlogPost(webapp.RequestHandler):
def get(self):
if not users.get_current_user():
self.redirect(users.create_login_url("/"))
render_page(self, 'post.html', {})
def post(self):
if users.get_current_user():
p = Post()
p.author = users.get_current_user()
p.title = self.request.get('title')
p.body = self.request.get('body')
p.put()
self.redirect('/')
else:
self.redirect(users.create_login_url(self.request.uri))
class ViewPost(webapp.RequestHandler):
def get(self):
try:
p = Post.get(self.request.get('key'))
except db.BadKeyError:
self.redirect("/")
else:
c = None
if p:
c = db.GqlQuery("SELECT * FROM Comment WHERE reference=:1",
p.key())
params = { 'post': p, 'comments': c, }
render_page(self, 'view.html', params)
def post(self):
p = Post.get(self.request.get('key'))
comment = Comment()
comment.reference = p.key()
comment.comment = self.request.get('comment')
comment.author = users.get_current_user()
comment.put()
p.comments += 1
p.put()
self.redirect(self.request.referrer)
class DeletePost(webapp.RequestHandler):
def get(self):
if users.is_current_user_admin():
try:
p = Post.get(self.request.get('key'))
except db.BadKeyError:
self.redirect(self.request.referrer)
else:
c = db.GqlQuery("SELECT * FROM Comment WHERE reference=:1",
p.key())
p.delete()
db.delete(c)
self.redirect('/')
class DeleteComment(webapp.RequestHandler):
def get(self):
if users.is_current_user_admin():
try:
c = Comment.get(self.request.get('key'))
except db.BadKeyError:
self.redirect(self.request.referrer)
else:
p = Post.get(c.reference.key())
c.delete()
p.comments -= 1
p.put()
self.redirect(self.request.referrer)
def main():
application = webapp.WSGIApplication([
('/', MainPage),
('/post', BlogPost),
('/view', ViewPost),
('/delete', DeletePost),
('/deletecomment', DeleteComment),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()