events.py 2.3 KB

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