Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views / im.py @ 8998f09a

History | View | Annotate | Download (29 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 176023aa Kostas Papadimitriou
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 176023aa Kostas Papadimitriou
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 176023aa Kostas Papadimitriou
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 176023aa Kostas Papadimitriou
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 176023aa Kostas Papadimitriou
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 64cd4730 Antony Chazapis
import logging
35 9a06d96f Olga Brani
import inflect
36 9a06d96f Olga Brani
37 9a06d96f Olga Brani
engine = inflect.engine()
38 64cd4730 Antony Chazapis
39 0905ccd2 Sofia Papagiannaki
from urllib import quote
40 a5cef8d0 Kostas Papadimitriou
41 c630fee6 Kostas Papadimitriou
from django.shortcuts import get_object_or_404
42 890b0eaf Sofia Papagiannaki
from django.contrib import messages
43 01ac12d5 Sofia Papagiannaki
from django.contrib.auth.decorators import login_required
44 01ac12d5 Sofia Papagiannaki
from django.core.urlresolvers import reverse
45 01ac12d5 Sofia Papagiannaki
from django.db import transaction
46 3e0a032d Sofia Papagiannaki
from django.http import HttpResponse, HttpResponseRedirect, Http404
47 01ac12d5 Sofia Papagiannaki
from django.shortcuts import redirect
48 01ac12d5 Sofia Papagiannaki
from django.utils.translation import ugettext as _
49 3e0a032d Sofia Papagiannaki
from django.core.exceptions import PermissionDenied
50 9a06d96f Olga Brani
from django.views.decorators.http import require_http_methods
51 96b44c04 Sofia Papagiannaki
from django.utils import simplejson as json
52 734107ef Kostas Papadimitriou
53 c630fee6 Kostas Papadimitriou
import astakos.im.messages as astakos_messages
54 c630fee6 Kostas Papadimitriou
55 e7cb4085 Kostas Papadimitriou
from astakos.im import activation_backends
56 3e0a032d Sofia Papagiannaki
from astakos.im.models import AstakosUser, ApprovalTerms, EmailChange, \
57 3e0a032d Sofia Papagiannaki
    AstakosUserAuthProvider, PendingThirdPartyUser, Service
58 3e0a032d Sofia Papagiannaki
from astakos.im.util import get_context, prepare_response, get_query, \
59 3e0a032d Sofia Papagiannaki
    restrict_next
60 3e0a032d Sofia Papagiannaki
from astakos.im.forms import LoginForm, InvitationForm, FeedbackForm, \
61 3e0a032d Sofia Papagiannaki
    SignApprovalTermsForm, EmailChangeForm
62 f7400729 Kostas Papadimitriou
from astakos.im.forms import ExtendedProfileForm as ProfileForm
63 3e0a032d Sofia Papagiannaki
from astakos.im.functions import send_feedback, logout as auth_logout, \
64 3e0a032d Sofia Papagiannaki
    invite as invite_func
65 e7cb4085 Kostas Papadimitriou
from astakos.im import settings
66 8998f09a Sofia Papagiannaki
from astakos.im import presentation
67 9d20fe23 Kostas Papadimitriou
from astakos.im import auth_providers as auth
68 4e03ba30 Kostas Papadimitriou
from astakos.im import quotas
69 70e11eaa Sofia Papagiannaki
from astakos.im.views.util import render_response, _resources_catalog
70 70e11eaa Sofia Papagiannaki
from astakos.im.views.decorators import cookie_fix, signed_terms_required,\
71 70e11eaa Sofia Papagiannaki
    required_auth_methods_assigned, valid_astakos_user_required
72 ae497612 Olga Brani
73 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
74 e015e9e6 Sofia Papagiannaki
75 9a06d96f Olga Brani
76 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
77 222305b7 Sofia Papagiannaki
@cookie_fix
78 270dd48d Sofia Papagiannaki
@signed_terms_required
79 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
80 890b0eaf Sofia Papagiannaki
    """
81 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
82 176023aa Kostas Papadimitriou

83 890b0eaf Sofia Papagiannaki
    **Arguments**
84 176023aa Kostas Papadimitriou

85 dcf55476 Sofia Papagiannaki
    ``login_template_name``
86 dcf55476 Sofia Papagiannaki
        A custom login template to use. This is optional; if not specified,
87 1e685275 Sofia Papagiannaki
        this will default to ``im/login.html``.
88 176023aa Kostas Papadimitriou

89 dcf55476 Sofia Papagiannaki
    ``profile_template_name``
90 dcf55476 Sofia Papagiannaki
        A custom profile template to use. This is optional; if not specified,
91 1e685275 Sofia Papagiannaki
        this will default to ``im/profile.html``.
92 176023aa Kostas Papadimitriou

93 890b0eaf Sofia Papagiannaki
    ``extra_context``
94 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
95 176023aa Kostas Papadimitriou

96 890b0eaf Sofia Papagiannaki
    **Template:**
97 176023aa Kostas Papadimitriou

98 1e685275 Sofia Papagiannaki
    im/profile.html or im/login.html or ``template_name`` keyword argument.
99 176023aa Kostas Papadimitriou

100 890b0eaf Sofia Papagiannaki
    """
101 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
102 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
103 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
104 f534fb96 Sofia Papagiannaki
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
105 792c2f3b Olga Brani
106 f7cf5257 Kostas Papadimitriou
    third_party_token = request.GET.get('key', False)
107 f7cf5257 Kostas Papadimitriou
    if third_party_token:
108 f7cf5257 Kostas Papadimitriou
        messages.info(request, astakos_messages.AUTH_PROVIDER_LOGIN_TO_ADD)
109 f7cf5257 Kostas Papadimitriou
110 ef20ea07 Sofia Papagiannaki
    return render_response(
111 ef20ea07 Sofia Papagiannaki
        template_name,
112 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
113 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
114 ef20ea07 Sofia Papagiannaki
    )
115 5ce3ce4f Sofia Papagiannaki
116 64cd4730 Antony Chazapis
117 0504f010 Kostas Papadimitriou
@require_http_methods(["POST"])
118 222305b7 Sofia Papagiannaki
@cookie_fix
119 0504f010 Kostas Papadimitriou
@valid_astakos_user_required
120 0504f010 Kostas Papadimitriou
def update_token(request):
121 0504f010 Kostas Papadimitriou
    """
122 0504f010 Kostas Papadimitriou
    Update api token view.
123 0504f010 Kostas Papadimitriou
    """
124 0504f010 Kostas Papadimitriou
    user = request.user
125 0504f010 Kostas Papadimitriou
    user.renew_token()
126 0504f010 Kostas Papadimitriou
    user.save()
127 0504f010 Kostas Papadimitriou
    messages.success(request, astakos_messages.TOKEN_UPDATED)
128 0504f010 Kostas Papadimitriou
    return HttpResponseRedirect(reverse('edit_profile'))
129 0504f010 Kostas Papadimitriou
130 0504f010 Kostas Papadimitriou
131 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
132 222305b7 Sofia Papagiannaki
@cookie_fix
133 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
134 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
135 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
136 890b0eaf Sofia Papagiannaki
    """
137 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
138 176023aa Kostas Papadimitriou

139 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for providing the invitee information.
140 890b0eaf Sofia Papagiannaki
    In case of POST checks whether the user has not run out of invitations and then
141 890b0eaf Sofia Papagiannaki
    sends an invitation email to singup to the service.
142 176023aa Kostas Papadimitriou

143 890b0eaf Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the number of the
144 890b0eaf Sofia Papagiannaki
    user invitations is going to be updated only if the email has been successfully sent.
145 176023aa Kostas Papadimitriou

146 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
147 176023aa Kostas Papadimitriou

148 890b0eaf Sofia Papagiannaki
    **Arguments**
149 176023aa Kostas Papadimitriou

150 890b0eaf Sofia Papagiannaki
    ``template_name``
151 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
152 1e685275 Sofia Papagiannaki
        this will default to ``im/invitations.html``.
153 176023aa Kostas Papadimitriou

154 890b0eaf Sofia Papagiannaki
    ``extra_context``
155 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
156 176023aa Kostas Papadimitriou

157 890b0eaf Sofia Papagiannaki
    **Template:**
158 176023aa Kostas Papadimitriou

159 1e685275 Sofia Papagiannaki
    im/invitations.html or ``template_name`` keyword argument.
160 176023aa Kostas Papadimitriou

161 890b0eaf Sofia Papagiannaki
    **Settings:**
162 176023aa Kostas Papadimitriou

163 890b0eaf Sofia Papagiannaki
    The view expectes the following settings are defined:
164 176023aa Kostas Papadimitriou

165 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
166 890b0eaf Sofia Papagiannaki
    """
167 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
168 64cd4730 Antony Chazapis
    status = None
169 64cd4730 Antony Chazapis
    message = None
170 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
171 5ce3ce4f Sofia Papagiannaki
172 18ffbee1 Sofia Papagiannaki
    inviter = request.user
173 64cd4730 Antony Chazapis
    if request.method == 'POST':
174 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
175 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
176 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
177 8f5a3a06 Sofia Papagiannaki
                try:
178 9a06d96f Olga Brani
                    email = form.cleaned_data.get('username')
179 9a06d96f Olga Brani
                    realname = form.cleaned_data.get('realname')
180 9cdb86fd Sofia Papagiannaki
                    invite_func(inviter, email, realname)
181 ae497612 Olga Brani
                    message = _(astakos_messages.INVITATION_SENT) % locals()
182 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
183 e7cb4085 Kostas Papadimitriou
                except Exception, e:
184 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
185 e7cb4085 Kostas Papadimitriou
                    raise
186 18ffbee1 Sofia Papagiannaki
                else:
187 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
188 64cd4730 Antony Chazapis
        else:
189 ae497612 Olga Brani
            message = _(astakos_messages.MAX_INVITATION_NUMBER_REACHED)
190 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
191 176023aa Kostas Papadimitriou
192 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
193 d6ae71a2 root
             'realname': inv.realname,
194 d6ae71a2 root
             'is_consumed': inv.is_consumed}
195 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
196 77e2ad52 root
    kwargs = {'inviter': inviter,
197 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
198 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
199 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
200 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
201 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
202 5ce3ce4f Sofia Papagiannaki
203 64cd4730 Antony Chazapis
204 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
205 9d20fe23 Kostas Papadimitriou
@required_auth_methods_assigned(allow_access=True)
206 890b0eaf Sofia Papagiannaki
@login_required
207 222305b7 Sofia Papagiannaki
@cookie_fix
208 270dd48d Sofia Papagiannaki
@signed_terms_required
209 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
210 890b0eaf Sofia Papagiannaki
    """
211 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
212 176023aa Kostas Papadimitriou

213 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for displaying the user information.
214 ce86cd44 Sofia Papagiannaki
    In case of POST updates the user informantion and redirects to ``next``
215 ce86cd44 Sofia Papagiannaki
    url parameter if exists.
216 176023aa Kostas Papadimitriou

217 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
218 176023aa Kostas Papadimitriou

219 890b0eaf Sofia Papagiannaki
    **Arguments**
220 176023aa Kostas Papadimitriou

221 890b0eaf Sofia Papagiannaki
    ``template_name``
222 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
223 1e685275 Sofia Papagiannaki
        this will default to ``im/profile.html``.
224 176023aa Kostas Papadimitriou

225 890b0eaf Sofia Papagiannaki
    ``extra_context``
226 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
227 176023aa Kostas Papadimitriou

228 890b0eaf Sofia Papagiannaki
    **Template:**
229 176023aa Kostas Papadimitriou

230 1e685275 Sofia Papagiannaki
    im/profile.html or ``template_name`` keyword argument.
231 176023aa Kostas Papadimitriou

232 92defad4 Sofia Papagiannaki
    **Settings:**
233 176023aa Kostas Papadimitriou

234 92defad4 Sofia Papagiannaki
    The view expectes the following settings are defined:
235 176023aa Kostas Papadimitriou

236 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
237 890b0eaf Sofia Papagiannaki
    """
238 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
239 bf0c6de5 Sofia Papagiannaki
    form = ProfileForm(
240 bf0c6de5 Sofia Papagiannaki
        instance=request.user,
241 bf0c6de5 Sofia Papagiannaki
        session_key=request.session.session_key
242 bf0c6de5 Sofia Papagiannaki
    )
243 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
244 64cd4730 Antony Chazapis
    if request.method == 'POST':
245 bf0c6de5 Sofia Papagiannaki
        form = ProfileForm(
246 bf0c6de5 Sofia Papagiannaki
            request.POST,
247 bf0c6de5 Sofia Papagiannaki
            instance=request.user,
248 bf0c6de5 Sofia Papagiannaki
            session_key=request.session.session_key
249 bf0c6de5 Sofia Papagiannaki
        )
250 890b0eaf Sofia Papagiannaki
        if form.is_valid():
251 64cd4730 Antony Chazapis
            try:
252 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
253 3fbf7863 Kostas Papadimitriou
                user = form.save(request=request)
254 217994f8 Sofia Papagiannaki
                next = restrict_next(
255 217994f8 Sofia Papagiannaki
                    request.POST.get('next'),
256 8998f09a Sofia Papagiannaki
                    domain=settings.COOKIE_DOMAIN
257 217994f8 Sofia Papagiannaki
                )
258 ae497612 Olga Brani
                msg = _(astakos_messages.PROFILE_UPDATED)
259 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
260 2da6f56b Kostas Papadimitriou
261 2da6f56b Kostas Papadimitriou
                if form.email_changed:
262 2da6f56b Kostas Papadimitriou
                    msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
263 2da6f56b Kostas Papadimitriou
                    messages.success(request, msg)
264 2da6f56b Kostas Papadimitriou
                if form.password_changed:
265 2da6f56b Kostas Papadimitriou
                    msg = _(astakos_messages.PASSWORD_CHANGED)
266 2da6f56b Kostas Papadimitriou
                    messages.success(request, msg)
267 2da6f56b Kostas Papadimitriou
268 f7400729 Kostas Papadimitriou
                if next:
269 f7400729 Kostas Papadimitriou
                    return redirect(next)
270 f7400729 Kostas Papadimitriou
                else:
271 f7400729 Kostas Papadimitriou
                    return redirect(reverse('edit_profile'))
272 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
273 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
274 23447441 Sofia Papagiannaki
    elif request.method == "GET":
275 792c2f3b Olga Brani
        request.user.is_verified = True
276 792c2f3b Olga Brani
        request.user.save()
277 792c2f3b Olga Brani
278 792c2f3b Olga Brani
    # existing providers
279 9d20fe23 Kostas Papadimitriou
    user_providers = request.user.get_enabled_auth_providers()
280 9d20fe23 Kostas Papadimitriou
    user_disabled_providers = request.user.get_disabled_auth_providers()
281 792c2f3b Olga Brani
282 792c2f3b Olga Brani
    # providers that user can add
283 792c2f3b Olga Brani
    user_available_providers = request.user.get_available_auth_providers()
284 792c2f3b Olga Brani
285 79b5d61b Sofia Papagiannaki
    extra_context['services'] = Service.catalog().values()
286 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
287 e7cb4085 Kostas Papadimitriou
                           profile_form=form,
288 e7cb4085 Kostas Papadimitriou
                           user_providers=user_providers,
289 e7cb4085 Kostas Papadimitriou
                           user_disabled_providers=user_disabled_providers,
290 e7cb4085 Kostas Papadimitriou
                           user_available_providers=user_available_providers,
291 e7cb4085 Kostas Papadimitriou
                           context_instance=get_context(request,
292 c301698f Sofia Papagiannaki
                                                          extra_context))
293 5ce3ce4f Sofia Papagiannaki
294 64cd4730 Antony Chazapis
295 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
296 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
297 222305b7 Sofia Papagiannaki
@cookie_fix
298 e7cb4085 Kostas Papadimitriou
def signup(request, template_name='im/signup.html', on_success='index',
299 e7cb4085 Kostas Papadimitriou
           extra_context=None, activation_backend=None):
300 890b0eaf Sofia Papagiannaki
    """
301 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
302 176023aa Kostas Papadimitriou

303 b669d9c0 Sofia Papagiannaki
    In case of GET request renders a form for entering the user information.
304 890b0eaf Sofia Papagiannaki
    In case of POST handles the signup.
305 176023aa Kostas Papadimitriou

306 e7cb4085 Kostas Papadimitriou
    The user activation will be delegated to the backend specified by the
307 e7cb4085 Kostas Papadimitriou
    ``activation_backend`` keyword argument if present, otherwise to the
308 e7cb4085 Kostas Papadimitriou
    ``astakos.im.activation_backends.InvitationBackend`` if
309 e7cb4085 Kostas Papadimitriou
    settings.ASTAKOS_INVITATIONS_ENABLED is True or
310 e7cb4085 Kostas Papadimitriou
    ``astakos.im.activation_backends.SimpleBackend`` if not (see
311 e7cb4085 Kostas Papadimitriou
    activation_backends);
312 5ce3ce4f Sofia Papagiannaki

313 e7cb4085 Kostas Papadimitriou
    Upon successful user creation, if ``next`` url parameter is present the
314 e7cb4085 Kostas Papadimitriou
    user is redirected there otherwise renders the same page with a success
315 e7cb4085 Kostas Papadimitriou
    message.
316 5ce3ce4f Sofia Papagiannaki

317 8f5a3a06 Sofia Papagiannaki
    On unsuccessful creation, renders ``template_name`` with an error message.
318 5ce3ce4f Sofia Papagiannaki

319 890b0eaf Sofia Papagiannaki
    **Arguments**
320 5ce3ce4f Sofia Papagiannaki

321 8f5a3a06 Sofia Papagiannaki
    ``template_name``
322 8f5a3a06 Sofia Papagiannaki
        A custom template to render. This is optional;
323 1e685275 Sofia Papagiannaki
        if not specified, this will default to ``im/signup.html``.
324 176023aa Kostas Papadimitriou

325 890b0eaf Sofia Papagiannaki
    ``extra_context``
326 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
327 176023aa Kostas Papadimitriou

328 43332a76 Kostas Papadimitriou
    ``on_success``
329 43332a76 Kostas Papadimitriou
        Resolvable view name to redirect on registration success.
330 43332a76 Kostas Papadimitriou

331 890b0eaf Sofia Papagiannaki
    **Template:**
332 5ce3ce4f Sofia Papagiannaki

333 8f5a3a06 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
334 890b0eaf Sofia Papagiannaki
    """
335 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
336 0d02a287 Sofia Papagiannaki
    if request.user.is_authenticated():
337 e7cb4085 Kostas Papadimitriou
        logger.info("%s already signed in, redirect to index",
338 e7cb4085 Kostas Papadimitriou
                    request.user.log_display)
339 e7cb4085 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('index'))
340 5ce3ce4f Sofia Papagiannaki
341 0a569195 Sofia Papagiannaki
    provider = get_query(request).get('provider', 'local')
342 9d20fe23 Kostas Papadimitriou
    if not auth.get_provider(provider).get_create_policy:
343 e7cb4085 Kostas Papadimitriou
        logger.error("%s provider not available for signup", provider)
344 279d6e51 Olga Brani
        raise PermissionDenied
345 279d6e51 Olga Brani
346 e7cb4085 Kostas Papadimitriou
    instance = None
347 6c8a3f7c Sofia Papagiannaki
348 e7cb4085 Kostas Papadimitriou
    # user registered using third party provider
349 8ab484ea Kostas Papadimitriou
    third_party_token = request.REQUEST.get('third_party_token', None)
350 9d20fe23 Kostas Papadimitriou
    unverified = None
351 c630fee6 Kostas Papadimitriou
    if third_party_token:
352 e7cb4085 Kostas Papadimitriou
        # retreive third party entry. This was created right after the initial
353 e7cb4085 Kostas Papadimitriou
        # third party provider handshake.
354 c630fee6 Kostas Papadimitriou
        pending = get_object_or_404(PendingThirdPartyUser,
355 c630fee6 Kostas Papadimitriou
                                    token=third_party_token)
356 9d20fe23 Kostas Papadimitriou
357 c630fee6 Kostas Papadimitriou
        provider = pending.provider
358 e7cb4085 Kostas Papadimitriou
359 e7cb4085 Kostas Papadimitriou
        # clone third party instance into the corresponding AstakosUser
360 c630fee6 Kostas Papadimitriou
        instance = pending.get_user_instance()
361 9d20fe23 Kostas Papadimitriou
        get_unverified = AstakosUserAuthProvider.objects.unverified
362 e7cb4085 Kostas Papadimitriou
363 e7cb4085 Kostas Papadimitriou
        # check existing unverified entries
364 9d20fe23 Kostas Papadimitriou
        unverified = get_unverified(pending.provider,
365 9d20fe23 Kostas Papadimitriou
                                    identifier=pending.third_party_identifier)
366 9d20fe23 Kostas Papadimitriou
367 9d20fe23 Kostas Papadimitriou
        if unverified and request.method == 'GET':
368 9d20fe23 Kostas Papadimitriou
            messages.warning(request, unverified.get_pending_registration_msg)
369 e7cb4085 Kostas Papadimitriou
            if unverified.user.moderated:
370 9d20fe23 Kostas Papadimitriou
                messages.warning(request,
371 9d20fe23 Kostas Papadimitriou
                                 unverified.get_pending_resend_activation_msg)
372 9d20fe23 Kostas Papadimitriou
            else:
373 9d20fe23 Kostas Papadimitriou
                messages.warning(request,
374 9d20fe23 Kostas Papadimitriou
                                 unverified.get_pending_moderation_msg)
375 8ab484ea Kostas Papadimitriou
376 e7cb4085 Kostas Papadimitriou
    # prepare activation backend based on current request
377 e7cb4085 Kostas Papadimitriou
    if not activation_backend:
378 e7cb4085 Kostas Papadimitriou
        activation_backend = activation_backends.get_backend()
379 e7cb4085 Kostas Papadimitriou
380 e7cb4085 Kostas Papadimitriou
    form_kwargs = {'instance': instance}
381 e7cb4085 Kostas Papadimitriou
    if third_party_token:
382 e7cb4085 Kostas Papadimitriou
        form_kwargs['third_party_token'] = third_party_token
383 e7cb4085 Kostas Papadimitriou
384 e7cb4085 Kostas Papadimitriou
    form = activation_backend.get_signup_form(
385 e7cb4085 Kostas Papadimitriou
        provider, None, **form_kwargs)
386 9d20fe23 Kostas Papadimitriou
387 8f5a3a06 Sofia Papagiannaki
    if request.method == 'POST':
388 e7cb4085 Kostas Papadimitriou
        form = activation_backend.get_signup_form(
389 e7cb4085 Kostas Papadimitriou
            provider,
390 e7cb4085 Kostas Papadimitriou
            request.POST,
391 e7cb4085 Kostas Papadimitriou
            **form_kwargs)
392 e7cb4085 Kostas Papadimitriou
393 8f5a3a06 Sofia Papagiannaki
        if form.is_valid():
394 e7cb4085 Kostas Papadimitriou
            commited = False
395 e7cb4085 Kostas Papadimitriou
            try:
396 e7cb4085 Kostas Papadimitriou
                user = form.save(commit=False)
397 43332a76 Kostas Papadimitriou
398 e7cb4085 Kostas Papadimitriou
                # delete previously unverified accounts
399 e7cb4085 Kostas Papadimitriou
                if AstakosUser.objects.user_exists(user.email):
400 e7cb4085 Kostas Papadimitriou
                    AstakosUser.objects.get_by_identifier(user.email).delete()
401 43332a76 Kostas Papadimitriou
402 e7cb4085 Kostas Papadimitriou
                # store_user so that user auth providers get initialized
403 9d20fe23 Kostas Papadimitriou
                form.store_user(user, request)
404 e7cb4085 Kostas Papadimitriou
                result = activation_backend.handle_registration(user)
405 e7cb4085 Kostas Papadimitriou
                if result.status == \
406 e7cb4085 Kostas Papadimitriou
                        activation_backend.Result.PENDING_MODERATION:
407 e7cb4085 Kostas Papadimitriou
                    # user should be warned that his account is not active yet
408 e7cb4085 Kostas Papadimitriou
                    status = messages.WARNING
409 e7cb4085 Kostas Papadimitriou
                else:
410 e7cb4085 Kostas Papadimitriou
                    status = messages.SUCCESS
411 18ffbee1 Sofia Papagiannaki
                message = result.message
412 e7cb4085 Kostas Papadimitriou
                activation_backend.send_result_notifications(result, user)
413 792c2f3b Olga Brani
414 e7cb4085 Kostas Papadimitriou
                # commit user entry
415 e7cb4085 Kostas Papadimitriou
                transaction.commit()
416 e7cb4085 Kostas Papadimitriou
                # commited flag
417 e7cb4085 Kostas Papadimitriou
                # in case an exception get raised from this point
418 e7cb4085 Kostas Papadimitriou
                commited = True
419 43332a76 Kostas Papadimitriou
420 8f5a3a06 Sofia Papagiannaki
                if user and user.is_active:
421 e7cb4085 Kostas Papadimitriou
                    # activation backend directly activated the user
422 e7cb4085 Kostas Papadimitriou
                    # log him in
423 8f5a3a06 Sofia Papagiannaki
                    next = request.POST.get('next', '')
424 40a0cd8b Sofia Papagiannaki
                    response = prepare_response(request, user, next=next)
425 40a0cd8b Sofia Papagiannaki
                    return response
426 43332a76 Kostas Papadimitriou
427 43332a76 Kostas Papadimitriou
                messages.add_message(request, status, message)
428 43332a76 Kostas Papadimitriou
                return HttpResponseRedirect(reverse(on_success))
429 e7cb4085 Kostas Papadimitriou
            except Exception, e:
430 e7cb4085 Kostas Papadimitriou
                if not commited:
431 e7cb4085 Kostas Papadimitriou
                    transaction.rollback()
432 e7cb4085 Kostas Papadimitriou
                raise
433 43332a76 Kostas Papadimitriou
434 8f5a3a06 Sofia Papagiannaki
    return render_response(template_name,
435 5ce3ce4f Sofia Papagiannaki
                           signup_form=form,
436 8ab484ea Kostas Papadimitriou
                           third_party_token=third_party_token,
437 5ce3ce4f Sofia Papagiannaki
                           provider=provider,
438 890b0eaf Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
439 64cd4730 Antony Chazapis
440 5ce3ce4f Sofia Papagiannaki
441 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
442 9d20fe23 Kostas Papadimitriou
@required_auth_methods_assigned(allow_access=True)
443 890b0eaf Sofia Papagiannaki
@login_required
444 222305b7 Sofia Papagiannaki
@cookie_fix
445 270dd48d Sofia Papagiannaki
@signed_terms_required
446 aab4d540 Sofia Papagiannaki
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context=None):
447 890b0eaf Sofia Papagiannaki
    """
448 890b0eaf Sofia Papagiannaki
    Allows a user to send feedback.
449 176023aa Kostas Papadimitriou

450 890b0eaf Sofia Papagiannaki
    In case of GET request renders a form for providing the feedback information.
451 890b0eaf Sofia Papagiannaki
    In case of POST sends an email to support team.
452 176023aa Kostas Papadimitriou

453 2cbaacd5 Sofia Papagiannaki
    If the user isn't logged in, redirects to settings.LOGIN_URL.
454 176023aa Kostas Papadimitriou

455 890b0eaf Sofia Papagiannaki
    **Arguments**
456 176023aa Kostas Papadimitriou

457 890b0eaf Sofia Papagiannaki
    ``template_name``
458 890b0eaf Sofia Papagiannaki
        A custom template to use. This is optional; if not specified,
459 1e685275 Sofia Papagiannaki
        this will default to ``im/feedback.html``.
460 176023aa Kostas Papadimitriou

461 890b0eaf Sofia Papagiannaki
    ``extra_context``
462 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
463 176023aa Kostas Papadimitriou

464 890b0eaf Sofia Papagiannaki
    **Template:**
465 176023aa Kostas Papadimitriou

466 1e685275 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
467 176023aa Kostas Papadimitriou

468 890b0eaf Sofia Papagiannaki
    **Settings:**
469 176023aa Kostas Papadimitriou

470 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
471 890b0eaf Sofia Papagiannaki
    """
472 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
473 64cd4730 Antony Chazapis
    if request.method == 'GET':
474 890b0eaf Sofia Papagiannaki
        form = FeedbackForm()
475 890b0eaf Sofia Papagiannaki
    if request.method == 'POST':
476 890b0eaf Sofia Papagiannaki
        if not request.user:
477 890b0eaf Sofia Papagiannaki
            return HttpResponse('Unauthorized', status=401)
478 176023aa Kostas Papadimitriou
479 890b0eaf Sofia Papagiannaki
        form = FeedbackForm(request.POST)
480 890b0eaf Sofia Papagiannaki
        if form.is_valid():
481 e9083112 Sofia Papagiannaki
            msg = form.cleaned_data['feedback_msg']
482 8f5a3a06 Sofia Papagiannaki
            data = form.cleaned_data['feedback_data']
483 860bb9f7 Sofia Papagiannaki
            send_feedback(msg, data, request.user, email_template_name)
484 860bb9f7 Sofia Papagiannaki
            message = _(astakos_messages.FEEDBACK_SENT)
485 860bb9f7 Sofia Papagiannaki
            messages.success(request, message)
486 b9f8f48a Kostas Papadimitriou
            return HttpResponseRedirect(reverse('feedback'))
487 e7cb4085 Kostas Papadimitriou
488 890b0eaf Sofia Papagiannaki
    return render_response(template_name,
489 5ce3ce4f Sofia Papagiannaki
                           feedback_form=form,
490 e7cb4085 Kostas Papadimitriou
                           context_instance=get_context(request,
491 e7cb4085 Kostas Papadimitriou
                                                        extra_context))
492 5ce3ce4f Sofia Papagiannaki
493 15efc749 Sofia Papagiannaki
494 217994f8 Sofia Papagiannaki
@require_http_methods(["GET"])
495 222305b7 Sofia Papagiannaki
@cookie_fix
496 e7cb4085 Kostas Papadimitriou
def logout(request, template='registration/logged_out.html',
497 e7cb4085 Kostas Papadimitriou
           extra_context=None):
498 63ecdd20 Sofia Papagiannaki
    """
499 b2ffa772 Sofia Papagiannaki
    Wraps `django.contrib.auth.logout`.
500 63ecdd20 Sofia Papagiannaki
    """
501 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
502 7482228b Sofia Papagiannaki
    response = HttpResponse()
503 8e45d6fd Sofia Papagiannaki
    if request.user.is_authenticated():
504 8e45d6fd Sofia Papagiannaki
        email = request.user.email
505 8e45d6fd Sofia Papagiannaki
        auth_logout(request)
506 c630fee6 Kostas Papadimitriou
    else:
507 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
508 c630fee6 Kostas Papadimitriou
        response.status_code = 301
509 c630fee6 Kostas Papadimitriou
        return response
510 c630fee6 Kostas Papadimitriou
511 217994f8 Sofia Papagiannaki
    next = restrict_next(
512 217994f8 Sofia Papagiannaki
        request.GET.get('next'),
513 8998f09a Sofia Papagiannaki
        domain=settings.COOKIE_DOMAIN
514 217994f8 Sofia Papagiannaki
    )
515 c630fee6 Kostas Papadimitriou
516 63ecdd20 Sofia Papagiannaki
    if next:
517 63ecdd20 Sofia Papagiannaki
        response['Location'] = next
518 63ecdd20 Sofia Papagiannaki
        response.status_code = 302
519 8998f09a Sofia Papagiannaki
    elif settings.LOGOUT_NEXT:
520 8998f09a Sofia Papagiannaki
        response['Location'] = settings.LOGOUT_NEXT
521 0d02a287 Sofia Papagiannaki
        response.status_code = 301
522 b2ffa772 Sofia Papagiannaki
    else:
523 9d20fe23 Kostas Papadimitriou
        last_provider = request.COOKIES.get('astakos_last_login_method', 'local')
524 9d20fe23 Kostas Papadimitriou
        provider = auth.get_provider(last_provider)
525 9d20fe23 Kostas Papadimitriou
        message = provider.get_logout_success_msg
526 9d20fe23 Kostas Papadimitriou
        extra = provider.get_logout_success_extra_msg
527 9d20fe23 Kostas Papadimitriou
        if extra:
528 9d20fe23 Kostas Papadimitriou
            message += "<br />"  + extra
529 d21d422a Kostas Papadimitriou
        messages.success(request, message)
530 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
531 c630fee6 Kostas Papadimitriou
        response.status_code = 301
532 49df775e Sofia Papagiannaki
    return response
533 2126d85d Sofia Papagiannaki
534 5ce3ce4f Sofia Papagiannaki
535 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
536 222305b7 Sofia Papagiannaki
@cookie_fix
537 683cf244 Sofia Papagiannaki
@transaction.commit_manually
538 3bb604eb Sofia Papagiannaki
def activate(request, greeting_email_template_name='im/welcome_email.txt',
539 3bb604eb Sofia Papagiannaki
             helpdesk_email_template_name='im/helpdesk_notification.txt'):
540 2126d85d Sofia Papagiannaki
    """
541 e7cb4085 Kostas Papadimitriou
    Activates the user identified by the ``auth`` request parameter, sends a
542 e7cb4085 Kostas Papadimitriou
    welcome email and renews the user token.
543 176023aa Kostas Papadimitriou

544 e7cb4085 Kostas Papadimitriou
    The view uses commit_manually decorator in order to ensure the user state
545 e7cb4085 Kostas Papadimitriou
    will be updated only if the email will be send successfully.
546 2126d85d Sofia Papagiannaki
    """
547 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
548 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
549 5ce3ce4f Sofia Papagiannaki
550 e7cb4085 Kostas Papadimitriou
    if request.user.is_authenticated():
551 e7cb4085 Kostas Papadimitriou
        message = _(astakos_messages.LOGGED_IN_WARNING)
552 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
553 92a8abc9 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('index'))
554 5ce3ce4f Sofia Papagiannaki
555 e7cb4085 Kostas Papadimitriou
    try:
556 e7cb4085 Kostas Papadimitriou
        user = AstakosUser.objects.get(verification_code=token)
557 e7cb4085 Kostas Papadimitriou
    except AstakosUser.DoesNotExist:
558 e7cb4085 Kostas Papadimitriou
        raise Http404
559 e7cb4085 Kostas Papadimitriou
560 e7cb4085 Kostas Papadimitriou
    if user.email_verified:
561 e7cb4085 Kostas Papadimitriou
        message = _(astakos_messages.ACCOUNT_ALREADY_VERIFIED)
562 89d959c9 Kostas Papadimitriou
        messages.error(request, message)
563 89d959c9 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('index'))
564 89d959c9 Kostas Papadimitriou
565 0a569195 Sofia Papagiannaki
    try:
566 e7cb4085 Kostas Papadimitriou
        backend = activation_backends.get_backend()
567 e7cb4085 Kostas Papadimitriou
        result = backend.handle_verification(user, token)
568 e7cb4085 Kostas Papadimitriou
        backend.send_result_notifications(result, user)
569 8998f09a Sofia Papagiannaki
        next = settings.ACTIVATION_REDIRECT_URL or next
570 e7cb4085 Kostas Papadimitriou
        response = HttpResponseRedirect(reverse('index'))
571 e7cb4085 Kostas Papadimitriou
        if user.is_active:
572 e7cb4085 Kostas Papadimitriou
            response = prepare_response(request, user, next, renew=True)
573 e7cb4085 Kostas Papadimitriou
            messages.success(request, _(result.message))
574 e7cb4085 Kostas Papadimitriou
        else:
575 e7cb4085 Kostas Papadimitriou
            messages.warning(request, _(result.message))
576 e7cb4085 Kostas Papadimitriou
    except Exception:
577 e7cb4085 Kostas Papadimitriou
        transaction.rollback()
578 e7cb4085 Kostas Papadimitriou
        raise
579 e7cb4085 Kostas Papadimitriou
    else:
580 ef20ea07 Sofia Papagiannaki
        transaction.commit()
581 279d6e51 Olga Brani
        return response
582 270dd48d Sofia Papagiannaki
583 5ce3ce4f Sofia Papagiannaki
584 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
585 222305b7 Sofia Papagiannaki
@cookie_fix
586 e7cb4085 Kostas Papadimitriou
def approval_terms(request, term_id=None,
587 e7cb4085 Kostas Papadimitriou
                   template_name='im/approval_terms.html', extra_context=None):
588 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
589 270dd48d Sofia Papagiannaki
    term = None
590 270dd48d Sofia Papagiannaki
    terms = None
591 270dd48d Sofia Papagiannaki
    if not term_id:
592 270dd48d Sofia Papagiannaki
        try:
593 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
594 270dd48d Sofia Papagiannaki
        except IndexError:
595 270dd48d Sofia Papagiannaki
            pass
596 270dd48d Sofia Papagiannaki
    else:
597 270dd48d Sofia Papagiannaki
        try:
598 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
599 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
600 270dd48d Sofia Papagiannaki
            pass
601 176023aa Kostas Papadimitriou
602 270dd48d Sofia Papagiannaki
    if not term:
603 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
604 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
605 64b5136c Sofia Papagiannaki
    try:
606 64b5136c Sofia Papagiannaki
        f = open(term.location, 'r')
607 64b5136c Sofia Papagiannaki
    except IOError:
608 64b5136c Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
609 64b5136c Sofia Papagiannaki
        return render_response(
610 e7cb4085 Kostas Papadimitriou
            template_name, context_instance=get_context(request,
611 e7cb4085 Kostas Papadimitriou
                                                        extra_context))
612 64b5136c Sofia Papagiannaki
613 270dd48d Sofia Papagiannaki
    terms = f.read()
614 176023aa Kostas Papadimitriou
615 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
616 217994f8 Sofia Papagiannaki
        next = restrict_next(
617 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
618 8998f09a Sofia Papagiannaki
            domain=settings.COOKIE_DOMAIN
619 217994f8 Sofia Papagiannaki
        )
620 270dd48d Sofia Papagiannaki
        if not next:
621 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
622 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
623 270dd48d Sofia Papagiannaki
        if not form.is_valid():
624 270dd48d Sofia Papagiannaki
            return render_response(template_name,
625 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
626 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
627 e7cb4085 Kostas Papadimitriou
                                   context_instance=get_context(request,
628 e7cb4085 Kostas Papadimitriou
                                                                extra_context))
629 270dd48d Sofia Papagiannaki
        user = form.save()
630 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
631 270dd48d Sofia Papagiannaki
    else:
632 586967c0 Sofia Papagiannaki
        form = None
633 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
634 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
635 270dd48d Sofia Papagiannaki
        return render_response(template_name,
636 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
637 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
638 e7cb4085 Kostas Papadimitriou
                               context_instance=get_context(request,
639 e7cb4085 Kostas Papadimitriou
                                                            extra_context))
640 5ce3ce4f Sofia Papagiannaki
641 270dd48d Sofia Papagiannaki
642 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
643 222305b7 Sofia Papagiannaki
@cookie_fix
644 49790d9d Sofia Papagiannaki
@transaction.commit_manually
645 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
646 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
647 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
648 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
649 aab4d540 Sofia Papagiannaki
                 extra_context=None):
650 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
651 53e0b8fe Kostas Papadimitriou
652 e7cb4085 Kostas Papadimitriou
    if not settings.EMAILCHANGE_ENABLED:
653 17ad5d37 Kostas Papadimitriou
        raise PermissionDenied
654 17ad5d37 Kostas Papadimitriou
655 49790d9d Sofia Papagiannaki
    if activation_key:
656 49790d9d Sofia Papagiannaki
        try:
657 0b817216 Kostas Papadimitriou
            try:
658 0b817216 Kostas Papadimitriou
                email_change = EmailChange.objects.get(
659 0b817216 Kostas Papadimitriou
                    activation_key=activation_key)
660 0b817216 Kostas Papadimitriou
            except EmailChange.DoesNotExist:
661 0b817216 Kostas Papadimitriou
                transaction.rollback()
662 0b817216 Kostas Papadimitriou
                logger.error("[change-email] Invalid or used activation "
663 0b817216 Kostas Papadimitriou
                             "code, %s", activation_key)
664 0b817216 Kostas Papadimitriou
                raise Http404
665 0b817216 Kostas Papadimitriou
666 0b817216 Kostas Papadimitriou
            if (request.user.is_authenticated() and \
667 0b817216 Kostas Papadimitriou
                request.user == email_change.user) or not \
668 10a870d5 Kostas Papadimitriou
                    request.user.is_authenticated():
669 0b817216 Kostas Papadimitriou
                user = EmailChange.objects.change_email(activation_key)
670 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
671 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
672 49790d9d Sofia Papagiannaki
                transaction.commit()
673 53e0b8fe Kostas Papadimitriou
                return HttpResponseRedirect(reverse('edit_profile'))
674 0b817216 Kostas Papadimitriou
            else:
675 0b817216 Kostas Papadimitriou
                logger.error("[change-email] Access from invalid user, %s %s",
676 0b817216 Kostas Papadimitriou
                             email_change.user, request.user.log_display)
677 0b817216 Kostas Papadimitriou
                transaction.rollback()
678 0b817216 Kostas Papadimitriou
                raise PermissionDenied
679 49790d9d Sofia Papagiannaki
        except ValueError, e:
680 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
681 53e0b8fe Kostas Papadimitriou
            transaction.rollback()
682 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('index'))
683 53e0b8fe Kostas Papadimitriou
684 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
685 e7cb4085 Kostas Papadimitriou
                               modified_user=user if 'user' in locals()
686 53e0b8fe Kostas Papadimitriou
                               else None, context_instance=get_context(request,
687 e7cb4085 Kostas Papadimitriou
                               extra_context))
688 5ce3ce4f Sofia Papagiannaki
689 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
690 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
691 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
692 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
693 53e0b8fe Kostas Papadimitriou
694 53e0b8fe Kostas Papadimitriou
    # clean up expired email changes
695 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
696 53e0b8fe Kostas Papadimitriou
        change = request.user.emailchanges.get()
697 53e0b8fe Kostas Papadimitriou
        if change.activation_key_expired():
698 53e0b8fe Kostas Papadimitriou
            change.delete()
699 53e0b8fe Kostas Papadimitriou
            transaction.commit()
700 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('email_change'))
701 53e0b8fe Kostas Papadimitriou
702 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
703 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
704 49790d9d Sofia Papagiannaki
        try:
705 9d20fe23 Kostas Papadimitriou
            ec = form.save(request, email_template_name, request)
706 e7cb4085 Kostas Papadimitriou
        except Exception, e:
707 49790d9d Sofia Papagiannaki
            transaction.rollback()
708 e7cb4085 Kostas Papadimitriou
            raise
709 49790d9d Sofia Papagiannaki
        else:
710 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
711 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
712 49790d9d Sofia Papagiannaki
            transaction.commit()
713 53e0b8fe Kostas Papadimitriou
            return HttpResponseRedirect(reverse('edit_profile'))
714 53e0b8fe Kostas Papadimitriou
715 53e0b8fe Kostas Papadimitriou
    if request.user.email_change_is_pending():
716 53e0b8fe Kostas Papadimitriou
        messages.warning(request, astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
717 53e0b8fe Kostas Papadimitriou
718 c0b26605 Sofia Papagiannaki
    return render_response(
719 c0b26605 Sofia Papagiannaki
        form_template_name,
720 c0b26605 Sofia Papagiannaki
        form=form,
721 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
722 c0b26605 Sofia Papagiannaki
    )
723 1f3b4b39 Sofia Papagiannaki
724 1f3b4b39 Sofia Papagiannaki
725 222305b7 Sofia Papagiannaki
@cookie_fix
726 e7cb4085 Kostas Papadimitriou
def send_activation(request, user_id, template_name='im/login.html',
727 e7cb4085 Kostas Papadimitriou
                    extra_context=None):
728 792c2f3b Olga Brani
729 badcb2a9 Kostas Papadimitriou
    if request.user.is_authenticated():
730 e7cb4085 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('index'))
731 badcb2a9 Kostas Papadimitriou
732 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
733 1f3b4b39 Sofia Papagiannaki
    try:
734 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
735 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
736 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
737 1f3b4b39 Sofia Papagiannaki
    else:
738 e7cb4085 Kostas Papadimitriou
        if u.email_verified:
739 e7cb4085 Kostas Papadimitriou
            logger.warning("[resend activation] Account already verified: %s",
740 e7cb4085 Kostas Papadimitriou
                           u.log_display)
741 e7cb4085 Kostas Papadimitriou
742 e7cb4085 Kostas Papadimitriou
            messages.error(request,
743 e7cb4085 Kostas Papadimitriou
                           _(astakos_messages.ACCOUNT_ALREADY_VERIFIED))
744 e7cb4085 Kostas Papadimitriou
        else:
745 e7cb4085 Kostas Papadimitriou
            activation_backend = activation_backends.get_backend()
746 e7cb4085 Kostas Papadimitriou
            activation_backend.send_user_verification_email(u)
747 e7cb4085 Kostas Papadimitriou
            messages.success(request, astakos_messages.ACTIVATION_SENT)
748 ff81d0d9 Kostas Papadimitriou
749 ff81d0d9 Kostas Papadimitriou
    return HttpResponseRedirect(reverse('index'))
750 5ce3ce4f Sofia Papagiannaki
751 73fbaec4 Sofia Papagiannaki
752 73fbaec4 Sofia Papagiannaki
@require_http_methods(["GET"])
753 222305b7 Sofia Papagiannaki
@cookie_fix
754 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
755 666c7490 Sofia Papagiannaki
def resource_usage(request):
756 e9ef5009 Kostas Papadimitriou
757 37d59b27 Kostas Papadimitriou
    resources_meta = presentation.RESOURCES
758 37d59b27 Kostas Papadimitriou
759 4e03ba30 Kostas Papadimitriou
    current_usage = quotas.get_user_quotas(request.user)
760 4e03ba30 Kostas Papadimitriou
    current_usage = json.dumps(current_usage['system'])
761 37d59b27 Kostas Papadimitriou
    resource_catalog, resource_groups = _resources_catalog(for_usage=True)
762 37d59b27 Kostas Papadimitriou
    if resource_catalog is False:
763 37d59b27 Kostas Papadimitriou
        # on fail resource_groups contains the result object
764 37d59b27 Kostas Papadimitriou
        result = resource_groups
765 37d59b27 Kostas Papadimitriou
        messages.error(request, 'Unable to retrieve system resources: %s' %
766 37d59b27 Kostas Papadimitriou
                       result.reason)
767 37d59b27 Kostas Papadimitriou
768 4e03ba30 Kostas Papadimitriou
    resource_catalog = json.dumps(resource_catalog)
769 4e03ba30 Kostas Papadimitriou
    resource_groups = json.dumps(resource_groups)
770 37d59b27 Kostas Papadimitriou
    resources_order = json.dumps(resources_meta.get('resources_order'))
771 401089d8 Kostas Papadimitriou
772 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
773 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
774 4e03ba30 Kostas Papadimitriou
                           resource_catalog=resource_catalog,
775 4e03ba30 Kostas Papadimitriou
                           resource_groups=resource_groups,
776 4e03ba30 Kostas Papadimitriou
                           resources_order=resources_order,
777 4e03ba30 Kostas Papadimitriou
                           current_usage=current_usage,
778 e7cb4085 Kostas Papadimitriou
                           token_cookie_name=settings.COOKIE_NAME,
779 4e03ba30 Kostas Papadimitriou
                           usage_update_interval=
780 e7cb4085 Kostas Papadimitriou
                           settings.USAGE_UPDATE_INTERVAL)
781 4e03ba30 Kostas Papadimitriou
782 9a06d96f Olga Brani
783 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
784 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
785 222305b7 Sofia Papagiannaki
@cookie_fix
786 9d20fe23 Kostas Papadimitriou
@valid_astakos_user_required
787 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
788 f432088a Kostas Papadimitriou
    try:
789 9d20fe23 Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=int(pk)).settings
790 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
791 f432088a Kostas Papadimitriou
        raise Http404
792 f432088a Kostas Papadimitriou
793 9d20fe23 Kostas Papadimitriou
    if provider.get_remove_policy:
794 9d20fe23 Kostas Papadimitriou
        messages.success(request, provider.get_removed_msg)
795 9d20fe23 Kostas Papadimitriou
        provider.remove_from_user()
796 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
797 d2633501 Kostas Papadimitriou
    else:
798 f432088a Kostas Papadimitriou
        raise PermissionDenied
799 5ebebb20 Olga Brani
800 792c2f3b Olga Brani
801 9d20fe23 Kostas Papadimitriou
@require_http_methods(["GET"])
802 9d20fe23 Kostas Papadimitriou
@required_auth_methods_assigned(allow_access=True)
803 9d20fe23 Kostas Papadimitriou
@login_required
804 222305b7 Sofia Papagiannaki
@cookie_fix
805 9d20fe23 Kostas Papadimitriou
@signed_terms_required
806 003d8fcf Olga Brani
def landing(request):
807 0156e40c Kostas Papadimitriou
    context = {'services': Service.catalog(orderfor='dashboard')}
808 003d8fcf Olga Brani
    return render_response(
809 003d8fcf Olga Brani
        'im/landing.html',
810 0156e40c Kostas Papadimitriou
        context_instance=get_context(request), **context)
811 b87429e1 Olga Brani
812 ca5148f2 Kostas Papadimitriou
813 b87429e1 Olga Brani
def api_access(request):
814 b87429e1 Olga Brani
    return render_response(
815 b87429e1 Olga Brani
        'im/api_access.html',
816 ca5148f2 Kostas Papadimitriou
        context_instance=get_context(request))