123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- from cgi import escape
- from misago.acl import add_acl
- from misago.threads.checksums import update_event_checksum
- from misago.threads.models import Event
- __all__ = ['record_event', 'add_events_to_posts']
- LINK_TEMPLATE = '<a href="%s" class="event-%s">%s</a>'
- def format_message(message, links):
- if links:
- formats = {}
- for name, value in links.items():
- formats[name] = LINK_TEMPLATE % (escape(value[1]), escape(name), escape(value[0]))
- return message % formats
- else:
- return message
- def record_event(user, thread, icon, message, links=None):
- event = Event.objects.create(
- forum=thread.forum,
- thread=thread,
- author=user,
- author_name=user.username,
- author_slug=user.slug,
- icon=icon,
- message=format_message(message, links))
- update_event_checksum(event)
- event.save(update_fields=['checksum'])
- thread.has_events = True
- return event
- def add_events_to_posts(user, thread, posts, delimeter=None):
- if thread.has_events:
- real_add_events_to_posts(user, thread, posts, delimeter)
- else:
- for post in posts:
- post.events = []
- def real_add_events_to_posts(user, thread, posts, delimeter=None):
- start_date = posts[0].posted_on
- events_queryset = thread.event_set.filter(occured_on__gte=start_date)
- if delimeter:
- events_queryset = events_queryset.filter(occured_on__lt=delimeter)
- events_queryset = events_queryset.order_by('id')
- acl = user.acl['forums'].get(thread.forum_id, {'can_hide_events': False})
- if not acl['can_hide_events']:
- events_queryset = events_queryset.filter(is_hidden=False)
- events = [e for e in events_queryset]
- add_acl(user, events)
- for i, post in enumerate(posts[:-1]):
- post.events = []
- while events and events[0].occured_on < posts[i + 1].posted_on:
- post.events.append(events.pop(0))
- posts[-1].events = events
|