from django.views.generic.detail import DetailView
from accounts.models import Officer
from meetings.models import CCNoticeSend, MeetingAnnounce
from .forms import SrvAnnounceSendForm, TargetedSMSForm, SMSForm, PokeCCForm
from .generators import generate_web_service_email, generate_sms_email, generate_poke_cc_email_content, \
BasicEmailGenerator, GenericEmailGenerator
from slack.api import slack_post
from events.models import BaseEvent
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth import get_user_model
from django.core.exceptions import PermissionDenied
from django.shortcuts import render, reverse
from django.http import HttpResponseRedirect
from django.db.models import Q
from django.utils import timezone
from django.template import loader
from django.http.response import HttpResponse
[docs]class MeetingAnnounceView(DetailView):
model = MeetingAnnounce
slug_field = "uuid"
template_name = "emails/email_notice.html"
# def get_context_data(self, **kwargs):
# context = super(ArticleDetailView, self).get_context_data(**kwargs)
# context['now'] = timezone.now()
# return context
[docs]class MeetingAnnounceCCView(DetailView):
model = CCNoticeSend
slug_field = "uuid"
template_name = "emails/email_notice_cc.html"
# def get_context_data(self, **kwargs):
# context = super(ArticleDetailView, self).get_context_data(**kwargs)
# context['now'] = timezone.now()
# return context
[docs]@login_required
def mk_srv_announce(request):
""" Send out a web service announcement """
context = {}
perms = ('meetings.send_mtg_notice',)
if not (request.user.has_perms(perms)):
raise PermissionDenied
if request.method == 'POST':
form = SrvAnnounceSendForm(request.POST)
if form.is_valid():
notice = form.cleaned_data
email = generate_web_service_email(notice)
email.send()
if notice['slack_channel'] not in ['', None]:
if not request.user.has_perm('slack.post_officer'):
messages.add_message(request, messages.WARNING, 'Failed to post to Slack: Permission denied')
return HttpResponseRedirect(reverse('home'))
message = notice['message'].replace('**', '&&').replace('* ', '*&').replace('*', '_')\
.replace('_&', '- ').replace('&&', '*').replace('~~', '~')
response = slack_post(notice['slack_channel'], text=message, username='LNL Webmaster')
if not response['ok']:
messages.add_message(request, messages.WARNING,
'There was an error posting to Slack: %s' % response['error'])
return HttpResponseRedirect(reverse('home'))
else:
context['form'] = form
else:
form = SrvAnnounceSendForm()
context['form'] = form
context['msg'] = "Service Announcement"
return render(request, 'form_crispy.html', context)
[docs]@login_required
@permission_required('emails.send', raise_exception=True)
def send_sms(request):
""" Send a text message to a specific user (must have opted-in to receive messages) """
context = {}
if request.method == 'POST':
form = TargetedSMSForm(request.POST)
if form.is_valid():
data = form.cleaned_data
email = generate_sms_email(data)
if email is None:
template = loader.get_template('default.html')
return HttpResponse(template.render({
'title': "Error 403: User Opted Out",
'message': "This user has not agreed to receiving text messages through this service, or has not "
"provided the required information",
'NO_FOOT': True
}, request))
email.send()
return HttpResponseRedirect(reverse('home'))
else:
form = TargetedSMSForm()
context['form'] = form
context['msg'] = "Send Text Message"
return render(request, 'form_crispy.html', context)
[docs]@login_required
@permission_required('emails.send', raise_exception=True)
def send_active_sms(request):
""" Send a text message to all active members (must have opted-in to receive text messages) """
context = {}
if request.method == 'POST':
form = SMSForm(request.POST)
if form.is_valid():
users = get_user_model().objects.filter(Q(groups__name='Active') | Q(groups__name='Officer'),
phone__isnull=False, carrier__isnull=False).exclude(carrier="")
if users.count() == 0:
template = loader.get_template('default.html')
return HttpResponse(template.render({
'title': "Error 204: No contacts found",
'message': "Your message could not be sent. 0 active members have opted in to receiving text "
"messages.",
'NO_FOOT': True
}, request))
to_addrs = []
for user in users:
to_addrs.append(''.join(e for e in user.phone if e.isalnum()) + "@" + user.carrier)
email = BasicEmailGenerator(to_emails=None, bcc=to_addrs, body=form.instance.message)
email.send()
return HttpResponseRedirect(reverse('home'))
else:
form = SMSForm()
context['form'] = form
context['msg'] = "Send Text Message to Active Members"
return render(request, 'form_crispy.html', context)
[docs]@login_required
@permission_required('events.edit_event_hours', raise_exception=True)
def poke_cc(request):
""" Send a "Poke for CC" email (searching for crew chiefs) """
context = {}
events = BaseEvent.objects.filter(approved=True, closed=False, cancelled=False, test_event=False) \
.filter(datetime_start__gt=timezone.now()).exclude().distinct()
if events.count() == 0:
return render(request, 'default.html',
{'title': 'Error 404: No events found', 'NO_FOOT': True,
'message': 'It appears there are no events in need of a crew chief'}, status=404)
if request.method == "POST":
form = PokeCCForm(request.POST)
if form.is_valid():
preview = generate_poke_cc_email_content(form.cleaned_data['events'], form.cleaned_data['message'])
if request.POST['save'] == "Preview":
form = PokeCCForm(request.POST, preview=preview)
else:
email = GenericEmailGenerator(
"Crew Chiefs Needed", request.POST['email_to'], body=preview, reply_to=[settings.EMAIL_TARGET_VP],
context={'CUSTOM_URL': True, 'UNSUB': True}
)
email.send()
if form.cleaned_data['slack'] is True:
if not request.user.has_perm('slack.post_officer'):
messages.add_message(request, messages.WARNING, 'Failed to post to Slack: Permission denied')
return HttpResponseRedirect(reverse('home'))
body = preview.replace('<strong>', '>*').replace('</strong>', '*').replace("a href='", '')\
.replace("'>", '|').replace('</a', '')
message = body.split('<hr>')[0]
details = body.split('<hr>')[1]
blocks = [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": message
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": details
}
},
]
username = 'LNL Vice President'
officer = Officer.objects.filter(user=request.user).first()
if officer:
username = officer.title
response = slack_post(settings.SLACK_TARGET_ACTIVE, text=message, content=blocks, username=username)
if not response['ok']:
messages.add_message(request, messages.WARNING,
'There was an error posting to Slack: %s' % response['error'])
return HttpResponseRedirect(reverse("home"))
else:
form = PokeCCForm()
context['form'] = form
context['msg'] = "Poke for Crew Chief"
return render(request, 'form_crispy.html', context)
[docs]@login_required
def dispatch_console(request):
""" Menu for email tools """
if not request.user.has_perm('emails.send') and not request.user.has_perm('events.edit_event_hours'):
raise PermissionDenied
return render(request, 'email_tools.html', {})