def send_invite_email(self): from pretalx.mail.models import QueuedMail role = _('organiser') if not self.is_orga and self.is_reviewer: role = _('reviewer') elif self.is_orga and self.is_reviewer: role = _('organiser and reviewer') if self.user: invitation_link = build_absolute_uri( 'orga:event.dashboard', event=self.event, kwargs={'event': self.event.slug}) invitation_text = _('''Hi! You have been added to the {event} team as a {role} - you can access the organiser area here: {invitation_link} See you there, The {event} crew''').format(role=role, event=self.event.name, invitation_link=invitation_link) invitation_subject = _( 'You have been granted additional privileges on {event}' ).format(event=self.event.name) to = self.user.email else: self.invitation_token = get_random_string( allowed_chars=string.ascii_lowercase + string.digits, length=20) self.save() invitation_link = build_absolute_uri( 'orga:invitation.view', event=self.event, kwargs={'code': self.invitation_token}) invitation_text = _('''Hi! You have been invited to the {event} team as a {role} - Please click here to accept: {invitation_link} See you there, The {event} crew (minus you)''').format(role=role, event=self.event.name, invitation_link=invitation_link) invitation_subject = _('You have been invited to the {event} crew' ).format(event=self.event.name) to = self.invitation_email return QueuedMail( to=to, reply_to=self.event.email, subject=str(invitation_subject), text=str(invitation_text), event=self.event, )
def reset_password(self, event, user=None): from pretalx.common.mail import mail self.pw_reset_token = get_random_string(32) self.pw_reset_time = now() self.save() if event: mail_text = event.settings.mail_text_reset context = { 'name': self.name or '', 'event': event.name, 'url': build_absolute_uri( 'cfp:event.recover', event=event, kwargs={ 'event': event.slug, 'token': self.pw_reset_token }, ), } else: context = { 'name': self.name or '', 'url': build_absolute_uri( 'orga:auth.recover', kwargs={'token': self.pw_reset_token}, ), } mail_text = _('''Hi {name}, you have requested a new password for your pretalx account. To reset your password, click on the following link: {url} If this wasn\'t you, you can just ignore this email. All the best, the pretalx robot''') mail( self, _('Password recovery'), mail_text, context, event, locale=get_language(), ) self.log_action(action='pretalx.user.password.reset', person=user, orga=bool(user))
def send(self): from pretalx.mail.models import QueuedMail invitation_link = build_absolute_uri("orga:invitation.view", kwargs={"code": self.token}) invitation_text = _("""Hi! You have been invited to the {name} event organiser team - Please click here to accept: {invitation_link} See you there, The {organiser} team""").format( name=str(self.team.name), invitation_link=invitation_link, organiser=str(self.team.organiser.name), ) invitation_subject = _("You have been invited to an organiser team") mail = QueuedMail.objects.create( to=self.email, subject=str(invitation_subject), text=str(invitation_text), ) mail.send() return mail
def _handle_new_user(self, request, email, permission=None): event = request.event if not permission: invitation_token = get_random_string(allowed_chars=string.ascii_lowercase + string.digits, length=20) permission = EventPermission.objects.create( event=event, invitation_email=email, invitation_token=invitation_token, is_orga=False, is_reviewer=True, ) invitation_link = build_absolute_uri('orga:invitation.view', event=event, kwargs={'code': permission.invitation_token}) invitation_text = _('''Hi! You have been invited to the submission review team of {event} - Please click here to accept: {invitation_link} We look forward to have you on the team!, The {event} orga crew (minus you)''').format(event=event.name, invitation_link=invitation_link) invitation_subject = _('You have been invited to the reviewer team of {event}').format(event=request.event.name) QueuedMail( event=request.event, to=email, reply_to=request.event.email, subject=str(invitation_subject), text=str(invitation_text), ).send() request.event.log_action('pretalx.invite.reviewer.send', person=request.user, orga=True) messages.success( request, _('<{email}> has been invited to your reviewer team - more reviewers help gain perspective, so … yay!').format(email=email) ) return redirect(event.orga_urls.review_settings)
def reset_password(self, event, user=None): from pretalx.common.mail import mail with transaction.atomic(): self.pw_reset_token = get_random_string(32) self.pw_reset_time = now() self.save() mail( self, _('Password recovery'), event.settings.mail_text_reset, { 'name': self.name or '', 'event': event.name, 'url': build_absolute_uri( 'cfp:event.recover', event=event, kwargs={'event': event.slug, 'token': self.pw_reset_token}, ), }, event, locale=get_language(), ) self.log_action( action='pretalx.user.password.reset', person=user, orga=bool(user) )
def post(self, request, event): email = request.POST.get('email') event = request.event invitation_token = get_random_string( allowed_chars=string.ascii_lowercase + string.digits, length=20) invitation_link = build_absolute_uri('orga:invitation.view', kwargs={'code': invitation_token}) EventPermission.objects.create( event=event, invitation_email=email, invitation_token=invitation_token, is_orga=True, ) invitation_text = _('''Hi! You have been invited to the orga crew of {event} - Please click here to accept: {invitation_link} See you there, The {event} orga crew (minus you)''').format(event=event.name, invitation_link=invitation_link) mail_send_task.apply_async(args=( [email], _('You have been invited to the orga crew of {event}').format( event=request.event.name), invitation_text, request.event.email, event.pk)) request.event.log_action('pretalx.event.invite.orga.send', person=request.user, orga=True) messages.success( request, _('<{email}> has been invited to your team - more team members help distribute the workload, so … yay!' ).format(email=email)) return redirect(request.event.orga_urls.team_settings)
def template_context_from_event(event): return { 'all_submissions_url': build_absolute_uri( 'cfp:event.user.submissions', kwargs={'event': event.slug} ), }
def send_email(self, event): email_hashed = hash_email(self.cleaned_data["email"], event) email_signed = event_sign(email_hashed, event) # For the email link, sign the hashed email address, so that no one # can just randomly create new URLs and pretend to be a user that # was validated via email. Credits for the email signing code go # to Volker Mische / @vmx vote_url = build_absolute_uri( "plugins:pretalx_public_voting:talks", kwargs={ "event": event.slug, "signed_user": email_signed }, ) mail_text = _("""Hi, you have registered to vote for submissions for {event.name}. Please confirm that this email address is valid by following this link: {vote_url} If you did not register for voting, you can ignore this email. Thank you for participating in the vote! The {event.name} organisers """) QueuedMail( event=event, to=self.cleaned_data["email"], subject=_("Public voting registration"), text=str(mail_text).format(vote_url=vote_url, event=event), ).send()
def send(self, event): from pretalx.mail.models import QueuedMail invitation_link = build_absolute_uri('orga:invitation.view', kwargs={'code': self.token}) invitation_text = _('''Hi! You have been invited to the {name} event organiser team - Please click here to accept: {invitation_link} See you there, The {event} team''').format( name=str(self.team.name), invitation_link=invitation_link, event=str(event.name) if event else str(self.team.organiser.name), ) invitation_subject = _('You have been invited to an organiser team') mail = QueuedMail.objects.create( to=self.email, event=event, subject=str(invitation_subject), text=str(invitation_text), ) if event: mail.save() else: mail.send() return mail
def reset_password(self, event, user=None, mail_text=None, orga=False): from pretalx.mail.models import QueuedMail self.pw_reset_token = get_random_string(32) self.pw_reset_time = now() self.save() if event: path = "orga:event.auth.recover" if orga else "cfp:event.recover" url = build_absolute_uri( path, kwargs={ "token": self.pw_reset_token, "event": event.slug }, ) else: url = build_absolute_uri("orga:auth.recover", kwargs={"token": self.pw_reset_token}) context = { "name": self.name or "", "url": url, } if not mail_text: mail_text = _("""Hi {name}, you have requested a new password for your pretalx account. To reset your password, click on the following link: {url} If this wasn\'t you, you can just ignore this email. All the best, the pretalx robot""") with override(self.locale): mail = QueuedMail.objects.create( subject=_("Password recovery"), text=str(mail_text).format(**context), locale=self.locale, ) mail.to_users.add(self) mail.send() self.log_action(action="pretalx.user.password.reset", person=user, orga=bool(user))
def post(self, request, event): email = request.POST.get('email') event = request.event kwargs = { 'event': event, 'invitation_email': email, 'is_orga': True, } permission = EventPermission.objects.filter(user__isnull=True, **kwargs).first() if not permission: invitation_token = get_random_string( allowed_chars=string.ascii_lowercase + string.digits, length=20) permission = EventPermission.objects.create( event=event, invitation_email=email, invitation_token=invitation_token, is_orga=True, ) messages.success( request, _('<{email}> has been invited to your team - more team members help distribute the workload, so … yay!' ).format(email=email)) else: invitation_token = permission.invitation_token messages.info( request, _('<{email}> had already been invited – we\'ve resent the invitation instead :)' ).format(email=email), ) invitation_link = build_absolute_uri('orga:invitation.view', kwargs={'code': invitation_token}) invitation_text = _('''Hi! You have been invited to the orga crew of {event} - Please click here to accept: {invitation_link} See you there, The {event} orga crew (minus you)''').format(event=event.name, invitation_link=invitation_link) invitation_subject = _( 'You have been invited to the orga crew of {event}').format( event=request.event.name) QueuedMail(event=event, to=email, reply_to=request.event.email, subject=str(invitation_subject), text=str(invitation_text)).send() request.event.log_action('pretalx.event.invite.orga.send', person=request.user, orga=True) return redirect(request.event.orga_urls.team_settings)
def template_context_from_submission(submission): ctx = template_context_from_event(submission.event) ctx.update({ 'confirmation_link': build_absolute_uri('cfp:event.user.submission.confirm', kwargs={ 'event': submission.event.slug, 'id': submission.pk }), 'event_name': submission.event.name, 'submission_title': submission.title, 'submission_url': build_absolute_uri('cfp:event.user.submission.edit', kwargs={ 'event': submission.event.slug, 'id': submission.pk }), }) return ctx
def footer_link_pages(sender, request=None, **kwargs): return [{ "label": page.title, "link": build_absolute_uri( "plugins:pretalx_pages:show", event=sender, kwargs={ "event": sender.slug, "slug": page.slug }, ), } for page in Page.objects.filter(event=sender, link_in_footer=True)]
def template_context_from_submission(submission): ctx = template_context_from_event(submission.event) ctx.update({ 'confirmation_link': build_absolute_uri( 'cfp:event.user.submission.confirm', kwargs={'event': submission.event.slug, 'code': submission.code} ), 'event_name': submission.event.name, 'submission_title': submission.title, 'submission_url': submission.urls.user_base.full(scheme='https', hostname=settings.SITE_NETLOC), 'speakers': submission.display_speaker_names, 'orga_url': submission.orga_urls.base.full(scheme='https', hostname=settings.SITE_NETLOC), }) return ctx
def create_user_as_orga(email, submission=None): if not email: return nick = email.split('@')[0].lower() while User.objects.filter(nick__iexact=nick).exists(): nick += random.choice([ '_1', '_2', '_11', '_42', '_the_first', '_the_third', '_speaker', '_third_of_their_name', '_', '123', nick ]) user = User.objects.create_user( nick=nick, password=get_random_string(32), email=email.lower(), pw_reset_token=get_random_string(32), pw_reset_time=now() + timedelta(days=7), ) SpeakerProfile.objects.get_or_create(user=user, event=submission.event) with override(submission.content_locale): invitation_link = build_absolute_uri('cfp:event.recover', kwargs={ 'event': submission.event.slug, 'token': user.pw_reset_token }) invitation_text = _('''Hi! You have been set as the speaker of a submission to the Call for Participation of {event}, titled »{title}«. An account has been created for you – please follow this link to set your account password. {invitation_link} Afterwards, you can edit your user profile and see the state of your submission. The {event} orga crew''').format(event=submission.event.name, title=submission.title, invitation_link=invitation_link) QueuedMail.objects.create( event=submission.event, to=user.email, reply_to=submission.event.email, subject=str( _('You have been added to a submission for {event}').format( event=submission.event.name)), text=invitation_text, ) return user
def form_valid(self, form): user = form.cleaned_data['user'] if not user: messages.success(self.request, phrases.cfp.auth_password_reset) return redirect( reverse('cfp:event.login', kwargs={'event': self.request.event.slug})) if user.pw_reset_time and ( now() - user.pw_reset_time).total_seconds() < 3600 * 24: messages.error(self.request, phrases.cfp.auth_already_requested) return redirect( reverse('cfp:event.reset', kwargs={'event': self.request.event.slug})) try: user.pw_reset_token = get_random_string(32) user.pw_reset_time = now() user.save() mail(user, _('Password recovery'), self.request.event.settings.mail_text_reset, { 'name': user.name or user.nick, 'event': self.request.event.name, 'url': build_absolute_uri('cfp:event.recover', event=self.request.event, kwargs={ 'event': self.request.event.slug, 'token': user.pw_reset_token, }) }, self.request.event, locale=get_language()) except SendMailException: messages.error(self.request, phrases.base.error_sending_mail) return self.get(self.request, *self.args, **self.kwargs) messages.success(self.request, phrases.cfp.auth_password_reset) user.log_action('pretalx.user.password.reset') return redirect( reverse('cfp:event.login', kwargs={'event': self.request.event.slug}))
def create_user_as_orga(email, submission=None, name=None): form = OrgaSpeakerForm({"name": name, "email": email}) form.is_valid() user = User.objects.create_user( password=get_random_string(32), email=form.cleaned_data["email"].lower().strip(), name=form.cleaned_data.get("name").strip(), pw_reset_token=get_random_string(32), pw_reset_time=now() + dt.timedelta(days=7), ) SpeakerProfile.objects.get_or_create(user=user, event=submission.event) with override(submission.content_locale): invitation_link = build_absolute_uri( "cfp:event.recover", kwargs={"event": submission.event.slug, "token": user.pw_reset_token}, ) invitation_text = _( """Hi! You have been set as the speaker of a proposal to the Call for Participation of {event}, titled “{title}”. An account has been created for you – please follow this link to set your account password. {invitation_link} Afterwards, you can edit your user profile and see the state of your proposal. The {event} orga crew""" ).format( event=submission.event.name, title=submission.title, invitation_link=invitation_link, ) mail = QueuedMail.objects.create( event=submission.event, reply_to=submission.event.email, subject=str( _("You have been added to a proposal for {event}").format( event=submission.event.name ) ), text=invitation_text, ) mail.to_users.add(user) return user
def create_user_as_orga(email, submission=None, name=None): if not email: return None user = User.objects.create_user( password=get_random_string(32), email=email.lower(), name=name, pw_reset_token=get_random_string(32), pw_reset_time=now() + timedelta(days=7), ) SpeakerProfile.objects.get_or_create(user=user, event=submission.event) with override(submission.content_locale): invitation_link = build_absolute_uri( 'cfp:event.recover', kwargs={'event': submission.event.slug, 'token': user.pw_reset_token}, ) invitation_text = _( '''Hi! You have been set as the speaker of a submission to the Call for Participation of {event}, titled »{title}«. An account has been created for you – please follow this link to set your account password. {invitation_link} Afterwards, you can edit your user profile and see the state of your submission. The {event} orga crew''' ).format( event=submission.event.name, title=submission.title, invitation_link=invitation_link, ) QueuedMail.objects.create( event=submission.event, to=user.email, reply_to=submission.event.email, subject=str( _('You have been added to a submission for {event}').format( event=submission.event.name ) ), text=invitation_text, ) return user
def form_valid(self, form): user = form.cleaned_data['user'] if user.pw_reset_time and (now() - user.pw_reset_time).total_seconds() < 3600 * 24: messages.error(self.request, _('You already requested a new password within the last 24 hours.')) return redirect(reverse('cfp:event.reset', kwargs={ 'event': self.request.event.slug })) try: user.pw_reset_token = get_random_string(32) user.pw_reset_time = now() user.save() mail( user, _('Password recovery'), self.request.event.settings.mail_text_reset, { 'name': user.name or user.nick, 'event': self.request.event.name, 'url': build_absolute_uri( 'cfp:event.recover', kwargs={ 'event': self.request.event.slug, 'token': user.pw_reset_token, } ) }, self.request.event, locale=get_language() ) except SendMailException: messages.error(self.request, _('There was an error sending the mail. Please try again later.')) return self.get(self.request, *self.args, **self.kwargs) messages.success(self.request, _('We will send you an e-mail containing further instructions. If you don\'t ' 'see the email within the next minutes, check your spam inbox!')) user.log_action('pretalx.user.password.reset') return redirect(reverse('cfp:event.login', kwargs={ 'event': self.request.event.slug }))
def reset_password(self, event): from pretalx.common.mail import mail with transaction.atomic(): self.pw_reset_token = get_random_string(32) self.pw_reset_time = now() self.save() mail(self, _('Password recovery'), event.settings.mail_text_reset, { 'name': self.name or self.nick, 'event': event.name, 'url': build_absolute_uri('cfp:event.recover', event=event, kwargs={ 'event': event.slug, 'token': self.pw_reset_token, }) }, event, locale=get_language())
def reset_password(self, event, user=None): from pretalx.mail.models import QueuedMail self.pw_reset_token = get_random_string(32) self.pw_reset_time = now() self.save() context = { 'name': self.name or '', 'url': build_absolute_uri( 'orga:auth.recover', kwargs={'token': self.pw_reset_token} ), } mail_text = _( '''Hi {name}, you have requested a new password for your pretalx account. To reset your password, click on the following link: {url} If this wasn\'t you, you can just ignore this email. All the best, the pretalx robot''' ) with override(get_language()): mail = QueuedMail.objects.create( subject=_('Password recovery'), text=str(mail_text).format(**context), ) mail.to_users.add(self) mail.send() self.log_action( action='pretalx.user.password.reset', person=user, orga=bool(user) )