posts.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. # -*- coding: UTF-8 -*-
  2. from django.http import HttpResponse,HttpResponseRedirect
  3. from django.conf import settings
  4. from django.shortcuts import render_to_response,RequestContext
  5. #from django_hosts.resolvers import reverse
  6. #from django.core.cache import get_cache
  7. from django.conf import settings
  8. from django.views.decorators.csrf import csrf_exempt
  9. from django.core.urlresolvers import reverse
  10. from django.contrib import messages
  11. from siteutil.DataConvert import str2int,CheckPOST,str2long,BigIntUniqueID,MakeSummary,TIIHASH
  12. from siteutil.CommonPaginator import SelfPaginator
  13. from siteutil.CommonFilter import CommonFilter,FilterCondition
  14. #from siteutil.htmlutil import renderPichuMarkDown as renderMarkdownSafety
  15. from siteutil.redisconf import RedisConfigHandler
  16. from siteutil.InabaR.renderer import BlogRender,getver
  17. from zlogin.common.JsonResponse import JsonResponse
  18. from zlogin.decorators import login_detect,login_required,PermNeed
  19. from zlogin import zlauth
  20. from zlogin.zlauth import GetUser,PermCheck
  21. from zlogin.captcha_app import CheckCaptcha,OutsiteCaptchaURL
  22. from pichublog.models import KVConf,BlogCategoty,BlogPost,BlogComment,LeaveMsg
  23. from pichublog.forms import BlogCategotyForm,EditPostForm,PostPermForm
  24. import time
  25. #cache = get_cache("pichublog")
  26. def strFastConfGet(key,default=""):
  27. r = RedisConfigHandler(settings.CFG_REDIS,"pichublog")
  28. return r.get_or_set(key,default)
  29. def boolFastConfGet(key,default=False):
  30. r = RedisConfigHandler(settings.CFG_REDIS,"pichublog")
  31. return r.get_or_set_bool(key,default)
  32. @PermNeed('pichublog','Admin')
  33. def PostABkList(request):
  34. bpo = BlogPost.objects.all()
  35. ctids = []
  36. ctals = []
  37. for i in BlogCategoty.objects.all().order_by('order'):
  38. ctids.append(i.id)
  39. ctals.append(i.title)
  40. fco = FilterCondition()
  41. fco.addTextContain("t","标题","title")
  42. fco.addTextContain("au","作者","author__name")
  43. fco.addDateRange("ct","创建时间","crttime")
  44. fco.addDateRange("pt","发布时间","pubtime")
  45. fco.addSingleChoice("hid","隐藏","hidden",[True,False],alias=["真","假"])
  46. fco.addSingleChoice("prv","私密","private",[True,False],alias=["真","假"])
  47. fco.addSingleChoice("fc","自由评论","freecomment",[True,False],alias=["真","假"])
  48. fco.addMultiChoice("cat","分类","category_id",ctids,alias=ctals)
  49. fList = CommonFilter(request,fco,bpo)
  50. #分页功能
  51. lpg = SelfPaginator(request,fList, 20)
  52. kwvars = {
  53. "request":request,
  54. "lPage":lpg,
  55. 'FilterHTML':fco.RenderHTML(request),
  56. "adminmode":True,
  57. }
  58. return render_to_response('home/post.bk.list.html',kwvars,RequestContext(request))
  59. @PermNeed('pichublog','Writer')
  60. def PostWBkList(request):
  61. bpo = BlogPost.objects.all()
  62. mList = bpo.filter(author=GetUser(request))
  63. ctids = []
  64. ctals = []
  65. for i in BlogCategoty.objects.all().order_by('order'):
  66. ctids.append(i.id)
  67. ctals.append(i.title)
  68. fco = FilterCondition()
  69. fco.addTextContain("t","标题","title")
  70. fco.addDateRange("ct","创建时间","crttime")
  71. fco.addDateRange("pt","发布时间","pubtime")
  72. fco.addSingleChoice("hid","隐藏","hidden",[True,False],alias=["真","假"])
  73. fco.addSingleChoice("prv","私密","private",[True,False],alias=["真","假"])
  74. fco.addSingleChoice("fc","自由评论","freecomment",[True,False],alias=["真","假"])
  75. fco.addMultiChoice("cat","分类","category_id",ctids,alias=ctals)
  76. fList = CommonFilter(request,fco,mList)
  77. #分页功能
  78. lpg = SelfPaginator(request,fList, 20)
  79. kwvars = {
  80. "request":request,
  81. "lPage":lpg,
  82. 'FilterHTML':fco.RenderHTML(request),
  83. "adminmode":False,
  84. }
  85. return render_to_response('home/post.bk.list.html',kwvars,RequestContext(request))
  86. def PostList(request,ctname):
  87. bpo = BlogPost.objects.all().filter(rendered=True,hidden=False)
  88. if ctname == "*":
  89. stcl = strFastConfGet('MainTopList',default="")
  90. ltcl = stcl.split(',')
  91. itcl = map(lambda x:str2int(x), ltcl)
  92. toplist = BlogPost.objects.filter(id__in=itcl)
  93. cttitle = "*"
  94. else:
  95. bpo = bpo.filter(category__engname=ctname)
  96. try:
  97. cto = BlogCategoty.objects.get(engname=ctname)
  98. cttitle = cto.title
  99. except:
  100. cttitle = "?"
  101. try:
  102. cato = BlogCategoty.objects.get(engname=ctname)
  103. stcl = cato.topli
  104. ltcl = stcl.split(',')
  105. itcl = map(lambda x:str2int(x), ltcl)
  106. toplist = BlogPost.objects.filter(id__in=itcl)
  107. except:
  108. stcl = strFastConfGet('MainTopList',default="")
  109. ltcl = stcl.split(',')
  110. itcl = map(lambda x:str2int(x), ltcl)
  111. toplist = BlogPost.objects.filter(id__in=itcl)
  112. fco = FilterCondition()
  113. fco.addTextContain("t","标题","title")
  114. fco.addTextContain("au","作者用户名","author__name")
  115. fco.addTextContain("an","作者昵称","author__nick")
  116. fco.addDateRange("ct","创建时间","crttime")
  117. fco.addDateRange("pt","发布时间","pubtime")
  118. fList = CommonFilter(request,fco,bpo)
  119. #分页功能
  120. lpg = SelfPaginator(request,fList, 20)
  121. kwvars = {
  122. "request":request,
  123. "ctname":ctname,
  124. "cttitle":cttitle,
  125. "TopList":toplist,
  126. "lPage":lpg,
  127. "ctlist":BlogCategoty.objects.all().order_by('order'),
  128. 'FilterHTML':fco.RenderHTML(request),
  129. }
  130. return render_to_response('home/post.list.html',kwvars,RequestContext(request))
  131. @PermNeed('pichublog','Writer')
  132. def PostAdd(request):
  133. bpo = BlogPost.objects.create(
  134. title = time.strftime("[草稿]%Y-%b-%d %H:%M:%S"),
  135. author = GetUser(request),
  136. rendered = False,
  137. hidden = True,
  138. private = False,
  139. passwdlck = False,
  140. freecomment = True,
  141. )
  142. return HttpResponseRedirect(reverse('pichublog_postedit',args=(bpo.id,)))
  143. def PostPasswordForm(request,ID):
  144. kwvars = {
  145. "request":request,
  146. "ctlist":BlogCategoty.objects.all().order_by('order'),
  147. "pid":ID,
  148. }
  149. return render_to_response('home/post.pswd.form.html',kwvars,RequestContext(request))
  150. def PostView(request,ID):
  151. thisuser = GetUser(request)
  152. try:
  153. bpo = BlogPost.objects.get(id=ID)
  154. except BlogPost.DoesNotExist:
  155. kwvars = {
  156. "request":request,
  157. "ctlist":BlogCategoty.objects.all().order_by('order'),
  158. }
  159. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  160. if not bpo.rendered:
  161. kwvars = {
  162. "request":request,
  163. "ctlist":BlogCategoty.objects.all().order_by('order'),
  164. }
  165. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  166. if bpo.hidden:
  167. if not bpo.author == thisuser:
  168. if not PermCheck(request.auth,'pichublog','Admin'):
  169. kwvars = {
  170. "request":request,
  171. "ctlist":BlogCategoty.objects.all().order_by('order'),
  172. }
  173. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  174. if bpo.private:
  175. if bpo.passwdlck:
  176. if request.method == "POST":
  177. if not request.POST.get('ppppppppaaaaaassssssssssssswwwwwooorrrrrdddd') == bpo.passwd:
  178. messages.error(request,u"<b>密码错误!</b>")
  179. return HttpResponseRedirect(reverse('pichublog_postpwdf',args=(bpo.id,)))
  180. else:
  181. return HttpResponseRedirect(reverse('pichublog_postpwdf',args=(bpo.id,)))
  182. else:
  183. pmh = False
  184. for hgp in thisuser.group:
  185. if hgp in bpo.readgrp:
  186. if not thisuser in bpo.readuex:
  187. pmh = True
  188. break
  189. if not pmh:
  190. if thisuser in bpo.readuin:
  191. pmh = True
  192. if not pmh:
  193. kwvars = {
  194. "request":request,
  195. "ctlist":BlogCategoty.objects.all().order_by('order'),
  196. }
  197. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  198. if bpo.freecomment:
  199. pmhc = True
  200. else:
  201. pmhc = False
  202. for hgp in thisuser.group:
  203. if hgp in bpo.commentgrp:
  204. if not thisuser in bpo.commentuex:
  205. pmhc = True
  206. break
  207. if not pmhc:
  208. if thisuser in bpo.commentuin:
  209. pmhc = True
  210. kwvars = {
  211. "request":request,
  212. "bpo":bpo,
  213. "bkmode":False,
  214. "OutsiteCaptchaURL":OutsiteCaptchaURL(request),
  215. "ctlist":BlogCategoty.objects.all().order_by('order'),
  216. "crws":boolFastConfGet('CommentsReviewSwitch',default=True),
  217. "allowcmt":pmhc,
  218. }
  219. return render_to_response('home/post.view.html',kwvars,RequestContext(request))
  220. @PermNeed('pichublog','Writer')
  221. def PostPreview(request,ID):
  222. try:
  223. bpo = BlogPost.objects.get(id=ID)
  224. except BlogPost.DoesNotExist:
  225. kwvars = {
  226. "request":request,
  227. "ctlist":BlogCategoty.objects.all().order_by('order'),
  228. }
  229. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  230. if not PermCheck(request.auth,'pichublog','Admin'):
  231. if not thisuser == bpo.author:
  232. kwvars = {
  233. "request":request,
  234. "ctlist":BlogCategoty.objects.all().order_by('order'),
  235. }
  236. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  237. kwvars = {
  238. "request":request,
  239. "bpo":bpo,
  240. "bkmode":True,
  241. }
  242. return render_to_response('home/post.view.html',kwvars,RequestContext(request))
  243. @PermNeed('pichublog','Admin')
  244. def PostEdit(request,ID):
  245. try:
  246. bpo = BlogPost.objects.get(id=ID)
  247. except BlogPost.DoesNotExist:
  248. kwvars = {
  249. "request":request,
  250. "ctlist":BlogCategoty.objects.all().order_by('order'),
  251. "randposts":BlogPost.objects.all().order_by('?')[:5],
  252. }
  253. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  254. if request.method == "POST":
  255. form = EditPostForm(request.POST,instance=bpo)
  256. if form.is_valid():
  257. nbp = form.save(commit=False)
  258. #nbp.html = renderMarkdownSafety(nbp.markdown)
  259. nbp.html = BlogRender(nbp.markdown,html=False,traceback=False)
  260. nbp.rendered = True
  261. nbp.save()
  262. form.save_m2m()
  263. if request.REQUEST.get("rfm") == "w":
  264. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  265. else:
  266. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  267. else:
  268. form = EditPostForm(instance=bpo)
  269. ver = getver()
  270. kwvars = {
  271. "request":request,
  272. 'form':form,
  273. 'rnginver':ver[0],
  274. 'zumdownver':ver[1],
  275. 'rfm':request.REQUEST.get("rfm"),
  276. }
  277. return render_to_response('home/post.edit.html',kwvars,RequestContext(request))
  278. @PermNeed('pichublog','Admin')
  279. def PostGrant(request,ID):
  280. try:
  281. bpo = BlogPost.objects.get(id=ID)
  282. except BlogPost.DoesNotExist:
  283. kwvars = {
  284. "request":request,
  285. "ctlist":BlogCategoty.objects.all().order_by('order'),
  286. "randposts":BlogPost.objects.all().order_by('?')[:5],
  287. }
  288. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  289. if request.method == "POST":
  290. form = PostPermForm(request.POST,instance=bpo)
  291. if form.is_valid():
  292. form.save()
  293. if request.REQUEST.get("rfm") == "w":
  294. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  295. else:
  296. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  297. else:
  298. form = PostPermForm(instance=bpo)
  299. kwvars = {
  300. "request":request,
  301. 'form':form,
  302. 'rfm':request.REQUEST.get("rfm"),
  303. }
  304. return render_to_response('home/post.grant.html',kwvars,RequestContext(request))
  305. @PermNeed('pichublog','Admin')
  306. def PostHidden(request,ID):
  307. try:
  308. bpo = BlogPost.objects.get(id=ID)
  309. except BlogPost.DoesNotExist:
  310. kwvars = {
  311. "request":request,
  312. "ctlist":BlogCategoty.objects.all().order_by('order'),
  313. "randposts":BlogPost.objects.all().order_by('?')[:5],
  314. }
  315. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  316. if not "val" in request.GET.keys():
  317. return HttpResponse("Err Request Arguments")
  318. bset = (request.GET['val']=="true")
  319. bpo.hidden = bset
  320. bpo.save()
  321. if request.REQUEST.get("rfm") == "w":
  322. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  323. else:
  324. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  325. @PermNeed('pichublog','Admin')
  326. def PostDel(request,ID):
  327. try:
  328. bpo = BlogPost.objects.get(id=ID)
  329. except BlogPost.DoesNotExist:
  330. kwvars = {
  331. "request":request,
  332. "ctlist":BlogCategoty.objects.all().order_by('order'),
  333. "randposts":BlogPost.objects.all().order_by('?')[:5],
  334. }
  335. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  336. if request.GET.get('veryfycode') == unicode(hash(bpo.title)):
  337. bpo.delete()
  338. else:
  339. messages.error(request,"<b>删除失败:</b>请求参数校验不成功,为了安全起见,该删除请求被服务器拒绝。")
  340. if request.REQUEST.get("rfm") == "w":
  341. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  342. else:
  343. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  344. def AjaxShowComments(request,ID):
  345. try:
  346. bpo = BlogPost.objects.get(id=ID)
  347. except BlogPost.DoesNotExist:
  348. kwvars = {
  349. "request":request,
  350. "ctlist":BlogCategoty.objects.all().order_by('order'),
  351. }
  352. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  353. thisuser = GetUser(request)
  354. owner = PermCheck(request.auth,'pichublog','Admin')
  355. if not owner:
  356. if bpo.author == thisuser:
  357. owner = True
  358. if owner:
  359. cmt = BlogComment.objects.filter(post=bpo).order_by('-time')
  360. else:
  361. cmt = BlogComment.objects.filter(post=bpo,reviewed=True).order_by('-time')
  362. lPage = SelfPaginator(request,cmt,20)
  363. kwvars = {
  364. 'request':request,
  365. 'owner':owner,
  366. 'lPage':lPage,
  367. 'AjaxPaginatorID':'cmt',
  368. }
  369. return render_to_response('home/ajax.comment.html',kwvars,RequestContext(request))
  370. @PermNeed('pichublog','Admin')
  371. def DelComments(request,cmid):
  372. try:
  373. lmo = BlogComment.objects.get(cmid=cmid)
  374. except BlogComment.DoesNotExist:
  375. return JsonResponse({"stat":"err","type":"DoesNotExist"})
  376. if request.GET.get('veryfycode') == TIIHASH(lmo.fromuser,lmo.fromuser):
  377. lmo.delete()
  378. else:
  379. return JsonResponse({"stat":"err","type":"VerificationError"})
  380. return JsonResponse({"stat":"ok","type":"OK"})
  381. @PermNeed('pichublog','Admin')
  382. def SetCommentsReview(request,cmid):
  383. try:
  384. lmo = BlogComment.objects.get(cmid=cmid)
  385. except BlogComment.DoesNotExist:
  386. return JsonResponse({"stat":"err","type":"DoesNotExist"})
  387. logic = request.GET.get('val')
  388. bl = (logic == "true")
  389. lmo.reviewed = bl
  390. lmo.save()
  391. return JsonResponse({"stat":"ok","type":"OK"})
  392. def AddComments(request,ID):
  393. try:
  394. bpo = BlogPost.objects.get(id=ID)
  395. except BlogPost.DoesNotExist:
  396. kwvars = {
  397. "request":request,
  398. "ctlist":BlogCategoty.objects.all().order_by('order'),
  399. }
  400. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  401. if bpo.freecomment:
  402. pmhc = True
  403. else:
  404. pmhc = False
  405. for hgp in thisuser.group:
  406. if hgp in bpo.commentgrp:
  407. if not thisuser in bpo.commentuex:
  408. pmhc = True
  409. break
  410. if not pmhc:
  411. if thisuser in bpo.commentuin:
  412. pmhc = True
  413. if not pmhc:
  414. messages.error(request,u"<b>作者只允许指定身份的人评论本文,您不在此列。</b>")
  415. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  416. if request.method == "POST":
  417. if request.auth.islogin:
  418. chkpr=CheckPOST(['content'],request.POST.keys())
  419. if not chkpr == "" :
  420. return JsonResponse({"code":400,"msg":"Error Args."})
  421. else:
  422. chkpr=CheckPOST(['content','nick','website','mail','title'],request.POST.keys())
  423. if not chkpr == "" :
  424. return JsonResponse({"code":400,"msg":"Error Args."})
  425. if request.auth.islogin:
  426. content = request.POST.get('content')
  427. stk = request.auth.cookie.get('zl2_token')
  428. BlogComment.objects.create(post=bpo,cmid=BigIntUniqueID(),anonymou=False,stoken=stk,fromuser=request.auth.user,content=content,reviewed=True)
  429. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  430. else:
  431. capt = request.POST.get('captcha')
  432. if not CheckCaptcha(request,capt):
  433. messages.error(request,u"<b>验证码错误</b>")
  434. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  435. content = request.POST.get('content')
  436. nick = request.POST.get('nick')
  437. mail = request.POST.get('mail')
  438. web = request.POST.get('website')
  439. stk = request.auth.cookie.get('zl2_token')
  440. rws = not boolFastConfGet('CommentsReviewSwitch',default=True)
  441. LeaveMsg.objects.create(post=bpo,cmid=BigIntUniqueID(),anonymou=True,stoken=stk,fromuser=nick,mail=mail,website=web,content=content,reviewed=rws)
  442. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  443. else:
  444. return HttpResponse("405 Method Not Allowed")