goto.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from math import ceil
  2. from django.conf import settings
  3. from django.core.urlresolvers import reverse
  4. from misago.readtracker.threadstracker import make_read_aware
  5. from misago.threads.models import Post
  6. def posts_queryset(qs):
  7. return qs.count(), qs.order_by('id')
  8. def get_thread_pages(posts):
  9. if posts <= settings.MISAGO_POSTS_PER_PAGE + settings.MISAGO_THREAD_TAIL:
  10. return 1
  11. thread_pages = posts / settings.MISAGO_POSTS_PER_PAGE
  12. thread_tail = posts - thread_pages * settings.MISAGO_POSTS_PER_PAGE
  13. if thread_tail and thread_tail > settings.MISAGO_THREAD_TAIL:
  14. thread_pages += 1
  15. return thread_pages
  16. def get_post_page(posts, post_qs):
  17. post_no = post_qs.count()
  18. if posts <= settings.MISAGO_POSTS_PER_PAGE + settings.MISAGO_THREAD_TAIL:
  19. return 1
  20. thread_pages = get_thread_pages(posts)
  21. post_page = int(ceil(float(post_no) / settings.MISAGO_POSTS_PER_PAGE))
  22. if post_page > thread_pages:
  23. post_page = thread_pages
  24. return post_page
  25. def hashed_reverse(thread, post, page=1):
  26. return thread.get_post_url(post.pk, page)
  27. def last(thread, posts_qs):
  28. posts, qs = posts_queryset(posts_qs)
  29. thread_pages = get_thread_pages(posts)
  30. return thread.get_post_url(thread.last_post_id, thread_pages)
  31. def get_post_link(posts, qs, thread, post):
  32. post_page = get_post_page(posts, qs.filter(id__lte=post.pk))
  33. return hashed_reverse(thread, post, post_page)
  34. def new(user, thread, posts_qs):
  35. make_read_aware(user, thread)
  36. if thread.is_read:
  37. return last(thread, posts_qs)
  38. posts, qs = posts_queryset(posts_qs)
  39. try:
  40. first_unread = qs.filter(posted_on__gt=thread.last_read_on)[:1][0]
  41. except IndexError:
  42. return last(thread, posts_qs)
  43. return get_post_link(posts, qs, thread, first_unread)
  44. def post(thread, posts_qs, post):
  45. posts, qs = posts_queryset(posts_qs)
  46. return get_post_link(posts, qs, thread, post)