goto.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. def posts_queryset(qs):
  6. return qs.count(), qs.order_by('id')
  7. def get_thread_pages(posts):
  8. if posts <= 13:
  9. return 1
  10. thread_pages = posts / 10
  11. thread_tail = posts - thread_pages * 10
  12. if thread_tail and thread_tail > 3:
  13. thread_pages += 1
  14. return thread_pages
  15. def get_post_page(posts, post_qs):
  16. post_no = post_qs.count()
  17. if posts <= 13:
  18. return 1
  19. thread_pages = get_thread_pages(posts)
  20. post_page = int(ceil(float(post_no) / 10))
  21. if post_page > thread_pages:
  22. post_page = thread_pages
  23. return post_page
  24. def hashed_reverse(thread, post, page=1):
  25. return thread.get_post_url(post.pk, page)
  26. def last(thread, posts_qs):
  27. posts, qs = posts_queryset(posts_qs)
  28. thread_pages = get_thread_pages(posts)
  29. return thread.get_post_url(thread.last_post_id, thread_pages)
  30. def get_post_link(posts, qs, thread, post):
  31. post_page = get_post_page(posts, qs.filter(id__lte=post.pk))
  32. return hashed_reverse(thread, post, post_page)
  33. def new(user, thread, posts_qs):
  34. make_read_aware(user, thread)
  35. if thread.is_read:
  36. return last(thread, posts_qs)
  37. posts, qs = posts_queryset(posts_qs)
  38. try:
  39. first_unread = qs.filter(posted_on__gt=thread.last_read_on)[:1][0]
  40. except IndexError:
  41. return last(thread, posts_qs)
  42. return get_post_link(posts, qs, thread, first_unread)
  43. def post(thread, posts_qs, post):
  44. posts, qs = posts_queryset(posts_qs)
  45. return get_post_link(posts, qs, thread, post)