Esempio n. 1
0
    def get(self, page_slug=""):
        if page_slug:
            t_values = {}

            posts = Entry.all().filter("is_external_page =", True).filter("entrytype =", 'page').filter("slug =", page_slug)
            if posts.count() == 1:
                logging.warning("find one page with slug=%s" % (page_slug))
                posts = posts.fetch(limit=1)
                post = posts[0]
                t_values['post'] = post
                # dump(post)

                # find all comments
                comments = Comment.all().filter("entry =", post).order("date")
                t_values['comments'] = comments
            else:
                logging.warning("%d entries share the same slug %s" % (posts.count(), page_slug))

            links = Link.all().order("date")
            t_values['links'] = links

            categories = Category.all()
            t_values['categories'] = categories

            pages = Entry.all().filter("is_external_page =", True).filter("entrytype =", 'page').order("date")
            t_values['pages'] = pages

            return self.response.out.write(render_template("page.html", t_values, "basic", False))
        else:
            self.redirect(uri_for("weblog.index"))
Esempio n. 2
0
    def get(self):
        # find stats for this blog
        stats = {}
        stats['posts'] = Entry.all().filter("entrytype =", "post").filter("is_external_page =", True).count()
        stats['pages'] = Entry.all().filter("entrytype =", "page").filter("is_external_page =", True).count()
        stats['comments'] = Comment.all().count()
        stats['categories'] = Category.all().count()
        stats['links'] = Link.all().count()

        t_values = {}
        t_values['stats'] = stats
        return self.response.out.write(render_template("index.html", t_values, "", True))
Esempio n. 3
0
  def get(self):
    context = {}
    query = Entry.all().order("-updated")
    next = self.request.get("next")
    if next:
      dt = datetime.strptime(next, "%Y-%m-%dT%H:%M:%S")
      entries = query.filter("updated <=",
	  dt).fetch(PAGESIZE + 1)
      if len(entries) == PAGESIZE + 1:
	context["next"] = entries[-1].updated.isoformat("T")
      else:
	context["next"] = None
      context["entries"] = entries[:PAGESIZE]
      self.response.out.write(self.render_sec_entries(context))
      return
    else:
      sec = {}
      entries = query.fetch(PAGESIZE + 1)
      if len(entries) == PAGESIZE + 1:
	context["next"] = entries[-1].updated.isoformat("T")
      else:
	context["next"] = None
      context["entries"] = entries[:PAGESIZE]
      sec["entries"] = self.render_sec_entries(context)

      sec["featured"] = self.render_sec_featured()
      path = templatepath("main.html")
      self.response.out.write(template.render(path, sec))
Esempio n. 4
0
    def get(self):

        entry_count = Entry.all().count(1000)
        tags = Tag.all().order('usetime')

        tags_count = tags.count(1000)
        tag_list = []
        for tag in tags:
            tag_count = tag.count_link + tag.count_note + tag.count_pic
            if tag.count_link >= tag.count_note:
                if tag.count_link >= tag.count_pic:
                    max_type = 'link'
                else:
                    max_type = 'pic'
            else:
                if tag.count_pic >= tag.count_note:
                    max_type = 'pic'
                else:
                    max_type = 'note'
            tag_list.append({
                "info": tag,
                "type": max_type,
                "level": tag_count / (entry_count / tags_count)
            })
        template_values = {'tags': tag_list}

        path = os.path.join(os.path.dirname(__file__), 'templates/tag.html')
        self.response.out.write(template.render(path, template_values))
Esempio n. 5
0
 def EntryHandler_postTest(self):
     weight = 75.0
     variance = 1.4
     currDate = "2012-10-10"
     currDt =dt.date(2012, 10, 10)
     nick= users.get_current_user().nickname()
     head = {"Content-Type" : "application/x-www-form-urlencoded", "Accept" : "text/plain"}
     payload = urlencode({"date" : currDate, "variance" : float(variance),"weight":float(weight)})
     #request = requests.Request("POST","/users/%s/"%nick, data=payload)
     request = webapp2.Request.blank('/users/%s/entry/%s'%(nick,currDate))
     request.method="POST"
     request.headers=head
     request.body=payload
     currUser=users.get_current_user()
     response = webapp2.Response()
     handler = EntryHandler()
     handler.initialize(request, response)
     handler.post(user=None,cd=None)
     self.setCurrentUser("*****@*****.**", "aaaaaaa")
     userId=users.get_current_user().user_id()
     db.delete(Entry.all())
     nick=users.get_current_user().nickname()
     handler.post(user=nick,cd='2012-10-10')
     Entry(weight=100.0, variance=5.0,date=currDt,user=currUser, parent=log_key(userId)).put()
     handler.post(user=nick,cd='2012-10-10')
     db.delete(Biometric.all())
     Biometric(height=150, target=73.3, parent=bio_key(currUser.user_id())).put()
     handler.post(user=nick,cd='2012-10-10')
     #Put Test
     handler.put(user=nick,cd='2012-10-10')
     handler.put(user=nick,cd='2012-10-15')
     handler.delete(user=nick,cd='2012-10-10')
Esempio n. 6
0
def getTagsForUrl(url):
    try:
        content = resource.get(url).decodeBody().lower()
    except:
        content = ""
    
    soup = BeautifulSoup(content) 
    texts = soup.findAll(text=True)

    def visible(element):
        if element.parent.name in ['style', 'script', '[document]', 'head', 'title']:
            return False
        elif re.match('<!--.*-->', str(element)):
            return False
        return True
    
    visible_texts = filter(visible, texts)
    visibleText = " ".join(visible_texts)
    
    result = getTagsProposalsForText(visibleText)
    
    entry = Entry.all().filter("url =", url).fetch(1)
    if len(entry) > 0:
        entryStableTags = entry[0].tags
        for t in entryStableTags:
            found = False
            name = Tag.get(t).name
            for r in result:
                if name == r:
                    found = True
            if not found:
                result.append(name)
                
    return result
Esempio n. 7
0
	def update_basic_info(
		update_categories=False,
		update_tags=False,
		update_links=False,
		update_comments=False,
		update_archives=False,
		update_pages=False):

		from model import Entry,Archive,Comment,Category,Tag,Link
		basic_info = ObjCache.get(is_basicinfo=True)
		if basic_info is not None:
			info = ObjCache.get_cache_value(basic_info.cache_key)
			if update_pages:
				info['menu_pages'] = Entry.all().filter('entrytype =','page')\
							.filter('published =',True)\
							.filter('entry_parent =',0)\
							.order('menu_order').fetch(limit=1000)
			if update_archives:
				info['archives'] = Archive.all().order('-year').order('-month').fetch(12)
			if update_comments:
				info['recent_comments'] = Comment.all().order('-date').fetch(5)
			if update_links:
				info['blogroll'] = Link.all().filter('linktype =','blogroll').fetch(limit=1000)
			if update_tags:
				info['alltags'] = Tag.all().order('-tagcount').fetch(limit=100)
			if update_categories:
				info['categories'] = Category.all().fetch(limit=1000)

			logging.debug('basic_info updated')
			basic_info.update(info)
Esempio n. 8
0
    def get(self, user, tag_title):
        """Gets RSS feed for a user, filtered by tag"""
        user = utils.get_user_model_by_id_or_nick(user)
        
        if not user:
            self.error(403)
            return
            
        tag_title = tag_title.decode('utf-8')
        tag = Tag.all().ancestor(user.key()).filter('title_lower =', tag_title.lower()).get()

        if not tag:
            self.error(404)
            return

        entries = Entry.all().filter('tags =', tag.key()).filter('published =', True).order('-time_published').fetch(20)
        entries = [e.to_struct() for e in entries]
            
        path = os.path.join(os.path.dirname(__file__), 'template.rss')
        self.response.headers['Content-Type'] = 'application/xml; charset=utf-8'
        self.response.out.write(template.render(path, {
            'entries': entries,
            'url': self.request.url,
            'title': tag_title,
        }))
Esempio n. 9
0
    def post(self):
        # add new post or edit existed post
        t_values = {}
        current_post_id = self.request.POST["current_post_id"]
        post_title = self.request.POST["blog_title"]
        post_slug = get_safe_slug(self.request.POST["blog_slug"])
        post_content = self.request.POST["blog_content"]
        # find category
        blog_category_id = self.request.POST["blog_category_id"]
        post_category = Category.get_by_id(long(blog_category_id))
        if post_category:
            logging.info("find category %s for id %s" % (post_category.name, blog_category_id))
        else:
            logging.error("category id %s can't be located" % (blog_category_id))

        if current_post_id:
            logging.info("PostManager: post : edit post current_post_id = %s" % (current_post_id))
            # update existed post
            post = Entry.get_by_id(long(current_post_id))
            if post:
                t_values['alert_message'] = "Post %s has been updated!" % (post.title)
                post.title = post_title
                post.slug = post_slug
                post.content = post_content
                post.entrytype = "post"
                # update category count if this post is public
                if post.is_external_page and post.category != post_category:
                    if post.category and (post.category.entrycount > 0):
                        post.category.entrycount -= 1
                        post.category.put()
                    post_category.entrycount += 1
                    post.category.put()
                post.category = post_category
                post.put()
        else:
            logging.info("PostManager: post : new post title %s" % (self.request.POST['blog_title']))
            # create new post
            post = Entry()
            post.title = post_title
            post.slug = post_slug
            post.content = post_content
            post.entrytype = 'post'
            post.category = post_category
            # save as public or private?
            operation = self.request.POST["submit_action"]
            if operation == "save_publish":
                post.is_external_page = True
                # update category count
                post.category.entrycount += 1
                post.category.put()
            else:  # "save" operation
                post.is_external_page = False
            # save the post
            post.put()
            t_values['alert_message'] = "Post %s has been created!" % (post.title)

        # show all posts
        posts = Entry.all().filter("entrytype =", 'post')
        t_values['posts'] = posts
        return self.response.out.write(render_template("posts.html", t_values, "", True))
Esempio n. 10
0
    def get(self, page_id="", operation=""):
        t_values = {}
        logging.info("PageManager get: page_id = %s, operation = %s" % (page_id, operation))

        # find current_post based on page_id
        if page_id:
            current_post = Entry.get_by_id(long(page_id))
            if current_post:
                logging.info("find post %s from post id %s" % (page_id, current_post.title))
                if operation == "edit":
                    t_values['current_post'] = current_post
                elif operation == "publish":
                    current_post.is_external_page = True
                    current_post.put()
                    t_values['alert_message'] = "Post %s has been changed to public" % (current_post.title)
                elif operation == "unpublish":
                    current_post.is_external_page = False
                    current_post.put()
                    t_values['alert_message'] = "Post %s has been changed to private" % (current_post.title)
                elif operation == "delete":
                    current_post.delete()
                    t_values['alert_message'] = "Post %s has been changed to deleted" % (current_post.title)

        # show all posts
        posts = Entry.all().filter("entrytype =", 'page')
        t_values['posts'] = posts
        return self.response.out.write(render_template("pages.html", t_values, "", True))
Esempio n. 11
0
    def delete(self, title):
        """Delete the specified tag for the current user"""
        user = utils.get_current_user()
        
        title = title.decode('utf-8')
        
        if not user:
            self.error(403)
            return
            
        m = Tag.all().ancestor(user).filter('title_lower =', title.lower()).get()
        if not m:
            # Original tag not found
            self.error(404)
            return

        entries = Entry.all().filter('tags =', m.key())

        # Remove tag from entries
        for entry in entries:
            logging.info(entry)
            entry.tags.remove(m.key())
            entry.save()
        
        m.delete()

        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.out.write('ok')
Esempio n. 12
0
	def get (self):
		offset = self.request.get('offset')
		if not offset:
			offset = 0
		e = Entry.all().order('addtime')
		e = e.fetch(10,int(offset))
		path = os.path.join(os.path.dirname(__file__),'templates/export.tpl')
		self.response.out.write(template.render(path,{'e':e}))	
Esempio n. 13
0
	def get(self,req_user=''):
		user_lang = 'en'
		#********************** User Auth **************************#
		user = users.get_current_user()
		nickname = ''
		if user:
			nickname=user.nickname()
		if nickname:
			user_info = User.all().filter('user',nickname)
			if user_info.count(1)>0:
				user_info = user_info.get()
				user_lang = user_info.lang
			auth_url = users.create_logout_url(self.request.uri)
			auth_text= 'signout'
		else:
			auth_url = users.create_login_url(self.request.uri)
			auth_text= 'signin'
		
		entry_count =Entry.all().count(1000)
		if req_user:
			tag_user = req_user
			tags = Tag.all().filter("user",req_user)
		else:
			tag_user = '******'
			tags = Tag.all()
		tags_count = tags.count(1000)
		tag_list=[]
		for tag in tags:
			tag_count=tag.count_link + tag.count_note + tag.count_pic
			if tag.count_link >= tag.count_note:
				if tag.count_link >= tag.count_pic:
					max_type = 'link'
				else:
					max_type = 'pic'
			else:
				if tag.count_pic >= tag.count_note:
					max_type = 'pic'
				else:
					max_type = 'note'
			#logging.info(tag_count)
			#logging.info(entry_count)
			#logging.info(tags_count)
			tag_list.append({
				"info":tag,
				"type":max_type,
				"level":int(round(tag_count/(float(entry_count)/tags_count)))
				})
		template_values = {
			'nickname' : nickname,
			'req_user' : req_user,
			'auth_url' : auth_url,
			'auth_text': auth_text,
			'tag_user' : tag_user,
			'tags'     : tag_list,
			'uri'      : self.request.uri
			}
		path = os.path.join(os.path.dirname(__file__),'templates/'+user_lang+'/tag.html')
		self.response.out.write(template.render(path,template_values))
Esempio n. 14
0
    def get(self, page="1", cate_slug=""):
        t_values = {}
        page = int(page)
        logging.info("IndexHandler - get: page = %d, cate_slug = %s" % (page, cate_slug))

        # find all entries by order
        query = Entry.all().filter("is_external_page =", True).filter("entrytype =", 'post').order("-date")
        # add category filter?
        if cate_slug:
            cates = Category.all().filter("slug =", cate_slug)
            if cates:
                query = query.filter("category =", cates[0])

        # pagination
        total_posts = query.count()
        q_limit = Configuration["posts_per_page"]
        q_offset = (page - 1) * Configuration["posts_per_page"]
        logging.info("limit = %d, offset = %d" % (q_limit, q_offset))

        # get entries
        entries = query.fetch(limit=q_limit, offset=q_offset)
        t_values['entries'] = entries

        # show entries for debug purpose
        # for entry in entries:
        #     logging.info("entry title: %s, public = %s, cate = %s" % (entry.title, entry.is_external_page, entry.category.name))

        logging.info("total posts = %d, current_page = %d, posts_per_page = %d" % (total_posts, page, Configuration['posts_per_page']))
        t_values['navlist'] = generateNavList(total_posts, page, Configuration["posts_per_page"])
        # logging.info(t_values['navlist'])

        # find all links
        links = Link.all().order("date")
        t_values['links'] = links

        # find all categories
        categories = Category.all()
        t_values['categories'] = categories

        # find all pages
        pages = Entry.all().filter("is_external_page =", True).filter("entrytype =", 'page').order("date")
        t_values['pages'] = pages

        # show index page
        return self.response.out.write(render_template("index.html", t_values, "basic", False))
Esempio n. 15
0
    def get(self):
        """Gets all entries from all feeds this user subscribes to"""
        user = utils.get_current_user()
        
        if not user:
            self.error(403)
            return
            
        # Filter and sorting
        order = self.request.get('order')
        lang = self.request.get('lang')
        tag_title = self.request.get('tag')

        # Filter
        if tag_title:
            tag = Tag.all().ancestor(user.key()).filter('title_lower =', tag_title.lower()).get()
            entries = Entry.all().filter('tags =', tag.key())
        else:
            entries = Entry.all().ancestor(user)

        if lang and lang != 'all':
            entries = entries.filter('language =', lang)

        # Sorting
        if order:
            if order == 'date-asc':
                entries = entries.order('time_published')
            elif order == 'date-desc':
                entries = entries.order('-time_published')
            elif order == 'title-asc':
                entries = entries.order('title')
            elif order == 'title-desc':
                entries = entries.order('-title')
        else:
            entries = entries.order('-time_published')

        entries = entries.fetch(25)
            
        self.response.headers['Content-Type'] = 'application/json; charset=utf-8'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        
        entries = [i.to_struct(include_tags=True) for i in entries]
        
        self.response.out.write(json.dumps(entries))
Esempio n. 16
0
	def get(self):

















		entry_count =Entry.all().count(1000)
		tags = Tag.all().order('usetime')





		tags_count = tags.count(1000)
		tag_list=[]
		for tag in tags:
			tag_count=tag.count_link + tag.count_note + tag.count_pic
			if tag.count_link >= tag.count_note:
				if tag.count_link >= tag.count_pic:
					max_type = 'link'
				else:
					max_type = 'pic'
			else:
				if tag.count_pic >= tag.count_note:
					max_type = 'pic'
				else:
					max_type = 'note'
			tag_list.append({
				"info":tag,
				"type":max_type,
				"level":tag_count/(entry_count/tags_count)
				})
		template_values = {
			'tags'     : tag_list
			}





		path = os.path.join(os.path.dirname(__file__),'templates/tag.html')
		self.response.out.write(template.render(path,template_values))
Esempio n. 17
0
    def get(self, format="json"):
        results = []

        tagsRaw = getTagTerms(self.request.get("q").lower())

        if len(tagsRaw) == 0 or tagsRaw[0] == "":
            simplewebapp.formatResponse(format, self, results)
            return

        entries = Entry.all().filter("tagsRaw IN ", tagsRaw).run()
        results = findEntries(entries, tagsRaw)

        simplewebapp.formatResponse(format, self, results)
Esempio n. 18
0
    def get(self, format="json"):
        results = []

        tagsRaw = getTagTerms(self.request.get("q").lower())

        if len(tagsRaw) == 0 or tagsRaw[0] == "":
            simplewebapp.formatResponse(format, self, results)
            return

        # EXTREMELY SLOW ! OPTIMIZE!
        entries = Entry.all().order("-updatedAt").run()
        results = findEntries(entries, tagsRaw)

        simplewebapp.formatResponse(format, self, results)
Esempio n. 19
0
 def get(self,format):
     tags = Tag.all().run()
     db.delete(tags)
     
     firstLevelTags = [
         "ActionScript",
         "Asp",
         "BASIC",
         "C",
         "C++",
         "Clojure",
         "COBOL",
         "ColdFusion",
         "Erlang",
         "Fortran",
         "Groovy",
         "Haskell",
         "Java",
         "JavaScript",
         "Lisp",
         "Perl",
         "PHP",
         "Python",
         "Ruby",
         "Scala",
         "Scheme",
         "haxe",
         "nodejs",
         'framework',
         'tool',
         'wiki',
         'tutorial',
         'howto',
         'library',
         'service',
         'language'
     ]
     
     for tag in firstLevelTags:
         t = Tag(name=tag.lower())
         t.put()
         
     entries = Entry.all()
     for e in entries:
         newtags = getTagKeys(e.tagsRaw)
         e.tags = newtags
         e.put()
         
     simplewebapp.formatResponse(format, self, "OK")
     
Esempio n. 20
0
	def get(self,req_user='',req_tag=''):
		entry = Entry.all().filter("private", False).order("-addtime")
		if req_user != '' and req_user!='all':
			entry = entry.filter("user", req_user)
		if req_tag:
			entry = entry.filter("tags", unquote(req_tag).decode('utf-8'))

		self.response.headers['Content-Type'] = 'text/xml'
		self.response.out.write('<?xml version="1.0" encoding="UTF-8"?>\r\n')
		#self.response.out.write('<?xml-stylesheet type="text/xsl" href="/css/rss_xml_style.css"?>\r\n')
		self.response.out.write('<rss version="2.0">\r\n')
		self.response.out.write('\t<channel>\r\n')
		self.response.out.write('\t\t<title>%s - http://5dnote.appspot.com</title>\r\n' % req_user)
		self.response.out.write('\t\t<image>\r\n')
		self.response.out.write('\t\t\t<title>5dnote.appspot.com</title>\r\n')
		self.response.out.write('\t\t\t<link>http://5dnote.appspot.com/</link>\r\n')
		self.response.out.write('\t\t\t<url>http://5dnote.appspot.com/media/logo.jpg</url>\r\n')
		self.response.out.write('\t\t</image>\r\n')
		self.response.out.write('\t\t<description>%s @ http://5dnote.appspot.com</description>\r\n' % req_user)
		self.response.out.write('\t\t<link>http://5dnote.appspot.com/</link>\r\n')
		self.response.out.write('\t\t<copyright>Copyright 2009 5dnote.appspot.com All Rights Reserved</copyright>\r\n')
		self.response.out.write('\t\t<language>zh-cn</language>\r\n')
		self.response.out.write('\t\t<generator>Google App Engine</generator>\r\n')
		i=0
		for item in entry:
			i +=1
			self.response.out.write('\t\t<item>\r\n')
			self.response.out.write('\t\t\t<title>%s</title>\r\n' % (item.title) )
			self.response.out.write('\t\t\t<link>%s</link>\r\n' % item.url)
			self.response.out.write('\t\t\t<author>%s</author>\r\n' % item.user)

			#for tag in item.tags:
			tag_names =','.join(tag for tag in item.tags)
				
				
			self.response.out.write('\t\t\t<category>%s</category>\r\n' % tag_names)
			self.response.out.write('\t\t\t<pubDate>%s</pubDate>\r\n' % item.addtime)
			comment = ''
			self.response.out.write('\t\t\t<comments>%s</comments>\r\n' % comment)
			if item.content:
				content = '<![CDATA[\n' + item.content + '\n]]>'
			else:
				content = ''
			self.response.out.write('\t\t\t<description>%s</description>\r\n' % content)
			self.response.out.write('\t\t</item>\r\n')
		self.response.out.write('\t</channel>\r\n')
		self.response.out.write('</rss>\r\n')
Esempio n. 21
0
 def get(self):
     """Gets all entries"""
     page = int(self.request.get('page', '0'))
     page_size = 30
     
     if not users.is_current_user_admin():
         self.error(401)
         return
         
     entries = Entry.all().order('-time_published').fetch(page_size, page_size * page)
         
     self.response.headers['Content-Type'] = 'application/json; charset=utf-8'
     self.response.headers['Access-Control-Allow-Origin'] = '*'
     
     entries = [i.to_struct(include_tags=True) for i in entries]
     
     self.response.out.write(json.dumps(entries))
Esempio n. 22
0
    def get(self, post_id="", operation=""):
        t_values = {}
        logging.info("PostManager get: post_id = %s, operation = %s" % (post_id, operation))

        # find current_post based on post_id
        if post_id:
            current_post = Entry.get_by_id(long(post_id))
            if current_post:
                logging.info("find post %s from post id %s" % (post_id, current_post.title))
                if operation == "edit":
                    t_values['current_post'] = current_post
                elif operation == "publish":
                    if not current_post.is_external_page:
                        current_post.category.entrycount += 1
                        current_post.category.put()
                        current_post.is_external_page = True
                        current_post.put()
                        t_values['alert_message'] = "Post %s has been changed to public" % (current_post.title)
                    else:
                        t_values['alert_message'] = "Post %s was public already" % (current_post.title)
                elif operation == "unpublish":
                    if current_post.is_external_page:
                        current_post.category.entrycount -= 1
                        current_post.category.put()
                        current_post.is_external_page = False
                        current_post.put()
                        t_values['alert_message'] = "Post %s has been changed to private" % (current_post.title)
                    else:
                        t_values['alert_message'] = "Post %s was private already" % (current_post.title)
                elif operation == "delete":
                    if current_post.is_external_page:
                        current_post.category.entrycount -= 1
                        current_post.category.put()
                    current_post.delete()
                    t_values['alert_message'] = "Post %s has been changed to deleted" % (current_post.title)

        # show all posts
        posts = Entry.all().filter("entrytype =", 'post')
        t_values['posts'] = posts

        # load all categories
        categories = Category.all().order("name")
        t_values['categories'] = categories

        return self.response.out.write(render_template("posts.html", t_values, "", True))
Esempio n. 23
0
	def get(self,req_tag=''):
		entry = Entry.all().filter("private", False).order("-addtime")
		if req_tag:
			entry = entry.filter("tags =", unquote(req_tag).decode('utf-8'))

		self.response.headers['Content-Type'] = 'text/xml'
		self.response.out.write('<?xml version="1.0" encoding="UTF-8"?>\r\n')
		#self.response.out.write('<?xml-stylesheet type="text/xsl" href="/css/rss_xml_style.css"?>\r\n')
		self.response.out.write('<rss version="2.0">\r\n')
		self.response.out.write('\t<channel>\r\n')
		self.response.out.write('\t\t<title>zerofault.appspot.com</title>\r\n')
		self.response.out.write('\t\t<image>\r\n')
		self.response.out.write('\t\t\t<title>Link/Note/Pic @GAE</title>\r\n')
		self.response.out.write('\t\t\t<link>http://zerofault.appspot.com/</link>\r\n')
		self.response.out.write('\t\t\t<url>http://zerofault.appspot.com/media/logo.jpg</url>\r\n')
		self.response.out.write('\t\t</image>\r\n')
		self.response.out.write('\t\t<description>My Favorites at Google App Engine</description>\r\n')
		self.response.out.write('\t\t<link>http://zerofault.appspot.com/</link>\r\n')
		self.response.out.write('\t\t<copyright>Copyright 2009 zerofault. All Rights Reserved</copyright>\r\n')
		self.response.out.write('\t\t<language>zh-cn</language>\r\n')
		self.response.out.write('\t\t<generator>python @ google app engine</generator>\r\n')
		i=0
		for item in entry:
			i +=1
			self.response.out.write('\t\t<item>\r\n')
			self.response.out.write('\t\t\t<title>%s</title>\r\n' % (item.title) )
			self.response.out.write('\t\t\t<link>%s</link>\r\n' % item.url)
			self.response.out.write('\t\t\t<author>[email protected]</author>\r\n')

			#for tag in item.tags:
			tag_names =' '.join(tag for tag in item.tags)
				
				
			self.response.out.write('\t\t\t<category>%s</category>\r\n' % tag_names)
			self.response.out.write('\t\t\t<pubDate>%s</pubDate>\r\n' % item.addtime)
			comment = ''
			self.response.out.write('\t\t\t<comments>%s</comments>\r\n' % comment)
			if item.content:
				content = '<![CDATA[\n' + item.content + '\n]]>'
			else:
				content = ''
			self.response.out.write('\t\t\t<description>%s</description>\r\n' % content)
			self.response.out.write('\t\t</item>\r\n')
		self.response.out.write('\t</channel>\r\n')
		self.response.out.write('</rss>\r\n')
Esempio n. 24
0
	def get(self):
		i=0
		
		self.response.headers['Content-Type'] = 'text/csv'
		self.response.headers['Content-Disposition'] = 'attachment; filename="Link_Tag.csv"'
		self.response.headers['Cache-Control'] = 'must-revalidate, post-check=0'
		self.response.headers['Expires'] = '0'
		self.response.headers['Pragma']  = 'public'
		
		entry = Entry.all().order("-addtime")

		for item in entry:
			i +=1
			self.response.out.write('"%d","%s","%s","%s","%s","' %(i, item.title, item.url, item.content, item.private))
				
			tag_names =','.join(tag for tag in item.tags)

			self.response.out.write('%s' % tag_names)
			self.response.out.write('"\r\n')
Esempio n. 25
0
    def post(self):
        t_values = {}
        # add new post or edit existed post
        current_post_id = self.request.POST["current_post_id"]
        if current_post_id:
            logging.info("PageManager: post : current_post_id = %s" % (current_post_id))
            # update existed post
            post = Entry.get_by_id(long(current_post_id))
            if post:
                t_values['alert_message'] = "Post %s has been updated!" % (post.title)
                post.title = self.request.POST["blog_title"]
                post.slug = get_safe_slug(self.request.POST["blog_slug"])
                post.content = self.request.POST["blog_content"]
                post.entrytype = 'page'
                post.put()

        else:
            logging.info("PageManager: post : new post title %s" % (self.request.POST['blog_title']))
            # create new post
            post = Entry()
            post.title = self.request.POST["blog_title"]
            post.slug = get_safe_slug(self.request.POST["blog_slug"])
            post.content = self.request.POST["blog_content"]
            # post.categories = self.request.POST["blog_categories"]
            operation = self.request.POST["submit_action"]
            logging.info("operation = %s" % (operation))
            if operation == "save_publish":
                post.is_external_page = True
            else:  # "save" operation
                post.is_external_page = False
            post.entrytype = 'page'
            post.put()

            t_values['alert_message'] = "Page %s: %s has been created!" % (post.title, post.entrytype)

        # show all posts
        posts = Entry.all().filter("entrytype =", 'page')
        t_values['posts'] = posts
        return self.response.out.write(render_template("pages.html", t_values, "", True))
Esempio n. 26
0
    def post(self, feed_id, language):
        current_user = utils.get_current_user()
        
        if not current_user:
            self.error(403)
            return
        
        feed = InputFeed.get_by_id(int(feed_id), parent=current_user)
        
        if not feed:
            self.error(404)
            return

        entries = Entry.all().ancestor(feed)
        for entry in entries:
            entry.language = language
            entry.save()

        feed.language = language
        feed.save()

        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.out.write('ok')
Esempio n. 27
0
    def get(self, req_user=''):
        user_lang = 'en'
        #********************** User Auth **************************#
        user = users.get_current_user()
        nickname = ''
        if user:
            nickname = user.nickname()
        if nickname:
            user_info = User.all().filter('user', nickname)
            if user_info.count(1) > 0:
                user_info = user_info.get()
                user_lang = user_info.lang
            auth_url = users.create_logout_url(self.request.uri)
            auth_text = 'signout'
        else:
            auth_url = users.create_login_url(self.request.uri)
            auth_text = 'signin'

        entry_count = Entry.all().count(1000)
        if req_user:
            tag_user = req_user
            tags = Tag.all().filter("user", req_user)
        else:
            tag_user = '******'
            tags = Tag.all()
        tags_count = tags.count(1000)
        tag_list = []
        for tag in tags:
            tag_count = tag.count_link + tag.count_note + tag.count_pic
            if tag.count_link >= tag.count_note:
                if tag.count_link >= tag.count_pic:
                    max_type = 'link'
                else:
                    max_type = 'pic'
            else:
                if tag.count_pic >= tag.count_note:
                    max_type = 'pic'
                else:
                    max_type = 'note'
            #logging.info(tag_count)
            #logging.info(entry_count)
            #logging.info(tags_count)
            tag_list.append({
                "info":
                tag,
                "type":
                max_type,
                "level":
                int(round(tag_count / (float(entry_count) / tags_count)))
            })
        template_values = {
            'nickname': nickname,
            'req_user': req_user,
            'auth_url': auth_url,
            'auth_text': auth_text,
            'tag_user': tag_user,
            'tags': tag_list,
            'uri': self.request.uri
        }
        path = os.path.join(os.path.dirname(__file__),
                            'templates/' + user_lang + '/tag.html')
        self.response.out.write(template.render(path, template_values))
Esempio n. 28
0
 def entryRsetBuilderOrderByFetchNum(self,key,orderby,rows):
     rset = Entry.all()
     rset.ancestor(log_key(key))
     rset.order(orderby)
     return rset.fetch(rows)
Esempio n. 29
0
    def post(self):

        if not self.is_login:
            self.redirect(users.create_login_url(self.request.uri))
        filename = self.param('filename')
        do_comment = self.paramint('c', 0)
        if filename[:4] == 'img/':  #处理图片
            new_filename = filename.split('/')[1]
            mtype = new_filename.split('.')[1]
            bits = self.request.body
            media = Media.all().filter('name =', new_filename)
            if media.count() > 0:
                media = media[0]
            else:
                media = Media()
            media.name = new_filename
            media.mtype = mtype
            media.bits = bits
            media.put()
            bid = '_'.join(new_filename.split('_')[:-1])
            entries = Entry.all().filter('slug =', bid)
            if entries.count() > 0:
                entry = entries[0]
                entry.content = entry.content.replace(
                    filename, '/media/' + str(media.key()))
                entry.put()
            return

        if filename == "index.html" or filename[-5:] != '.html':
            return
        #处理html页面
        bid = filename[:-5]
        try:

            soup = BeautifulSoup(self.request.body)
            bp = soup.find(id='bp')
            title = self.getChineseStr(soup.title.text)
            logging.info(bid)
            pubdate = self.getdate(bp.find(id='bp-' + bid + '-publish').text)
            body = bp.find('div', 'blogpost')

            entries = Entry.all().filter('title = ', title)
            if entries.count() < 1:
                entry = Entry()
            else:
                entry = entries[0]


##			entry=Entry.get_by_key_name(bid)
##			if not entry:
##				entry=Entry(key_name=bid)
            entry.slug = bid
            entry.title = title
            entry.author_name = self.login_user.nickname()
            entry.date = pubdate
            entry.settags("")
            entry.content = unicode(body)
            entry.author = self.login_user

            entry.save(True)
            if do_comment > 0:
                comments = soup.find('div', 'comments', 'div')
                if comments:
                    for comment in comments.contents:
                        name, date = comment.h5.text.split(' - ')
                        # modify by lastmind4
                        name_date_pair = comment.h5.text
                        if name_date_pair.index('- ') == 0:
                            name_date_pair = 'Anonymous ' + name_date_pair
                        name, date = name_date_pair.split(' - ')

                        key_id = comment.h5['id']
                        date = self.getdate(date)
                        content = comment.contents[1].text
                        comment = Comment.get_or_insert(key_id,
                                                        content=content)
                        comment.entry = entry
                        comment.date = date
                        comment.author = name
                        comment.save()

        except Exception, e:
            logging.info("import error: %s" % e.message)
Esempio n. 30
0
	def post(self):

		if not self.is_login:
			self.redirect(users.create_login_url(self.request.uri))
		filename=self.param('filename')
		do_comment=self.paramint('c',0)
		if filename[:4]=='img/':#处理图片
			new_filename=filename.split('/')[1]
			mtype =new_filename.split('.')[1]
			bits = self.request.body
			media=Media.all().filter('name =',new_filename)
			if media.count()>0:
				media=media[0]
			else:
				media=Media()
			media.name=new_filename
			media.mtype=mtype
			media.bits=bits
			media.put()
			bid='_'.join(new_filename.split('_')[:-1])
			entries=Entry.all().filter('slug =',bid)
			if entries.count()>0:
				entry=entries[0]
				entry.content=entry.content.replace(filename,'/media/'+str(media.key()))
				entry.put()
			return

		if filename=="index.html" or filename[-5:]!='.html':
			return
		#处理html页面
		bid=filename[:-5]
		try:

			soup=BeautifulSoup(self.request.body)
			bp=soup.find(id='bp')
			title=self.getChineseStr( soup.title.text)
			logging.info(bid)
			pubdate=self.getdate( bp.find(id='bp-'+bid+'-publish').text)
			body=bp.find('div','blogpost')

			entries=Entry.all().filter('title = ',title)
			if entries.count()<1:
				entry=Entry()
			else:
				entry=entries[0]
##			entry=Entry.get_by_key_name(bid)
##			if not entry:
##				entry=Entry(key_name=bid)
			entry.slug=bid
			entry.title=title
			entry.author_name=self.login_user.nickname()
			entry.date=pubdate
			entry.settags("")
			entry.content=unicode(body)
			entry.author=self.login_user

			entry.save(True)
			if do_comment>0:
				comments=soup.find('div','comments','div')
				if comments:
					for comment in comments.contents:
						name,date=comment.h5.text.split(' - ')
						# modify by lastmind4
						name_date_pair = comment.h5.text
						if name_date_pair.index('- ') == 0:
							name_date_pair = 'Anonymous ' + name_date_pair
						name,date=name_date_pair.split(' - ')

						key_id=comment.h5['id']
						date=self.getdate(date)
						content=comment.contents[1].text
						comment=Comment.get_or_insert(key_id,content=content)
						comment.entry=entry
						comment.date=date
						comment.author=name
						comment.save()

		except Exception,e :
			logging.info("import error: %s"%e.message)
Esempio n. 31
0
	def get(self,req_type='link',req_tag=''):
		if not req_type:
			req_type = 'link'
		#********************** User Auth **************************#
		isAdmin = False
		user = users.get_current_user()
		if user:
			if users.is_current_user_admin():
				isAdmin = True
			auth_url = users.create_logout_url(self.request.uri)
			auth_text= '注销'
		else:
			auth_url = users.create_login_url(self.request.uri)
			auth_text= '登录'






		#********************** Pagenator init**************************#
		limit = 20;
		p = self.request.get('p')
		if not p:
			p=1
		else:
			p = int(p)
		offset = (p-1)*limit
		
		#********************** Query **************************#
		e = Entry.all().filter('type',req_type).order("-addtime")




		if req_tag:
			e = e.filter("tags", unquote(req_tag).decode('utf-8'))
		if not isAdmin:
			e = e.filter("private", False)

		if e and e.count()>0:
			cur_pageid = e.get().pageid
		else:
			cur_pageid = 0
		item_count = 0
		while cur_pageid>=0:
			entry=Entry.all().filter('type',req_type)


			if req_tag:
				entry = entry.filter('tags',unquote(req_tag).decode('utf-8'))
			if not isAdmin:
				entry = entry.filter('private', False)
			
			item_count += entry.filter('pageid',cur_pageid).count()
			cur_pageid -=1

		e = e.fetch(limit,offset)

		#********************** Pagenator **************************#
		page_count = int(math.ceil(item_count / float(limit))) #总页数
		if page_count <=7 :
			page_numbers = range(1,page_count+1)
		else:
			if p<=6:
				page_numbers = range(1,max(1,p-3))
			else:
				page_numbers = [1,2] + ['...']
			page_numbers += range(max(1,p-3),min(p+4,page_count+1))
			if p >= page_count-5:
				page_numbers += range(min(p+4,page_count+1),page_count+1)
			else:
				page_numbers += (['...']+range(page_count-1,page_count+1))






		template_values = {
			'user'     : user,
			'req_type' : req_type,
			'isAdmin'  : isAdmin,
			'auth_url' : auth_url,
			'auth_text': auth_text,
			'entry_list': e,
			'tag_list' : Tag.all().order("-count_"+req_type),
			'is_paginated':  page_count> 1,
			'has_next': p*limit < item_count,
			'has_previous': p > 1,
			'current_page': p,
			'next_page': p + 1,
			'previous_page': p - 1,
			'pages': page_count,
			'page_numbers': page_numbers,
			'count': item_count
			}
		path = os.path.join(os.path.dirname(__file__),'templates/'+req_type+'.html')
		self.response.out.write(template.render(path,template_values))
Esempio n. 32
0
    def post(self):
        #********************** User Auth **************************#
        user = users.get_current_user()
        nickname = ''
        if user:
            nickname = user.nickname()
        if nickname:
            key = self.request.get('key')
            if key:
                e = db.get(key)
                if e.user != nickname:
                    e = Entry()
                    e.user = nickname
            else:
                e = Entry()
                e.user = nickname
            type = self.request.get('type')
            if not type:
                type = 'link'
            tz = self.request.get('tz')
            if tz[0:1] == '-':
                tz = int(tz[1:])
                tz = -tz
            else:
                tz = int(tz[1:])
                tz = +tz

            title = self.request.get('title')
            e.title = title.replace('&', '&amp;').replace('<', '&lt;').replace(
                '>', '&gt;')
            url = self.request.get('url')
            purl = self.request.get('purl')
            if type == 'pic' and not key:
                e.url = purl.replace('&', '&amp;').replace('<',
                                                           '&lt;').replace(
                                                               '>', '&gt;')
            else:
                e.url = url.replace('&', '&amp;').replace('<', '&lt;').replace(
                    '>', '&gt;')
            content = self.request.get('content')
            e.content = content
            if not key:
                e.addtime += datetime.timedelta(hours=tz)
            e.private = bool(int(self.request.get('private')))
            e.type = type
            if type == 'pic' and not key:
                if url:
                    try:
                        result = urlfetch.fetch(url)
                        if result.status_code == 200:
                            e.image = db.Blob(result.content)
                    except:
                        self.response.out.write(
                            'Fetch picture fail! You can <a href="/add?type=pic">upload</a> it manually'
                        )
                        return
                else:
                    myfile = self.request.get("myfile")
                    if not myfile:
                        self.response.out.write('No file specified!')
                        return
                    try:
                        e.image = db.Blob(myfile)
                    except:
                        self.response.out.write('Uploading fail!')
                        return

            if key:  #更新数据
                for oldtag in e.tags:
                    tag = Tag.all().filter("user",
                                           nickname).filter('name', oldtag)
                    if (tag.count(1) > 0):
                        t = tag.get()
                        if type == 'link':
                            t.count_link -= 1
                        if type == 'note':
                            t.count_note -= 1
                        if type == 'pic':
                            t.count_pic -= 1
                        t.put()
            else:  #新增数据
                max_pageCount = 900  #超过此数据,则pageid递增
                entry = Entry.all().order('-addtime')
                if entry.count() > 0:
                    cur_pageid = entry.get().pageid
                else:
                    cur_pageid = 0

                cur_pageCount = entry.filter('pageid =',
                                             cur_pageid).count(1000)

                if cur_pageCount >= max_pageCount:
                    e.pageid = cur_pageid + 1
                else:
                    e.pageid = cur_pageid

            e.tags = []
            tag_names = self.request.get('tags').split()
            for tag_name in tag_names:
                tag = Tag.all().filter("user",
                                       nickname).filter('name', tag_name)
                if (tag.count(1) > 0):
                    t = tag.get()
                    if type == 'link':
                        t.count_link += 1
                    if type == 'note':
                        t.count_note += 1
                    if type == 'pic':
                        t.count_pic += 1
                    t.user = nickname
                    t.usetime = datetime.datetime.now()
                    t.put()
                else:
                    t = Tag()
                    t.name = tag_name
                    if type == 'link':
                        t.count_link = 1
                    if type == 'note':
                        t.count_note = 1
                    if type == 'pic':
                        t.count_pic = 1
                    t.user = nickname
                    t.usetime = datetime.datetime.now()
                    t.put()
                e.tags.append(db.Category(tag_name))
            e.put()
            self.redirect('/' + type + '/' + nickname)
        else:
            self.redirect(users.create_login_url(self.request.uri))
Esempio n. 33
0
    def post(self):

        if users.is_current_user_admin():
            key = self.request.get('key')
            if key:
                e = db.get(key)

            else:
                e = Entry()

            type = self.request.get('type')
            if not type:
                type = 'link'
            title = self.request.get('title')
            e.title = title.replace('&', '&amp;').replace('<', '&lt;').replace(
                '>', '&gt;')
            url = self.request.get('url')
            purl = self.request.get('purl')
            if type == 'pic' and not key:
                e.url = purl.replace('&', '&amp;').replace('<',
                                                           '&lt;').replace(
                                                               '>', '&gt;')
            else:
                e.url = url.replace('&', '&amp;').replace('<', '&lt;').replace(
                    '>', '&gt;')
            content = self.request.get('content')
            e.content = content
            if not key:
                e.addtime += datetime.timedelta(hours=+8)
            e.private = bool(int(self.request.get('private')))
            e.type = type
            if type == 'pic' and not key:
                if url:
                    try:
                        result = urlfetch.fetch(url)
                        if result.status_code == 200:
                            e.image = db.Blob(result.content)
                    except:
                        self.response.out.write('获取图片超时!')
                        return
                else:
                    myfile = self.request.get("myfile")
                    if not myfile:
                        self.response.out.write('没有选择文件!')
                        return
                    try:
                        e.image = db.Blob(myfile)
                    except:
                        self.response.out.write('文件上传失败!')
                        return

            if key:  #更新数据
                for oldtag in e.tags:
                    tag = Tag.all().filter('name', oldtag)
                    if (tag.count(1) > 0):
                        t = tag.get()
                        if type == 'link':
                            t.count_link -= 1
                        if type == 'note':
                            t.count_note -= 1
                        if type == 'pic':
                            t.count_pic -= 1
                        t.put()
            else:  #新增数据
                max_pageCount = 900  #超过此数据,则pageid递增
                entry = Entry.all().order('-addtime')
                if entry.count() > 0:
                    cur_pageid = entry.get().pageid
                else:
                    cur_pageid = 0

                cur_pageCount = entry.filter('pageid =',
                                             cur_pageid).count(1000)

                if cur_pageCount >= max_pageCount:
                    e.pageid = cur_pageid + 1
                else:
                    e.pageid = cur_pageid

            e.tags = []
            tag_names = self.request.get('tags').split()
            for tag_name in tag_names:
                tag = Tag.all().filter('name', tag_name)
                if (tag.count(1) > 0):
                    t = tag.get()
                    if type == 'link':
                        t.count_link += 1
                    if type == 'note':
                        t.count_note += 1
                    if type == 'pic':
                        t.count_pic += 1

                    t.usetime = datetime.datetime.now()
                    t.put()
                else:
                    t = Tag()
                    t.name = tag_name
                    if type == 'link':
                        t.count_link = 1
                    if type == 'note':
                        t.count_note = 1
                    if type == 'pic':
                        t.count_pic = 1

                    t.usetime = datetime.datetime.now()
                    t.put()
                e.tags.append(db.Category(tag_name))
            e.put()
            self.redirect('/' + type + '/')
        else:
            self.redirect(users.create_login_url(self.request.uri))
Esempio n. 34
0
    def get(self, req_type='link', req_tag=''):
        if not req_type:
            req_type = 'link'
        #********************** User Auth **************************#
        isAdmin = False
        user = users.get_current_user()
        if user:
            if users.is_current_user_admin():
                isAdmin = True
            auth_url = users.create_logout_url(self.request.uri)
            auth_text = '注销'
        else:
            auth_url = users.create_login_url(self.request.uri)
            auth_text = '登录'

        #********************** Pagenator init**************************#
        limit = 20
        p = self.request.get('p')
        if not p:
            p = 1
        else:
            p = int(p)
        offset = (p - 1) * limit

        #********************** Query **************************#
        e = Entry.all().filter('type', req_type).order("-addtime")

        if req_tag:
            e = e.filter("tags", unquote(req_tag).decode('utf-8'))
        if not isAdmin:
            e = e.filter("private", False)

        if e and e.count() > 0:
            cur_pageid = e.get().pageid
        else:
            cur_pageid = 0
        item_count = 0
        while cur_pageid >= 0:
            entry = Entry.all().filter('type', req_type)

            if req_tag:
                entry = entry.filter('tags', unquote(req_tag).decode('utf-8'))
            if not isAdmin:
                entry = entry.filter('private', False)

            item_count += entry.filter('pageid', cur_pageid).count()
            cur_pageid -= 1

        e = e.fetch(limit, offset)

        #********************** Pagenator **************************#
        page_count = int(math.ceil(item_count / float(limit)))  #总页数
        if page_count <= 7:
            page_numbers = range(1, page_count + 1)
        else:
            if p <= 6:
                page_numbers = range(1, max(1, p - 3))
            else:
                page_numbers = [1, 2] + ['...']
            page_numbers += range(max(1, p - 3), min(p + 4, page_count + 1))
            if p >= page_count - 5:
                page_numbers += range(min(p + 4, page_count + 1),
                                      page_count + 1)
            else:
                page_numbers += (['...'] +
                                 range(page_count - 1, page_count + 1))

        template_values = {
            'user': user,
            'req_type': req_type,
            'isAdmin': isAdmin,
            'auth_url': auth_url,
            'auth_text': auth_text,
            'entry_list': e,
            'tag_list': Tag.all().order("-count_" + req_type),
            'is_paginated': page_count > 1,
            'has_next': p * limit < item_count,
            'has_previous': p > 1,
            'current_page': p,
            'next_page': p + 1,
            'previous_page': p - 1,
            'pages': page_count,
            'page_numbers': page_numbers,
            'count': item_count
        }
        path = os.path.join(os.path.dirname(__file__),
                            'templates/' + req_type + '.html')
        self.response.out.write(template.render(path, template_values))
Esempio n. 35
0
 def entryRsetBuilder(self,key):
     rset = Entry.all()
     rset.ancestor(log_key(key))
     return rset
Esempio n. 36
0
 def getEntrybyDateDesc(self,key):
     return  Entry.all().ancestor(log_key(key)).order("-date")
Esempio n. 37
0
    def post(self, post_slug=""):
        if post_slug:
            t_values = {}

            post_id = self.request.POST['post_id']
            post = Entry.get_by_id(long(post_id))
            if post:
                # ok, we find the post, try to add comment to this post
                logging.warning("find one post with post_id %s" % (post_id))
                t_values['post'] = post
                # dump(post)

                # check google recaptcha, these two fileds might not exist due to connection to reCAPTCHA
                recaptcha_challenge_field = self.request.POST.get('recaptcha_challenge_field', "")
                recaptcha_response_field = self.request.POST.get('recaptcha_response_field', "")
                remote_ip = self.request.environ['REMOTE_ADDR']
                private_key = "6LdwFdISAAAAAOYRK7ls3O-kXPTnYDEstrLM2MRo"
                antispam_flag = False
                try:
                    result = submit(recaptcha_challenge_field, recaptcha_response_field, private_key, remote_ip)
                    logging.info("google recaptcha %s, %s" % (result.is_valid, result.error_code))
                    if result.is_valid:
                        antispam_flag = True
                except:
                    e = sys.exc_info()[0]
                    logging.info(e)

                # create comment for this post
                if antispam_flag:
                    logging.info("PostManager - add comment")
                    comm_author = self.request.POST['author']
                    comm_email = self.request.POST['email']
                    comm_weburl = self.request.POST['weburl']
                    comm_content = self.request.POST['comment']
                    comment_ip = self.request.environ['REMOTE_ADDR']
                    comm = Comment(entry=post, author=comm_author, email=comm_email, weburl=comm_weburl, content=comm_content, ip=comment_ip)
                    comm.put()
                    t_values['alert_message'] = "Thanks %s for your comment!" % (comm_author)
                else:
                    logging.warning("comment ignored because antispam failed")
                    t_values['alert_message'] = "Sorry, your comment was ignored because of reCAPTCHA failure!"

                # find all comments
                comments = Comment.all().filter("entry =", post).order("date")
                logging.info("PostHandler, post, find %d comments" % (comments.count()))
                if post_id:
                    # only update commentcount when new comment is added
                    post.commentcount = comments.count()
                    post.put()
                t_values['comments'] = comments
            else:
                logging.warning("post_id %s does not exist" % (post_id))

            links = Link.all().order("date")
            t_values['links'] = links

            categories = Category.all()
            t_values['categories'] = categories
    
            pages = Entry.all().filter("is_external_page =", True).filter("entrytype =", 'page').order("date")
            t_values['pages'] = pages

            return self.response.out.write(render_template("post.html", t_values, "basic", False))
        else:
            self.redirect(uri_for("weblog.index"))