views.py 9.7 KB
Newer Older
1 2 3
# standard library imports
from __future__ import absolute_import, print_function
from distutils.util import strtobool
4
from datetime import date
5
# core django imports
6
from django.shortcuts import redirect
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
7
from django.views.generic import FormView
8 9 10 11 12 13
from django.core.urlresolvers import reverse
from django.contrib import messages
# third party imports
from braces.views import LoginRequiredMixin
from ratelimit.decorators import ratelimit
# imports from your apps
Daniel W Bond's avatar
Daniel W Bond committed
14
from accounts.models import Confirmation, Major
15
from core.utils import create_email, no_nums, get_semester
16 17 18
from housing.models import Room
from .forms import (WelcomeNameForm, WelcomeMajorForm,
                    WelcomePrivacyForm, WelcomeSocialForm)
Daniel W Bond's avatar
Daniel W Bond committed
19

20 21 22 23 24 25

settings_redirect = """You've already finished the welcome walkthrough.
                       Your user settings can now be changed here on this page."""


class WelcomeName(LoginRequiredMixin, FormView):
Daniel W Bond's avatar
Daniel W Bond committed
26 27
    """Student adds first and last name, and gender and gender display."""

28 29 30 31
    template_name = 'welcome_name.html'
    form_class = WelcomeNameForm
    login_url = 'login'

Daniel W Bond's avatar
Daniel W Bond committed
32 33
    # students are redirected to the normal settings page once they have completed
    # the welcome walkthrough in its entirety
34 35 36 37
    def get(self, request, *args, **kwargs):

        if self.request.user.student.totally_done():
            messages.add_message(request, messages.INFO, settings_redirect)
38
            return redirect(reverse('update_student',
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
39
                            kwargs={'slug': self.request.user.username}))
40 41 42
        else:
            return super(WelcomeName, self).get(request, *args, **kwargs)

43
    def get_initial(self):
44
        me = self.request.user.student
45

46 47 48 49
        initial = {'first_name': me.user.first_name,
                   'last_name': me.user.last_name,
                   'gender': me.gender,
                   'show_gender': me.show_gender, }
50

51
        return initial
52 53 54 55 56 57 58

    @ratelimit(key='user', rate='5/m', method='POST', block=True)
    @ratelimit(key='user', rate='10/d', method='POST', block=True)
    def post(self, request, *args, **kwargs):
        return super(WelcomeName, self).post(request, *args, **kwargs)

    def form_valid(self, form):
59
        me = self.request.user.student
60

61 62
        me.user.first_name = no_nums(form.data['first_name'])
        me.user.last_name = no_nums(form.data['last_name'])
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

        me.gender = form.data.getlist('gender')
        me.show_gender = strtobool(form.data.get('show_gender', 'False'))

        me.completedName = True

        me.user.save()
        me.save()

        return super(WelcomeName, self).form_valid(form)

    def get_success_url(self):
        return reverse('welcomePrivacy')


class WelcomePrivacy(LoginRequiredMixin, FormView):
Daniel W Bond's avatar
Daniel W Bond committed
79 80
    """Student adds off-or-on campus status, and if on-campus, housing and privacy."""

81 82 83 84 85 86 87 88
    form_class = WelcomePrivacyForm
    template_name = 'welcome_privacy.html'
    login_url = 'login'

    def get(self, request, *args, **kwargs):

        if self.request.user.student.totally_done():
            messages.add_message(request, messages.INFO, settings_redirect)
89
            return redirect(reverse('update_student',
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
90
                            kwargs={'slug': self.request.user.username}))
91 92 93
        else:
            return super(WelcomePrivacy, self).get(request, *args, **kwargs)

94
    def get_initial(self):
95
        me = self.request.user.student
96

97 98 99 100 101 102 103 104 105
        initial={'on_campus': me.on_campus,
                 'privacy': me.privacy, }

        return initial

    def get_form(self):
        form = super(WelcomePrivacy, self).get_form(WelcomePrivacyForm)

        me = self.request.user.student
106 107 108

        form.fields['room'].widget.user = self.request.user

109 110 111 112 113 114
        return form

    def get_context_data(self, **kwargs):
        context = super(WelcomePrivacy, self).get_context_data(**kwargs)

        me = self.request.user.student
115 116 117 118 119 120 121 122 123 124 125

        context['student'] = me

        return context

    @ratelimit(key='user', rate='5/m', method='POST', block=True)
    @ratelimit(key='user', rate='10/d', method='POST', block=True)
    def post(self, request, *args, **kwargs):
        return super(WelcomePrivacy, self).post(request, *args, **kwargs)

    def form_valid(self, form):
126
        me = self.request.user.student
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

        current_room = me.room

        # if you somehow got around the hidden widget, you're still outta luck
        if me.recent_changes() > 2:
            form_room = current_room
        else:
            try:
                form_room = Room.objects.get(pk=form.data['room'])
            except:
                form_room = None

        # casts to an integer, 0 or 1
        on_campus = strtobool(form.data.get('on_campus', 'True'))

        # no room if you move off campus
        if not on_campus:
            form_room = None

        if current_room != form_room:
            form.instance.times_changed_room += 1
            Confirmation.objects.filter(student=me).delete()

        me.on_campus = on_campus
        me.room = form_room

153 154 155 156 157
        if not(me.on_campus):
            me.privacy = 'students'
        else:
            me.privacy = form.data['privacy']

158 159 160 161 162 163 164 165 166 167 168
        me.completedPrivacy = True

        me.save()

        return super(WelcomePrivacy, self).form_valid(form)

    def get_success_url(self):
        return reverse('welcomeMajor')


class WelcomeMajor(LoginRequiredMixin, FormView):
Daniel W Bond's avatar
Daniel W Bond committed
169 170
    """Student adds major and graduation year."""

171 172 173 174 175 176 177 178
    template_name = 'welcome_major.html'
    form_class = WelcomeMajorForm
    login_url = 'login'

    def get(self, request, *args, **kwargs):

        if self.request.user.student.totally_done():
            messages.add_message(request, messages.INFO, settings_redirect)
179
            return redirect(reverse('update_student',
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
180
                            kwargs={'slug': self.request.user.username}))
181 182 183
        else:
            return super(WelcomeMajor, self).get(request, *args, **kwargs)

184 185 186 187 188 189 190 191
    def get_initial(self):
        me = self.request.user.student

        initial={'major': me.major.all(),
                 'graduating_year': me.graduating_year, }

        return initial

192 193 194
    def get_context_data(self, **kwargs):
        context = super(WelcomeMajor, self).get_context_data(**kwargs)

195
        me = self.request.user.student
196 197 198 199 200 201 202 203 204 205 206 207

        context['student'] = me

        return context

    @ratelimit(key='user', rate='5/m', method='POST', block=True)
    @ratelimit(key='user', rate='10/d', method='POST', block=True)
    def post(self, request, *args, **kwargs):
        return super(WelcomeMajor, self).post(request, *args, **kwargs)

    def form_valid(self, form):

208
        me = self.request.user.student
209

210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
        try:
            # see UpdateStudent in accounts/ for a detailed explanation
            # but m2m fields are more difficult to manage than other relationships
            form_major_pks = set(form.data.getlist('major')[:2])
            form_majors = [Major.objects.get(pk=pk) for pk in form_major_pks]
            # a student likely won't have any majors on the welcome walkthrough
            # using Python's implicit evaluation (empty is False, anything is True)
            if me.major.all():
                for current_major in me.major.all():
                    if current_major not in form_majors:
                        me.major.remove(current_major)
            for form_major in form_majors:
                if form_major not in me.major.all():
                    me.major.add(form_major)
        except:
            pass

227 228 229 230 231 232 233 234 235 236 237 238 239
        me.graduating_year = form.instance.graduating_year

        me.completedMajor = True

        me.save()

        return super(WelcomeMajor, self).form_valid(form)

    def get_success_url(self):
        return reverse('welcomeSocial')


class WelcomeSocial(LoginRequiredMixin, FormView):
Daniel W Bond's avatar
Daniel W Bond committed
240 241
    """Student connects social media accounts. Redirects to settings page when done."""

242 243 244 245 246 247 248 249
    form_class = WelcomeSocialForm
    template_name = 'welcome_social.html'
    login_url = 'login'

    def get(self, request, *args, **kwargs):

        if self.request.user.student.totally_done():
            messages.add_message(request, messages.INFO, settings_redirect)
250
            return redirect(reverse('update_student',
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
251
                            kwargs={'slug': self.request.user.username}))
252 253 254 255 256 257
        else:
            return super(WelcomeSocial, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(WelcomeSocial, self).get_context_data(**kwargs)

258
        me = self.request.user.student
259 260 261 262 263 264 265 266 267 268 269

        context['student'] = me

        return context

    @ratelimit(key='user', rate='5/m', method='POST', block=True)
    @ratelimit(key='user', rate='10/d', method='POST', block=True)
    def post(self, request, *args, **kwargs):
        return super(WelcomeSocial, self).post(request, *args, **kwargs)

    def form_valid(self, form):
270
        me = self.request.user.student
271 272 273 274 275

        me.completedSocial = True

        me.save()

276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
        # send students a welcome email
        text_path = 'email/welcome.txt'
        html_path = 'email/welcome.html'

        today = date.today()
        semester = "%s %s" % (get_semester(today), today.strftime('%Y'))

        context = {
            'student_name': me.get_first_name_or_uname,
            'semester': semester
        }

        subject = "Welcome to Roomlist, %s" % me.get_first_name_or_uname()
        to = me.user.email

        welcome_email = create_email(text_path, html_path, subject, to, context)

        welcome_email.send()

295 296 297 298 299 300 301 302 303
        return super(WelcomeSocial, self).form_valid(form)

    def get_success_url(self):

        if self.request.user.student.totally_done():
            messages.add_message(self.request, messages.SUCCESS,
                                 "You successfully finished the welcome walkthrough!")

        return reverse('detail_student',
Daniel W Bond's avatar
pep8 me  
Daniel W Bond committed
304
                       kwargs={'slug': self.request.user.username})