goto.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from math import ceil
  2. from django.core.urlresolvers import reverse
  3. from misago.readtracker.threadstracker import make_read_aware
  4. from misago.threads.models import Post
  5. from misago.threads.permissions import exclude_invisible_posts
  6. def posts_queryset(user, thread):
  7. qs = exclude_invisible_posts(thread.post_set, user, thread.forum)
  8. return qs.count(), qs.order_by('id')
  9. def get_thread_pages(posts):
  10. if posts <= 13:
  11. return 1
  12. thread_pages = posts / 10
  13. thread_tail = posts - thread_pages * 10
  14. if thread_tail and thread_tail > 3:
  15. thread_pages += 1
  16. return thread_pages
  17. def get_post_page(posts, post_qs):
  18. post_no = post_qs.count()
  19. if posts <= 13:
  20. return 1
  21. thread_pages = get_thread_pages(posts)
  22. post_page = int(ceil(float(post_no) / 10))
  23. if post_page > thread_pages:
  24. post_page = thread_pages
  25. return post_page
  26. def hashed_reverse(thread, post, page=1):
  27. link_name = thread.get_url_name()
  28. if page > 1:
  29. post_url = reverse(link_name, kwargs={
  30. 'thread_id': thread.id,
  31. 'thread_slug': thread.slug,
  32. 'page': page
  33. })
  34. else:
  35. post_url = reverse(link_name, kwargs={
  36. 'thread_id': thread.id,
  37. 'thread_slug': thread.slug
  38. })
  39. return '%s#post-%s' % (post_url, post.pk)
  40. def last(user, thread):
  41. posts, qs = posts_queryset(user, thread)
  42. thread_pages = get_thread_pages(posts)
  43. link_name = thread.get_url_name()
  44. if thread_pages > 1:
  45. post_url = reverse(link_name, kwargs={
  46. 'thread_id': thread.id,
  47. 'thread_slug': thread.slug,
  48. 'page': thread_pages
  49. })
  50. else:
  51. post_url = reverse(link_name, kwargs={
  52. 'thread_id': thread.id,
  53. 'thread_slug': thread.slug
  54. })
  55. return '%s#post-%s' % (post_url, thread.last_post_id)
  56. def get_post_link(posts, qs, thread, post):
  57. post_page = get_post_page(posts, qs.filter(id__lte=post.pk))
  58. return hashed_reverse(thread, post, post_page)
  59. def new(user, thread):
  60. make_read_aware(user, thread)
  61. if thread.is_read:
  62. return last(user, thread)
  63. posts, qs = posts_queryset(user, thread)
  64. try:
  65. first_unread = qs.filter(posted_on__gt=thread.last_read_on)[:1][0]
  66. except IndexError:
  67. return last(user, thread)
  68. return get_post_link(posts, qs, thread, first_unread)
  69. def reported(user, thread):
  70. if not thread.has_reported_posts or not thread.acl['can_see_reports']:
  71. return last(user, thread)
  72. posts, qs = posts_queryset(user, thread)
  73. try:
  74. first_reported = qs.filter(is_reported=True)[:1][0]
  75. except IndexError:
  76. return last(user, thread)
  77. return get_post_link(posts, qs, thread, first_reported)
  78. def moderated(user, thread):
  79. if not thread.has_moderated_posts or not thread.acl['can_review']:
  80. return last(user, thread)
  81. posts, qs = posts_queryset(user, thread)
  82. try:
  83. first_moderated = qs.filter(is_moderated=True)[:1][0]
  84. except IndexError:
  85. return last(user, thread)
  86. return get_post_link(posts, qs, thread, first_moderated)
  87. def post(user, thread, post):
  88. posts, qs = posts_queryset(user, thread)
  89. return get_post_link(posts, qs, thread, post)