/kai/controllers/pasties.py

https://bitbucket.org/bbangert/kai/ · Python · 113 lines · 102 code · 11 blank · 0 comment · 9 complexity · 53755aee0f354eed612217492845d461 MD5 · raw file

  1. import logging
  2. from pylons import cache, request, response, session, tmpl_context as c, url
  3. from pylons.controllers.util import abort, redirect
  4. from pylons.decorators import rest
  5. from kai.lib.base import BaseController, CMSObject, render
  6. from kai.lib.decorators import validate
  7. from kai.lib.helpers import success_flash
  8. from kai.lib.serialization import render_feed
  9. from kai.model import Paste, forms
  10. from kai.model.generics import all_doc_tags
  11. log = logging.getLogger(__name__)
  12. class PastiesController(BaseController, CMSObject):
  13. _cms_object = Paste
  14. def __before__(self):
  15. c.active_tab = 'Tools'
  16. c.active_sub = 'Pastebin'
  17. @rest.dispatch_on(POST='_process_new')
  18. def new(self):
  19. c.tags = [row['name'] for row in list(all_doc_tags(self.db))]
  20. return render('/pasties/create.mako')
  21. @validate(form=forms.pastebin_form, error_handler='new')
  22. def _process_new(self):
  23. self.form_result.pop('notabot')
  24. paste = Paste(**self.form_result)
  25. if c.user:
  26. paste.human_id = c.user.id
  27. paste.email = c.user.email
  28. paste.displayname = c.user.displayname
  29. else:
  30. paste.session_id = session.id
  31. if 'tags' in self.form_result:
  32. paste.tags = self.form_result['tags'].replace(',', ' ').strip().split(' ')
  33. paste.store(self.db)
  34. redirect(url('paste', id=paste.id))
  35. def show(self, id):
  36. doc = Paste.load(self.db, id)
  37. if not doc:
  38. docs = list(Paste.by_old_id(self.db)[id])
  39. if not docs:
  40. abort(404)
  41. doc = docs[0]
  42. c.paste = doc
  43. c.is_owner = self._check_owner(doc, c.user, check_session=True)
  44. return render('/pasties/show.mako')
  45. def download(self, id):
  46. doc = Paste.load(self.db, id)
  47. if not doc:
  48. docs = list(Paste.by_old_id(self.db)[id])
  49. if not docs:
  50. abort(404)
  51. doc = docs[0]
  52. id = doc.old_id or doc.id
  53. response.content_type = 'text/plain'
  54. response.headers['Content-disposition'] = 'attachment; filename=paste_%s.txt' % id
  55. return doc.code
  56. def index(self, format='html', tag=None):
  57. """ Get the pasties by date and by author"""
  58. start = request.GET.get('start', '1')
  59. startkey = request.GET.get('startkey')
  60. prevkey = request.GET.get('prevkey')
  61. kwargs = {}
  62. if startkey:
  63. kwargs = dict(descending=True, startkey=startkey, limit=11)
  64. elif prevkey:
  65. kwargs = dict(startkey=prevkey, limit=11)
  66. c.reverse = True
  67. else:
  68. kwargs = dict(descending=True, limit=11)
  69. if tag:
  70. if startkey:
  71. kwargs['startkey'] = [tag, startkey]
  72. kwargs['endkey'] = [tag]
  73. elif prevkey:
  74. kwargs['startkey'] = [tag, prevkey]
  75. kwargs['endkey'] = [tag, {}]
  76. else:
  77. kwargs['startkey'] = [tag, {}]
  78. kwargs['endkey'] = [tag]
  79. c.pasties = Paste.by_tag_time(self.db, **kwargs)
  80. total_count = list(Paste.all_tags(self.db)[tag]) or 0
  81. if total_count:
  82. total_count = total_count[0]['count']
  83. c.total = total_count
  84. else:
  85. c.pasties = Paste.by_time(self.db, **kwargs)
  86. c.start = start
  87. if format in ['atom', 'rss']:
  88. response.content_type = 'application/atom+xml'
  89. title = "PylonsHQ Pastie Feed"
  90. if tag:
  91. title += " - Tag: %s" % tag
  92. return render_feed(
  93. title=title, link=url.current(qualified=True),
  94. description="Recent PylonsHQ pasties", objects=c.pasties[:10],
  95. pub_date='created')
  96. return render('/pasties/index.mako')
  97. def tagcloud(self):
  98. c.tag_sizes = cache.get_cache('pasties.py_tagcloud').get_value(
  99. 'tags', createfunc=lambda: Paste.tag_sizes(), expiretime=180)
  100. return render('/pasties/tagcloud.mako')