def update_thread(self,bbs,thread,user): compiled_line = re.compile("\r\n|\r|\n") title = self.request.get('thread_title') title=self.escape_comment(title) thread.title = title thread.author=self.request.get('thread_author') category = self.request.get("thread_category") thread.category=category CategoryList.add_new_category(bbs,category) event_id = self.request.get("event_id") thread.event_id=event_id summary = self.request.get('thread_summary') summary = compiled_line.sub(r'', summary) thread.summary = summary postscript = self.request.get('thread_postscript') postscript = compiled_line.sub(r'', postscript) thread.postscript = postscript new_show_in_portal = int(self.request.get('dont_show_in_portal')) if((thread.violate_photo and not new_show_in_portal) or (not thread.violate_photo and new_show_in_portal)): ApiFeed.invalidate_cache() thread.violate_photo = new_show_in_portal self.link_to_profile(thread,user) thread.adult=int(self.request.get("regulation")) #thread.hidden_in_list = int(self.request.get('hidden_in_list')) try: thread.comment_cnt = int(self.request.get('comment_cnt')) except: Alert.alert_msg_with_write(self,"コメント数は数値である必要があります。"); return True thread.search_index_version=0 #インデックス更新 thread.put() if(thread.user_id): ApiUser.invalidate_thread_count(thread.user_id) return False
def post(self): is_flash=self.request.get('mode')=="illust" or self.request.get('mode')=="illust_all"; is_english=CssDesign.is_english(self) if(self.request.get('thread_title')==""): if(is_english): self.write_status(is_flash,"Please input title"); else: self.write_status(is_flash,"スレッドタイトルを入力して下さい。"); return if(self.request.get('author')==""): if(is_english): self.write_status(is_flash,"Please input author"); else: self.write_status(is_flash,"投稿者名を入力して下さい。"); return permission_error_str="スレッドを作成する権限がありません。" if(is_english): permission_error_str="Permission denied" login_require="ログインが必要です。" if(is_english): login_require="Login require" bbs = db.get(self.request.get("bbs_key")) user = users.get_current_user() if(not user and self.request.get('mode')=="illust_all"): self.write_status(is_flash,login_require); return if(bbs.bbs_mode==BbsConst.BBS_MODE_ONLY_ADMIN): if(OwnerCheck.check(bbs,user)): self.write_status(is_flash,permission_error_str); return if(bbs.bbs_mode==BbsConst.BBS_MODE_NO_IMAGE): if(bbs.disable_create_new_thread==1): if(OwnerCheck.check(bbs,user)): self.write_status(is_flash,permission_error_str); return if(bbs.disable_create_new_thread==2): if(not user): self.write_status(is_flash,permission_error_str); return if(SpamCheck.check_all(self,self.request.get('thread_title'),self.request.get("remote_host"),user,bbs,is_flash,is_english)): return homepage_addr="" if(self.request.get('homepage_addr') and self.request.get('homepage_addr')!="http://"): homepage_addr=self.request.get('homepage_addr') overwrite_mode=False if(self.request.get("thread_key")): #上書きモード #上書きの場合 overwrite_mode=True new_thread=db.get(self.request.get("thread_key")) if(OwnerCheck.check(bbs,user)): if((not user) or (not new_thread.user_id) or new_thread.user_id!=user.user_id()): if(self.request.get("delete_key")!=new_thread.delete_key or new_thread.delete_key==""): self.write_status(is_flash,"上書きをする権限がありません。"); return; else: #新規作成の場合 new_thread = MesThread() new_thread.put() #キーの確保 new_thread.score = None new_thread.comment_cnt=0 bbs.illust_n=bbs.illust_n+1 bbs.cached_threads_num=None #キャッシュ更新リクエスト bbs.put() #上書きモードの場合は作成日を更新しない new_thread.create_date=datetime.datetime.today() #更新日は更新する new_thread.date=datetime.datetime.today() #各種設定値を書き込み new_thread.illust_mode = int(self.request.get('illust_mode')) new_thread.title = cgi.escape(self.request.get('thread_title')) if(self.request.get('mode')=="illust_all"): new_thread.summary = self.request.get('comment') else: new_thread.summary = cgi.escape(self.request.get('comment')) new_thread.bbs_key = db.Key(self.request.get('bbs_key')) new_thread.summary=EscapeComment.escape_br(new_thread.summary) new_thread.homepage_addr=homepage_addr new_thread.author=self.request.get('author') if(self.request.get("draw_time")): new_thread.draw_time=int(self.request.get("draw_time")) if(self.request.get("delete_key")): new_thread.delete_key=self.request.get("delete_key") if(self.request.get("category")): new_thread.category=self.request.get("category") CategoryList.add_new_category(bbs,new_thread.category) if(self.request.get("event_id")): new_thread.event_id=self.request.get("event_id") if(self.request.get("regulation")): new_thread.adult=int(self.request.get("regulation")) if(self.request.get("dont_show_in_portal")): new_thread.violate_photo=1 if(self.request.get("is_png")): new_thread.is_png=1 else: new_thread.is_png=0 #プロフィールにリンクするか link_to_profile=StackFeed.is_link_to_profile(self) if(link_to_profile and user): new_thread.user_id=user.user_id() #通常投稿モード(MOPER) if(self.request.get('mode')=="illust"): new_thread.image_key=db.get(self.request.get('thread_image')) new_thread.mail=self.request.get('thread_mail') compiled_line = re.compile("(http://[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)") new_thread.summary = compiled_line.sub(r'<a href=\1 TARGET="_blank">\1</a>', new_thread.summary) if(user): new_thread.user_id=user.user_id() #必ずプロフィールにマップ #一括投稿モード(新エディタ) timage=None if((self.request.get('mode')=="illust_all" or self.request.get('mode')=="illust_temp") and new_thread.illust_mode!=BbsConst.ILLUSTMODE_TEXT): timage=ThreadImage() timage.bbs_key=db.get(self.request.get("bbs_key")) if(self.request.get('mode')=="illust_temp"): try: temp_image=db.get(self.request.get("temp_illust_key")) except: temp_image=None if(not temp_image): self.write_status(is_flash,"画像データが見つかりません。") return timage.image=temp_image.image timage.thumbnail=temp_image.thumbnail else: 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"))) new_thread.is_ipad=1 else: timage.image=db.Blob(self.request.get("image")) timage.thumbnail=db.Blob(self.request.get("thumbnail")) if(len(timage.image)<=0 or len(timage.thumbnail)<=0): self.write_status(is_flash,"画像データが不正です。"); return timage.illust_mode=new_thread.illust_mode timage.is_png=new_thread.is_png timage.thumbnail2=None try: timage.put() except: if(is_english): self.write_status(is_flash,"Too big image"); else: self.write_status(is_flash,"画像の容量が大きすぎます。"); return new_thread.image_key=timage ImageFile.invalidate_cache(str(timage.key())) #url assign MappingThreadId.assign(bbs,new_thread,False) #IPアドレスを書き込み new_thread.remote_addr=self.request.remote_addr new_thread.remote_host=self.request.get("remote_host") new_thread.thumbnail2_version=0 new_thread.search_index_version=0 #put if(not SyncPut.put_sync(new_thread)): message="イラストの投稿は成功しましたが表示が遅延しています。反映まで数分お待ちください。" memcache.set(BbsConst.OBJECT_BBS_MESSAGE_HEADER+str(bbs.key()),message,BbsConst.OBJECT_BBS_MESSAGE_CACHE_TIME) #サムネイル更新 if(timage): if(new_thread.adult==0): bbs.cached_thumbnail_key=str(timage.key()) bbs.put() #新着イラストのキャッシュ無効化 RecentCommentCache.invalidate(bbs) #ステータスを出力 if(is_flash): self.write_status(is_flash,"success") else: self.redirect(str('./bbs_index?bbs_key='+self.request.get('bbs_key'))) #feed if(not link_to_profile): user=None url=self.get_thread_url(bbs,new_thread) if(not overwrite_mode): try: StackFeed.feed_new_thread(user,bbs,new_thread) except: logging.error("new thread stack feed add error") #submit thread count if(user): ApiUser.invalidate_thread_count(user.user_id()) #news ApiFeed.invalidate_cache() #Rss RssFeed.invalidate_cache(str(bbs.key()))
def get(self,bbs_key): #日本語対応 SetUtf8.set() #英語版かどうか is_english=CssDesign.is_english(self) #メンテナンス中かどうか is_maintenance=0 if(MaintenanceCheck.is_appengine_maintenance()): is_maintenance=1 #掲示板を取得 bbs=ShowBbs.get_bbs(self,bbs_key) if(bbs==None): return #掲示板削除チェック if(bbs.del_flag) : if(is_english): Alert.alert_msg_with_write(self,"This bbs was deleted.") else: Alert.alert_msg_with_write(self,"この掲示板は削除されました。") return #ページ取得 page = 1 if self.request.get("page"): try: page = int(self.request.get("page")) except: Alert.alert_msg_with_write(self,"ページ番号が異常です。") return if page<1 : page=1 #描画順を取得 order=ShowBbs.get_order(self,bbs) #カテゴリ取得 category="" if(self.request.get("category")): category=self.request.get("category") #スレッド一覧を取得 thread_query=ShowBbs.get_thread_query(bbs,category,order) #1ページのイラスト数を取得 col_num=ShowBbs.get_col_num(bbs,order) #スレッド数とスレッドを取得 count_limit=(BbsConst.PAGE_LIST_COUNT+page)*col_num #ページ番号生成用にしか使わないのでページ番号のMaxがわかれば良い if(category==""): threads_num = bbs.cached_threads_num else: threads_num = thread_query.count(limit=count_limit) all_threads = thread_query.fetch(limit=col_num, offset=(page-1)*col_num) #返信イラストを取得 all_entries = None #if(order=="thumbnail"): # all_entries=ShowBbs.get_illust_reply(bbs,page,col_num) # if(threads_num<all_entries["count"]): # threads_num=all_entries["count"] # all_entries=all_entries["entry"] #ホストURLを取得 host_url="http://"+MappingId.mapping_host(self.request.host)+"/"; #URLを作成 mapped_category=urllib.quote(category.encode('utf-8')) page_url=MappingId.get_usr_url(host_url,bbs) page_url_base=MappingId.get_usr_url(host_url,bbs)+'?order='+order+'&category='+mapped_category+'&page=' page_url_order_base=MappingId.get_usr_url(host_url,bbs)+'?page=1&category='+mapped_category+'&order=' page_url_category_base=MappingId.get_usr_url(host_url,bbs)+'?page=1&order='+order+"&category=" #ページリストを作成 page_list=PageGenerate.generate_page(page,threads_num,col_num) #ログインユーザを取得 user = users.get_current_user() logined=0 if(user): logined=1 owner=user if(OwnerCheck.check(bbs,user)): owner=None #サイドバーコメントを取得 side_comment=RecentCommentCache.get_entry(bbs) side_thread=RecentCommentCache.get_thread(bbs) #カテゴリ一覧を取得 category_list=None if(bbs.category_list): if(bbs.category_list!=""): category_list=CategoryList.get_category_list(bbs) #bbs.category_list.split(",") #ページデザインを取得 css_key=self.request.get("css_key") design=CssDesign.get_design_object(self,bbs,host_url,0) #サイドバー一覧を作成 sidebar_list=ShowBbs.get_sidebar(bbs,category_list,side_comment,side_thread) #新規スレッドを作成できるか can_create_thread=ShowBbs.get_can_create_thread(bbs,user,logined) can_create_new_image=ShowBbs.get_can_create_new_image(bbs,owner) #スレッドを全て取得 all_threads_cached=ApiObject.get_cached_object_list(all_threads) #コメントフォームを表示するか show_comment_form=1 if(bbs.comment_login_require and not(owner)): show_comment_form=0 #フルコメントデバッグ if(self.request.get("full_comment")): bbs.enable_full_comment=1 #フルフラット表示をデフォルト化 if(bbs.bbs_mode==BbsConst.BBS_MODE_NO_IMAGE): bbs.enable_full_flat=0 bbs.enable_full_comment=0 else: bbs.enable_full_flat=1 #bbs.enable_full_comment=1 #デフォルト化を止める #コメントを全て取得 #user_name="" user_name=ShowEntry.get_user_name(user) if(bbs.enable_full_comment): admin_user=OwnerCheck.is_admin(user) ShowEntry.render_comment_list(self,all_threads_cached,host_url,bbs,show_comment_form,logined,admin_user,user_name,user) #デザインの編集ができるか can_edit_design=False is_admin=OwnerCheck.is_admin(user) if(owner or (is_admin and bbs.bbs_mode==BbsConst.BBS_MODE_EVERYONE)): can_edit_design=True #infinite_scrollを使用するかどうか infinite_scroll=False #if(bbs.bbs_mode!=BbsConst.BBS_MODE_NO_IMAGE):# and design["is_iphone"]): infinite_scroll=True #infinite_scrollの2ページ目以降 contents_only=0 if(self.request.get("contents_only")=="1"): contents_only=1 #メッセージ message=memcache.get(BbsConst.OBJECT_BBS_MESSAGE_HEADER+str(bbs.key())) #カウントアップコメント if(bbs.counter): bbs.counter.new_day_update() count_up_comment=None #if(bbs.dont_count_owner): # if(owner): # count_up_comment="管理人" # else: # count_up_comment="ユーザ" #カテゴリリスト show_category_list=False if(self.request.get("show_category_list")=="1"): show_category_list=True #レンダリング template_values = { 'host': host_url, 'usrhost': MappingId.get_usr_url(host_url,bbs), 'threads': all_threads_cached, 'all_entries':all_entries, 'bbs':bbs, 'new_url': 'create_new_thread', 'page':page, 'page_url':page_url, 'page_url_base':page_url_base, 'order':order, 'page_url_order_base':page_url_order_base, 'page_list':page_list, 'user':user, 'owner': owner, 'side_comment':side_comment, 'side_thread':side_thread, 'logined':logined, 'can_create_thread':can_create_thread, 'category_list':category_list, 'page_url_category_base':page_url_category_base, 'now_category':category, 'can_create_new_image':can_create_new_image, 'template_path':design["template_path"], 'css_name':design["css_name"], 'is_iphone':design["is_iphone"], 'is_tablet':design["is_tablet"], 'template_base_color':design["template_base_color"], 'sidebar_list': sidebar_list, 'is_maintenance': is_maintenance, 'css_key': css_key, 'redirect_url': self.request.path, 'show_comment_form': show_comment_form, 'user_name': user_name, 'is_admin': is_admin, 'can_edit_design': can_edit_design, 'infinite_scroll': infinite_scroll, 'infinite_scroll_selecter': ".entry", 'contents_only': contents_only, 'message': message, 'is_english': is_english, 'count_up_comment': count_up_comment, 'show_category_list': show_category_list } path = "/html/"+design["base_name"] self.response.out.write(template_select.render(path, template_values)) if(is_maintenance): return CounterWorker.update_counter(self,bbs,None,owner)
def get(self): SetUtf8.set() try: bbs = db.get(self.request.get("bbs_key")) except: Alert.alert_msg_with_write(self,"掲示板の取得に失敗しました。") return user = users.get_current_user() if(OwnerCheck.check(bbs,user) and not OwnerCheck.is_admin(user)): Alert.alert_msg_with_write(self,"削除する権限がありません。") return user = users.get_current_user() page=1 if(self.request.get("page")): page=int(self.request.get("page")) order="new" if(self.request.get("order")): order=self.request.get("order") limit=20 offset=(page-1)*limit query=db.Query(MesThread,keys_only=True) query.filter("bbs_key =",bbs) if(order=="new"): query.order("-create_date") else: query.order("create_date") thread_key_list=query.fetch(offset=offset,limit=limit) thread_list=[] for thread_key in thread_key_list: try: thread_list.append(db.get(thread_key)) except: continue deleted_count=self.request.get("deleted_count") category_count=self.request.get("category_count") link_count=self.request.get("link_count") if(deleted_count): deleted_count=int(deleted_count) if(category_count): category_count=int(category_count) if(link_count): link_count=int(link_count) category_list=CategoryList.get_category_list(bbs) template_values = { 'host': './', 'bbs': bbs, 'user': user, 'thread_list': thread_list, 'redirect_url': self.request.path, 'page': page, 'order': order, 'deleted_count': deleted_count, 'category_count': category_count, 'link_count': link_count, 'is_iphone': CssDesign.is_iphone(self), 'is_tablet': CssDesign.is_tablet(self), 'category_list': category_list, 'is_english': CssDesign.is_english(self) } path = '/html/edit_thread_list.html' self.response.out.write(template_select.render(path, template_values))
def get(self): try: bbs=db.get(self.request.get("bbs_key")); except: bbs=None if(not bbs): Alert.alert_msg_with_write(self,"編集する掲示板が見つかりません。") return try: thread = db.get(self.request.get("thread_key")) except: thread = None try: entry = db.get(self.request.get("entry_key")) except: entry = None try: res = db.get(self.request.get("res_key")) except: res = None if(not thread and not entry and not res): Alert.alert_msg_with_write(self,"編集する対象が見つかりません。") return user = users.get_current_user() bbs_owner=not OwnerCheck.check(bbs,user) thread_owner=False if(user): if(thread): if(user.user_id()==thread.user_id): thread_owner=True if(entry): if(user.user_id()==entry.user_id): thread_owner=True if(res): if(user.user_id()==res.user_id): thread_owner=True if(not bbs_owner and not thread_owner and not OwnerCheck.is_admin(user)): Alert.alert_msg_with_write(self,"編集する権限がありません。") return summary="" postscript="" category="" if(thread): summary=thread.summary if(thread.postscript): postscript=thread.postscript summary=ReeditEscape.escape(summary); postscript=ReeditEscape.escape(postscript); category=thread.category host_url="./" design=CssDesign.get_design_object(self,bbs,host_url,1) category_list=CategoryList.get_category_list(bbs) event_list=EventList.get_event_list() template_values = { 'host': './', 'bbs': bbs, 'thread': thread, 'entry': entry, 'res': res, 'summary': summary, 'postscript': postscript, 'template_path':design["template_path"], 'css_name':design["css_name"], 'is_iphone':design["is_iphone"], 'is_tablet':design["is_tablet"], 'template_base_color':design["template_base_color"], 'user': user, 'redirect_url': self.request.path, 'edit_thread': True, 'category_list': category_list, 'event_list': event_list, 'selecting_category': category, 'res_entry_key': self.request.get("res_entry_key"), 'is_english': CssDesign.is_english(self) } path = '/html/edit_thread.html' self.response.out.write(template_select.render(path, template_values))
def get(self): celsys=0 host_url="http://"+MappingId.mapping_host(self.request.host)+"/" bbs=None try: bbs = db.get(self.request.get("bbs_key")) except: bbs=None if(bbs==None): Alert.alert_msg_with_write(self,"イラストの投稿画面のURLが変更されています。掲示板からイラストを描くボタンをクリックして下さい。") return ipad=CssDesign.is_tablet(self) iphone=CssDesign.is_iphone(self) if(not ipad and not iphone): if(self.request.get("ipad") and self.request.get("ipad")=="1"): ipad=1 thread_key=self.request.get("thread_key") entry_key=self.request.get("entry_key") category_list=CategoryList.get_category_list(bbs) event_list=EventList.get_event_list() user = users.get_current_user() logined=0 if(user): logined=1 is_reply=self.request.get("reply") wacom2=True #ipad=1 #掲示板のデザインを取得 design=CssDesign.get_design_object(self,bbs,host_url,1) #英語版かどうか is_english=CssDesign.is_english(self) #基本情報設定 template_values = { 'host': host_url, 'bbs': bbs, 'bbs_key': self.request.get("bbs_key"), 'thread_key': thread_key, 'entry_key': entry_key, 'draw_time': 0, 'canvas_width': int(self.request.get("canvas_width")), 'canvas_height': int(self.request.get("canvas_height")), 'canvas_url': self.request.get("canvas_url"), 'reply': is_reply, 'celsys': celsys, 'category_list': category_list, 'is_png': 0, 'summary': "", 'author': "", 'title': "", 'ipad': ipad, 'logined': logined, 'template_path':design["template_path"], 'css_name':design["css_name"], 'is_iphone':design["is_iphone"], 'template_base_color':design["template_base_color"], 'version': self.request.get("version"), 'wacom2': wacom2, 'selecting_category': None, 'is_english': is_english, 'event_list': event_list } #上書き時のコメントの初期値を設定 if(not self.get_thread_comment(template_values,thread_key,entry_key,is_reply)): return if(not self.get_entry_comment(template_values,entry_key)): return if(ipad or iphone): path = '/html/tools/draw_window_ipad.htm' else: path = '/html/draw_window_flash_lapper.html' self.response.out.write(template_select.render(path, template_values))