def get(self): try: thread = db.get(self.request.get("thread_key")) bbs = db.get(self.request.get("bbs_key")) except: thread = None bbs = None if thread == None or bbs == None: Alert.alert_msg_with_write(self, "拍手対象のスレッドが見つかりません。") return not_spam = ( self.request.remote_addr != thread.applause_ip and self.request.remote_addr != thread.applause_ip2 and self.request.remote_addr != thread.applause_ip3 and self.request.remote_addr != thread.applause_ip4 ) if not_spam or self.request.get("comment"): if thread.applause: thread.applause = thread.applause + 1 else: thread.applause = 1 thread.applause_ip4 = thread.applause_ip3 thread.applause_ip3 = thread.applause_ip2 thread.applause_ip2 = thread.applause_ip thread.applause_ip = self.request.remote_addr thread.applause_date = datetime.datetime.today() thread.search_index_version = 0 thread.put() if bbs.applause_n: bbs.applause_n = bbs.applause_n + 1 else: bbs.applause_n = 1 bbs.put() user = users.get_current_user() comment = "" if self.request.get("comment"): comment = self.request.get("comment") StackFeed.feed_new_applause_thread(user, thread, comment) Ranking.add_rank_global(thread, BbsConst.SCORE_APPLAUSE) if self.request.get("mode") == "bbs": order = self.request.get("order") page = self.request.get("page") self.redirect(str(MappingId.get_usr_url("./", bbs) + "?order=" + order + "&page=" + page)) else: thread_url = self.request.get("thread_key") if thread.short: thread_url = thread.short self.redirect(str(MappingId.get_usr_url("./", bbs) + thread_url + ".html"))
def get(self): is_iphone=CssDesign.is_iphone(self) page=1 page_unit=20 if(self.request.get("page")): page=int(self.request.get("page")) rank=Ranking.get_or_insert(BbsConst.THREAD_RANKING_KEY_NAME) ranking_mode=self.request.get("mode") ranking_id_list=rank.user_id_ranking_list[(page-1)*page_unit:page*page_unit] ranking_list=[] for user_id in ranking_id_list: obj=ApiObject.get_bookmark_of_user_id(user_id) if(obj): if(obj.disable_rankwatch): ranking_list.append(None) continue obj=ApiObject.create_user_object(self,obj) ranking_list.append(obj) user = users.get_current_user() user_rank=0 if(user): rank=Ranking.get_by_key_name(BbsConst.THREAD_RANKING_KEY_NAME) if(rank): user_rank=rank.get_user_rank(user.user_id()) template_values = { 'host': "./", 'is_iphone': is_iphone, 'user': user, 'user_rank': user_rank, 'redirect_url': self.request.path, 'mode': "ranking", 'header_enable': False, 'ranking_list': ranking_list, 'ranking_mode': ranking_mode, 'page': page, 'page_unit': page_unit } path = '/html/portal.html' self.response.out.write(template_select.render(path, template_values))
def feed_get_thread_list(req,order,offset,limit): #最大取得数 if(limit>100): limit=100 #キャッシュが有効かどうか cache_enable=ApiFeed._is_cache_enable(offset,limit,order) #キャッシュ取得 cache_id=ApiFeed._get_cache_id(order,req.request.get("bbs_id"),offset,limit) if(cache_enable): data=memcache.get(cache_id) if(data): dic=ApiObject.create_thread_object_list(req,data,req.request.get("bbs_id")) return dic #スレッド一覧取得 if(order=="hot"): rank=Ranking.get_by_key_name(BbsConst.THREAD_RANKING_KEY_NAME) if(rank==None): rank=Ranking.get_or_insert(BbsConst.THREAD_RANKING_KEY_NAME) thread_list=rank.get_rank(offset,limit) bbs_id=None else: query=ApiFeed._get_query(order,req.request.get("event_id")) bbs_id=None if(req.request.get("bbs_id")): bbs_key=MappingId.mapping(req.request.get("bbs_id")) if(bbs_key==""): return None #bbs not found query.filter("bbs_key =",db.get(bbs_key)) bbs_id=True thread_list=query.fetch(offset=offset,limit=limit) #キャッシュに乗せる if(cache_enable): memcache.set(cache_id,thread_list,BbsConst.TOPPAGE_FEED_CACHE_TIME) #リスト作成 dic=ApiObject.create_thread_object_list(req,thread_list,bbs_id) return dic
def feed_get_bbs_list(req,order,offset,limit): #最大取得数 if(limit>100): limit=100 #キャッシュが有効かどうか cache_enable=0 if(offset==0): cache_enable=1 #キャッシュ取得 cache_id=BbsConst.OBJECT_CACHE_HEADER+BbsConst.OBJECT_BBS_RANKING_HEADER if(cache_enable): data=memcache.get(cache_id) else: data=None if(data and cache_enable): dic=[] for bbs in data: dic.append(ApiObject.create_bbs_object(req,bbs)) return dic #BBS一覧取得 rank=Ranking.get_by_key_name(BbsConst.THREAD_RANKING_KEY_NAME) if(rank==None): rank=Ranking.get_or_insert(BbsConst.THREAD_RANKING_KEY_NAME) bbs_list=rank.get_bbs_rank(offset,limit) #リスト作成 bbs_list=ApiObject.get_cached_object_list(bbs_list) #キャッシュに乗せる if(cache_enable): memcache.set(cache_id,bbs_list,BbsConst.TOPPAGE_FEED_CACHE_TIME) #オブジェクト作成 dic=[] for bbs in bbs_list: dic.append(ApiObject.create_bbs_object(req,bbs)) return dic
def get(self): SetUtf8.set() #ランキング更新 rank=Ranking.get_or_insert(BbsConst.THREAD_RANKING_KEY_NAME) rank.create_rank(self) ApiFeed.invalidate_cache(); #キャッシュ取得 cache=SiteAnalyzer.get_cache_from_db(); #1日単位で習得 #force=False #if(self.request.get("force")): # force=True if(cache.date and len(cache.day_list)>=1):# and not force): day1_str=NicoTracker.get_day_string(cache.date) day2_str=NicoTracker.get_day_string(datetime.datetime.today()) if(day1_str==day2_str): Alert.alert_msg_with_write(self,"ランキングを更新しました。統計情報はまだ1日が経過していないので計測していません。") return #コメント数と再生数を取得 bbs_cnt=Bbs.all().count(limit=100000) illust_cnt=MesThread.all().count(limit=100000) entry_cnt=Entry.all().count(limit=100000) user_cnt=Bookmark.all().count(limit=100000) #書き込み day_str=NicoTracker.get_day_string(datetime.datetime.today()) cache.entry_cnt_list.insert(0,entry_cnt) cache.illust_cnt_list.insert(0,illust_cnt) cache.bbs_cnt_list.insert(0,bbs_cnt) cache.user_cnt_list.insert(0,user_cnt) cache.day_list.insert(0,day_str) cache.bbs_n=bbs_cnt cache.illust_n=illust_cnt cache.put() Alert.alert_msg_with_write(self,"ランキングを更新しました。")
def post(self): SetUtf8.set() is_english=CssDesign.is_english(self) #エラーコードはFlash向けかどうか is_flash=False if(self.request.get('image')): is_flash=True #書き込み対象のコメントを取得 if(self.request.get("entry_key")): #上書きモード entry = db.get(self.request.get("entry_key")) overwrite = True else: entry = Entry() overwrite = False #コメント if(self.request.get('comment')): entry.content = self.request.get('comment') else: if(self.request.get('image')): entry.content = "" else: if(is_english): self.write_status(is_flash,"Please input comment"); else: self.write_status(is_flash,"コメントを入力して下さい。"); return #名前 if(self.request.get('author')): entry.editor = cgi.escape(self.request.get('author')) else: entry.editor = "no_name" if(is_english): self.write_status(is_flash,"Please input name"); else: self.write_status(is_flash,"名前を入力して下さい。"); return if(not self.request.get('image')): if(self.request.get("seed")!=BbsConst.SUBMIT_SEED): self.write_status(is_flash,"シードが一致しません。"); return if(self.request.get('mail_addr')): entry.mail=self.request.get('mail_addr') else: entry.mail="" if(self.request.get('homepage_addr') and self.request.get('homepage_addr')!="http://"): entry.homepage_addr=self.request.get('homepage_addr') else: entry.homepage_addr="" user = users.get_current_user() thread=db.Key(self.request.get("thread_key")) bbs = db.get(self.request.get("bbs_key")) if(SpamCheck.check_all(self,entry.content,self.request.get("remote_host"),user,bbs,is_flash,is_english)): return #二重投稿ブロック if(entry.content!="" and memcache.get("add_entry_double_block")==entry.content): if(is_flash): self.write_status(is_flash,"二重投稿を検出しました。時間を置いて、再度、投稿して下さい。"); else: url=MappingThreadId.get_thread_url("./",bbs,db.get(self.request.get("thread_key"))) self.redirect(str(url)) return #コメント禁止 if(db.get(thread).prohibit_comment): self.write_status(is_flash,"このイラストへのコメントは禁止されています。"); return #書き込み権限確認 if(bbs.comment_login_require): if(not(user)): self.write_status(is_flash,"この掲示板ではコメントする際にログインが必須です。"); return #上書き権限確認 if(overwrite): bbs=db.get(self.request.get("bbs_key")) if(OwnerCheck.check(bbs,user)): if(user and entry.user_id!=user.user_id()): self.write_status(is_flash,"上書き投稿する権限がありません。"); return #イラストの設定 delete_thread_image=None if(self.request.get('image')): if(overwrite): delete_thread_image=entry.illust_reply_image_key timage=ThreadImage() timage.bbs_key=bbs if(self.request.get("base64") and self.request.get("base64")=="1"): timage.image=db.Blob(base64.b64decode(self.request.get("image"))) timage.thumbnail=db.Blob(base64.b64decode(self.request.get("thumbnail"))) else: timage.image=db.Blob(self.request.get("image")) timage.thumbnail=db.Blob(self.request.get("thumbnail")) timage.thumbnail2=None timage.illust_mode=1; try: timage.put() except: if(is_english): self.write_status(is_flash,"Too big image"); else: self.write_status(is_flash,"画像サイズが大きすぎます。"); return entry.illust_reply=1 entry.illust_reply_image_key=timage else: entry.content=cgi.escape(entry.content) entry.content=EscapeComment.auto_link(entry.content) entry.content=EscapeComment.escape_br(entry.content) entry.thread_key = thread entry.bbs_key = bbs entry.del_flag = 1 if(self.request.get("regulation")): entry.adult=int(self.request.get("regulation")) #プロフィールにリンクするか link_to_profile=StackFeed.is_link_to_profile(self) if(link_to_profile and user): entry.user_id=user.user_id() #スレッドを取得 thread = db.get(self.request.get("thread_key")) #基本情報を設定 if(not overwrite): self.set_basic_info(entry,thread) #保存 if(not SyncPut.put_sync(entry)): message="コメントの投稿は成功しましたが表示が遅延しています。反映まで数分お待ちください。" memcache.set(BbsConst.OBJECT_THREAD_MESSAGE_HEADER+str(thread.key()),message,BbsConst.OBJECT_THREAD_MESSAGE_CACHE_TIME) memcache.set(BbsConst.OBJECT_BBS_MESSAGE_HEADER+str(bbs.key()),message,BbsConst.OBJECT_BBS_MESSAGE_CACHE_TIME) #スレッドと掲示板の情報を更新 if(not overwrite): self.update_thread_and_bbs_information(thread,bbs,entry) #上書き投稿時の昔のイラストの削除 if(delete_thread_image): delete_thread_image.delete() #ステータスコードを出力 if(self.request.get('image')): self.response.headers ['Content-type'] = "text/html;charset=utf-8" self.response.out.write("success") else: url=MappingThreadId.get_thread_url("./",bbs,thread) if(self.request.get("redirect_url")): url=self.request.get("redirect_url") self.redirect(str(url)) #二重投稿ブロック memcache.set("add_entry_double_block",self.request.get("comment"),30) #ランキング is_owner=False if(thread.user_id and entry.user_id and thread.user_id == entry.user_id): is_owner=True if(not is_owner): #自分のスレッドへのコメントはランキングに反映しない Ranking.add_rank_global(thread,BbsConst.SCORE_ENTRY) #フィード if(not link_to_profile): user=None try: StackFeed.feed_new_comment_thread(user,thread,entry) except: logging.error("new entry stackfeed add error")
def get(self): SetUtf8.set() mode = self.request.get("mode") #スレッド取得 thread = AddBookmark.get_one_db(self.request.get("thread_key")) if(not thread and mode=="add"): #削除はスレッドが見つからなくてもできるようにする Alert.alert_msg_with_write(self,"スレッドが見つかりません。"); return #BBS取得 bbs=AddBookmark.get_one_db(self.request.get("bbs_key")) if(not bbs and mode=="add_bbs"): Alert.alert_msg_with_write(self,"掲示板が見つかりません。"); return #アプリ取得 app=AddBookmark.get_one_db(self.request.get("app_key")) if(not app and mode=="add_app"): Alert.alert_msg_with_write(self,"アプリが見つかりません。"); return #ログイン要求 user = users.get_current_user() if(not(user)): Alert.alert_msg_with_write(self,"ブックマークをする場合はログインが必須です。"); return bookmark=ApiObject.get_bookmark_of_user_id_for_write(user.user_id()) if(bookmark==None): Alert.alert_msg_with_write(self,"ブックマークの取得に失敗しました。"); return #ユーザ add_user_key=self.request.get("user_key") #ブックマーク数を初期化 if(thread): if(not thread.bookmark_count): thread.bookmark_count=0 if(bbs): if(not bbs.bookmark_count): bbs.bookmark_count=0 add_thread_key=None if(self.request.get("thread_key")): add_thread_key=db.Key(self.request.get("thread_key")) add_bbs_key=None if(self.request.get("bbs_key")): add_bbs_key=db.Key(self.request.get("bbs_key")) add_app_key=None if(self.request.get("app_key")): add_app_key=db.Key(self.request.get("app_key")) comment=None if(self.request.get("comment")): comment=self.request.get("comment") #unpack mute_bbs_list mute_bbs_list=bookmark.get_mute_bbs_list() mute_user_list=bookmark.get_mute_user_list() #add bookmark feed_enable=False if(mode=="add"): AddBookmark.add_comment(thread,user.user_id(),comment) feed_enable=AddBookmark.add_one(bookmark.thread_key_list,add_thread_key,thread,True) if(mode=="add_bbs"): feed_enable=AddBookmark.add_one(bookmark.bbs_key_list,add_bbs_key,bbs,True) if(mode=="add_mute_bbs"): feed_enable=AddBookmark.add_one(mute_bbs_list,str(add_bbs_key),bbs,False) if(mode=="add_app"): AddBookmark.add_one(bookmark.app_key_list,add_app_key,app,True) if(mode=="add_user"): feed_enable=AddBookmark.add_user(bookmark.user_list,add_user_key) if(mode=="add_mute_user"): feed_enable=AddBookmark.add_user(mute_user_list,add_user_key) #del bookmark if(mode=="del"): AddBookmark.del_one(bookmark.thread_key_list,add_thread_key,thread,True) if(mode=="del_bbs"): AddBookmark.del_one(bookmark.bbs_key_list,add_bbs_key,bbs,True) if(mode=="del_mute_bbs"): AddBookmark.del_one(mute_bbs_list,str(add_bbs_key),bbs,False) if(mode=="del_app"): AddBookmark.del_one(bookmark.app_key_list,add_app_key,app,True) if(mode=="del_user"): if(add_user_key in bookmark.user_list): bookmark.user_list.remove(add_user_key) if(mode=="del_mute_user"): if(add_user_key in mute_user_list): mute_user_list.remove(add_user_key) #pack mute_bbs_list bookmark.mute_bbs_packed_str_list="" for one_bbs in mute_bbs_list: bookmark.mute_bbs_packed_str_list+=str(one_bbs)+"#" bookmark.mute_user_packed_str_list="" for m_user in mute_user_list: bookmark.mute_user_packed_str_list+=str(m_user)+"#" #フォロー先のユーザのフォロワーを更新するようにリクエスト if(mode=="add_user" or mode=="del_user"): ApiObject.invalidate_follower_list(add_user_key) #write bookmark.put() #feed(feed内でもbookmark.putを行うため、bookmark.putの前に置いてはいけない) if(mode=="add"): if(feed_enable): StackFeed.feed_new_bookmark_thread(user,thread,comment) Ranking.add_rank_global(thread,BbsConst.SCORE_BOOKMARK) if(mode=="add_bbs"): if(feed_enable): StackFeed.feed_new_bookmark_bbs(user,bbs) if(mode=="add_user"): if(feed_enable): StackFeed.feed_new_follow(user,add_user_key) if(mode=="del_user"): StackFeed.feed_unfollow(user,add_user_key) #redirect url="./mypage" if(mode=="del" or mode=="add"): url=url+"?tab=bookmark" if(mode=="del_bbs" or mode=="add_bbs"): url=url+"?tab=bbs" if(mode=="del_mute_bbs" or mode=="add_mute_bbs"): url=url+"?tab=bbs" if(mode=="add_user" or mode=="del_user"): url=url+"?user_id="+add_user_key if(mode=="add" or mode=="add_bbs"): Alert.alert_msg_with_write(self,"success"); else: self.redirect(str(url))
def post(self): SetUtf8.set() is_english=CssDesign.is_english(self) entry=None try: entry = db.get(self.request.get("entry_key")) except: entry=None if(not entry): Alert.alert_msg_with_write(self,"エントリーが見つかりません。"); return thread_key=entry.thread_key bbs_key=thread_key.bbs_key #スパムチェック if(self.request.get("seed")!=BbsConst.SUBMIT_SEED): Alert.alert_msg_with_write(self,"シードが一致しません。"); return #コメント禁止 if(thread_key.prohibit_comment): Alert.alert_msg_with_write(self,"このイラストへのコメントは禁止されています。"); return #書き込み権限チェック user = users.get_current_user() if(bbs_key.comment_login_require): if(not(user)): Alert.alert_msg_with_write(self,"この掲示板ではコメントする際にログインが必須です。"); return response = Response() if(self.request.get('comment')): response.content = cgi.escape(self.request.get('comment')) else: Alert.alert_msg_with_write(self,"コメントを入力して下さい。"); return #二重投稿ブロック if(response.content!="" and memcache.get("add_res_double_block")==response.content): url=MappingThreadId.get_thread_url("./",bbs_key,thread_key) self.redirect(str(url)) return is_flash=False if(SpamCheck.check_all(self,response.content,self.request.get("remote_host"),user,bbs_key,is_flash,is_english)): return response.content=EscapeComment.escape_br(response.content) response.content=EscapeComment.auto_link(response.content) if(self.request.get('author')): try: response.editor = cgi.escape(self.request.get('author')) except: Alert.alert_msg_with_write(self,"名前に改行は使用できません。"); return else: response.editor = "no_name" if(is_english): Alert.alert_msg_with_write(self,"Please input name"); else: Alert.alert_msg_with_write(self,"名前を入力して下さい。"); return #プロフィールにリンクするか link_to_profile=StackFeed.is_link_to_profile(self) if(link_to_profile and user): response.user_id=user.user_id() #コメント番号を設定 response.comment_no=thread_key.comment_cnt+1 response.remote_addr=self.request.remote_addr response.remote_host=self.request.get("remote_host") #レスを書き込み response.put() #レスをコメントに追加 entry.res_list.append(response.key()) entry.last_update_editor = response.editor entry.date=datetime.datetime.today() entry.search_index_version=0 entry.put() #スレッドのコメント数を更新 thread = thread_key thread.comment_cnt = thread.comment_cnt+1 thread.date=datetime.datetime.today() thread.put() #コメント数を更新 if(bbs_key.comment_n) : bbs_key.comment_n=bbs_key.comment_n+1 else: bbs_key.comment_n=1 bbs_key.put() RecentCommentCache.invalidate(bbs_key) #ステータス出力 url=MappingThreadId.get_thread_url("./",bbs_key,thread_key) if(self.request.get("redirect_url")): url=self.request.get("redirect_url") self.redirect(str(url)) #二重投稿ブロック memcache.set("add_res_double_block",self.request.get("comment"),30) #ランキング Ranking.add_rank_global(thread,BbsConst.SCORE_RES) #フィード if(not link_to_profile): user=None try: StackFeed.feed_new_response_entry(user,thread,entry,response) except: logging.error("new res stack feed add error")