events.py 1.9 KB

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