events.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from cgi import escape
  2. from misago.acl import add_acl
  3. from misago.threads.checksums import update_event_checksum
  4. from misago.threads.models import Event
  5. __all__ = ['record_event', 'add_events_to_posts']
  6. LINK_TEMPLATE = '<a href="%s" class="event-%s">%s</a>'
  7. NAME_TEMPLATE = '<strong class="event-%s">%s</strong>'
  8. def format_message(message, links):
  9. if links:
  10. formats = {}
  11. for name, value in links.items():
  12. if isinstance(value, basestring):
  13. formats[name] = NAME_TEMPLATE % (escape(name), escape(value))
  14. else:
  15. try:
  16. replaces = (
  17. escape(value.get_absolute_url()),
  18. escape(name),
  19. escape(unicode(value))
  20. )
  21. except AttributeError:
  22. replaces = (
  23. escape(value[1]),
  24. escape(name),
  25. escape(value[0])
  26. )
  27. formats[name] = LINK_TEMPLATE % replaces
  28. return message % formats
  29. else:
  30. return message
  31. def record_event(user, thread, icon, message, links=None):
  32. event = Event.objects.create(
  33. forum=thread.forum,
  34. thread=thread,
  35. author=user,
  36. author_name=user.username,
  37. author_slug=user.slug,
  38. icon=icon,
  39. message=format_message(message, links))
  40. update_event_checksum(event)
  41. event.save(update_fields=['checksum'])
  42. thread.has_events = True
  43. return event
  44. def add_events_to_posts(user, thread, posts, delimeter=None):
  45. if thread.has_events:
  46. real_add_events_to_posts(user, thread, posts, delimeter)
  47. else:
  48. for post in posts:
  49. post.events = []
  50. def real_add_events_to_posts(user, thread, posts, delimeter=None):
  51. start_date = posts[0].posted_on
  52. events_queryset = thread.event_set.filter(occured_on__gte=start_date)
  53. if delimeter:
  54. events_queryset = events_queryset.filter(occured_on__lt=delimeter)
  55. events_queryset = events_queryset.order_by('id')
  56. acl = user.acl['forums'].get(thread.forum_id, {})
  57. if not acl.get('can_hide_events'):
  58. events_queryset = events_queryset.filter(is_hidden=False)
  59. events = [e for e in events_queryset[:50]]
  60. add_acl(user, events)
  61. for i, post in enumerate(posts[:-1]):
  62. post.events = []
  63. while events and events[0].occured_on < posts[i + 1].posted_on:
  64. post.events.append(events.pop(0))
  65. posts[-1].events = events