article.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. import json
  2. from datetime import datetime
  3. from django.contrib.auth.decorators import login_required
  4. from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
  5. from django.http import JsonResponse, HttpResponseRedirect
  6. from django.shortcuts import render
  7. import blog
  8. from blog import models
  9. from system.error.ServerException import ServerException
  10. @login_required(login_url='/login')
  11. def article(request):
  12. page = request.GET.get('page')
  13. search_title = request.GET.get('search_title')
  14. search_content = request.GET.get('search_content')
  15. search_category = request.GET.get('search_category')
  16. if page is None:
  17. page = 0
  18. articles = blog.controller.article.get_article(is_paginator=True, page=int(page), search_title=search_title,
  19. search_content=search_content, search_category=search_category)
  20. return render(request, 'management/article/article.html', context={'articles': articles})
  21. @login_required(login_url='/login')
  22. def draft(request):
  23. page = request.GET.get('page')
  24. search_title = request.GET.get('search_title')
  25. search_content = request.GET.get('search_content')
  26. search_category = request.GET.get('search_category')
  27. if page is None:
  28. page = 0
  29. articles = blog.controller.article.get_article(is_paginator=True, page=int(page), search_title=search_title,
  30. search_content=search_content, search_category=search_category,
  31. draft=True)
  32. return render(request, 'management/article/draft.html', context={'articles': articles})
  33. @login_required(login_url='/login')
  34. def cancel_show_index(request, pk):
  35. article = models.Article.objects.get(id=int(pk))
  36. article.is_top = False
  37. article.save()
  38. return HttpResponseRedirect('/') # 跳转到主界面
  39. def new(request):
  40. return render(request, 'management/article/new_article.html')
  41. def show_article(request, pk):
  42. article = models.Article.objects.filter(id=int(pk)).values('id', 'title', 'intro', 'category',
  43. 'user', 'created_time', 'type',
  44. 'cover__file_net_path',
  45. 'music__file_net_path', 'status',
  46. 'category__name',
  47. 'user__first_name', 'user_id',
  48. 'user__last_name', 'markdown_text', 'is_top',
  49. 'html_text').first()
  50. comments = models.Comment.objects.filter(article_id=int(pk))
  51. from blog.views import get_record_and_tags
  52. result = get_record_and_tags()
  53. return render(request, 'blog.html', context={'article': article, 'records': result['records'],
  54. 'tags': result['tags'], 'comments': comments})
  55. @login_required(login_url='/')
  56. def to_edit(request, pk):
  57. article = models.Article.objects.filter(id=int(pk)).values('id', 'title', 'intro', 'category',
  58. 'user', 'created_time', 'type',
  59. 'cover__file_net_path',
  60. 'music__file_net_path', 'status',
  61. 'category__name',
  62. 'user__first_name', 'user_id',
  63. 'user__last_name', 'markdown_text', 'html_text',
  64. 'is_top').first()
  65. tags = models.Tags.objects.raw(
  66. 'select * from blog_tags left join blog_article_tags bat on blog_tags.id = bat.tags_id where bat.article_id = {0}'.format(
  67. int(pk)))
  68. tags_str = []
  69. for tag in tags:
  70. tags_str.append(tag.name)
  71. return render(request, 'management/article/edit_article.html',
  72. context={'article': article, 'tags': ','.join(tags_str)})
  73. @login_required(login_url='/')
  74. def edit_article(request):
  75. if request.method == 'POST':
  76. title = request.POST['title']
  77. intro = request.POST['intro']
  78. category = request.POST['category']
  79. html_text = request.POST['html']
  80. markdown_text = request.POST['markdown']
  81. type_ = request.POST['type']
  82. status = request.POST['status']
  83. tags = request.POST['tags']
  84. pk = request.POST['pk']
  85. is_top = request.POST['is_top']
  86. category_obj = models.Category.objects.get(id=category)
  87. article_obj = models.Article.objects.get(id=int(pk))
  88. tags_id = []
  89. for tag in str(tags).split(','):
  90. if tag == '':
  91. break
  92. else:
  93. tag_obj = models.Tags.objects.filter(name=tag).first()
  94. if tag_obj is None:
  95. obj = models.Tags(name=tag)
  96. obj.save()
  97. tags_id.append(obj.pk)
  98. else:
  99. tags_id.append(tag_obj.pk)
  100. if len(tags_id) > 0:
  101. article_obj.tags.set(tags_id)
  102. # models.Article.objects.filter(id=int(pk)).update(title=title, intro=intro, category=category_obj,
  103. # html_text=html_text,
  104. # markdown_text=markdown_text,
  105. # type=type_, status=status,
  106. # tags=str(tags).split(',')
  107. # )
  108. article_obj.title = title
  109. article_obj.intro = intro
  110. article_obj.category = category_obj
  111. article_obj.html_text = html_text
  112. article_obj.markdown_text = markdown_text
  113. article_obj.type = type_
  114. article_obj.status = status
  115. article_obj.is_top = is_top
  116. article_obj.save()
  117. return JsonResponse({"success": True, "message": "修改成功"})
  118. else:
  119. raise ServerException("错误的请求")
  120. @login_required(login_url='/')
  121. def add_article(request):
  122. if request.method == 'POST':
  123. title = request.POST['title']
  124. intro = request.POST['intro']
  125. category = request.POST['category']
  126. html_text = request.POST['html']
  127. markdown_text = request.POST['markdown']
  128. type_ = request.POST['type']
  129. status = request.POST['status']
  130. tags = request.POST['tags']
  131. is_top = request.POST['is_top']
  132. category_obj = models.Category.objects.get(id=category)
  133. article_obj = models.Article.objects.create(title=title, intro=intro, category=category_obj,
  134. html_text=html_text,
  135. markdown_text=markdown_text,
  136. type=type_, status=status, user=request.user,
  137. created_time=datetime.now(),
  138. is_top=is_top
  139. )
  140. tags_id = []
  141. for tag in str(tags).split(','):
  142. if tag == '':
  143. break
  144. else:
  145. tag_obj = models.Tags.objects.filter(name=tag).first()
  146. if tag_obj is None:
  147. obj = models.Tags(name=tag)
  148. obj.save()
  149. tags_id.append(obj.pk)
  150. else:
  151. tags_id.append(tag_obj.pk)
  152. if len(tags_id) > 0:
  153. article_obj.tags.set(tags_id)
  154. return JsonResponse({"success": True, "message": "添加成功"})
  155. else:
  156. raise ServerException("错误的请求")
  157. @login_required(login_url='/')
  158. def add_media(request):
  159. if request.method == 'POST':
  160. title = request.POST['title']
  161. category = request.POST['category']
  162. type_ = request.POST['type']
  163. status = request.POST['status']
  164. tags = request.POST['tags']
  165. cover = request.POST['cover_id']
  166. music_id = request.POST['music_id']
  167. cover_obj = models.FileRecord.objects.get(id=cover)
  168. music_obj = models.FileRecord.objects.get(id=music_id)
  169. category_obj = models.Category.objects.get(id=category)
  170. article_obj = models.Article.objects.create(title=title, category=category_obj,
  171. type=type_, status=status, user=request.user,
  172. created_time=datetime.now(),
  173. cover=cover_obj, music=music_obj
  174. )
  175. if tags != 'null':
  176. article_obj.tags.set(str(tags).split(','))
  177. return JsonResponse({"success": True, "message": "添加成功"})
  178. else:
  179. raise ServerException("错误的请求")
  180. @login_required(login_url='/')
  181. def add_music(request):
  182. if request.method == 'POST':
  183. title = request.POST['title']
  184. category = request.POST['category']
  185. type_ = request.POST['type']
  186. status = request.POST['status']
  187. tags = request.POST['tags']
  188. cover = request.POST['cover_id']
  189. music_id = request.POST['music_id']
  190. cover_obj = models.FileRecord.objects.get(id=cover)
  191. music_obj = models.FileRecord.objects.get(id=music_id)
  192. category_obj = models.Category.objects.get(id=category)
  193. article_obj = models.Article.objects.create(title=title, category=category_obj,
  194. type=type_, status=status, user=request.user,
  195. created_time=datetime.now(),
  196. cover=cover_obj, music=music_obj
  197. )
  198. if tags != 'null':
  199. article_obj.tags.set(str(tags).split(','))
  200. return JsonResponse({"success": True, "message": "添加成功"})
  201. else:
  202. raise ServerException("错误的请求")
  203. def set_tag(articles):
  204. for i in range(len(articles)):
  205. tags = models.Tags.objects.raw(
  206. 'select * from blog_tags left join blog_article_tags bat on blog_tags.id = bat.tags_id where bat.article_id = {0}'.format(
  207. articles[i]['id']))
  208. tags_field = []
  209. for item in tags:
  210. tags_field.append(item.name)
  211. articles[i]['tags'] = tags_field
  212. def get_article(top: int = -1, page: int = -1, is_paginator: bool = False, category: models.Category = None,
  213. tag: models.Tags = None, search_category: str = None, search_title: str = None,
  214. search_content: str = None, date_record: str = None,
  215. draft: bool = False):
  216. if category is None and tag is None and date_record is None and draft == False:
  217. search_dict = dict()
  218. if search_title:
  219. search_dict['title__contains'] = search_title
  220. if search_content:
  221. search_dict['markdown_text__contains'] = search_content
  222. if search_category:
  223. search_dict['category'] = search_category
  224. articles = models.Article.objects.filter(**search_dict).order_by('-created_time').values(
  225. 'id', 'title', 'intro', 'category',
  226. 'user', 'created_time', 'type',
  227. 'cover__file_net_path',
  228. 'music__file_net_path', 'status',
  229. 'category__name',
  230. 'user__first_name', 'user_id',
  231. 'user__last_name',
  232. 'is_top', 'html_text')
  233. elif date_record is not None:
  234. date_format = "%Y-%m"
  235. date = datetime.strptime(date_record, date_format)
  236. articles = models.Article.objects.filter(created_time__year=date.year, created_time__month=date.month).order_by(
  237. '-created_time').values('id', 'title',
  238. 'intro',
  239. 'category',
  240. 'user',
  241. 'created_time',
  242. 'type',
  243. 'cover__file_net_path',
  244. 'music__file_net_path',
  245. 'status',
  246. 'category__name',
  247. 'user__first_name',
  248. 'user_id',
  249. 'user__last_name',
  250. 'is_top',
  251. 'html_text').distinct()
  252. elif tag is not None:
  253. articles = models.Article.objects.filter(tags__name=tag.name).order_by('-created_time').values('id', 'title',
  254. 'intro',
  255. 'category',
  256. 'user',
  257. 'created_time',
  258. 'type',
  259. 'cover__file_net_path',
  260. 'music__file_net_path',
  261. 'status',
  262. 'category__name',
  263. 'user__first_name',
  264. 'user_id',
  265. 'user__last_name',
  266. 'tags__name',
  267. 'is_top',
  268. 'html_text')
  269. elif draft:
  270. search_dict = dict()
  271. search_dict['status'] = 0
  272. if search_title:
  273. search_dict['title__contains'] = search_title
  274. if search_content:
  275. search_dict['markdown_text__contains'] = search_content
  276. if search_category:
  277. search_dict['category'] = search_category
  278. articles = models.Article.objects.filter(**search_dict).order_by('-created_time').values('id', 'title',
  279. 'intro',
  280. 'category',
  281. 'user',
  282. 'created_time',
  283. 'type',
  284. 'cover__file_net_path',
  285. 'music__file_net_path',
  286. 'status',
  287. 'category__name',
  288. 'user__first_name',
  289. 'user_id',
  290. 'user__last_name',
  291. 'is_top',
  292. 'html_text').distinct()
  293. else:
  294. articles = models.Article.objects.filter(category=category).order_by('-created_time').values('id', 'title',
  295. 'intro',
  296. 'category',
  297. 'user',
  298. 'created_time',
  299. 'type',
  300. 'cover__file_net_path',
  301. 'music__file_net_path',
  302. 'status',
  303. 'category__name',
  304. 'user__first_name',
  305. 'user_id',
  306. 'user__last_name',
  307. 'is_top',
  308. 'html_text')
  309. if is_paginator:
  310. if page <= 0:
  311. page = 1
  312. paginator = Paginator(articles, 15)
  313. try:
  314. articles = paginator.page(page)
  315. except PageNotAnInteger:
  316. articles = paginator.page(1)
  317. except EmptyPage:
  318. articles = paginator.page(paginator.num_pages)
  319. set_tag(articles=articles)
  320. return articles
  321. else:
  322. articles = list(articles)
  323. if top > -1:
  324. articles = articles[:top]
  325. set_tag(articles=articles)
  326. return articles
  327. # return JsonResponse({'all_article': json.loads(json.dumps(articles, default=str))})
  328. @login_required(login_url='/')
  329. def get_all_article(request):
  330. articles = models.Article.objects.order_by('-created_time').values('id', 'title',
  331. 'intro',
  332. 'category',
  333. 'user',
  334. 'created_time',
  335. 'type',
  336. 'cover__file_net_path',
  337. 'music__file_net_path',
  338. 'status',
  339. 'category__name',
  340. 'user__first_name', 'user_id',
  341. 'user__last_name')
  342. return JsonResponse(json.loads(json.dumps(list(articles), default=str)), safe=False)
  343. @login_required(login_url='/')
  344. def delete_article(request):
  345. if request.method == 'GET':
  346. id = request.GET.get("id")
  347. article = models.Article.objects.get(id=int(id))
  348. article.tags.clear()
  349. article.delete()
  350. return HttpResponseRedirect('/management/article') # 跳转到主界面
  351. else:
  352. raise ServerException("错误的请求")