posts.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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
  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. else:
  93. bpo = bpo.filter(category__engname=ctname)
  94. try:
  95. cato = BlogCategoty.objects.get(engname=ctname)
  96. stcl = cato.topli
  97. ltcl = stcl.split(',')
  98. itcl = map(lambda x:str2int(x), ltcl)
  99. toplist = BlogPost.objects.filter(id__in=itcl)
  100. except:
  101. stcl = strFastConfGet('MainTopList',default="")
  102. ltcl = stcl.split(',')
  103. itcl = map(lambda x:str2int(x), ltcl)
  104. toplist = BlogPost.objects.filter(id__in=itcl)
  105. fco = FilterCondition()
  106. fco.addTextContain("t","标题","title")
  107. fco.addTextContain("au","作者用户名","author__name")
  108. fco.addTextContain("an","作者昵称","author__nick")
  109. fco.addDateRange("ct","创建时间","crttime")
  110. fco.addDateRange("pt","发布时间","pubtime")
  111. fList = CommonFilter(request,fco,bpo)
  112. #分页功能
  113. lpg = SelfPaginator(request,fList, 20)
  114. kwvars = {
  115. "request":request,
  116. "ctname":ctname,
  117. "TopList":toplist,
  118. "lPage":lpg,
  119. "ctlist":BlogCategoty.objects.all().order_by('order'),
  120. 'FilterHTML':fco.RenderHTML(request),
  121. }
  122. return render_to_response('home/post.list.html',kwvars,RequestContext(request))
  123. @PermNeed('pichublog','Writer')
  124. def PostAdd(request):
  125. bpo = BlogPost.objects.create(
  126. title = time.strftime("[草稿]%Y-%b-%d %H:%M:%S"),
  127. author = GetUser(request),
  128. rendered = False,
  129. hidden = True,
  130. private = False,
  131. passwdlck = False,
  132. freecomment = True,
  133. )
  134. return HttpResponseRedirect(reverse('pichublog_postedit',args=(bpo.id,)))
  135. def PostPasswordForm(request,ID):
  136. kwvars = {
  137. "request":request,
  138. "ctlist":BlogCategoty.objects.all().order_by('order'),
  139. "pid":ID,
  140. }
  141. return render_to_response('home/post.pswd.form.html',kwvars,RequestContext(request))
  142. def PostView(request,ID):
  143. thisuser = GetUser(request)
  144. try:
  145. bpo = BlogPost.objects.get(id=ID)
  146. except BlogPost.DoesNotExist:
  147. kwvars = {
  148. "request":request,
  149. "ctlist":BlogCategoty.objects.all().order_by('order'),
  150. }
  151. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  152. if not bpo.rendered:
  153. kwvars = {
  154. "request":request,
  155. "ctlist":BlogCategoty.objects.all().order_by('order'),
  156. }
  157. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  158. if bpo.hidden:
  159. if not bpo.author == thisuser:
  160. if not PermCheck('pichublog','Admin'):
  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.private:
  167. if bpo.passwdlck:
  168. if request.method == "POST":
  169. if not request.POST.get('ppppppppaaaaaassssssssssssswwwwwooorrrrrdddd') == bpo.passwd:
  170. messages.error(request,u"<b>密码错误!</b>")
  171. return HttpResponseRedirect(reverse('pichublog_postpwdf',args=(bpo.id,)))
  172. else:
  173. return HttpResponseRedirect(reverse('pichublog_postpwdf',args=(bpo.id,)))
  174. else:
  175. pmh = False
  176. for hgp in thisuser.group:
  177. if hgp in bpo.readgrp:
  178. if not thisuser in bpo.readuex:
  179. pmh = True
  180. break
  181. if not pmh:
  182. if thisuser in bpo.readuin:
  183. pmh = True
  184. if not pmh:
  185. kwvars = {
  186. "request":request,
  187. "ctlist":BlogCategoty.objects.all().order_by('order'),
  188. }
  189. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  190. if bpo.freecomment:
  191. pmhc = True
  192. else:
  193. pmhc = False
  194. for hgp in thisuser.group:
  195. if hgp in bpo.commentgrp:
  196. if not thisuser in bpo.commentuex:
  197. pmhc = True
  198. break
  199. if not pmhc:
  200. if thisuser in bpo.commentuin:
  201. pmhc = True
  202. kwvars = {
  203. "request":request,
  204. "bpo":bpo,
  205. "bkmode":False,
  206. "ctlist":BlogCategoty.objects.all().order_by('order'),
  207. "crws":boolFastConfGet('CommentsReviewSwitch',default=True),
  208. "allowcmt":pmhc,
  209. }
  210. return render_to_response('home/post.view.html',kwvars,RequestContext(request))
  211. @PermNeed('pichublog','Writer')
  212. def PostPreview(request,ID):
  213. try:
  214. bpo = BlogPost.objects.get(id=ID)
  215. except BlogPost.DoesNotExist:
  216. kwvars = {
  217. "request":request,
  218. "ctlist":BlogCategoty.objects.all().order_by('order'),
  219. }
  220. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  221. if not PermCheck(request.auth,'pichublog','Admin'):
  222. if not thisuser == bpo.author:
  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. kwvars = {
  229. "request":request,
  230. "bpo":bpo,
  231. "bkmode":True,
  232. }
  233. return render_to_response('home/post.view.html',kwvars,RequestContext(request))
  234. def PostEdit(request,ID):
  235. try:
  236. bpo = BlogPost.objects.get(id=ID)
  237. except BlogPost.DoesNotExist:
  238. kwvars = {
  239. "request":request,
  240. "ctlist":BlogCategoty.objects.all().order_by('order'),
  241. "randposts":BlogPost.objects.all().order_by('?')[:5],
  242. }
  243. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  244. if request.method == "POST":
  245. form = EditPostForm(request.POST,instance=bpo)
  246. if form.is_valid():
  247. nbp = form.save(commit=False)
  248. nbp.html = renderMarkdownSafety(nbp.markdown)
  249. nbp.rendered = True
  250. nbp.save()
  251. form.save_m2m()
  252. if request.REQUEST.get("rfm") == "w":
  253. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  254. else:
  255. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  256. else:
  257. form = EditPostForm(instance=bpo)
  258. kwvars = {
  259. "request":request,
  260. 'form':form,
  261. 'rfm':request.REQUEST.get("rfm"),
  262. }
  263. return render_to_response('home/post.edit.html',kwvars,RequestContext(request))
  264. def PostGrant(request,ID):
  265. try:
  266. bpo = BlogPost.objects.get(id=ID)
  267. except BlogPost.DoesNotExist:
  268. kwvars = {
  269. "request":request,
  270. "ctlist":BlogCategoty.objects.all().order_by('order'),
  271. "randposts":BlogPost.objects.all().order_by('?')[:5],
  272. }
  273. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  274. if request.method == "POST":
  275. form = PostPermForm(request.POST,instance=bpo)
  276. if form.is_valid():
  277. form.save()
  278. if request.REQUEST.get("rfm") == "w":
  279. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  280. else:
  281. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  282. else:
  283. form = PostPermForm(instance=bpo)
  284. kwvars = {
  285. "request":request,
  286. 'form':form,
  287. 'rfm':request.REQUEST.get("rfm"),
  288. }
  289. return render_to_response('home/post.grant.html',kwvars,RequestContext(request))
  290. def PostHidden(request,ID):
  291. try:
  292. bpo = BlogPost.objects.get(id=ID)
  293. except BlogPost.DoesNotExist:
  294. kwvars = {
  295. "request":request,
  296. "ctlist":BlogCategoty.objects.all().order_by('order'),
  297. "randposts":BlogPost.objects.all().order_by('?')[:5],
  298. }
  299. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  300. if not "val" in request.GET.keys():
  301. return HttpResponse("Err Request Arguments")
  302. bset = (request.GET['val']=="true")
  303. bpo.hidden = bset
  304. bpo.save()
  305. if request.REQUEST.get("rfm") == "w":
  306. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  307. else:
  308. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  309. def PostDel(request,ID):
  310. try:
  311. bpo = BlogPost.objects.get(id=ID)
  312. except BlogPost.DoesNotExist:
  313. kwvars = {
  314. "request":request,
  315. "ctlist":BlogCategoty.objects.all().order_by('order'),
  316. "randposts":BlogPost.objects.all().order_by('?')[:5],
  317. }
  318. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  319. if request.GET.get('veryfycode') == unicode(hash(bpo.title)):
  320. bpo.delete()
  321. else:
  322. messages.error(request,"<b>删除失败:</b>请求参数校验不成功,为了安全起见,该删除请求被服务器拒绝。")
  323. if request.REQUEST.get("rfm") == "w":
  324. return HttpResponseRedirect(reverse('pichublog_postwbklist'))
  325. else:
  326. return HttpResponseRedirect(reverse('pichublog_postabklist'))
  327. def AjaxShowComments(request,ID):
  328. try:
  329. bpo = BlogPost.objects.get(id=ID)
  330. except BlogPost.DoesNotExist:
  331. kwvars = {
  332. "request":request,
  333. "ctlist":BlogCategoty.objects.all().order_by('order'),
  334. }
  335. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  336. thisuser = GetUser(request)
  337. owner = PermCheck(request.auth,'pichublog','Admin')
  338. if not owner:
  339. if bpo.author == thisuser:
  340. owner = True
  341. if owner:
  342. cmt = BlogComment.objects.filter(post=bpo).order_by('-time')
  343. else:
  344. cmt = BlogComment.objects.filter(post=bpo,reviewed=True).order_by('-time')
  345. lPage = SelfPaginator(request,cmt,20)
  346. kwvars = {
  347. 'request':request,
  348. 'owner':owner,
  349. 'lPage':lPage,
  350. 'AjaxPaginatorID':'cmt',
  351. }
  352. return render_to_response('home/ajax.comment.html',kwvars,RequestContext(request))
  353. def AddComments(request,ID):
  354. try:
  355. bpo = BlogPost.objects.get(id=ID)
  356. except BlogPost.DoesNotExist:
  357. kwvars = {
  358. "request":request,
  359. "ctlist":BlogCategoty.objects.all().order_by('order'),
  360. }
  361. return render_to_response('home/post.err.html',kwvars,RequestContext(request))
  362. if bpo.freecomment:
  363. pmhc = True
  364. else:
  365. pmhc = False
  366. for hgp in thisuser.group:
  367. if hgp in bpo.commentgrp:
  368. if not thisuser in bpo.commentuex:
  369. pmhc = True
  370. break
  371. if not pmhc:
  372. if thisuser in bpo.commentuin:
  373. pmhc = True
  374. if not pmhc:
  375. messages.error(request,u"<b>作者只允许指定身份的人评论本文,您不在此列。</b>")
  376. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  377. if request.method == "POST":
  378. if request.auth.islogin:
  379. chkpr=CheckPOST(['content'],request.POST.keys())
  380. if not chkpr == "" :
  381. return JsonResponse({"code":400,"msg":"Error Args."})
  382. else:
  383. chkpr=CheckPOST(['content','nick','website','mail','title'],request.POST.keys())
  384. if not chkpr == "" :
  385. return JsonResponse({"code":400,"msg":"Error Args."})
  386. if request.auth.islogin:
  387. content = request.POST.get('content')
  388. stk = request.auth.cookie.get('zl2_token')
  389. BlogComment.objects.create(post=bpo,cmid=BigIntUniqueID(),anonymou=False,stoken=stk,fromuser=request.auth.user,content=content,reviewed=True)
  390. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  391. else:
  392. capt = request.POST.get('captcha')
  393. if not CheckCaptcha(request,capt):
  394. messages.error(request,u"<b>验证码错误</b>")
  395. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  396. content = request.POST.get('content')
  397. nick = request.POST.get('nick')
  398. mail = request.POST.get('mail')
  399. web = request.POST.get('website')
  400. stk = request.auth.cookie.get('zl2_token')
  401. rws = not boolFastConfGet('CommentsReviewSwitch',default=True)
  402. LeaveMsg.objects.create(post=bpo,cmid=BigIntUniqueID(),anonymou=True,stoken=stk,fromuser=nick,mail=mail,website=web,content=content,reviewed=rws)
  403. return HttpResponseRedirect(reverse('pichublog_postview',args=(ID,)))
  404. else:
  405. return HttpResponse("405 Method Not Allowed")