posts.py 15 KB

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