/iv2ex/backstage.py

https://github.com/hitigon/woosuko · Python · 1036 lines · 982 code · 18 blank · 36 comment · 241 complexity · 810efa4939cb6966e51b97f15edd0e12 MD5 · raw file

  1. #coding=utf-8
  2. '''
  3. Created on 11-9-13
  4. @author: qiaoshun8888
  5. '''
  6. import os
  7. import random
  8. import re
  9. import datetime
  10. import Image
  11. from django.http import HttpResponseRedirect
  12. from django.shortcuts import render_to_response
  13. import time
  14. import sys
  15. import math
  16. import config
  17. from iv2ex import SYSTEM_VERSION
  18. from iv2ex.models import Counter, Section, Member, Minisite, Node, Page, Topic, Reply, Notification
  19. import settings
  20. from v2ex.babel.da import GetSite, GetKindByName, GetKindByNum
  21. from v2ex.babel.l10n import GetMessages, GetLanguageSelect, GetSupportedLanguages
  22. from v2ex.babel.security import CheckAuth
  23. from v2ex.babel.ua import detect
  24. from django.core.cache import cache as memcache
  25. def BackstageHomeHandler(request):
  26. if request.method == 'GET':
  27. site = GetSite()
  28. browser = detect(request)
  29. member = CheckAuth(request)
  30. l10n = GetMessages(member, site)
  31. template_values = {}
  32. template_values['l10n'] = l10n
  33. template_values['site'] = site
  34. template_values['rnd'] = random.randrange(1, 100)
  35. template_values['system_version'] = SYSTEM_VERSION
  36. template_values['member'] = member
  37. template_values['page_title'] = site.title + u' › ' + l10n.backstage.decode('utf-8')
  38. member_total = memcache.get('member_total')
  39. if member_total is None:
  40. q3 = Counter.objects.filter(name='member.total')
  41. if (len(q3) > 0):
  42. member_total = q3[0].value
  43. else:
  44. member_total = 0
  45. memcache.set('member_total', member_total, 600)
  46. template_values['member_total'] = member_total
  47. topic_total = memcache.get('topic_total')
  48. if topic_total is None:
  49. q4 = Counter.objects.filter(name='topic.total')
  50. if (len(q4) > 0):
  51. topic_total = q4[0].value
  52. else:
  53. topic_total = 0
  54. memcache.set('topic_total', topic_total, 600)
  55. template_values['topic_total'] = topic_total
  56. reply_total = memcache.get('reply_total')
  57. if reply_total is None:
  58. q5 = Counter.objects.filter(name='reply.total')
  59. if (len(q5) > 0):
  60. reply_total = q5[0].value
  61. else:
  62. reply_total = 0
  63. memcache.set('reply_total', reply_total, 600)
  64. template_values['reply_total'] = reply_total
  65. if (member):
  66. if (member.level == 0):
  67. q = Section.objects.filter().order_by('-nodes')
  68. template_values['sections'] = q
  69. q2 = Member.objects.filter().order_by('-created')[:5]
  70. template_values['latest_members'] = q2
  71. q3 = Minisite.objects.filter().order_by('-created')
  72. template_values['minisites'] = q3
  73. q4 = Node.objects.filter().order_by('-last_modified')[:8]
  74. template_values['latest_nodes'] = q4
  75. if browser['ios']:
  76. path = os.path.join('mobile', 'backstage_home.html')
  77. else:
  78. path = os.path.join('desktop', 'backstage_home.html')
  79. return render_to_response(path, template_values)
  80. else:
  81. return HttpResponseRedirect('/')
  82. else:
  83. return HttpResponseRedirect('/signin')
  84. def BackstageNewMinisiteHandler(request):
  85. if request.method == 'GET':
  86. site = GetSite()
  87. template_values = {}
  88. template_values['site'] = site
  89. template_values['page_title'] = site.title + u' › 添加新站点'
  90. template_values['system_version'] = SYSTEM_VERSION
  91. member = CheckAuth(request)
  92. template_values['member'] = member
  93. l10n = GetMessages(member, site)
  94. template_values['l10n'] = l10n
  95. if (member):
  96. if (member.level == 0):
  97. path = os.path.join('desktop', 'backstage_new_minisite.html')
  98. return render_to_response(path, template_values)
  99. else:
  100. return HttpResponseRedirect('/')
  101. else:
  102. return HttpResponseRedirect('/signin')
  103. else:
  104. site = GetSite()
  105. template_values = {}
  106. template_values['site'] = site
  107. template_values['page_title'] = site.title + u' › 添加新站点'
  108. template_values['system_version'] = SYSTEM_VERSION
  109. member = CheckAuth(request)
  110. template_values['member'] = member
  111. l10n = GetMessages(member, site)
  112. template_values['l10n'] = l10n
  113. if (member):
  114. if (member.level == 0):
  115. errors = 0
  116. # Verification: name
  117. minisite_name_error = 0
  118. minisite_name_error_messages = ['',
  119. u'请输入站点名',
  120. u'站点名长度不能超过 32 个字符',
  121. u'站点名只能由 a-Z 0-9 及 - 和 _ 组成',
  122. u'抱歉这个站点名已经存在了']
  123. minisite_name = request.POST['name'].strip().lower()
  124. if (len(minisite_name) == 0):
  125. errors = errors + 1
  126. minisite_name_error = 1
  127. else:
  128. if (len(minisite_name) > 32):
  129. errors = errors + 1
  130. minisite_name_error = 2
  131. else:
  132. if (re.search('^[a-zA-Z0-9\-\_]+$', minisite_name)):
  133. q = Minisite.objects.filter(name=minisite_name.lower())
  134. if (len(q) > 0):
  135. errors = errors + 1
  136. minisite_name_error = 4
  137. else:
  138. errors = errors + 1
  139. minisite_name_error = 3
  140. template_values['minisite_name'] = minisite_name
  141. template_values['minisite_name_error'] = minisite_name_error
  142. template_values['minisite_name_error_message'] = minisite_name_error_messages[minisite_name_error]
  143. # Verification: title
  144. minisite_title_error = 0
  145. minisite_title_error_messages = ['',
  146. u'请输入站点标题',
  147. u'站点标题长度不能超过 32 个字符'
  148. ]
  149. minisite_title = request.POST['title'].strip()
  150. if (len(minisite_title) == 0):
  151. errors = errors + 1
  152. minisite_title_error = 1
  153. else:
  154. if (len(minisite_title) > 32):
  155. errors = errors + 1
  156. minisite_title_error = 2
  157. template_values['minisite_title'] = minisite_title
  158. template_values['minisite_title_error'] = minisite_title_error
  159. template_values['minisite_title_error_message'] = minisite_title_error_messages[minisite_title_error]
  160. # Verification: description
  161. minisite_description_error = 0
  162. minisite_description_error_messages = ['',
  163. u'请输入站点描述',
  164. u'站点描述长度不能超过 2000 个字符'
  165. ]
  166. minisite_description = request.POST['description'].strip()
  167. if (len(minisite_description) == 0):
  168. errors = errors + 1
  169. minisite_description_error = 1
  170. else:
  171. if (len(minisite_description) > 2000):
  172. errors = errors + 1
  173. minisite_description_error = 2
  174. template_values['minisite_description'] = minisite_description
  175. template_values['minisite_description_error'] = minisite_description_error
  176. template_values['minisite_description_error_message'] = minisite_description_error_messages[minisite_description_error]
  177. template_values['errors'] = errors
  178. if (errors == 0):
  179. minisite = Minisite()
  180. q = Counter.objects.filter(name='minisite.max')
  181. if (len(q) == 1):
  182. counter = q[0]
  183. counter.value = counter.value + 1
  184. else:
  185. counter = Counter()
  186. counter.name = 'minisite.max'
  187. counter.value = 1
  188. minisite.num = counter.value
  189. minisite.name = minisite_name
  190. minisite.title = minisite_title
  191. minisite.description = minisite_description
  192. minisite.save()
  193. counter.save()
  194. return HttpResponseRedirect('/backstage')
  195. else:
  196. path = os.path.join('desktop', 'backstage_new_minisite.html')
  197. return render_to_response(path, template_values)
  198. else:
  199. return HttpResponseRedirect('/')
  200. else:
  201. return HttpResponseRedirect('/signin')
  202. def BackstageMinisiteHandler(request, minisite_name):
  203. if request.method == 'GET':
  204. site = GetSite()
  205. template_values = {}
  206. template_values['site'] = site
  207. template_values['page_title'] = site.title + u' › Minisite'
  208. template_values['system_version'] = SYSTEM_VERSION
  209. member = CheckAuth(request)
  210. template_values['member'] = member
  211. l10n = GetMessages(member, site)
  212. template_values['l10n'] = l10n
  213. if (member):
  214. if (member.level == 0):
  215. minisite = GetKindByName('Minisite', minisite_name)
  216. if minisite is not False:
  217. template_values['minisite'] = minisite
  218. template_values['page_title'] = site.title + u' › ' + minisite.title
  219. q = Page.objects.filter(minisite=minisite).order_by('weight')
  220. template_values['pages'] = q
  221. path = os.path.join('desktop', 'backstage_minisite.html')
  222. return render_to_response(path, template_values)
  223. else:
  224. return HttpResponseRedirect('/backstage')
  225. else:
  226. return HttpResponseRedirect('/')
  227. else:
  228. return HttpResponseRedirect('/signin')
  229. def BackstageNewPageHandler(request, minisite_name):
  230. if request.method == 'GET':
  231. site = GetSite()
  232. template_values = {}
  233. template_values['site'] = site
  234. template_values['system_version'] = SYSTEM_VERSION
  235. member = CheckAuth(request)
  236. template_values['member'] = member
  237. l10n = GetMessages(member, site)
  238. template_values['l10n'] = l10n
  239. if (member):
  240. if (member.level == 0):
  241. minisite = GetKindByName('Minisite', minisite_name)
  242. if minisite is not False:
  243. template_values['minisite'] = minisite
  244. template_values['page_title'] = site.title + u' › ' + minisite.title + u' › 添加新页面'
  245. template_values['page_content_type'] = 'text/html;charset=utf-8'
  246. template_values['page_weight'] = 0
  247. template_values['page_mode'] = 0
  248. path = os.path.join('desktop', 'backstage_new_page.html')
  249. return render_to_response(path, template_values)
  250. else:
  251. return HttpResponseRedirect('/backstage')
  252. else:
  253. return HttpResponseRedirect('/')
  254. else:
  255. return HttpResponseRedirect('/signin')
  256. else:
  257. site = GetSite()
  258. template_values = {}
  259. template_values['site'] = site
  260. template_values['system_version'] = SYSTEM_VERSION
  261. member = CheckAuth(request)
  262. template_values['member'] = member
  263. l10n = GetMessages(member, site)
  264. template_values['l10n'] = l10n
  265. if (member):
  266. if (member.level == 0):
  267. minisite = GetKindByName('Minisite', minisite_name)
  268. if minisite is False:
  269. return HttpResponseRedirect('/backstage')
  270. else:
  271. template_values['minisite'] = minisite
  272. template_values['page_title'] = site.title + u' › ' + minisite.title + u' › 添加新页面'
  273. errors = 0
  274. # Verification: name
  275. page_name_error = 0
  276. page_name_error_messages = ['',
  277. u'请输入页面名',
  278. u'页面名长度不能超过 64 个字符',
  279. u'页面名只能由 a-Z 0-9 及 . - _ 组成',
  280. u'抱歉这个页面名已经存在了']
  281. page_name = request.POST['name'].strip().lower()
  282. if (len(page_name) == 0):
  283. errors = errors + 1
  284. page_name_error = 1
  285. else:
  286. if (len(page_name) > 64):
  287. errors = errors + 1
  288. page_name_error = 2
  289. else:
  290. if (re.search('^[a-zA-Z0-9\-\_\.]+$', page_name)):
  291. q = Page.objects.filter(name=page_name.lower())
  292. if (len(q) > 0):
  293. if q[0].minisite.name == minisite.name:
  294. errors = errors + 1
  295. page_name_error = 4
  296. else:
  297. errors = errors + 1
  298. page_name_error = 3
  299. template_values['page_name'] = page_name
  300. template_values['page_name_error'] = page_name_error
  301. template_values['page_name_error_message'] = page_name_error_messages[page_name_error]
  302. # Verification: title
  303. page_t_error = 0
  304. page_t_error_messages = ['',
  305. u'请输入页面标题',
  306. u'页面标题长度不能超过 100 个字符'
  307. ]
  308. page_t = request.POST['t'].strip()
  309. if (len(page_t) == 0):
  310. errors = errors + 1
  311. page_t_error = 1
  312. else:
  313. if (len(page_t) > 100):
  314. errors = errors + 1
  315. page_t_error = 2
  316. template_values['page_t'] = page_t
  317. template_values['page_t_error'] = page_t_error
  318. template_values['page_t_error_message'] = page_t_error_messages[page_t_error]
  319. # Verification: content
  320. page_content_error = 0
  321. page_content_error_messages = ['',
  322. u'请输入页面内容',
  323. u'页面内容长度不能超过 200000 个字符'
  324. ]
  325. page_content = request.POST['content'].strip()
  326. if (len(page_content) == 0):
  327. errors = errors + 1
  328. page_content_error = 1
  329. else:
  330. if (len(page_content) > 200000):
  331. errors = errors + 1
  332. page_content_error = 2
  333. template_values['page_content'] = page_content
  334. template_values['page_content_error'] = page_content_error
  335. template_values['page_content_error_message'] = page_content_error_messages[page_content_error]
  336. # Verification: mode
  337. page_mode = 0
  338. page_mode = request.POST['mode'].strip()
  339. if page_mode == '1':
  340. page_mode = 1
  341. else:
  342. page_mode = 0
  343. # Verification: content_type
  344. page_content_type = request.POST['content_type'].strip()
  345. if (len(page_content_type) == 0):
  346. page_content_type = 'text/html;charset=utf-8'
  347. else:
  348. if (len(page_content_type) > 40):
  349. page_content_type = 'text/html;charset=utf-8'
  350. template_values['page_content_type'] = page_content_type
  351. # Verification: weight
  352. page_weight = request.POST['weight'].strip()
  353. if (len(page_content_type) == 0):
  354. page_content_type = 0
  355. else:
  356. if (len(page_weight) > 9):
  357. page_weight = 0
  358. else:
  359. try:
  360. page_weight = int(page_weight)
  361. except:
  362. page_weight = 0
  363. template_values['page_weight'] = page_weight
  364. template_values['errors'] = errors
  365. if (errors == 0):
  366. page = Page()
  367. page.minisite = minisite
  368. q = Counter.objects.filter(name='page.max')
  369. if (len(q) == 1):
  370. counter = q[0]
  371. counter.value = counter.value + 1
  372. else:
  373. counter = Counter()
  374. counter.name = 'page.max'
  375. counter.value = 1
  376. q2 = Counter.objects.filter(name='page.total')
  377. if (len(q2) == 1):
  378. counter2 = q[0]
  379. counter2.value = counter.value + 1
  380. else:
  381. counter2 = Counter()
  382. counter2.name = 'page.total'
  383. counter2.value = 1
  384. page.num = counter.value
  385. page.name = page_name
  386. page.title = page_t
  387. page.content = page_content
  388. if page_mode == 1:
  389. from django.template import Context, Template
  390. t = Template(page_content)
  391. c = Context({"site" : site, "minisite" : page.minisite, "page" : page})
  392. output = t.render(c)
  393. page.content_rendered = output
  394. else:
  395. page.content_rendered = page_content
  396. page.content_type = page_content_type
  397. page.weight = page_weight
  398. page.mode = page_mode
  399. page.minisite = minisite
  400. page.save()
  401. counter.save()
  402. counter2.save()
  403. minisite.pages = minisite.pages + 1
  404. minisite.save()
  405. memcache.delete('Minisite_' + str(minisite.num))
  406. memcache.delete('Minisite::' + str(minisite.name))
  407. return HttpResponseRedirect('/backstage-minisite/' + minisite.name)
  408. else:
  409. path = os.path.join('desktop', 'backstage_new_page.html')
  410. return render_to_response(path, template_values)
  411. else:
  412. return HttpResponseRedirect('/')
  413. else:
  414. return HttpResponseRedirect('/signin')
  415. def BackstageRemoveMinisiteHandler(request, minisite_key):
  416. if request.method == 'GET':
  417. member = CheckAuth(request)
  418. if member:
  419. if member.level == 0:
  420. minisite = db.get(db.Key(minisite_key))
  421. if minisite:
  422. # Delete all contents
  423. pages = db.GqlQuery("SELECT * FROM Page WHERE minisite = :1", minisite)
  424. for page in pages:
  425. memcache.delete('Page_' + str(page.num))
  426. memcache.delete('Page::' + str(page.name))
  427. memcache.delete(minisite.name + '/' + page.name)
  428. page.delete()
  429. minisite.pages = 0
  430. minisite.put()
  431. # Delete the minisite
  432. memcache.delete('Minisite_' + str(minisite.num))
  433. memcache.delete('Minisite::' + str(minisite.name))
  434. minisite.delete()
  435. self.redirect('/backstage')
  436. else:
  437. self.redirect('/backstage')
  438. else:
  439. self.redirect('/')
  440. else:
  441. self.redirect('/signin')
  442. def BackstagePageHandler(request, page_key):
  443. if request.method == 'GET':
  444. site = GetSite()
  445. template_values = {}
  446. template_values['site'] = site
  447. template_values['system_version'] = SYSTEM_VERSION
  448. member = CheckAuth(request)
  449. template_values['member'] = member
  450. l10n = GetMessages(member, site)
  451. template_values['l10n'] = l10n
  452. if (member):
  453. if (member.level == 0):
  454. page = Page.objects.get(id=int(page_key))
  455. #page = db.get(db.Key(page_key))
  456. if page:
  457. minisite = page.minisite
  458. template_values['page'] = page
  459. template_values['minisite'] = minisite
  460. template_values['page_title'] = site.title + u' › ' + minisite.title + u' › ' + page.title + u' › 编辑'
  461. template_values['page_name'] = page.name
  462. template_values['page_t'] = page.title
  463. template_values['page_content'] = page.content
  464. template_values['page_content_type'] = page.content_type
  465. template_values['page_mode'] = page.mode
  466. template_values['page_weight'] = page.weight
  467. path = os.path.join('desktop', 'backstage_page.html')
  468. return render_to_response(path, template_values)
  469. else:
  470. return HttpResponseRedirect('/backstage')
  471. else:
  472. return HttpResponseRedirect('/')
  473. else:
  474. return HttpResponseRedirect('/signin')
  475. else:
  476. site = GetSite()
  477. template_values = {}
  478. template_values['site'] = site
  479. template_values['system_version'] = SYSTEM_VERSION
  480. member = CheckAuth(request)
  481. template_values['member'] = member
  482. l10n = GetMessages(member, site)
  483. template_values['l10n'] = l10n
  484. if (member):
  485. if (member.level == 0):
  486. page = Page.objects.get(id=int(page_key))
  487. #page = db.get(db.Key(page_key))
  488. if page:
  489. minisite = page.minisite
  490. template_values['page'] = page
  491. template_values['minisite'] = minisite
  492. template_values['page_title'] = site.title + u' › ' + minisite.title + u' › 添加新页面'
  493. errors = 0
  494. # Verification: name
  495. page_name_error = 0
  496. page_name_error_messages = ['',
  497. u'请输入页面名',
  498. u'页面名长度不能超过 64 个字符',
  499. u'页面名只能由 a-Z 0-9 及 . - _ 组成',
  500. u'抱歉这个页面名已经存在了']
  501. page_name = request.POST['name'].strip().lower()
  502. if (len(page_name) == 0):
  503. errors = errors + 1
  504. page_name_error = 1
  505. else:
  506. if (len(page_name) > 64):
  507. errors = errors + 1
  508. page_name_error = 2
  509. else:
  510. if (re.search('^[a-zA-Z0-9\-\_\.]+$', page_name)):
  511. q = Page.objects.filter(name=page_name.lower(), minisite=page.minisite)
  512. if (len(q) > 0):
  513. if q[0].num != page.num:
  514. errors = errors + 1
  515. page_name_error = 4
  516. else:
  517. errors = errors + 1
  518. page_name_error = 3
  519. template_values['page_name'] = page_name
  520. template_values['page_name_error'] = page_name_error
  521. template_values['page_name_error_message'] = page_name_error_messages[page_name_error]
  522. # Verification: title
  523. page_t_error = 0
  524. page_t_error_messages = ['',
  525. u'请输入页面标题',
  526. u'页面标题长度不能超过 100 个字符'
  527. ]
  528. page_t = request.POST['t'].strip()
  529. if (len(page_t) == 0):
  530. errors = errors + 1
  531. page_t_error = 1
  532. else:
  533. if (len(page_t) > 100):
  534. errors = errors + 1
  535. page_t_error = 2
  536. template_values['page_t'] = page_t
  537. template_values['page_t_error'] = page_t_error
  538. template_values['page_t_error_message'] = page_t_error_messages[page_t_error]
  539. # Verification: content
  540. page_content_error = 0
  541. page_content_error_messages = ['',
  542. u'请输入页面内容',
  543. u'页面内容长度不能超过 200000 个字符'
  544. ]
  545. page_content = request.POST['content'].strip()
  546. if (len(page_content) == 0):
  547. errors = errors + 1
  548. page_content_error = 1
  549. else:
  550. if (len(page_content) > 200000):
  551. errors = errors + 1
  552. page_content_error = 2
  553. template_values['page_content'] = page_content
  554. template_values['page_content_error'] = page_content_error
  555. template_values['page_content_error_message'] = page_content_error_messages[page_content_error]
  556. # Verification: mode
  557. page_mode = 0
  558. page_mode = request.POST['mode'].strip()
  559. if page_mode == '1':
  560. page_mode = 1
  561. else:
  562. page_mode = 0
  563. # Verification: content_type
  564. page_content_type = request.POST['content_type'].strip()
  565. if (len(page_content_type) == 0):
  566. page_content_type = 'text/html;charset=utf-8'
  567. else:
  568. if (len(page_content_type) > 40):
  569. page_content_type = 'text/html;charset=utf-8'
  570. template_values['page_content_type'] = page_content_type
  571. # Verification: weight
  572. page_weight = request.POST['weight'].strip()
  573. if (len(page_content_type) == 0):
  574. page_content_type = 0
  575. else:
  576. if (len(page_weight) > 9):
  577. page_weight = 0
  578. else:
  579. try:
  580. page_weight = int(page_weight)
  581. except:
  582. page_weight = 0
  583. template_values['page_weight'] = page_weight
  584. template_values['errors'] = errors
  585. if (errors == 0):
  586. page.name = page_name
  587. page.title = page_t
  588. page.content = page_content
  589. if page.mode == 1:
  590. from django.template import Context, Template
  591. t = Template(page_content)
  592. c = Context({"site" : site, "minisite" : page.minisite, "page" : page})
  593. output = t.render(c)
  594. page.content_rendered = output
  595. else:
  596. page.content_rendered = page_content
  597. page.content_type = page_content_type
  598. page.mode = page_mode
  599. page.weight = page_weight
  600. page.save()
  601. memcache.delete('Page_' + str(page.num))
  602. memcache.delete('Page::' + str(page.name))
  603. memcache.delete(minisite.name + '/' + page.name)
  604. return HttpResponseRedirect('/backstage-minisite/' + minisite.name)
  605. else:
  606. path = os.path.join('desktop', 'backstage_page.html')
  607. return render_to_response(path, template_values)
  608. else:
  609. return HttpResponseRedirect('/backstage')
  610. else:
  611. return HttpResponseRedirect('/')
  612. else:
  613. return HttpResponseRedirect('/signin')
  614. def BackstageRemovePageHandler(request):
  615. def get(self, page_key):
  616. member = CheckAuth(request)
  617. if member:
  618. if member.level == 0:
  619. page = db.get(db.Key(page_key))
  620. if page:
  621. memcache.delete('Page_' + str(page.num))
  622. memcache.delete('Page::' + str(page.name))
  623. memcache.delete(page.minisite.name + '/' + page.name)
  624. minisite = page.minisite
  625. page.delete()
  626. minisite.pages = minisite.pages - 1
  627. minisite.put()
  628. self.redirect('/backstage/minisite/' + minisite.name)
  629. else:
  630. self.redirect('/')
  631. else:
  632. self.redirect('/signin')
  633. def BackstageNewSectionHandler(request):
  634. if request.method == 'GET':
  635. site = GetSite()
  636. template_values = {}
  637. template_values['site'] = site
  638. template_values['page_title'] = site.title + u' › 添加新区域'
  639. template_values['system_version'] = SYSTEM_VERSION
  640. member = CheckAuth(request)
  641. template_values['member'] = member
  642. l10n = GetMessages(member, site)
  643. template_values['l10n'] = l10n
  644. if (member):
  645. if (member.level == 0):
  646. path = os.path.join('desktop', 'backstage_new_section.html')
  647. return render_to_response(path, template_values)
  648. else:
  649. return HttpResponseRedirect('/')
  650. else:
  651. return HttpResponseRedirect('/signin')
  652. else:
  653. site = GetSite()
  654. template_values = {}
  655. template_values['site'] = site
  656. template_values['page_title'] = site.title + u' › 添加新区域'
  657. template_values['system_version'] = SYSTEM_VERSION
  658. member = CheckAuth(request)
  659. template_values['member'] = member
  660. l10n = GetMessages(member, site)
  661. template_values['l10n'] = l10n
  662. if (member):
  663. if (member.level == 0):
  664. errors = 0
  665. # Verification: name
  666. section_name_error = 0
  667. section_name_error_messages = ['',
  668. u'请输入区域名',
  669. u'区域名长度不能超过 32 个字符',
  670. u'区域名只能由 a-Z 0-9 及 - 和 _ 组成',
  671. u'抱歉这个区域名已经存在了']
  672. section_name = request.POST['name'].strip().lower()
  673. if (len(section_name) == 0):
  674. errors = errors + 1
  675. section_name_error = 1
  676. else:
  677. if (len(section_name) > 32):
  678. errors = errors + 1
  679. section_name_error = 2
  680. else:
  681. if (re.search('^[a-zA-Z0-9\-\_]+$', section_name)):
  682. q = Section.objects.filter(name=section_name.lower())
  683. if (len(q) > 0):
  684. errors = errors + 1
  685. section_name_error = 4
  686. else:
  687. errors = errors + 1
  688. section_name_error = 3
  689. template_values['section_name'] = section_name
  690. template_values['section_name_error'] = section_name_error
  691. template_values['section_name_error_message'] = section_name_error_messages[section_name_error]
  692. # Verification: title
  693. section_title_error = 0
  694. section_title_error_messages = ['',
  695. u'请输入区域标题',
  696. u'区域标题长度不能超过 32 个字符'
  697. ]
  698. section_title = request.POST['title'].strip()
  699. if (len(section_title) == 0):
  700. errors = errors + 1
  701. section_title_error = 1
  702. else:
  703. if (len(section_title) > 32):
  704. errors = errors + 1
  705. section_title_error = 2
  706. template_values['section_title'] = section_title
  707. template_values['section_title_error'] = section_title_error
  708. template_values['section_title_error_message'] = section_title_error_messages[section_title_error]
  709. # Verification: title
  710. section_title_alternative_error = 0
  711. section_title_alternative_error_messages = ['',
  712. u'请输入区域副标题',
  713. u'区域标题长度不能超过 32 个字符'
  714. ]
  715. section_title_alternative = request.POST['title_alternative'].strip()
  716. if (len(section_title_alternative) == 0):
  717. errors = errors + 1
  718. section_title_alternative_error = 1
  719. else:
  720. if (len(section_title_alternative) > 32):
  721. errors = errors + 1
  722. section_title_alternative_error = 2
  723. template_values['section_title_alternative'] = section_title_alternative
  724. template_values['section_title_alternative_error'] = section_title_alternative_error
  725. template_values['section_title_alternative_error_message'] = section_title_alternative_error_messages[section_title_alternative_error]
  726. template_values['errors'] = errors
  727. if (errors == 0):
  728. section = Section()
  729. q = Counter.objects.filter(name='section.max')
  730. if (len(q) == 1):
  731. counter = q[0]
  732. counter.value = counter.value + 1
  733. else:
  734. counter = Counter()
  735. counter.name = 'section.max'
  736. counter.value = 1
  737. section.num = counter.value
  738. section.name = section_name
  739. section.title = section_title
  740. section.title_alternative = section_title_alternative
  741. section.save()
  742. counter.save()
  743. return HttpResponseRedirect('/backstage')
  744. else:
  745. path = os.path.join('mobile', 'backstage_new_section.html')
  746. return render_to_response(path, template_values)
  747. else:
  748. return HttpResponseRedirect('/')
  749. else:
  750. return HttpResponseRedirect('/signin')
  751. def BackstageSectionHandler(request,section_name):
  752. if request.method == 'GET':
  753. site = GetSite()
  754. browser = detect(request)
  755. template_values = {}
  756. template_values['rnd'] = random.randrange(1, 100)
  757. template_values['site'] = site
  758. template_values['system_version'] = SYSTEM_VERSION
  759. member = CheckAuth(request)
  760. l10n = GetMessages(member, site)
  761. template_values['l10n'] = l10n
  762. if (member):
  763. if (member.level == 0):
  764. template_values['member'] = member
  765. q = Section.objects.filter(name=section_name)
  766. section = False
  767. if (len(q) == 1):
  768. section = q[0]
  769. template_values['section'] = section
  770. template_values['page_title'] = site.title + u' › 后台 › ' + section.title
  771. template_values['section_name'] = section.name
  772. template_values['section_title'] = section.title
  773. template_values['section_title_alternative'] = section.title_alternative
  774. if section.header:
  775. template_values['section_header'] = section.header
  776. else:
  777. template_values['section_header'] = ''
  778. if section.footer:
  779. template_values['section_footer'] = section.footer
  780. else:
  781. template_values['section_footer'] = ''
  782. else:
  783. template_values['section'] = section
  784. if (section):
  785. q = Node.objects.filter(section_num=section.num).order_by('-topics')
  786. template_values['nodes'] = q
  787. section.nodes = len(q)
  788. section.save()
  789. template_values['section'] = section
  790. q2 = Node.objects.filter(section_num=section.num).order_by('-last_modified')[:10]
  791. template_values['recent_modified'] = q2
  792. else:
  793. template_values['nodes'] = False
  794. if browser['ios']:
  795. path = os.path.join('mobile', 'backstage_section.html')
  796. else:
  797. path = os.path.join('desktop', 'backstage_section.html')
  798. return render_to_response(path, template_values)
  799. else:
  800. return HttpResponseRedirect('/')
  801. else:
  802. return HttpResponseRedirect('/signin')
  803. else:
  804. site = GetSite()
  805. browser = detect(request)
  806. template_values = {}
  807. template_values['rnd'] = random.randrange(1, 100)
  808. template_values['site'] = site
  809. template_values['system_version'] = SYSTEM_VERSION
  810. member = CheckAuth(request)
  811. l10n = GetMessages(member, site)
  812. template_values['l10n'] = l10n
  813. if member:
  814. if member.level == 0:
  815. template_values['member'] = member
  816. section = GetKindByName('Section', section_name)
  817. if section is not False:
  818. template_values['section'] = section
  819. errors = 0
  820. # Verification: name
  821. section_name_error = 0
  822. section_name_error_messages = ['',
  823. u'请输入区域名',
  824. u'区域名长度不能超过 32 个字符',
  825. u'区域名只能由 a-Z 0-9 及 - 和 _ 组成',
  826. u'抱歉这个区域名已经存在了']
  827. section_name = request.POST['name'].strip().lower()
  828. if (len(section_name) == 0):
  829. errors = errors + 1
  830. section_name_error = 1
  831. else:
  832. if (len(section_name) > 32):
  833. errors = errors + 1
  834. section_name_error = 2
  835. else:
  836. if (re.search('^[a-zA-Z0-9\-\_]+$', section_name)):
  837. q = Section.objects.filter(name=section_name.lower())
  838. if (len(q) > 0):
  839. for possible_conflict in q:
  840. if possible_conflict.num != section.num:
  841. errors = errors + 1
  842. section_name_error = 4
  843. else:
  844. errors = errors + 1
  845. section_name_error = 3
  846. template_values['section_name'] = section_name
  847. template_values['section_name_error'] = section_name_error
  848. template_values['section_name_error_message'] = section_name_error_messages[section_name_error]
  849. # Verification: title
  850. section_title_error = 0
  851. section_title_error_messages = ['',
  852. u'请输入区域标题',
  853. u'区域标题长度不能超过 32 个字符'
  854. ]
  855. section_title = request.POST['title'].strip()
  856. if (len(section_title) == 0):
  857. errors = errors + 1
  858. section_title_error = 1
  859. else:
  860. if (len(section_title) > 32):
  861. errors = errors + 1
  862. section_title_error = 2
  863. template_values['section_title'] = section_title
  864. template_values['section_title_error'] = section_title_error
  865. template_values['section_title_error_message'] = section_title_error_messages[section_title_error]
  866. # Verification: title_alternative
  867. section_title_alternative_error = 0
  868. section_title_alternative_error_messages = ['',
  869. u'请输入区域副标题',
  870. u'区域标题长度不能超过 32 个字符'
  871. ]
  872. section_title_alternative = request.POST['title_alternative'].strip()
  873. if (len(section_title_alternative) == 0):
  874. errors = errors + 1
  875. section_title_alternative_error = 1
  876. else:
  877. if (len(section_title_alternative) > 32):
  878. errors = errors + 1
  879. section_title_alternative_error = 2
  880. template_values['section_title_alternative'] = section_title_alternative
  881. template_values['section_title_alternative_error'] = section_title_alternative_error
  882. template_values['section_title_alternative_error_message'] = section_title_alternative_error_messages[section_title_alternative_error]
  883. # Verification: header
  884. section_header_error = 0
  885. section_header_error_messages = ['',
  886. u'区域头部信息不能超过 1000 个字符'
  887. ]
  888. section_header = request.POST['header'].strip()
  889. if len(section_header) > 1000:
  890. errors = errors + 1
  891. section_header_error = 1
  892. template_values['section_header'] = section_header
  893. template_values['section_header_error'] = section_header_error
  894. template_values['section_header_error_message'] = section_header_error_messages[section_header_error]
  895. # Verification: footer
  896. section_footer_error = 0
  897. section_footer_error_messages = ['',
  898. u'区域尾部信息不能超过 1000 个字符'
  899. ]
  900. section_footer = request.POST['footer'].strip()
  901. if len(section_footer) > 1000:
  902. errors = errors + 1
  903. section_footer_error = 1
  904. template_values['section_footer'] = section_footer
  905. template_values['section_footer_error'] = section_footer_error
  906. template_values['section_footer_error_message'] = section_footer_error_messages[section_footer_error]
  907. template_values['errors'] = errors
  908. if (errors == 0):
  909. memcache.delete('Section::' + section.name)
  910. section.name = section_name
  911. section.title = section_title
  912. section.title_alternative = section_title_alternative
  913. section.header = section_header
  914. section.footer = section_footer
  915. section.save()
  916. memcache.delete('Section_' + str(section.num))
  917. memcache.delete('Section::' + section_name)
  918. return HttpResponseRedirect('/backstage')
  919. else:
  920. path = os.path.join('desktop', 'backstage_section.html')
  921. return render_to_response(path, template_values)
  922. else:
  923. return HttpResponseRedirect('/backstage')
  924. else:
  925. return HttpResponseRedirect('/')
  926. else:
  927. return HttpResponseRedirect('/signin')
  928. def BackstageNewNodeHandler(request,section_name):
  929. if request.method == 'GET':
  930. site = GetSite()
  931. template_values = {}
  932. template_values['site'] = site
  933. template_values['page_title'] = site.title + u' › 添加新节点'
  934. template_values['system_version'] = SYSTEM_VERSION
  935. member = CheckAuth(request)
  936. l10n = GetMessages(member, site)
  937. template_values['l10n'] = l10n
  938. if (member):
  939. if (member.level == 0):
  940. template_values['member'] = CheckAuth(request)
  941. q = Section.objects.filter(name=section_name)
  942. if (len(q) == 1):
  943. template_values['section'] = q[0]
  944. else:
  945. template_values['section'] = False
  946. path = os.path.join('desktop', 'backstage_new_node.html')
  947. return render_to_response(path, template_values)
  948. else:
  949. return HttpResponseRedirect('/')
  950. else:
  951. return HttpResponseRedirect('/signin')
  952. else:
  953. site = GetSite()
  954. template_values = {}
  955. template_values['site'] = site
  956. template_values['page_title'] = site.title + u' › 添加新节点'
  957. template_values['system_version'] = SYSTEM_VERSION
  958. member = CheckAuth(request)
  959. l10n = GetMessages(member, site)
  960. template_values['l10n'] = l10n
  961. if (member):
  962. if (member.level == 0):
  963. template_values['member'] = member
  964. section = False
  965. q = Section.objects.filter(name=section_name)
  966. if (len(q) == 1):
  967. section = q[0]
  968. template_values['section'] = section
  969. else:
  970. template_values['section'] = False
  971. errors = 0
  972. # Verification: name
  973. node_name_error = 0
  974. node_name_error_messages = ['',
  975. u'请输入节点名',
  976. u'节点名长度不能超过 32 个字符',
  977. u'节点名只能由 a-Z 0-9 及 - 和 _ 组成',
  978. u'抱歉这个节点名已经存在了']
  979. node_name = request.POST['name'].strip().lower()
  980. if (len(node_name) == 0):
  981. errors = errors + 1
  982. node_name_error = 1
  983. else:
  984. if (len(node_name) > 32):
  985. errors = errors + 1
  986. node_name_error = 2
  987. else:
  988. if (re.search('^[a-zA-Z0-9\-\_]+$', node_name)):
  989. q = Node.objects.filter(name=node_name.lower())
  990. if (len(q) > 0):
  991. errors = errors + 1
  992. node_name_error = 4
  993. else:
  994. errors = errors + 1
  995. node_name_error = 3
  996. template_values['node_name'] = node_name
  997. template_values['node_name_error'] = node_name_error
  998. template_values['node_name_error_message'] = node_name_error_messages[node_name_error]
  999. # Verification: title
  1000. node_title_error = 0
  1001. node_title_error_messages = ['',
  1002. u'请输入节点标题',
  1003. u'节点标题长度不能超过 32 个字符'
  1004. ]
  1005. node_title = request.POST['title'].strip()
  1006. if (len(node_title) == 0):
  1007. errors = errors + 1
  1008. node_title_error = 1
  1009. else:
  1010. if (len(node_title) > 32):
  1011. errors = errors + 1
  1012. node_title_error = 2
  1013. template_values['node_title'] = node_title
  1014. template_values['node_title_error'] = node_title_error
  1015. template_values['node_title_error_message'] = node_title_error_messages[node_title_error]
  1016. # Verification: title
  1017. node_title_alternative_error = 0