def start(self, context, request, appstruct, **kw): context.state.remove('pending') context.state.append('refused') context.modified_at = datetime.datetime.now(tz=pytz.UTC) context.reindex() manager = context.manager if manager: root = getSite() mail_template = root.get_mail_template( 'refuse_invitation', getattr(manager, 'user_locale', root.locale)) localizer = request.localizer email_data = get_user_data(context, 'user', request) novaideo_title = request.root.title roles_translate = [ localizer.translate(APPLICATION_ROLES.get(r, r)) for r in context.roles ] subject = mail_template['subject'].format( novaideo_title=novaideo_title, **email_data) email_data.update(get_user_data(manager, 'recipient', request)) email_data.update(get_entity_data(context, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [manager.email], subject=subject, body=message) return {}
def _alert_users(self, context, request, user, answer): root = getSite() users = self._get_users_to_alerts(context, request) if user in users: users.remove(user) author_data = get_user_data(user, 'author', request) alert_data = get_entity_data(answer, 'comment', request) alert_data.update(author_data) alert('internal', [root], users, internal_kind=InternalAlertKind.content_alert, alert_kind='new_answer', subjects=[context], **alert_data) subject_data = get_entity_data(context, 'subject', request) alert_data.update(subject_data) for user_to_alert in [u for u in users if getattr(u, 'email', '')]: mail_template = root.get_mail_template( 'alert_answer', user_to_alert.user_locale) subject = mail_template['subject'].format( **subject_data) email_data = get_user_data(user_to_alert, 'recipient', request) email_data.update(alert_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [user_to_alert.email], subject=subject, body=message)
def _alert_users(self, context, request, user, comment, channel): root = getSite() users = self._get_users_to_alerts(context, request, user, channel) author_data = get_user_data(user, 'author', request) alert_data = get_entity_data(comment, 'comment', request) alert_data.update(author_data) alert('internal', [root], users, internal_kind=InternalAlertKind.comment_alert, subjects=[channel], comment_kind='discuss', **alert_data) subject_data = get_entity_data(user, 'subject', request) alert_data.update(subject_data) for user_to_alert in [u for u in users if getattr(u, 'email', '')]: mail_template = root.get_mail_template('alert_discuss', user_to_alert.user_locale) subject = mail_template['subject'].format(**subject_data) email_data = get_user_data(user_to_alert, 'recipient', request) email_data.update(alert_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [user_to_alert.email], subject=subject, body=message)
def start(self, context, request, appstruct, **kw): context.state.remove('pending') context.state.append('refused') context.modified_at = datetime.datetime.now(tz=pytz.UTC) context.reindex() manager = context.manager if manager: root = getSite() mail_template = root.get_mail_template( 'refuse_invitation', getattr(manager, 'user_locale', root.locale)) localizer = request.localizer email_data = get_user_data(context, 'user', request) novaideo_title = request.root.title roles_translate = [localizer.translate(APPLICATION_ROLES.get(r, r)) for r in context.roles] subject = mail_template['subject'].format( novaideo_title=novaideo_title, **email_data ) email_data.update(get_user_data(manager, 'recipient', request)) email_data.update(get_entity_data(context, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [manager.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): datas = context.get_data( select(omit(InvitationSchema(), ['_csrf_token_']), [ 'user_title', 'roles', 'first_name', 'last_name', 'email', 'organization' ])) roles = datas.pop('roles') password = appstruct['password'] datas['locale'] = my_locale_negotiator(request) person = Person(password=password, **datas) root = getSite(context) principals = find_service(root, 'principals') users = principals['users'] name = person.first_name + ' ' + person.last_name name = name_chooser(users, name=name) users[name] = person if getattr(context, 'ismanager', False) and \ context.organization: grant_roles(person, (('OrganizationResponsible', context.organization), )) person.state.append('active') grant_roles(person, roles) grant_roles(person, (('Owner', person), )) manager = context.manager root.delfromproperty('invitations', context) root.addtoproperty('news_letter_members', person) newsletters = root.get_newsletters_automatic_registration() email = getattr(person, 'email', '') if newsletters and email: for newsletter in newsletters: newsletter.subscribe(person.first_name, person.last_name, email) context.person = person if manager: mail_template = root.get_mail_template( 'accept_invitation', getattr(manager, 'user_locale', root.locale)) localizer = request.localizer email_data = get_user_data(person, 'user', request) novaideo_title = request.root.title roles_translate = [ localizer.translate(APPLICATION_ROLES.get(r, r)) for r in roles ] subject = mail_template['subject'].format( novaideo_title=novaideo_title, **email_data) email_data.update(get_user_data(manager, 'recipient', request)) email_data.update(get_entity_data(person, 'user', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [manager.email], subject=subject, body=message) return {}
def get_ballot_alert_data( context, request, root, electors): alert_data = get_entity_data(context, 'subject', request) moderators_str = "" for index, elector in enumerate(electors): elector_data = get_user_data( elector, 'subject', request) elector_data['subject_email'] = elector.email elector_data['index'] = str(index+1) moderator_str = MODERATOR_DATA.format( **elector_data) moderators_str += "\n" + moderator_str alert_data['moderators'] = moderators_str alert_data['url_terms_of_use'] = request.resource_url( root.terms_of_use, '@@index') alert_data['url_moderation_rules'] = request.resource_url( root.moderation_rules, '@@index') duration = getattr(root, 'duration_moderation_vote', 7) date_end = datetime.datetime.now() + \ datetime.timedelta(days=duration) alert_data['date_end_vote'] = to_localized_time( date_end, request, translate=True) alert_data['duration'] = duration alert_data['novaideo_title'] = root.title return alert_data
def start(self, context, request, appstruct, **kw): context.state = PersistentList(['votes for amendments', 'published']) wg = context.working_group if 'closed' not in wg.state: wg.state.append('closed') context.reindex() members = wg.members root = request.root alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='voting_amendment') subject_data = get_entity_data(context, 'subject', request) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template('start_vote_amendments', member.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) return {}
def _send_ballot_result(self, context, request, electeds, members): root = request.root working_group = context.working_group ballots_urls = [(ballot.title, request.resource_url(root, '@@seeballot', query={'id': get_oid(ballot)})) for ballot in working_group.amendments_ballots] values = { 'ballots': ballots_urls, 'electeds': electeds, 'subject': context } result_body = renderers.render(self.amendments_vote_result_template, values, request) alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='amendment_result', ballots=ballots_urls) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template('vote_amendment_result', member.user_locale) subject = mail_template['subject'].format( subject_title=context.title) recipientdata = get_user_data(member, 'recipient', request) message = mail_template['template'].format( message_result=result_body, novaideo_title=root.title, **recipientdata) alert('email', [root.get_site_sender()], [member.email], subject=subject, html=message)
def start(self, context, request, appstruct, **kw): root = request.root url = request.resource_url(context, "") deadline_date = context.init_deadline( datetime.datetime.now(tz=pytz.UTC)) deadline_str = to_localized_time(deadline_date, request, translate=True) mail_template = root.get_mail_template( 'preregistration', getattr(context, 'locale', root.locale)) email_data = get_user_data(context, 'recipient', request) subject = mail_template['subject'].format(novaideo_title=root.title) deadline_str = to_localized_time(deadline_date, request, translate=True) message = mail_template['template'].format( url=url, deadline_date=deadline_str.lower(), novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [context.email], subject=subject, body=message) request.registry.notify( ActivityExecuted(self, [context], get_current())) return {}
def start(self, context, request, appstruct, **kw): #improvement_cycle TODO no improve members = context.working_group.members root = request.root alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='no_amendment') subject_data = get_entity_data(context, 'subject', request) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template('alert_amendment', member.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=request.root.title, **email_data) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() invitations = appstruct['invitations'] user = get_current() mail_template = root.get_mail_template('invitation') localizer = request.localizer novaideo_title = root.title for invitation_dict in invitations: invitation = invitation_dict['_object_data'] invitation.state.append('pending') invitation.setproperty('manager', user) invitation.__name__ = gen_random_token() root.addtoproperty('invitations', invitation) if not getattr(invitation, 'roles', []): invitation.roles = DEFAULT_ROLES roles_translate = [localizer.translate(APPLICATION_ROLES.get(r, r)) for r in invitation.roles] subject = mail_template['subject'].format( novaideo_title=novaideo_title ) email_data = get_user_data(invitation, 'recipient', request) email_data.update(get_entity_data( invitation, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [invitation.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): context.state = PersistentList(['votes for amendments', 'published']) wg = context.working_group if 'closed' not in wg.state: wg.state.append('closed') context.reindex() members = wg.members root = request.root alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='voting_amendment') subject_data = get_entity_data(context, 'subject', request) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template( 'start_vote_amendments', member.user_locale) subject = mail_template['subject'].format(subject_title=context.title) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) return {}
def _send_ballot_result(self, context, request, electeds, members): root = request.root working_group = context.working_group ballots_urls = [(ballot.title, request.resource_url( root, '@@seeballot', query={'id': get_oid(ballot)})) for ballot in working_group.amendments_ballots] values = {'ballots': ballots_urls, 'electeds': electeds, 'subject': context} result_body = renderers.render( self.amendments_vote_result_template, values, request) alert( 'internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='amendment_result', ballots=ballots_urls) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template( 'vote_amendment_result', member.user_locale) subject = mail_template['subject'].format( subject_title=context.title) recipientdata = get_user_data(member, 'recipient', request) message = mail_template['template'].format( message_result=result_body, novaideo_title=root.title, **recipientdata ) alert('email', [root.get_site_sender()], [member.email], subject=subject, html=message)
def start(self, context, request, appstruct, **kw): root = request.root url = request.resource_url(context, "") deadline_date = context.init_deadline( datetime.datetime.now(tz=pytz.UTC)) deadline_str = to_localized_time( deadline_date, request, translate=True) mail_template = root.get_mail_template( 'preregistration', getattr(context, 'locale', root.locale)) email_data = get_user_data(context, 'recipient', request) subject = mail_template['subject'].format( novaideo_title=root.title) deadline_str = to_localized_time( deadline_date, request, translate=True) message = mail_template['template'].format( url=url, deadline_date=deadline_str.lower(), novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [context.email], subject=subject, body=message) request.registry.notify(ActivityExecuted( self, [context], get_current())) return {}
def start(self, context, request, appstruct, **kw): root = getSite() explanation = appstruct['explanation'] context.state = PersistentList(['archived']) context.reindex() user = context.author alert('internal', [root], [user], internal_kind=InternalAlertKind.moderation_alert, subjects=[context], alert_kind='object_archive') if getattr(user, 'email', ''): mail_template = root.get_mail_template( 'archive_content_decision', user.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(user, 'recipient', request) email_data.update(get_entity_data(context, 'subject', request)) message = mail_template['template'].format( explanation=explanation, novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [user.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() invitations = appstruct['invitations'] user = get_current() mail_template = root.get_mail_template('invitation') localizer = request.localizer novaideo_title = root.title for invitation_dict in invitations: invitation = invitation_dict['_object_data'] invitation.state.append('pending') invitation.setproperty('manager', user) invitation.__name__ = gen_random_token() root.addtoproperty('invitations', invitation) if not getattr(invitation, 'roles', []): invitation.roles = DEFAULT_ROLES roles_translate = [ localizer.translate(APPLICATION_ROLES.get(r, r)) for r in invitation.roles ] subject = mail_template['subject'].format( novaideo_title=novaideo_title) email_data = get_user_data(invitation, 'recipient', request) email_data.update( get_entity_data(invitation, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [invitation.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() explanation = appstruct['explanation'] context.state = PersistentList(['archived']) context.reindex() user = context.author alert('internal', [root], [user], internal_kind=InternalAlertKind.moderation_alert, subjects=[context], alert_kind='object_archive') if getattr(user, 'email', ''): mail_template = root.get_mail_template('archive_content_decision', user.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(user, 'recipient', request) email_data.update(get_entity_data(context, 'subject', request)) message = mail_template['template'].format( explanation=explanation, novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [user.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): data = context.get_data(PersonSchema()) annotations = getattr(context, 'annotations', {}).get(PROCESS_HISTORY_KEY, []) data.update({'password': appstruct['password']}) data = { key: value for key, value in data.items() if value is not colander.null } data.pop('title') root = getSite() locale = my_locale_negotiator(request) data['locale'] = locale person = Person(**data) principals = find_service(root, 'principals') name = person.first_name + ' ' + person.last_name users = principals['users'] name = name_chooser(users, name=name) users[name] = person grant_roles(person, roles=('Member', )) grant_roles(person, (('Owner', person), )) person.state.append('active') oid = str(get_oid(context)) get_socket().send_pyobj(('stop', 'persistent_' + oid)) organization = context.organization if organization: person.setproperty('organization', organization) root.delfromproperty('preregistrations', context) person.init_annotations() person.annotations.setdefault(PROCESS_HISTORY_KEY, PersistentList()).extend(annotations) person.reindex() request.registry.notify(ActivityExecuted(self, [person], person)) root.addtoproperty('news_letter_members', person) newsletters = root.get_newsletters_automatic_registration() email = getattr(person, 'email', '') if newsletters and email: for newsletter in newsletters: newsletter.subscribe(person.first_name, person.last_name, email) transaction.commit() if email: mail_template = root.get_mail_template('registration_confiramtion', person.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title) recipientdata = get_user_data(person, 'recipient', request) message = mail_template['template'].format( login_url=request.resource_url(root, '@@login'), novaideo_title=root.title, **recipientdata) alert('email', [root.get_site_sender()], [email], subject=subject, body=message) return {'person': person}
def run_notation_process(context, request, user, members, alert_id=None): if members: subjects = [context] title = _('Mark of the cooperative behaviour of ${member}', mapping={'member': user.title}) ballot = Ballot('FPTP', members, subjects, DURATION, vote_process_id='membernotationmanagement', group_values=NOTATIONS, group_default=DEFAULT_NOTATION, group=NOTATION_GROUP) context.addtoproperty('ballots', ballot) ballot.title = title ballot.report.description_template = 'novaideo:views/templates/ballots/member_notation.pt' processes = ballot.run_ballot(context=context) for process in processes: process.execution_context.add_involved_entity('member', user) if alert_id: root = getSite() alert_data = get_user_data(user, 'user', request) alert_data.update(get_entity_data(user, 'user', request)) alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind=alert_id, **alert_data) alert_data.update(get_entity_data(context, 'subject', request)) for member in [a for a in members if getattr(a, 'email', '')]: mail_template = root.get_mail_template(alert_id, member.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title, **alert_data) email_data = get_user_data(member, 'recipient', request) alert_data.update(email_data) message = mail_template['template'].format( novaideo_title=root.title, **alert_data) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message)
def start(self, context, request, appstruct, **kw): root = getSite() if root.support_ideas: context.state = PersistentList(['submitted_support', 'published']) else: context.state = PersistentList(['published', 'submitted_support']) context.init_published_at() root.merge_keywords(context.keywords) context.reindex() user = context.author alert('internal', [root], [user], internal_kind=InternalAlertKind.moderation_alert, subjects=[context], alert_kind='moderation') if context.originalentity: # Add Nia comment alert_comment_nia( context.originalentity, request, root, internal_kind=InternalAlertKind.content_alert, subject_type='idea', alert_kind='duplicated', duplication=context ) transformed_from = context.transformed_from if transformed_from: context_type = transformed_from.__class__.__name__.lower() # Add Nia comment alert_comment_nia( transformed_from, request, root, internal_kind=InternalAlertKind.content_alert, subject_type=context_type, alert_kind='transformation_idea', idea=context ) if getattr(user, 'email', ''): mail_template = root.get_mail_template( 'publish_idea_decision', user.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(user, 'recipient', request) email_data.update(get_entity_data(context, 'subject', request)) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [user.email], subject=subject, body=message) request.registry.notify(ObjectPublished(object=context)) request.registry.notify(ActivityExecuted( self, [context], get_current(request))) return {}
def default_message(node, kw): context = node.bindings['context'] request = node.bindings['request'] mail_template = node.bindings['mail_template'] email_data = get_user_data(get_current(request), 'my', request) email_data.update(get_entity_data(context, 'subject', request)) return mail_template['template'].format(recipient_title='', recipient_first_name='', recipient_last_name='', novaideo_title=request.root.title, **email_data)
def start(self, context, request, appstruct, **kw): data = context.get_data(PersonSchema()) annotations = getattr(context, 'annotations', {}).get(PROCESS_HISTORY_KEY, []) data.update({'password': appstruct['password']}) data = {key: value for key, value in data.items() if value is not colander.null} data.pop('title') root = getSite() locale = my_locale_negotiator(request) data['locale'] = locale person = Person(**data) principals = find_service(root, 'principals') name = person.first_name + ' ' + person.last_name users = principals['users'] name = name_chooser(users, name=name) users[name] = person grant_roles(person, roles=('Member',)) grant_roles(person, (('Owner', person),)) person.state.append('active') oid = str(get_oid(context)) get_socket().send_pyobj(('stop', 'persistent_' + oid)) organization = context.organization if organization: person.setproperty('organization', organization) root.delfromproperty('preregistrations', context) person.init_annotations() person.annotations.setdefault( PROCESS_HISTORY_KEY, PersistentList()).extend(annotations) person.reindex() request.registry.notify(ActivityExecuted(self, [person], person)) root.addtoproperty('news_letter_members', person) newsletters = root.get_newsletters_automatic_registration() email = getattr(person, 'email', '') if newsletters and email: for newsletter in newsletters: newsletter.subscribe( person.first_name, person.last_name, email) transaction.commit() if email: mail_template = root.get_mail_template( 'registration_confiramtion', person.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title) recipientdata = get_user_data(person, 'recipient', request) message = mail_template['template'].format( login_url=request.resource_url(root, '@@login'), novaideo_title=root.title, **recipientdata) alert('email', [root.get_site_sender()], [email], subject=subject, body=message) return {'person': person}
def _alert_users(self, context, request, user, comment, channel): root = getSite() users = self._get_users_to_alerts(context, request, user, channel) comment_oid = getattr(comment, '__oid__', 'None') authordata = get_user_data(user, 'author', request) alert('internal', [root], users, exclude=[user], internal_kind=InternalAlertKind.comment_alert, subjects=[channel], comment_oid=comment_oid, comment_content=comment.comment, comment_kind='general_discuss', **authordata)
def default_message(node, kw): context = node.bindings['context'] request = node.bindings['request'] mail_template = node.bindings['mail_template'] email_data = get_user_data(get_current(request), 'my', request) email_data.update(get_entity_data(context, 'subject', request)) return mail_template['template'].format( recipient_title='', recipient_first_name='', recipient_last_name='', novaideo_title=request.root.title, **email_data )
def start(self, context, request, appstruct, **kw): user = get_current() report = appstruct['_object_data'] context.addtoproperty('reports', report) report.state.append('pending') context.state.append('reported') grant_roles(user=user, roles=(('Owner', report), )) report.setproperty('author', user) report.reindex() context.reindex() if hasattr(user, 'add_report'): user.add_report(context) root = getSite() # get random moderators ballots = [ b for b in getattr(context, 'ballot_processes', []) if b.id == 'contentreportdecision' ] if not ballots: moderators = get_random_users(ELECTORS_NB, [context.author]) if not moderators: ignore(context, request, root) else: author = context.author def before_start(b_proc): b_proc.content = context start_ballot(context, author, request, root, moderators, 'contentreportdecision', before_start=before_start, initiator=user, subjects=[context]) alert_data = get_ballot_alert_data(context, request, root, moderators) alert_data.update(get_user_data(author, 'recipient', request)) mail_template = root.get_mail_template('alert_report', author.user_locale) if mail_template: subject = mail_template['subject'].format(**alert_data) message = mail_template['template'].format(**alert_data) alert('email', [root.get_site_sender()], [author.email], subject=subject, body=message) return {}
def _alert_users(self, context, request, user, comment, channel): root = getSite() users = self._get_users_to_alerts(context, request, user, channel) comment_oid = getattr(comment, '__oid__', 'None') authordata = get_user_data(user, 'author', request) alert('internal', [root], users, exclude=[user], internal_kind=InternalAlertKind.comment_alert, subjects=[channel], comment_oid=comment_oid, comment_content=comment.comment, comment_kind='general_discuss', **authordata)
def start(self, context, request, appstruct, **kw): send_to_me = appstruct['send_to_me'] members = list(appstruct['members']) root = request.root user = get_current(request) if send_to_me: members.append(user) userdata = get_user_data(user, 'my', request) presentation_subject = appstruct['subject'] presentation_message = appstruct['message'] subject = presentation_subject.format(subject_title=context.title) users = [m for m in members if not isinstance(m, str)] alert('internal', [root], users, internal_kind=InternalAlertKind.content_alert, subjects=[context], alert_kind='present') email_data = get_entity_data(context, 'subject', request) email_data.update(userdata) for member in members: email_member_data = get_user_data(member, 'recipient', request) email_member_data.update(email_data) member_email = getattr(member, 'email', '') \ if not isinstance(member, str) else member if member_email: message = presentation_message.format( novaideo_title=root.title, **email_member_data ) alert('email', [root.get_site_sender()], [member_email], subject=subject, body=message) if member is not user and member_email \ and member_email not in context._email_persons_contacted: context._email_persons_contacted.append( member_email) return {}
def start(self, context, request, appstruct, **kw): root = getSite() moderators = self.process.execution_context.get_involved_collection( 'electors') alert('internal', [root], moderators, internal_kind=InternalAlertKind.moderation_alert, subjects=[context], alert_kind='moderate_report') subject_data = get_entity_data(context, 'subject', request) subject_data.update(get_user_data(context, 'subject', request)) duration = getattr(root, 'duration_moderation_vote', 7) date_end = datetime.datetime.now() + \ datetime.timedelta(days=duration) date_end_vote = to_localized_time(date_end, request, translate=True) subject_data['url_moderation_rules'] = request.resource_url( root.moderation_rules, '@@index') for moderator in [a for a in moderators if getattr(a, 'email', '')]: mail_template = root.get_mail_template('moderate_report', moderator.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title) email_data = get_user_data(moderator, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=root.title, subject_email=getattr(context, 'email', ''), date_end_vote=date_end_vote, duration=duration, **email_data) alert('email', [root.get_site_sender()], [moderator.email], subject=subject, body=message) request.registry.notify( ActivityExecuted(self, [context], get_current())) return {}
def start(self, context, request, appstruct, **kw): root = getSite() mail_template = root.get_mail_template('invitation') localizer = request.localizer roles_translate = [localizer.translate(APPLICATION_ROLES.get(r, r)) for r in getattr(context, 'roles', [])] subject = mail_template['subject'].format( novaideo_title=root.title ) email_data = get_user_data(context, 'recipient', request) email_data.update(get_entity_data(context, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [context.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() mail_template = root.get_mail_template('invitation') localizer = request.localizer roles_translate = [ localizer.translate(APPLICATION_ROLES.get(r, r)) for r in getattr(context, 'roles', []) ] subject = mail_template['subject'].format(novaideo_title=root.title) email_data = get_user_data(context, 'recipient', request) email_data.update(get_entity_data(context, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [context.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): appstruct.pop('_csrf_token_') context.opinion = PersistentDict(appstruct) context.state = PersistentList( ['examined', 'published', context.opinion['opinion']]) context.init_examined_at() context.remove_tokens() context.reindex() member = context.author root = getSite() users = list(get_users_by_preferences(context)) users.append(member) alert( 'internal', [root], users, internal_kind=InternalAlertKind.examination_alert, subjects=[context]) # Add Nia comment alert_comment_nia( context, request, root, internal_kind=InternalAlertKind.examination_alert, subject_type='idea' ) if getattr(member, 'email', ''): mail_template = root.get_mail_template( 'opinion_idea', member.user_locale) subject = mail_template['subject'].format( subject_title=context.title) localizer = request.localizer email_data = get_user_data(member, 'recipient', request) email_data.update(get_entity_data(context, 'subject', request)) message = mail_template['template'].format( opinion=localizer.translate(_(context.opinion_value)), explanation=context.opinion['explanation'], novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) request.registry.notify(ActivityExecuted( self, [context], get_current(request))) return {}
def mysubscriber_object_modified(event): content = event.object args = event.args state_source = args.get('state_source', '') state_target = args.get('state_target', '') request = get_current_request() users = get_users_by_preferences(content) root = request.root localizer = request.localizer subject_data = get_entity_data(content, 'subject', request) all_users = [] for member in users: all_users.append(member) if getattr(member, 'email', ''): mail_template = root.get_mail_template('alert_content_modified', member.user_locale) subject = mail_template['subject'].format(**subject_data) state_source_translate = state_source state_target_translate = state_target if state_source: state_source_translate = localizer.translate( get_states_mapping(member, content, state_source)) if state_target: state_target_translate = localizer.translate( get_states_mapping(member, content, state_target)) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( state_source=state_source_translate, state_target=state_target_translate, novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) alert('internal', [root], all_users, internal_kind=InternalAlertKind.content_alert, subjects=[content], alert_kind='modified')
def start(self, context, request, appstruct, **kw): root = getSite() context.state = PersistentList(['published', 'pending']) context.init_published_at() root.merge_keywords(context.keywords) context.reindex() user = appstruct.get('user', get_current(request)) author = context.author alert('internal', [root], [author], internal_kind=InternalAlertKind.moderation_alert, subjects=[context], alert_kind='moderation') # transformed_from = context.transformed_from # if transformed_from: # context_type = transformed_from.__class__.__name__.lower() # # Add Nia comment # alert_comment_nia( # transformed_from, request, root, # internal_kind=InternalAlertKind.content_alert, # subject_type=context_type, # alert_kind='transformation_challenge', # idea=context # ) if user is not author and getattr(author, 'email', ''): mail_template = root.get_mail_template( 'publish_challenge_decision', user.user_locale) subject = mail_template['subject'].format( subject_title=context.title) email_data = get_user_data(author, 'recipient', request) email_data.update(get_entity_data(context, 'subject', request)) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [author.email], subject=subject, body=message) request.registry.notify(ObjectPublished(object=context)) request.registry.notify(ActivityExecuted( self, [context], user)) return {}
def start(self, context, request, appstruct, **kw): preregistration = appstruct['_object_data'] preregistration.__name__ = gen_random_token() preregistration.locale = my_locale_negotiator(request) root = getSite() root.addtoproperty('preregistrations', preregistration) deadline = DEADLINE_PREREGISTRATION * 1000 call_id = 'persistent_' + str(get_oid(preregistration)) push_callback_after_commit(remove_expired_preregistration_callback, deadline, call_id, root=root, preregistration=preregistration) preregistration.state.append('pending') preregistration.reindex() transaction.commit() if not getattr(root, 'moderate_registration', False): accept_preregistration(request, preregistration, root) else: admins = get_users_with_role(role='SiteAdmin') alert('internal', [root], admins, internal_kind=InternalAlertKind.admin_alert, subjects=[preregistration], alert_kind='new_registration') url = request.resource_url(preregistration, '@@index') for admin in [a for a in admins if getattr(a, 'email', '')]: mail_template = root.get_mail_template( 'moderate_preregistration', admin.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title) email_data = get_user_data(admin, 'recipient', request) message = mail_template['template'].format( url=url, novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [admin.email], subject=subject, body=message) request.registry.notify(ActivityExecuted(self, [preregistration], None)) return {'preregistration': preregistration}
def accept_preregistration(request, preregistration, root): preregistration.init_deadline(datetime.datetime.now(tz=pytz.UTC)) if getattr(preregistration, 'email', ''): deadline_date = preregistration.get_deadline_date() locale = my_locale_negotiator(request) url = request.resource_url(preregistration, "") mail_template = root.get_mail_template( 'preregistration', getattr(preregistration, 'locale', locale)) email_data = get_user_data(preregistration, 'recipient', request) subject = mail_template['subject'].format(novaideo_title=root.title) deadline_str = to_localized_time(deadline_date, request, translate=True) message = mail_template['template'].format( url=url, deadline_date=deadline_str.lower(), novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [preregistration.email], subject=subject, body=message)
def accept_preregistration(request, preregistration, root): preregistration.init_deadline(datetime.datetime.now(tz=pytz.UTC)) if getattr(preregistration, 'email', ''): deadline_date = preregistration.get_deadline_date() locale = my_locale_negotiator(request) url = request.resource_url(preregistration, "") mail_template = root.get_mail_template( 'preregistration', getattr(preregistration, 'locale', locale)) email_data = get_user_data(preregistration, 'recipient', request) subject = mail_template['subject'].format( novaideo_title=root.title) deadline_str = to_localized_time( deadline_date, request, translate=True) message = mail_template['template'].format( url=url, deadline_date=deadline_str.lower(), novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [preregistration.email], subject=subject, body=message)
def start(self, context, request, appstruct, **kw): preregistration = appstruct['_object_data'] preregistration.__name__ = gen_random_token() preregistration.locale = my_locale_negotiator(request) root = getSite() root.addtoproperty('preregistrations', preregistration) deadline = DEADLINE_PREREGISTRATION * 1000 call_id = 'persistent_' + str(get_oid(preregistration)) push_callback_after_commit( remove_expired_preregistration_callback, deadline, call_id, root=root, preregistration=preregistration) preregistration.state.append('pending') preregistration.reindex() transaction.commit() if not getattr(root, 'moderate_registration', False): accept_preregistration(request, preregistration, root) else: admins = get_users_with_role(role='SiteAdmin') alert( 'internal', [root], admins, internal_kind=InternalAlertKind.admin_alert, subjects=[preregistration], alert_kind='new_registration') url = request.resource_url(preregistration, '@@index') for admin in [a for a in admins if getattr(a, 'email', '')]: mail_template = root.get_mail_template( 'moderate_preregistration', admin.user_locale) subject = mail_template['subject'].format( novaideo_title=root.title) email_data = get_user_data(admin, 'recipient', request) message = mail_template['template'].format( url=url, novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [admin.email], subject=subject, body=message) request.registry.notify(ActivityExecuted(self, [preregistration], None)) return {'preregistration': preregistration}
def start(self, context, request, appstruct, **kw): #improvement_cycle TODO no improve members = context.working_group.members root = request.root alert('internal', [root], members, internal_kind=InternalAlertKind.working_group_alert, subjects=[context], alert_kind='no_amendment') subject_data = get_entity_data(context, 'subject', request) for member in members: if getattr(member, 'email', ''): mail_template = root.get_mail_template( 'alert_amendment', member.user_locale) subject = mail_template['subject'].format(subject_title=context.title) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=request.root.title, **email_data ) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) return {}
def mysubscriber_object_published(event): content = event.object author = getattr(content, 'author', None) tree = content.tree request = get_current_request() root = request.root challenge = getattr(content, 'challenge', None) query = None challeng_followers = [] if getattr(challenge, 'is_restricted', False): novaideo_catalog = find_catalog('novaideo') challenges_index = novaideo_catalog['challenges'] query = challenges_index.any([get_oid(challenge)]) elif challenge: challeng_followers = get_users_by_preferences(challenge) alert('internal', [root], set(challeng_followers), internal_kind=InternalAlertKind.content_alert, subjects=[content], alert_kind='published_in_challenge') users = get_users_by_keywords(tree, query) subject_data = get_entity_data(content, 'subject', request) all_users = [] for member in users: all_users.append(member) if getattr(member, 'email', '') and author is not member: mail_template = root.get_mail_template('alert_new_content', member.user_locale) subject = mail_template['subject'].format(**subject_data) email_data = get_user_data(member, 'recipient', request) email_data.update(subject_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [member.email], subject=subject, body=message) if author in all_users: all_users.remove(author) alert('internal', [root], set(all_users), internal_kind=InternalAlertKind.content_alert, subjects=[content], alert_kind='published') pref_author = get_users_by_preferences(author) all_users = [u for u in pref_author if u not in set(all_users)] alert('internal', [root], all_users, internal_kind=InternalAlertKind.content_alert, subjects=[content], alert_kind='published_author', member_url=request.resource_url(author, '@@index'), member_title=getattr(author, 'title', author.__name__)) if getattr(content, 'original', None): original = content.original users = list(get_users_by_preferences(original)) users.append(original.author) alert('internal', [root], set(users), internal_kind=InternalAlertKind.content_alert, subjects=[content], alert_kind='duplicated', url=request.resource_url(original, '@@index'), duplicate_title=original.title)
def start(self, context, request, appstruct, **kw): datas = context.get_data(select(omit(InvitationSchema(), ['_csrf_token_']), ['user_title', 'roles', 'first_name', 'last_name', 'email', 'organization'])) roles = datas.pop('roles') password = appstruct['password'] datas['locale'] = my_locale_negotiator(request) person = Person(password=password, **datas) root = getSite(context) principals = find_service(root, 'principals') users = principals['users'] name = person.first_name + ' ' + person.last_name name = name_chooser(users, name=name) users[name] = person if getattr(context, 'ismanager', False) and \ context.organization: grant_roles(person, (('OrganizationResponsible', context.organization),)) person.state.append('active') grant_roles(person, roles) grant_roles(person, (('Owner', person),)) manager = context.manager root.delfromproperty('invitations', context) root.addtoproperty('news_letter_members', person) newsletters = root.get_newsletters_automatic_registration() email = getattr(person, 'email', '') if newsletters and email: for newsletter in newsletters: newsletter.subscribe( person.first_name, person.last_name, email) context.person = person if manager: mail_template = root.get_mail_template( 'accept_invitation', getattr(manager, 'user_locale', root.locale)) localizer = request.localizer email_data = get_user_data(person, 'user', request) novaideo_title = request.root.title roles_translate = [localizer.translate(APPLICATION_ROLES.get(r, r)) for r in roles] subject = mail_template['subject'].format( novaideo_title=novaideo_title, **email_data ) email_data.update(get_user_data(manager, 'recipient', request)) email_data.update(get_entity_data(person, 'user', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [manager.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() user = get_current() novaideo_catalog = find_catalog('novaideo') identifier_index = novaideo_catalog['identifier'] user_titles = {str(i).lower(): str(i) for i in root.titles} title_template = u"""{title} {first_name} {last_name}""" mail_template = root.get_mail_template('invitation') localizer = request.localizer novaideo_title = root.title xlfile = appstruct['file']['_object_data'] invitations_data = get_data_from_xl(file=xlfile, properties={ 'first_name': ('String', False), 'last_name': ('String', False), 'user_title': ('String', False), 'email': ('String', False), 'organization': ('String', False), 'ismanager': ('Boolean', False), 'roles': ('String', True) }) for invitation_data in invitations_data: email = invitation_data['email'] if email and invitation_data['first_name'] and invitation_data[ 'last_name']: query = identifier_index.any([email]) users = list(query.execute().all()) if not users: organization_title = invitation_data.pop( 'organization', None) organizations = list( get_entities_by_title([IOrganization], organization_title).all()) organization = organizations[0] if organizations else None roles = invitation_data.get('roles', []) roles = [ INVITATION_ROLES.get(r.lower()) for r in roles if r.lower() in INVITATION_ROLES ] roles = roles or ['Member'] invitation_data['roles'] = roles user_title = invitation_data['user_title'] invitation_data['user_title'] = user_titles.get( user_title.lower(), 'Mr') if user_title else 'Mr' invitation_data['title'] = title_template.format( title=invitation_data['user_title'], first_name=invitation_data['first_name'], last_name=invitation_data['last_name']) invitation = Invitation(**invitation_data) invitation.state.append('pending') invitation.setproperty('manager', user) invitation.__name__ = gen_random_token() if organization: invitation.setproperty('organization', organization) root.addtoproperty('invitations', invitation) roles_translate = [ localizer.translate(APPLICATION_ROLES.get(r, r)) for r in getattr(invitation, 'roles', []) ] subject = mail_template['subject'].format( novaideo_title=novaideo_title) email_data = get_user_data(invitation, 'recipient', request) email_data.update( get_entity_data(invitation, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [invitation.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() user = get_current() novaideo_catalog = find_catalog('novaideo') identifier_index = novaideo_catalog['identifier'] user_titles = {str(i).lower(): str(i) for i in root.titles} title_template = u"""{title} {first_name} {last_name}""" mail_template = root.get_mail_template('invitation') localizer = request.localizer novaideo_title = root.title xlfile = appstruct['file']['_object_data'] invitations_data = get_data_from_xl( file=xlfile, properties={'first_name': ('String', False), 'last_name': ('String', False), 'user_title': ('String', False), 'email': ('String', False), 'organization': ('String', False), 'ismanager': ('Boolean', False), 'roles': ('String', True)}) for invitation_data in invitations_data: email = invitation_data['email'] if email and invitation_data['first_name'] and invitation_data['last_name']: query = identifier_index.any([email]) users = list(query.execute().all()) if not users: organization_title = invitation_data.pop('organization', None) organizations = list(get_entities_by_title( [IOrganization], organization_title).all()) organization = organizations[0] if organizations else None roles = invitation_data.get('roles', []) roles = [INVITATION_ROLES.get(r.lower()) for r in roles if r.lower() in INVITATION_ROLES] roles = roles or ['Member'] invitation_data['roles'] = roles user_title = invitation_data['user_title'] invitation_data['user_title'] = user_titles.get( user_title.lower(), 'Mr') if user_title else 'Mr' invitation_data['title'] = title_template.format( title=invitation_data['user_title'], first_name=invitation_data['first_name'], last_name=invitation_data['last_name']) invitation = Invitation(**invitation_data) invitation.state.append('pending') invitation.setproperty('manager', user) invitation.__name__ = gen_random_token() if organization: invitation.setproperty('organization', organization) root.addtoproperty('invitations', invitation) roles_translate = [localizer.translate(APPLICATION_ROLES.get(r, r)) for r in getattr(invitation, 'roles', [])] subject = mail_template['subject'].format( novaideo_title=novaideo_title ) email_data = get_user_data(invitation, 'recipient', request) email_data.update(get_entity_data( invitation, 'invitation', request)) message = mail_template['template'].format( roles=", ".join(roles_translate), novaideo_title=novaideo_title, **email_data) alert('email', [root.get_site_sender()], [invitation.email], subject=subject, body=message) return {}
def start(self, context, request, appstruct, **kw): root = getSite() anonymous = appstruct.get('anonymous', False) comment = appstruct['_object_data'] context.addtoproperty('comments', comment) comment.format(request) user = appstruct.get('user', get_current()) author = user if not anonymous else user.get_mask(root) comment.setproperty('author', author) comment.state = PersistentList(['published']) grant_roles(user=author, roles=(('Owner', comment), )) content = comment.subject channel = comment.channel is_discuss = channel.is_discuss() channel.add_comment(comment) comment.reindex() if not is_discuss and content and content is not root: content.subscribe_to_channel(user) if appstruct.get('associated_contents', []): comment.set_associated_contents( appstruct['associated_contents'], author) if appstruct.get('alert', True): content_author = getattr(content, 'author', None) authors = getattr(content, 'authors', [content_author] if content_author else []) comment_author = getattr(context, 'author', None) if user in authors: authors.remove(user) if author in authors: authors.remove(author) if comment_author in authors: authors.remove(comment_author) comment_kind = 'general_discuss' if not channel.get_subject(author) \ else 'discuss' if is_discuss else 'comment' author_data = get_user_data(author, 'author', request) alert_data = get_entity_data(comment, 'comment', request) alert_data.update(author_data) alert('internal', [root], authors, internal_kind=InternalAlertKind.comment_alert, subjects=[channel], comment_kind=comment_kind, **alert_data) subject_data = get_entity_data(content, 'subject', request) alert_data.update(subject_data) mail_id = 'alert_discuss' if is_discuss else 'alert_comment' for user_to_alert in [u for u in authors if getattr(u, 'email', '')]: mail_template = root.get_mail_template( mail_id, user_to_alert.user_locale) subject = mail_template['subject'].format( **subject_data) email_data = get_user_data(user_to_alert, 'recipient', request) email_data.update(alert_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [user_to_alert.email], subject=subject, body=message) if comment_author is not user and comment_author is not author: alert('internal', [root], [comment_author], internal_kind=InternalAlertKind.comment_alert, subjects=[channel], is_respons=True, comment_kind=comment_kind, **alert_data ) if getattr(comment_author, 'email', ''): email_data = get_user_data(comment_author, 'recipient', request) email_data.update(alert_data) mail_template = root.get_mail_template( 'alert_discuss' if is_discuss else 'alert_respons', comment_author.user_locale) subject = mail_template['subject'].format( **subject_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data ) alert('email', [root.get_site_sender()], [comment_author.email], subject=subject, body=message) user.set_read_date(channel, datetime.datetime.now(tz=pytz.UTC)) return {'newcontext': comment.subject}
def start(self, context, request, appstruct, **kw): root = getSite() anonymous = appstruct.get('anonymous', False) comment = appstruct['_object_data'] context.addtoproperty('comments', comment) comment.format(request) user = appstruct.get('user', get_current()) author = user if not anonymous else user.get_mask(root) comment.setproperty('author', author) comment.state = PersistentList(['published']) grant_roles(user=author, roles=(('Owner', comment), )) content = comment.subject channel = comment.channel is_discuss = channel.is_discuss() channel.add_comment(comment) comment.reindex() if not is_discuss and content and content is not root: content.subscribe_to_channel(user) if appstruct.get('associated_contents', []): comment.set_associated_contents(appstruct['associated_contents'], author) if appstruct.get('alert', True): content_author = getattr(content, 'author', None) authors = getattr(content, 'authors', [content_author] if content_author else []) comment_author = getattr(context, 'author', None) if user in authors: authors.remove(user) if author in authors: authors.remove(author) if comment_author in authors: authors.remove(comment_author) comment_kind = 'general_discuss' if not channel.get_subject(author) \ else 'discuss' if is_discuss else 'comment' author_data = get_user_data(author, 'author', request) alert_data = get_entity_data(comment, 'comment', request) alert_data.update(author_data) alert('internal', [root], authors, internal_kind=InternalAlertKind.comment_alert, subjects=[channel], comment_kind=comment_kind, **alert_data) subject_data = get_entity_data(content, 'subject', request) alert_data.update(subject_data) mail_id = 'alert_discuss' if is_discuss else 'alert_comment' for user_to_alert in [ u for u in authors if getattr(u, 'email', '') ]: mail_template = root.get_mail_template( mail_id, user_to_alert.user_locale) subject = mail_template['subject'].format(**subject_data) email_data = get_user_data(user_to_alert, 'recipient', request) email_data.update(alert_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [user_to_alert.email], subject=subject, body=message) if comment_author is not user and comment_author is not author: alert('internal', [root], [comment_author], internal_kind=InternalAlertKind.comment_alert, subjects=[channel], is_respons=True, comment_kind=comment_kind, **alert_data) if getattr(comment_author, 'email', ''): email_data = get_user_data(comment_author, 'recipient', request) email_data.update(alert_data) mail_template = root.get_mail_template( 'alert_discuss' if is_discuss else 'alert_respons', comment_author.user_locale) subject = mail_template['subject'].format(**subject_data) message = mail_template['template'].format( novaideo_title=root.title, **email_data) alert('email', [root.get_site_sender()], [comment_author.email], subject=subject, body=message) user.set_read_date(channel, datetime.datetime.now(tz=pytz.UTC)) return {'newcontext': comment.subject}