posts.py 12 KB

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