import datetime
from random import randint
from django.shortcuts import get_object_or_404, render, reverse
from django.utils import timezone
from django.http import HttpResponseRedirect
from django.core.exceptions import PermissionDenied
from django.views.decorators.http import require_GET
from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.contrib import messages
from formtools.wizard.views import SessionWizardView
from events.models import BaseEvent
from emails.generators import generate_sms_email
from pages.models import Page, OnboardingScreen
from pages.forms import OnboardingContactInfoForm, OnboardingUserInfoForm, SMSVerificationForm
from accounts.models import PhoneVerificationCode
from accounts.ldap import get_student_id
from processors import navs
from helpers.mixins import LoginRequiredMixin
[docs]def page(request, slug):
""" Generate custom page """
context = {}
page_obj = get_object_or_404(Page, slug=slug)
nav = navs(request)
context['page'] = page_obj
context['title'] = page_obj.title
context['description'] = page_obj.description
context['styles'] = page_obj.css
context['noindex'] = page_obj.noindex
# the processors are on crack :-\
context['navs'] = nav
return render(request, 'static_page.html', context, )
# context_instance=context)
[docs]@require_GET
@login_required
def onboarding_screen(request, slug):
""" Generate and display an onboarding screen """
context = {}
screen_obj = get_object_or_404(OnboardingScreen, slug=slug)
if request.user not in screen_obj.users.all() and \
len(set(request.user.groups.all()).intersection(screen_obj.groups.all())) == 0:
raise PermissionDenied
context['page'] = screen_obj
context['title'] = screen_obj.title
context['noindex'] = True
context['next_href'] = request.GET.get('next', reverse('home'))
return render(request, 'onboarding.html', context)
[docs]@login_required
def new_member_welcome(request):
""" Welcome message for new members that kicks off the onboarding process """
context = {
'format': 'title',
'page': {
'inverted': True,
'title': 'Welcome to Lens and Lights!',
'subtitle': 'Let\'s finish getting you set up',
'btn_color': 'yellow',
'btn_txt': 'Get Started',
'skip_btn': True,
'skip_color': '#999',
'skip_href': reverse('home')
},
'next_href': reverse('pages:onboarding-wizard')
}
return render(request, 'onboarding.html', context)
[docs]class OnboardingWizard(SessionWizardView, LoginRequiredMixin):
""" Onboarding wizard which helps guide new LNL members through setting up their accounts """
template_name = 'onboarding.html'
form_list = [OnboardingUserInfoForm, OnboardingContactInfoForm]
[docs] def process_step(self, form):
if self.steps.current == '1':
# Process contact info step
sms_enabled = form.cleaned_data['sms']
self.request.user.phone = form.cleaned_data['phone']
# If phone number has not been provided the user cannot enroll in SMS messaging
if form.cleaned_data['phone'] in [None, '']:
sms_enabled = 'False'
if sms_enabled == 'True':
self.request.user.carrier = form.cleaned_data['carrier']
else:
self.request.user.carrier = ''
self.request.user.save()
# Add or remove the SMS verification form based on whether or not the user opted in or out
end = len(self.form_list)
exists = False
for i in range(end):
if self.form_list[str(i)] == SMSVerificationForm:
exists = True
if sms_enabled == 'False':
del self.form_list[str(i)]
if sms_enabled == 'True':
if not exists:
self.form_list[str(end)] = SMSVerificationForm
# Generate and send the user the verification code
code = randint(100000, 999999)
message = {
"user": self.request.user,
"message": str(code) + "\nUse this code for LNL verification"
}
email = generate_sms_email(message)
email.send()
existing_code = PhoneVerificationCode.objects.filter(user=self.request.user).first()
if existing_code:
existing_code.delete()
PhoneVerificationCode.objects.create(user=self.request.user, code=code)
# Ensure carrier field is set to "Opt out" until the user has verified their phone number
self.request.user.carrier = ''
self.request.user.save()
return self.get_form_step_data(form)
[docs] def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
contact_info = form_data[1]
for form in form_list:
form.save()
if contact_info['address'] or contact_info['city'] or contact_info['state']:
if contact_info['address'] and contact_info['line_2']:
line_1 = ', '.join([contact_info['address'], contact_info['line_2']])
else:
line_1 = contact_info['address'] + contact_info['line_2']
if contact_info['city'] and contact_info['state']:
line_2 = ', '.join([contact_info['city'], contact_info['state']])
else:
line_2 = contact_info['city'] + contact_info['state']
address = '\n'.join([line_1, line_2]).strip('\n')
self.request.user.addr = address
if contact_info['sms'] == 'True' and contact_info['phone']:
self.request.user.carrier = contact_info['carrier']
self.request.user.onboarded = True
self.request.user.save()
messages.success(self.request, 'Success! Your profile has been updated.')
return HttpResponseRedirect(reverse('home'))
[docs]@require_GET
def recruitment_page(request):
""" Serve LNL's join page with list of upcoming or ongoing events """
now = timezone.now()
five_days_from_now = now + datetime.timedelta(days=5)
events = BaseEvent.objects\
.filter(approved=True, cancelled=False, sensitive=False, test_event=False, closed=False)\
.filter(datetime_end__gte=now, ccinstances__setup_start__lte=five_days_from_now)\
.order_by('datetime_start').distinct()
return render(request, 'recruitment.html', {'events': events})