Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ 3b258643

History | View | Annotate | Download (52.2 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 6e029beb Sofia Papagiannaki
import calendar
36 9a06d96f Olga Brani
import inflect
37 9a06d96f Olga Brani
38 9a06d96f Olga Brani
engine = inflect.engine()
39 64cd4730 Antony Chazapis
40 0905ccd2 Sofia Papagiannaki
from urllib import quote
41 63ecdd20 Sofia Papagiannaki
from functools import wraps
42 c0b26605 Sofia Papagiannaki
from datetime import datetime
43 64cd4730 Antony Chazapis
44 c630fee6 Kostas Papadimitriou
from django.shortcuts import get_object_or_404
45 890b0eaf Sofia Papagiannaki
from django.contrib import messages
46 01ac12d5 Sofia Papagiannaki
from django.contrib.auth.decorators import login_required
47 01ac12d5 Sofia Papagiannaki
from django.core.urlresolvers import reverse
48 01ac12d5 Sofia Papagiannaki
from django.db import transaction
49 01ac12d5 Sofia Papagiannaki
from django.db.utils import IntegrityError
50 9a06d96f Olga Brani
from django.http import (HttpResponse, HttpResponseBadRequest,
51 9a06d96f Olga Brani
                         HttpResponseForbidden, HttpResponseRedirect,
52 9a06d96f Olga Brani
                         HttpResponseBadRequest, Http404)
53 01ac12d5 Sofia Papagiannaki
from django.shortcuts import redirect
54 661c4479 Sofia Papagiannaki
from django.template import RequestContext, loader as template_loader
55 01ac12d5 Sofia Papagiannaki
from django.utils.http import urlencode
56 01ac12d5 Sofia Papagiannaki
from django.utils.translation import ugettext as _
57 c0b26605 Sofia Papagiannaki
from django.views.generic.create_update import (delete_object,
58 de4ed385 Sofia Papagiannaki
                                                get_model_and_form_class)
59 c0b26605 Sofia Papagiannaki
from django.views.generic.list_detail import object_list
60 661c4479 Sofia Papagiannaki
from django.core.xheaders import populate_xheaders
61 792c2f3b Olga Brani
from django.core.exceptions import ValidationError, PermissionDenied
62 c0b26605 Sofia Papagiannaki
from django.template.loader import render_to_string
63 9a06d96f Olga Brani
from django.views.decorators.http import require_http_methods
64 29b0ec5a Sofia Papagiannaki
from django.db.models import Q
65 c0b26605 Sofia Papagiannaki
66 c630fee6 Kostas Papadimitriou
import astakos.im.messages as astakos_messages
67 c630fee6 Kostas Papadimitriou
68 29b0ec5a Sofia Papagiannaki
from astakos.im.activation_backends import get_backend, SimpleBackend
69 c0b26605 Sofia Papagiannaki
from astakos.im.models import (AstakosUser, ApprovalTerms, AstakosGroup,
70 c0b26605 Sofia Papagiannaki
                               EmailChange, GroupKind, Membership,
71 c630fee6 Kostas Papadimitriou
                               RESOURCE_SEPARATOR, AstakosUserAuthProvider,
72 c630fee6 Kostas Papadimitriou
                               PendingThirdPartyUser)
73 c0b26605 Sofia Papagiannaki
from astakos.im.util import get_context, prepare_response, get_query, restrict_next
74 51c57c9c Sofia Papagiannaki
from astakos.im.forms import (LoginForm, InvitationForm, ProfileForm,
75 51c57c9c Sofia Papagiannaki
                              FeedbackForm, SignApprovalTermsForm,
76 c0b26605 Sofia Papagiannaki
                              EmailChangeForm,
77 51c57c9c Sofia Papagiannaki
                              AstakosGroupCreationForm, AstakosGroupSearchForm,
78 789bcaf9 Sofia Papagiannaki
                              AstakosGroupUpdateForm, AddGroupMembersForm,
79 098f333b Sofia Papagiannaki
                              MembersSortForm, AstakosGroupSortForm,
80 29b87e7c Sofia Papagiannaki
                              TimelineForm, PickResourceForm,
81 29b87e7c Sofia Papagiannaki
                              AstakosGroupCreationSummaryForm)
82 aab4d540 Sofia Papagiannaki
from astakos.im.functions import (send_feedback, SendMailError,
83 9a06d96f Olga Brani
                                  logout as auth_logout,
84 51c57c9c Sofia Papagiannaki
                                  activate as activate_func,
85 c0b26605 Sofia Papagiannaki
                                  send_activation as send_activation_func,
86 9a06d96f Olga Brani
                                  send_group_creation_notification,
87 51c57c9c Sofia Papagiannaki
                                  SendNotificationError)
88 b6852727 Olga Brani
from astakos.im.endpoints.qh import timeline_charge
89 c0b26605 Sofia Papagiannaki
from astakos.im.settings import (COOKIE_DOMAIN, LOGOUT_NEXT,
90 59728d4e Olga Brani
                                 LOGGING_LEVEL, PAGINATE_BY, RESOURCES_PRESENTATION_DATA, PAGINATE_BY_ALL)
91 f8f86e83 root
#from astakos.im.tasks import request_billing
92 820b18e0 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
93 64cd4730 Antony Chazapis
94 792c2f3b Olga Brani
from astakos.im import settings
95 792c2f3b Olga Brani
from astakos.im import auth_providers
96 ae497612 Olga Brani
97 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
98 e015e9e6 Sofia Papagiannaki
99 820b18e0 Sofia Papagiannaki
callpoint = AstakosCallpoint()
100 9a06d96f Olga Brani
101 b2ffa772 Sofia Papagiannaki
def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
102 890b0eaf Sofia Papagiannaki
    """
103 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
104 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
105 890b0eaf Sofia Papagiannaki
    specified ``status``.
106 890b0eaf Sofia Papagiannaki
    """
107 64cd4730 Antony Chazapis
    if tab is None:
108 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
109 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
110 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
111 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
112 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
113 c301698f Sofia Papagiannaki
    return response
114 64cd4730 Antony Chazapis
115 792c2f3b Olga Brani
def requires_auth_provider(provider_id, **perms):
116 792c2f3b Olga Brani
    """
117 792c2f3b Olga Brani
    """
118 792c2f3b Olga Brani
    def decorator(func, *args, **kwargs):
119 792c2f3b Olga Brani
        @wraps(func)
120 792c2f3b Olga Brani
        def wrapper(request, *args, **kwargs):
121 792c2f3b Olga Brani
            provider = auth_providers.get_provider(provider_id)
122 792c2f3b Olga Brani
123 792c2f3b Olga Brani
            if not provider or not provider.is_active():
124 792c2f3b Olga Brani
                raise PermissionDenied
125 792c2f3b Olga Brani
126 792c2f3b Olga Brani
            if provider:
127 792c2f3b Olga Brani
                for pkey, value in perms.iteritems():
128 792c2f3b Olga Brani
                    attr = 'is_available_for_%s' % pkey.lower()
129 792c2f3b Olga Brani
                    if getattr(provider, attr)() != value:
130 c4b1a172 Kostas Papadimitriou
                        msg = provider.get_message("NOT_ACTIVE_FOR_" + pkey.upper())
131 c4b1a172 Kostas Papadimitriou
                        messages.error(request, msg)
132 c630fee6 Kostas Papadimitriou
                        return HttpResponseRedirect(reverse('login'))
133 792c2f3b Olga Brani
            return func(request, *args)
134 792c2f3b Olga Brani
        return wrapper
135 792c2f3b Olga Brani
    return decorator
136 792c2f3b Olga Brani
137 63ecdd20 Sofia Papagiannaki
138 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
139 63ecdd20 Sofia Papagiannaki
    """
140 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
141 7482228b Sofia Papagiannaki
    redirects to `logout`.
142 63ecdd20 Sofia Papagiannaki
    """
143 63ecdd20 Sofia Papagiannaki
    @wraps(func)
144 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
145 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
146 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
147 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
148 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
149 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
150 63ecdd20 Sofia Papagiannaki
    return wrapper
151 63ecdd20 Sofia Papagiannaki
152 5ce3ce4f Sofia Papagiannaki
153 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
154 270dd48d Sofia Papagiannaki
    """
155 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is Anonymous and in that case
156 270dd48d Sofia Papagiannaki
    redirects to `logout`.
157 270dd48d Sofia Papagiannaki
    """
158 270dd48d Sofia Papagiannaki
    @wraps(func)
159 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
160 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
161 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
162 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
163 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
164 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
165 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
166 270dd48d Sofia Papagiannaki
    return wrapper
167 270dd48d Sofia Papagiannaki
168 5ce3ce4f Sofia Papagiannaki
169 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
170 270dd48d Sofia Papagiannaki
@signed_terms_required
171 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
172 890b0eaf Sofia Papagiannaki
    """
173 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
174 176023aa Kostas Papadimitriou

175 890b0eaf Sofia Papagiannaki
    **Arguments**
176 176023aa Kostas Papadimitriou

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

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

185 890b0eaf Sofia Papagiannaki
    ``extra_context``
186 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
187 176023aa Kostas Papadimitriou

188 890b0eaf Sofia Papagiannaki
    **Template:**
189 176023aa Kostas Papadimitriou

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

192 890b0eaf Sofia Papagiannaki
    """
193 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
194 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
195 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
196 f534fb96 Sofia Papagiannaki
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
197 792c2f3b Olga Brani
198 ab7e3a9e Kostas Papadimitriou
    third_party_token = request.GET.get('key', False)
199 ab7e3a9e Kostas Papadimitriou
    if third_party_token:
200 ab7e3a9e Kostas Papadimitriou
        messages.info(request, astakos_messages.AUTH_PROVIDER_LOGIN_TO_ADD)
201 ab7e3a9e Kostas Papadimitriou
202 ef20ea07 Sofia Papagiannaki
    return render_response(
203 ef20ea07 Sofia Papagiannaki
        template_name,
204 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
205 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
206 ef20ea07 Sofia Papagiannaki
    )
207 5ce3ce4f Sofia Papagiannaki
208 64cd4730 Antony Chazapis
209 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
210 890b0eaf Sofia Papagiannaki
@login_required
211 270dd48d Sofia Papagiannaki
@signed_terms_required
212 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
213 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
214 890b0eaf Sofia Papagiannaki
    """
215 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
216 176023aa Kostas Papadimitriou

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

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

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

226 890b0eaf Sofia Papagiannaki
    **Arguments**
227 176023aa Kostas Papadimitriou

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

232 890b0eaf Sofia Papagiannaki
    ``extra_context``
233 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
234 176023aa Kostas Papadimitriou

235 890b0eaf Sofia Papagiannaki
    **Template:**
236 176023aa Kostas Papadimitriou

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

239 890b0eaf Sofia Papagiannaki
    **Settings:**
240 176023aa Kostas Papadimitriou

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

243 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
244 890b0eaf Sofia Papagiannaki
    """
245 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
246 64cd4730 Antony Chazapis
    status = None
247 64cd4730 Antony Chazapis
    message = None
248 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
249 5ce3ce4f Sofia Papagiannaki
250 18ffbee1 Sofia Papagiannaki
    inviter = request.user
251 64cd4730 Antony Chazapis
    if request.method == 'POST':
252 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
253 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
254 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
255 8f5a3a06 Sofia Papagiannaki
                try:
256 9a06d96f Olga Brani
                    email = form.cleaned_data.get('username')
257 9a06d96f Olga Brani
                    realname = form.cleaned_data.get('realname')
258 9a06d96f Olga Brani
                    inviter.invite(email, realname)
259 ae497612 Olga Brani
                    message = _(astakos_messages.INVITATION_SENT) % locals()
260 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
261 8f5a3a06 Sofia Papagiannaki
                except SendMailError, e:
262 8f5a3a06 Sofia Papagiannaki
                    message = e.message
263 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
264 8f5a3a06 Sofia Papagiannaki
                    transaction.rollback()
265 18ffbee1 Sofia Papagiannaki
                except BaseException, e:
266 ae497612 Olga Brani
                    message = _(astakos_messages.GENERIC_ERROR)
267 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
268 18ffbee1 Sofia Papagiannaki
                    logger.exception(e)
269 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
270 18ffbee1 Sofia Papagiannaki
                else:
271 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
272 64cd4730 Antony Chazapis
        else:
273 ae497612 Olga Brani
            message = _(astakos_messages.MAX_INVITATION_NUMBER_REACHED)
274 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
275 176023aa Kostas Papadimitriou
276 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
277 d6ae71a2 root
             'realname': inv.realname,
278 d6ae71a2 root
             'is_consumed': inv.is_consumed}
279 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
280 77e2ad52 root
    kwargs = {'inviter': inviter,
281 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
282 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
283 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
284 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
285 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
286 5ce3ce4f Sofia Papagiannaki
287 64cd4730 Antony Chazapis
288 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
289 890b0eaf Sofia Papagiannaki
@login_required
290 270dd48d Sofia Papagiannaki
@signed_terms_required
291 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
292 890b0eaf Sofia Papagiannaki
    """
293 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
294 176023aa Kostas Papadimitriou

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

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

301 890b0eaf Sofia Papagiannaki
    **Arguments**
302 176023aa Kostas Papadimitriou

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

307 890b0eaf Sofia Papagiannaki
    ``extra_context``
308 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
309 176023aa Kostas Papadimitriou

310 890b0eaf Sofia Papagiannaki
    **Template:**
311 176023aa Kostas Papadimitriou

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

314 92defad4 Sofia Papagiannaki
    **Settings:**
315 176023aa Kostas Papadimitriou

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

318 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
319 890b0eaf Sofia Papagiannaki
    """
320 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
321 bf0c6de5 Sofia Papagiannaki
    form = ProfileForm(
322 bf0c6de5 Sofia Papagiannaki
        instance=request.user,
323 bf0c6de5 Sofia Papagiannaki
        session_key=request.session.session_key
324 bf0c6de5 Sofia Papagiannaki
    )
325 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
326 64cd4730 Antony Chazapis
    if request.method == 'POST':
327 bf0c6de5 Sofia Papagiannaki
        form = ProfileForm(
328 bf0c6de5 Sofia Papagiannaki
            request.POST,
329 bf0c6de5 Sofia Papagiannaki
            instance=request.user,
330 bf0c6de5 Sofia Papagiannaki
            session_key=request.session.session_key
331 bf0c6de5 Sofia Papagiannaki
        )
332 890b0eaf Sofia Papagiannaki
        if form.is_valid():
333 64cd4730 Antony Chazapis
            try:
334 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
335 c301698f Sofia Papagiannaki
                user = form.save()
336 bf0c6de5 Sofia Papagiannaki
                form = ProfileForm(
337 bf0c6de5 Sofia Papagiannaki
                    instance=user,
338 bf0c6de5 Sofia Papagiannaki
                    session_key=request.session.session_key
339 bf0c6de5 Sofia Papagiannaki
                )
340 217994f8 Sofia Papagiannaki
                next = restrict_next(
341 217994f8 Sofia Papagiannaki
                    request.POST.get('next'),
342 217994f8 Sofia Papagiannaki
                    domain=COOKIE_DOMAIN
343 217994f8 Sofia Papagiannaki
                )
344 1a3675a0 Sofia Papagiannaki
                if next:
345 1a3675a0 Sofia Papagiannaki
                    return redirect(next)
346 ae497612 Olga Brani
                msg = _(astakos_messages.PROFILE_UPDATED)
347 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
348 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
349 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
350 23447441 Sofia Papagiannaki
    elif request.method == "GET":
351 792c2f3b Olga Brani
        request.user.is_verified = True
352 792c2f3b Olga Brani
        request.user.save()
353 792c2f3b Olga Brani
354 792c2f3b Olga Brani
    # existing providers
355 792c2f3b Olga Brani
    user_providers = request.user.get_active_auth_providers()
356 792c2f3b Olga Brani
357 792c2f3b Olga Brani
    # providers that user can add
358 792c2f3b Olga Brani
    user_available_providers = request.user.get_available_auth_providers()
359 792c2f3b Olga Brani
360 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
361 8f5a3a06 Sofia Papagiannaki
                           profile_form = form,
362 792c2f3b Olga Brani
                           user_providers = user_providers,
363 792c2f3b Olga Brani
                           user_available_providers = user_available_providers,
364 0905ccd2 Sofia Papagiannaki
                           context_instance = get_context(request,
365 c301698f Sofia Papagiannaki
                                                          extra_context))
366 5ce3ce4f Sofia Papagiannaki
367 64cd4730 Antony Chazapis
368 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
369 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
370 5e992f29 Kostas Papadimitriou
def signup(request, template_name='im/signup.html',
371 5e992f29 Kostas Papadimitriou
           on_success='im/signup_complete.html', extra_context=None,
372 5e992f29 Kostas Papadimitriou
           on_success_redirect='/im/profile/',
373 5e992f29 Kostas Papadimitriou
           backend=None):
374 890b0eaf Sofia Papagiannaki
    """
375 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
376 176023aa Kostas Papadimitriou

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

380 890b0eaf Sofia Papagiannaki
    The user activation will be delegated to the backend specified by the ``backend`` keyword argument
381 8f5a3a06 Sofia Papagiannaki
    if present, otherwise to the ``astakos.im.activation_backends.InvitationBackend``
382 8f5a3a06 Sofia Papagiannaki
    if settings.ASTAKOS_INVITATIONS_ENABLED is True or ``astakos.im.activation_backends.SimpleBackend`` if not
383 8f5a3a06 Sofia Papagiannaki
    (see activation_backends);
384 5ce3ce4f Sofia Papagiannaki

385 b669d9c0 Sofia Papagiannaki
    Upon successful user creation, if ``next`` url parameter is present the user is redirected there
386 890b0eaf Sofia Papagiannaki
    otherwise renders the same page with a success message.
387 5ce3ce4f Sofia Papagiannaki

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

390 890b0eaf Sofia Papagiannaki
    **Arguments**
391 5ce3ce4f Sofia Papagiannaki

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

396 f7e8a159 Sofia Papagiannaki
    ``on_success``
397 f7e8a159 Sofia Papagiannaki
        A custom template to render in case of success. This is optional;
398 1e685275 Sofia Papagiannaki
        if not specified, this will default to ``im/signup_complete.html``.
399 176023aa Kostas Papadimitriou

400 890b0eaf Sofia Papagiannaki
    ``extra_context``
401 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
402 176023aa Kostas Papadimitriou

403 890b0eaf Sofia Papagiannaki
    **Template:**
404 5ce3ce4f Sofia Papagiannaki

405 8f5a3a06 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
406 5ce3ce4f Sofia Papagiannaki
    im/signup_complete.html or ``on_success`` keyword argument.
407 890b0eaf Sofia Papagiannaki
    """
408 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
409 0d02a287 Sofia Papagiannaki
    if request.user.is_authenticated():
410 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('edit_profile'))
411 5ce3ce4f Sofia Papagiannaki
412 0a569195 Sofia Papagiannaki
    provider = get_query(request).get('provider', 'local')
413 792c2f3b Olga Brani
    if not auth_providers.get_provider(provider).is_available_for_create():
414 792c2f3b Olga Brani
        raise PermissionDenied
415 792c2f3b Olga Brani
416 6c8a3f7c Sofia Papagiannaki
    id = get_query(request).get('id')
417 6c8a3f7c Sofia Papagiannaki
    try:
418 6c8a3f7c Sofia Papagiannaki
        instance = AstakosUser.objects.get(id=id) if id else None
419 6c8a3f7c Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
420 6c8a3f7c Sofia Papagiannaki
        instance = None
421 6c8a3f7c Sofia Papagiannaki
422 8ab484ea Kostas Papadimitriou
    third_party_token = request.REQUEST.get('third_party_token', None)
423 c630fee6 Kostas Papadimitriou
    if third_party_token:
424 c630fee6 Kostas Papadimitriou
        pending = get_object_or_404(PendingThirdPartyUser,
425 c630fee6 Kostas Papadimitriou
                                    token=third_party_token)
426 c630fee6 Kostas Papadimitriou
        provider = pending.provider
427 c630fee6 Kostas Papadimitriou
        instance = pending.get_user_instance()
428 8ab484ea Kostas Papadimitriou
429 890b0eaf Sofia Papagiannaki
    try:
430 18ffbee1 Sofia Papagiannaki
        if not backend:
431 18ffbee1 Sofia Papagiannaki
            backend = get_backend(request)
432 6c8a3f7c Sofia Papagiannaki
        form = backend.get_signup_form(provider, instance)
433 0a569195 Sofia Papagiannaki
    except Exception, e:
434 4e30244e Sofia Papagiannaki
        form = SimpleBackend(request).get_signup_form(provider)
435 24406ae3 Sofia Papagiannaki
        messages.error(request, e)
436 5e992f29 Kostas Papadimitriou
437 8f5a3a06 Sofia Papagiannaki
    if request.method == 'POST':
438 8f5a3a06 Sofia Papagiannaki
        if form.is_valid():
439 18ffbee1 Sofia Papagiannaki
            user = form.save(commit=False)
440 8f5a3a06 Sofia Papagiannaki
            try:
441 8f5a3a06 Sofia Papagiannaki
                result = backend.handle_activation(user)
442 8f5a3a06 Sofia Papagiannaki
                status = messages.SUCCESS
443 18ffbee1 Sofia Papagiannaki
                message = result.message
444 792c2f3b Olga Brani
445 792c2f3b Olga Brani
                form.store_user(user, request)
446 792c2f3b Olga Brani
447 ca828a10 Sofia Papagiannaki
                if 'additional_email' in form.cleaned_data:
448 ca828a10 Sofia Papagiannaki
                    additional_email = form.cleaned_data['additional_email']
449 ca828a10 Sofia Papagiannaki
                    if additional_email != user.email:
450 ca828a10 Sofia Papagiannaki
                        user.additionalmail_set.create(email=additional_email)
451 5ce3ce4f Sofia Papagiannaki
                        msg = 'Additional email: %s saved for user %s.' % (
452 6c8a3f7c Sofia Papagiannaki
                            additional_email,
453 6c8a3f7c Sofia Papagiannaki
                            user.email
454 6c8a3f7c Sofia Papagiannaki
                        )
455 b669d9c0 Sofia Papagiannaki
                        logger._log(LOGGING_LEVEL, msg, [])
456 8f5a3a06 Sofia Papagiannaki
                if user and user.is_active:
457 8f5a3a06 Sofia Papagiannaki
                    next = request.POST.get('next', '')
458 40a0cd8b Sofia Papagiannaki
                    response = prepare_response(request, user, next=next)
459 c3f6cdf1 root
                    transaction.commit()
460 40a0cd8b Sofia Papagiannaki
                    return response
461 8f5a3a06 Sofia Papagiannaki
                messages.add_message(request, status, message)
462 792c2f3b Olga Brani
                transaction.commit()
463 5e992f29 Kostas Papadimitriou
                return HttpResponseRedirect(on_success_redirect)
464 5e992f29 Kostas Papadimitriou
465 18ffbee1 Sofia Papagiannaki
            except SendMailError, e:
466 c44955a6 Sofia Papagiannaki
                logger.exception(e)
467 18ffbee1 Sofia Papagiannaki
                status = messages.ERROR
468 18ffbee1 Sofia Papagiannaki
                message = e.message
469 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
470 10ed0073 Sofia Papagiannaki
                transaction.rollback()
471 18ffbee1 Sofia Papagiannaki
            except BaseException, e:
472 678b2236 Sofia Papagiannaki
                logger.exception(e)
473 ae497612 Olga Brani
                message = _(astakos_messages.GENERIC_ERROR)
474 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
475 0a569195 Sofia Papagiannaki
                logger.exception(e)
476 10ed0073 Sofia Papagiannaki
                transaction.rollback()
477 5e992f29 Kostas Papadimitriou
478 8f5a3a06 Sofia Papagiannaki
    return render_response(template_name,
479 5ce3ce4f Sofia Papagiannaki
                           signup_form=form,
480 8ab484ea Kostas Papadimitriou
                           third_party_token=third_party_token,
481 5ce3ce4f Sofia Papagiannaki
                           provider=provider,
482 890b0eaf Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
483 64cd4730 Antony Chazapis
484 5ce3ce4f Sofia Papagiannaki
485 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
486 890b0eaf Sofia Papagiannaki
@login_required
487 270dd48d Sofia Papagiannaki
@signed_terms_required
488 aab4d540 Sofia Papagiannaki
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context=None):
489 890b0eaf Sofia Papagiannaki
    """
490 890b0eaf Sofia Papagiannaki
    Allows a user to send feedback.
491 176023aa Kostas Papadimitriou

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

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

497 890b0eaf Sofia Papagiannaki
    **Arguments**
498 176023aa Kostas Papadimitriou

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

503 890b0eaf Sofia Papagiannaki
    ``extra_context``
504 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
505 176023aa Kostas Papadimitriou

506 890b0eaf Sofia Papagiannaki
    **Template:**
507 176023aa Kostas Papadimitriou

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

510 890b0eaf Sofia Papagiannaki
    **Settings:**
511 176023aa Kostas Papadimitriou

512 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
513 890b0eaf Sofia Papagiannaki
    """
514 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
515 64cd4730 Antony Chazapis
    if request.method == 'GET':
516 890b0eaf Sofia Papagiannaki
        form = FeedbackForm()
517 890b0eaf Sofia Papagiannaki
    if request.method == 'POST':
518 890b0eaf Sofia Papagiannaki
        if not request.user:
519 890b0eaf Sofia Papagiannaki
            return HttpResponse('Unauthorized', status=401)
520 176023aa Kostas Papadimitriou
521 890b0eaf Sofia Papagiannaki
        form = FeedbackForm(request.POST)
522 890b0eaf Sofia Papagiannaki
        if form.is_valid():
523 e9083112 Sofia Papagiannaki
            msg = form.cleaned_data['feedback_msg']
524 8f5a3a06 Sofia Papagiannaki
            data = form.cleaned_data['feedback_data']
525 538ccdd5 Sofia Papagiannaki
            try:
526 8f5a3a06 Sofia Papagiannaki
                send_feedback(msg, data, request.user, email_template_name)
527 8f5a3a06 Sofia Papagiannaki
            except SendMailError, e:
528 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
529 8f5a3a06 Sofia Papagiannaki
            else:
530 ae497612 Olga Brani
                message = _(astakos_messages.FEEDBACK_SENT)
531 aab4d540 Sofia Papagiannaki
                messages.success(request, message)
532 890b0eaf Sofia Papagiannaki
    return render_response(template_name,
533 5ce3ce4f Sofia Papagiannaki
                           feedback_form=form,
534 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
535 5ce3ce4f Sofia Papagiannaki
536 15efc749 Sofia Papagiannaki
537 217994f8 Sofia Papagiannaki
@require_http_methods(["GET"])
538 8e45d6fd Sofia Papagiannaki
@signed_terms_required
539 aab4d540 Sofia Papagiannaki
def logout(request, template='registration/logged_out.html', extra_context=None):
540 63ecdd20 Sofia Papagiannaki
    """
541 b2ffa772 Sofia Papagiannaki
    Wraps `django.contrib.auth.logout`.
542 63ecdd20 Sofia Papagiannaki
    """
543 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
544 7482228b Sofia Papagiannaki
    response = HttpResponse()
545 8e45d6fd Sofia Papagiannaki
    if request.user.is_authenticated():
546 8e45d6fd Sofia Papagiannaki
        email = request.user.email
547 8e45d6fd Sofia Papagiannaki
        auth_logout(request)
548 c630fee6 Kostas Papadimitriou
    else:
549 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
550 c630fee6 Kostas Papadimitriou
        response.status_code = 301
551 c630fee6 Kostas Papadimitriou
        return response
552 c630fee6 Kostas Papadimitriou
553 217994f8 Sofia Papagiannaki
    next = restrict_next(
554 217994f8 Sofia Papagiannaki
        request.GET.get('next'),
555 217994f8 Sofia Papagiannaki
        domain=COOKIE_DOMAIN
556 217994f8 Sofia Papagiannaki
    )
557 c630fee6 Kostas Papadimitriou
558 63ecdd20 Sofia Papagiannaki
    if next:
559 63ecdd20 Sofia Papagiannaki
        response['Location'] = next
560 63ecdd20 Sofia Papagiannaki
        response.status_code = 302
561 0d02a287 Sofia Papagiannaki
    elif LOGOUT_NEXT:
562 0d02a287 Sofia Papagiannaki
        response['Location'] = LOGOUT_NEXT
563 0d02a287 Sofia Papagiannaki
        response.status_code = 301
564 b2ffa772 Sofia Papagiannaki
    else:
565 c0b26605 Sofia Papagiannaki
        messages.add_message(request, messages.SUCCESS, _(astakos_messages.LOGOUT_SUCCESS))
566 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
567 c630fee6 Kostas Papadimitriou
        response.status_code = 301
568 49df775e Sofia Papagiannaki
    return response
569 2126d85d Sofia Papagiannaki
570 5ce3ce4f Sofia Papagiannaki
571 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
572 683cf244 Sofia Papagiannaki
@transaction.commit_manually
573 3bb604eb Sofia Papagiannaki
def activate(request, greeting_email_template_name='im/welcome_email.txt',
574 3bb604eb Sofia Papagiannaki
             helpdesk_email_template_name='im/helpdesk_notification.txt'):
575 2126d85d Sofia Papagiannaki
    """
576 683cf244 Sofia Papagiannaki
    Activates the user identified by the ``auth`` request parameter, sends a welcome email
577 683cf244 Sofia Papagiannaki
    and renews the user token.
578 176023aa Kostas Papadimitriou

579 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
580 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
581 2126d85d Sofia Papagiannaki
    """
582 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
583 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
584 2126d85d Sofia Papagiannaki
    try:
585 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
586 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
587 ae497612 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN))
588 5ce3ce4f Sofia Papagiannaki
589 d1757ca7 Sofia Papagiannaki
    if user.is_active:
590 ae497612 Olga Brani
        message = _(astakos_messages.ACCOUNT_ALREADY_ACTIVE)
591 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
592 23b9b72f Sofia Papagiannaki
        return index(request)
593 5ce3ce4f Sofia Papagiannaki
594 0a569195 Sofia Papagiannaki
    try:
595 ef20ea07 Sofia Papagiannaki
        activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True)
596 ef20ea07 Sofia Papagiannaki
        response = prepare_response(request, user, next, renew=True)
597 ef20ea07 Sofia Papagiannaki
        transaction.commit()
598 ef20ea07 Sofia Papagiannaki
        return response
599 ef20ea07 Sofia Papagiannaki
    except SendMailError, e:
600 ef20ea07 Sofia Papagiannaki
        message = e.message
601 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
602 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
603 ef20ea07 Sofia Papagiannaki
        return index(request)
604 ef20ea07 Sofia Papagiannaki
    except BaseException, e:
605 ef20ea07 Sofia Papagiannaki
        status = messages.ERROR
606 c0b26605 Sofia Papagiannaki
        message = _(astakos_messages.GENERIC_ERROR)
607 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
608 ef20ea07 Sofia Papagiannaki
        logger.exception(e)
609 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
610 ef20ea07 Sofia Papagiannaki
        return index(request)
611 270dd48d Sofia Papagiannaki
612 5ce3ce4f Sofia Papagiannaki
613 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
614 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
615 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
616 270dd48d Sofia Papagiannaki
    term = None
617 270dd48d Sofia Papagiannaki
    terms = None
618 270dd48d Sofia Papagiannaki
    if not term_id:
619 270dd48d Sofia Papagiannaki
        try:
620 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
621 270dd48d Sofia Papagiannaki
        except IndexError:
622 270dd48d Sofia Papagiannaki
            pass
623 270dd48d Sofia Papagiannaki
    else:
624 270dd48d Sofia Papagiannaki
        try:
625 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
626 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
627 270dd48d Sofia Papagiannaki
            pass
628 176023aa Kostas Papadimitriou
629 270dd48d Sofia Papagiannaki
    if not term:
630 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
631 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
632 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
633 270dd48d Sofia Papagiannaki
    terms = f.read()
634 176023aa Kostas Papadimitriou
635 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
636 217994f8 Sofia Papagiannaki
        next = restrict_next(
637 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
638 217994f8 Sofia Papagiannaki
            domain=COOKIE_DOMAIN
639 217994f8 Sofia Papagiannaki
        )
640 270dd48d Sofia Papagiannaki
        if not next:
641 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
642 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
643 270dd48d Sofia Papagiannaki
        if not form.is_valid():
644 270dd48d Sofia Papagiannaki
            return render_response(template_name,
645 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
646 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
647 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
648 270dd48d Sofia Papagiannaki
        user = form.save()
649 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
650 270dd48d Sofia Papagiannaki
    else:
651 586967c0 Sofia Papagiannaki
        form = None
652 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
653 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
654 270dd48d Sofia Papagiannaki
        return render_response(template_name,
655 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
656 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
657 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
658 5ce3ce4f Sofia Papagiannaki
659 270dd48d Sofia Papagiannaki
660 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
661 8e45d6fd Sofia Papagiannaki
@login_required
662 dda2e499 Sofia Papagiannaki
@signed_terms_required
663 49790d9d Sofia Papagiannaki
@transaction.commit_manually
664 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
665 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
666 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
667 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
668 aab4d540 Sofia Papagiannaki
                 extra_context=None):
669 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
670 49790d9d Sofia Papagiannaki
    if activation_key:
671 49790d9d Sofia Papagiannaki
        try:
672 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
673 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
674 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
675 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
676 49790d9d Sofia Papagiannaki
                auth_logout(request)
677 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
678 49790d9d Sofia Papagiannaki
                transaction.commit()
679 49790d9d Sofia Papagiannaki
                return response
680 49790d9d Sofia Papagiannaki
        except ValueError, e:
681 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
682 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
683 5ce3ce4f Sofia Papagiannaki
                               modified_user=user if 'user' in locals(
684 5ce3ce4f Sofia Papagiannaki
                               ) else None,
685 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request,
686 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
687 5ce3ce4f Sofia Papagiannaki
688 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
689 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
690 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
691 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
692 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
693 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
694 49790d9d Sofia Papagiannaki
        try:
695 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
696 49790d9d Sofia Papagiannaki
        except SendMailError, e:
697 49790d9d Sofia Papagiannaki
            msg = e
698 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
699 49790d9d Sofia Papagiannaki
            transaction.rollback()
700 49790d9d Sofia Papagiannaki
        except IntegrityError, e:
701 ae497612 Olga Brani
            msg = _(astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
702 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
703 49790d9d Sofia Papagiannaki
        else:
704 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
705 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
706 49790d9d Sofia Papagiannaki
            transaction.commit()
707 c0b26605 Sofia Papagiannaki
    return render_response(
708 c0b26605 Sofia Papagiannaki
        form_template_name,
709 c0b26605 Sofia Papagiannaki
        form=form,
710 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
711 c0b26605 Sofia Papagiannaki
    )
712 1f3b4b39 Sofia Papagiannaki
713 1f3b4b39 Sofia Papagiannaki
714 1f3b4b39 Sofia Papagiannaki
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
715 792c2f3b Olga Brani
716 792c2f3b Olga Brani
    if settings.MODERATION_ENABLED:
717 792c2f3b Olga Brani
        raise PermissionDenied
718 792c2f3b Olga Brani
719 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
720 1f3b4b39 Sofia Papagiannaki
    try:
721 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
722 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
723 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
724 1f3b4b39 Sofia Papagiannaki
    else:
725 1f3b4b39 Sofia Papagiannaki
        try:
726 1f3b4b39 Sofia Papagiannaki
            send_activation_func(u)
727 c0b26605 Sofia Papagiannaki
            msg = _(astakos_messages.ACTIVATION_SENT)
728 1f3b4b39 Sofia Papagiannaki
            messages.success(request, msg)
729 1f3b4b39 Sofia Papagiannaki
        except SendMailError, e:
730 1f3b4b39 Sofia Papagiannaki
            messages.error(request, e)
731 1f3b4b39 Sofia Papagiannaki
    return render_response(
732 1f3b4b39 Sofia Papagiannaki
        template_name,
733 c0b26605 Sofia Papagiannaki
        login_form = LoginForm(request=request),
734 1f3b4b39 Sofia Papagiannaki
        context_instance = get_context(
735 1f3b4b39 Sofia Papagiannaki
            request,
736 1f3b4b39 Sofia Papagiannaki
            extra_context
737 1f3b4b39 Sofia Papagiannaki
        )
738 1f3b4b39 Sofia Papagiannaki
    )
739 5ce3ce4f Sofia Papagiannaki
740 3cbd5e47 Olga Brani
class ResourcePresentation():
741 792c2f3b Olga Brani
742 3cbd5e47 Olga Brani
    def __init__(self, data):
743 3cbd5e47 Olga Brani
        self.data = data
744 792c2f3b Olga Brani
745 3cbd5e47 Olga Brani
    def update_from_result(self, result):
746 3cbd5e47 Olga Brani
        if result.is_success:
747 3cbd5e47 Olga Brani
            for r in result.data:
748 3cbd5e47 Olga Brani
                rname = '%s%s%s' % (r.get('service'), RESOURCE_SEPARATOR, r.get('name'))
749 3cbd5e47 Olga Brani
                if not rname in self.data['resources']:
750 3cbd5e47 Olga Brani
                    self.data['resources'][rname] = {}
751 792c2f3b Olga Brani
752 3cbd5e47 Olga Brani
                self.data['resources'][rname].update(r)
753 3cbd5e47 Olga Brani
                self.data['resources'][rname]['id'] = rname
754 3cbd5e47 Olga Brani
                group = r.get('group')
755 3cbd5e47 Olga Brani
                if not group in self.data['groups']:
756 3cbd5e47 Olga Brani
                    self.data['groups'][group] = {}
757 792c2f3b Olga Brani
758 3cbd5e47 Olga Brani
                self.data['groups'][r.get('group')].update({'name': r.get('group')})
759 792c2f3b Olga Brani
760 3cbd5e47 Olga Brani
    def test(self, quota_dict):
761 3cbd5e47 Olga Brani
        for k, v in quota_dict.iteritems():
762 3cbd5e47 Olga Brani
            rname = k
763 3cbd5e47 Olga Brani
            value = v
764 3cbd5e47 Olga Brani
            if not rname in self.data['resources']:
765 c0b26605 Sofia Papagiannaki
                self.data['resources'][rname] = {}
766 792c2f3b Olga Brani
767 792c2f3b Olga Brani
768 3cbd5e47 Olga Brani
            self.data['resources'][rname]['value'] = value
769 792c2f3b Olga Brani
770 792c2f3b Olga Brani
771 3cbd5e47 Olga Brani
    def update_from_result_report(self, result):
772 3cbd5e47 Olga Brani
        if result.is_success:
773 3cbd5e47 Olga Brani
            for r in result.data:
774 3cbd5e47 Olga Brani
                rname = r.get('name')
775 3cbd5e47 Olga Brani
                if not rname in self.data['resources']:
776 3cbd5e47 Olga Brani
                    self.data['resources'][rname] = {}
777 792c2f3b Olga Brani
778 3cbd5e47 Olga Brani
                self.data['resources'][rname].update(r)
779 3cbd5e47 Olga Brani
                self.data['resources'][rname]['id'] = rname
780 3cbd5e47 Olga Brani
                group = r.get('group')
781 3cbd5e47 Olga Brani
                if not group in self.data['groups']:
782 3cbd5e47 Olga Brani
                    self.data['groups'][group] = {}
783 792c2f3b Olga Brani
784 3cbd5e47 Olga Brani
                self.data['groups'][r.get('group')].update({'name': r.get('group')})
785 792c2f3b Olga Brani
786 3cbd5e47 Olga Brani
    def get_group_resources(self, group):
787 3cbd5e47 Olga Brani
        return dict(filter(lambda t: t[1].get('group') == group, self.data['resources'].iteritems()))
788 792c2f3b Olga Brani
789 3cbd5e47 Olga Brani
    def get_groups_resources(self):
790 3cbd5e47 Olga Brani
        for g in self.data['groups']:
791 3cbd5e47 Olga Brani
            yield g, self.get_group_resources(g)
792 792c2f3b Olga Brani
793 3cbd5e47 Olga Brani
    def get_quota(self, group_quotas):
794 3cbd5e47 Olga Brani
        for r, v in group_quotas.iteritems():
795 3cbd5e47 Olga Brani
            rname = str(r)
796 3cbd5e47 Olga Brani
            quota = self.data['resources'].get(rname)
797 3cbd5e47 Olga Brani
            quota['value'] = v
798 3cbd5e47 Olga Brani
            yield quota
799 792c2f3b Olga Brani
800 792c2f3b Olga Brani
801 3cbd5e47 Olga Brani
    def get_policies(self, policies_data):
802 3cbd5e47 Olga Brani
        for policy in policies_data:
803 3cbd5e47 Olga Brani
            rname = '%s%s%s' % (policy.get('service'), RESOURCE_SEPARATOR, policy.get('resource'))
804 3cbd5e47 Olga Brani
            policy.update(self.data['resources'].get(rname))
805 3cbd5e47 Olga Brani
            yield policy
806 792c2f3b Olga Brani
807 3cbd5e47 Olga Brani
    def __repr__(self):
808 3cbd5e47 Olga Brani
        return self.data.__repr__()
809 792c2f3b Olga Brani
810 3cbd5e47 Olga Brani
    def __iter__(self, *args, **kwargs):
811 3cbd5e47 Olga Brani
        return self.data.__iter__(*args, **kwargs)
812 792c2f3b Olga Brani
813 3cbd5e47 Olga Brani
    def __getitem__(self, *args, **kwargs):
814 3cbd5e47 Olga Brani
        return self.data.__getitem__(*args, **kwargs)
815 792c2f3b Olga Brani
816 3cbd5e47 Olga Brani
    def get(self, *args, **kwargs):
817 3cbd5e47 Olga Brani
        return self.data.get(*args, **kwargs)
818 792c2f3b Olga Brani
819 792c2f3b Olga Brani
820 12269b45 Olga Brani
821 8c804c12 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
822 8e45d6fd Sofia Papagiannaki
@signed_terms_required
823 01ac12d5 Sofia Papagiannaki
@login_required
824 0f4fa26d Sofia Papagiannaki
def group_add(request, kind_name='default'):
825 792c2f3b Olga Brani
826 820b18e0 Sofia Papagiannaki
    result = callpoint.list_resources()
827 3cbd5e47 Olga Brani
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
828 3cbd5e47 Olga Brani
    resource_catalog.update_from_result(result)
829 792c2f3b Olga Brani
830 3cbd5e47 Olga Brani
    if not result.is_success:
831 820b18e0 Sofia Papagiannaki
        messages.error(
832 820b18e0 Sofia Papagiannaki
            request,
833 820b18e0 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
834 820b18e0 Sofia Papagiannaki
    )
835 792c2f3b Olga Brani
836 0f4fa26d Sofia Papagiannaki
    try:
837 5ce3ce4f Sofia Papagiannaki
        kind = GroupKind.objects.get(name=kind_name)
838 0f4fa26d Sofia Papagiannaki
    except:
839 ae497612 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.GROUPKIND_UNKNOWN))
840 792c2f3b Olga Brani
841 792c2f3b Olga Brani
842 5ce3ce4f Sofia Papagiannaki
843 5ce3ce4f Sofia Papagiannaki
    post_save_redirect = '/im/group/%(id)s/'
844 5ce3ce4f Sofia Papagiannaki
    context_processors = None
845 0f4fa26d Sofia Papagiannaki
    model, form_class = get_model_and_form_class(
846 0f4fa26d Sofia Papagiannaki
        model=None,
847 0f4fa26d Sofia Papagiannaki
        form_class=AstakosGroupCreationForm
848 0f4fa26d Sofia Papagiannaki
    )
849 792c2f3b Olga Brani
850 0f4fa26d Sofia Papagiannaki
    if request.method == 'POST':
851 820b18e0 Sofia Papagiannaki
        form = form_class(request.POST, request.FILES)
852 0f4fa26d Sofia Papagiannaki
        if form.is_valid():
853 513571c3 Sofia Papagiannaki
            policies = form.policies()
854 8c804c12 Sofia Papagiannaki
            return render_response(
855 8c804c12 Sofia Papagiannaki
                template='im/astakosgroup_form_summary.html',
856 8c804c12 Sofia Papagiannaki
                context_instance=get_context(request),
857 513571c3 Sofia Papagiannaki
                form=AstakosGroupCreationSummaryForm(form.cleaned_data),
858 513571c3 Sofia Papagiannaki
                policies=resource_catalog.get_policies(policies)
859 8c804c12 Sofia Papagiannaki
            )
860 0f4fa26d Sofia Papagiannaki
    else:
861 0f4fa26d Sofia Papagiannaki
        now = datetime.now()
862 0f4fa26d Sofia Papagiannaki
        data = {
863 6abd262c Olga Brani
            'kind': kind,
864 0f4fa26d Sofia Papagiannaki
        }
865 3cbd5e47 Olga Brani
        for group, resources in resource_catalog.get_groups_resources():
866 6abd262c Olga Brani
            data['is_selected_%s' % group] = False
867 6abd262c Olga Brani
            for resource in resources:
868 6abd262c Olga Brani
                data['%s_uplimit' % resource] = ''
869 792c2f3b Olga Brani
870 820b18e0 Sofia Papagiannaki
        form = form_class(data)
871 0f4fa26d Sofia Papagiannaki
872 0f4fa26d Sofia Papagiannaki
    # Create the template, context, response
873 ae497612 Olga Brani
    template_name = "%s/%s_form.html" % (
874 0f4fa26d Sofia Papagiannaki
        model._meta.app_label,
875 0f4fa26d Sofia Papagiannaki
        model._meta.object_name.lower()
876 0f4fa26d Sofia Papagiannaki
    )
877 0f4fa26d Sofia Papagiannaki
    t = template_loader.get_template(template_name)
878 0f4fa26d Sofia Papagiannaki
    c = RequestContext(request, {
879 c8977d75 Olga Brani
        'form': form,
880 c8977d75 Olga Brani
        'kind': kind,
881 820b18e0 Sofia Papagiannaki
        'resource_catalog':resource_catalog,
882 0f4fa26d Sofia Papagiannaki
    }, context_processors)
883 0f4fa26d Sofia Papagiannaki
    return HttpResponse(t.render(c))
884 8e45d6fd Sofia Papagiannaki
885 8c804c12 Sofia Papagiannaki
886 ae497612 Olga Brani
#@require_http_methods(["POST"])
887 ae497612 Olga Brani
@require_http_methods(["GET", "POST"])
888 29b87e7c Sofia Papagiannaki
@signed_terms_required
889 29b87e7c Sofia Papagiannaki
@login_required
890 8c804c12 Sofia Papagiannaki
def group_add_complete(request):
891 29b87e7c Sofia Papagiannaki
    model = AstakosGroup
892 29b87e7c Sofia Papagiannaki
    form = AstakosGroupCreationSummaryForm(request.POST)
893 29b87e7c Sofia Papagiannaki
    if form.is_valid():
894 29b87e7c Sofia Papagiannaki
        d = form.cleaned_data
895 29b87e7c Sofia Papagiannaki
        d['owners'] = [request.user]
896 29b87e7c Sofia Papagiannaki
        result = callpoint.create_groups((d,)).next()
897 29b87e7c Sofia Papagiannaki
        if result.is_success:
898 29b87e7c Sofia Papagiannaki
            new_object = result.data[0]
899 ae497612 Olga Brani
            msg = _(astakos_messages.OBJECT_CREATED) %\
900 29b87e7c Sofia Papagiannaki
                {"verbose_name": model._meta.verbose_name}
901 29b87e7c Sofia Papagiannaki
            messages.success(request, msg, fail_silently=True)
902 792c2f3b Olga Brani
903 29b87e7c Sofia Papagiannaki
            # send notification
904 29b87e7c Sofia Papagiannaki
            try:
905 29b87e7c Sofia Papagiannaki
                send_group_creation_notification(
906 29b87e7c Sofia Papagiannaki
                    template_name='im/group_creation_notification.txt',
907 29b87e7c Sofia Papagiannaki
                    dictionary={
908 29b87e7c Sofia Papagiannaki
                        'group': new_object,
909 29b87e7c Sofia Papagiannaki
                        'owner': request.user,
910 29b87e7c Sofia Papagiannaki
                        'policies': d.get('policies', [])
911 29b87e7c Sofia Papagiannaki
                    }
912 29b87e7c Sofia Papagiannaki
                )
913 29b87e7c Sofia Papagiannaki
            except SendNotificationError, e:
914 29b87e7c Sofia Papagiannaki
                messages.error(request, e, fail_silently=True)
915 29b87e7c Sofia Papagiannaki
            post_save_redirect = '/im/group/%(id)s/'
916 29b87e7c Sofia Papagiannaki
            return HttpResponseRedirect(post_save_redirect % new_object)
917 29b87e7c Sofia Papagiannaki
        else:
918 3cbd5e47 Olga Brani
            d = {"verbose_name": model._meta.verbose_name,
919 29b87e7c Sofia Papagiannaki
                 "reason":result.reason}
920 792c2f3b Olga Brani
            msg = _(astakos_messages.OBJECT_CREATED_FAILED) % d
921 29b87e7c Sofia Papagiannaki
            messages.error(request, msg, fail_silently=True)
922 8c804c12 Sofia Papagiannaki
    return render_response(
923 29b87e7c Sofia Papagiannaki
        template='im/astakosgroup_form_summary.html',
924 29b87e7c Sofia Papagiannaki
        context_instance=get_context(request),
925 513571c3 Sofia Papagiannaki
        form=form,
926 513571c3 Sofia Papagiannaki
        policies=form.cleaned_data.get('policies')
927 513571c3 Sofia Papagiannaki
    )
928 8c804c12 Sofia Papagiannaki
929 8c804c12 Sofia Papagiannaki
930 ae497612 Olga Brani
#@require_http_methods(["GET"])
931 ae497612 Olga Brani
@require_http_methods(["GET", "POST"])
932 8e45d6fd Sofia Papagiannaki
@signed_terms_required
933 8e45d6fd Sofia Papagiannaki
@login_required
934 ade90760 Sofia Papagiannaki
def group_list(request):
935 789bcaf9 Sofia Papagiannaki
    none = request.user.astakos_groups.none()
936 3cbd5e47 Olga Brani
    query = """
937 789bcaf9 Sofia Papagiannaki
        SELECT auth_group.id,
938 098f333b Sofia Papagiannaki
        auth_group.name AS groupname,
939 789bcaf9 Sofia Papagiannaki
        im_groupkind.name AS kindname,
940 789bcaf9 Sofia Papagiannaki
        im_astakosgroup.*,
941 789bcaf9 Sofia Papagiannaki
        owner.email AS groupowner,
942 789bcaf9 Sofia Papagiannaki
        (SELECT COUNT(*) FROM im_membership
943 789bcaf9 Sofia Papagiannaki
            WHERE group_id = im_astakosgroup.group_ptr_id
944 789bcaf9 Sofia Papagiannaki
            AND date_joined IS NOT NULL) AS approved_members_num,
945 04febd09 Olga Brani
        (SELECT CASE WHEN(
946 04febd09 Olga Brani
                    SELECT date_joined FROM im_membership
947 04febd09 Olga Brani
                    WHERE group_id = im_astakosgroup.group_ptr_id
948 289f8c2e Sofia Papagiannaki
                    AND person_id = %(id)s) IS NULL
949 0f225db4 Sofia Papagiannaki
                    THEN 0 ELSE 1 END) AS membership_status
950 789bcaf9 Sofia Papagiannaki
        FROM im_astakosgroup
951 789bcaf9 Sofia Papagiannaki
        INNER JOIN im_membership ON (
952 789bcaf9 Sofia Papagiannaki
            im_astakosgroup.group_ptr_id = im_membership.group_id)
953 789bcaf9 Sofia Papagiannaki
        INNER JOIN auth_group ON(im_astakosgroup.group_ptr_id = auth_group.id)
954 789bcaf9 Sofia Papagiannaki
        INNER JOIN im_groupkind ON (im_astakosgroup.kind_id = im_groupkind.id)
955 789bcaf9 Sofia Papagiannaki
        LEFT JOIN im_astakosuser_owner ON (
956 789bcaf9 Sofia Papagiannaki
            im_astakosuser_owner.astakosgroup_id = im_astakosgroup.group_ptr_id)
957 789bcaf9 Sofia Papagiannaki
        LEFT JOIN auth_user as owner ON (
958 789bcaf9 Sofia Papagiannaki
            im_astakosuser_owner.astakosuser_id = owner.id)
959 289f8c2e Sofia Papagiannaki
        WHERE im_membership.person_id = %(id)s
960 29b0ec5a Sofia Papagiannaki
        AND im_groupkind.name != 'default'
961 289f8c2e Sofia Papagiannaki
        """ % request.user.__dict__
962 792c2f3b Olga Brani
963 098f333b Sofia Papagiannaki
    # validate sorting
964 098f333b Sofia Papagiannaki
    sorting = 'groupname'
965 098f333b Sofia Papagiannaki
    sort_form = AstakosGroupSortForm(request.GET)
966 098f333b Sofia Papagiannaki
    if sort_form.is_valid():
967 098f333b Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
968 098f333b Sofia Papagiannaki
    query = query+" ORDER BY %s ASC" %sorting
969 c630fee6 Kostas Papadimitriou
970 289f8c2e Sofia Papagiannaki
    q = AstakosGroup.objects.raw(query)
971 c630fee6 Kostas Papadimitriou
972 f2a4ce70 Sofia Papagiannaki
    # Create the template, context, response
973 f2a4ce70 Sofia Papagiannaki
    template_name = "%s/%s_list.html" % (
974 f2a4ce70 Sofia Papagiannaki
        q.model._meta.app_label,
975 f2a4ce70 Sofia Papagiannaki
        q.model._meta.object_name.lower()
976 f2a4ce70 Sofia Papagiannaki
    )
977 f2a4ce70 Sofia Papagiannaki
    extra_context = dict(
978 f2a4ce70 Sofia Papagiannaki
        is_search=False,
979 f2a4ce70 Sofia Papagiannaki
        q=q,
980 098f333b Sofia Papagiannaki
        sorting=sorting,
981 f2a4ce70 Sofia Papagiannaki
        page=request.GET.get('page', 1)
982 f2a4ce70 Sofia Papagiannaki
    )
983 f2a4ce70 Sofia Papagiannaki
    return render_response(template_name,
984 f2a4ce70 Sofia Papagiannaki
                           context_instance=get_context(request, extra_context)
985 f2a4ce70 Sofia Papagiannaki
    )
986 5ce3ce4f Sofia Papagiannaki
987 8e45d6fd Sofia Papagiannaki
988 8c804c12 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
989 8e45d6fd Sofia Papagiannaki
@signed_terms_required
990 8e45d6fd Sofia Papagiannaki
@login_required
991 8e45d6fd Sofia Papagiannaki
def group_detail(request, group_id):
992 032ade79 Sofia Papagiannaki
    q = AstakosGroup.objects.select_related().filter(pk=group_id)
993 661c4479 Sofia Papagiannaki
    q = q.extra(select={
994 661c4479 Sofia Papagiannaki
        'is_member': """SELECT CASE WHEN EXISTS(
995 661c4479 Sofia Papagiannaki
                            SELECT id FROM im_membership
996 661c4479 Sofia Papagiannaki
                            WHERE group_id = im_astakosgroup.group_ptr_id
997 661c4479 Sofia Papagiannaki
                            AND person_id = %s)
998 661c4479 Sofia Papagiannaki
                        THEN 1 ELSE 0 END""" % request.user.id,
999 661c4479 Sofia Papagiannaki
        'is_owner': """SELECT CASE WHEN EXISTS(
1000 032ade79 Sofia Papagiannaki
                        SELECT id FROM im_astakosuser_owner
1001 032ade79 Sofia Papagiannaki
                        WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1002 032ade79 Sofia Papagiannaki
                        AND astakosuser_id = %s)
1003 661c4479 Sofia Papagiannaki
                        THEN 1 ELSE 0 END""" % request.user.id,
1004 394c9834 Olga Brani
        'is_active_member': """SELECT CASE WHEN(
1005 394c9834 Olga Brani
                        SELECT date_joined FROM im_membership
1006 394c9834 Olga Brani
                        WHERE group_id = im_astakosgroup.group_ptr_id
1007 394c9834 Olga Brani
                        AND person_id = %s) IS NULL
1008 394c9834 Olga Brani
                        THEN 0 ELSE 1 END""" % request.user.id,
1009 661c4479 Sofia Papagiannaki
        'kindname': """SELECT name FROM im_groupkind
1010 661c4479 Sofia Papagiannaki
                       WHERE id = im_astakosgroup.kind_id"""})
1011 9a06d96f Olga Brani
1012 661c4479 Sofia Papagiannaki
    model = q.model
1013 661c4479 Sofia Papagiannaki
    context_processors = None
1014 661c4479 Sofia Papagiannaki
    mimetype = None
1015 8e45d6fd Sofia Papagiannaki
    try:
1016 661c4479 Sofia Papagiannaki
        obj = q.get()
1017 032ade79 Sofia Papagiannaki
    except AstakosGroup.DoesNotExist:
1018 032ade79 Sofia Papagiannaki
        raise Http404("No %s found matching the query" % (
1019 032ade79 Sofia Papagiannaki
            model._meta.verbose_name))
1020 9a06d96f Olga Brani
1021 661c4479 Sofia Papagiannaki
    update_form = AstakosGroupUpdateForm(instance=obj)
1022 661c4479 Sofia Papagiannaki
    addmembers_form = AddGroupMembersForm()
1023 661c4479 Sofia Papagiannaki
    if request.method == 'POST':
1024 661c4479 Sofia Papagiannaki
        update_data = {}
1025 661c4479 Sofia Papagiannaki
        addmembers_data = {}
1026 9a06d96f Olga Brani
        for k, v in request.POST.iteritems():
1027 661c4479 Sofia Papagiannaki
            if k in update_form.fields:
1028 661c4479 Sofia Papagiannaki
                update_data[k] = v
1029 661c4479 Sofia Papagiannaki
            if k in addmembers_form.fields:
1030 661c4479 Sofia Papagiannaki
                addmembers_data[k] = v
1031 661c4479 Sofia Papagiannaki
        update_data = update_data or None
1032 661c4479 Sofia Papagiannaki
        addmembers_data = addmembers_data or None
1033 661c4479 Sofia Papagiannaki
        update_form = AstakosGroupUpdateForm(update_data, instance=obj)
1034 661c4479 Sofia Papagiannaki
        addmembers_form = AddGroupMembersForm(addmembers_data)
1035 661c4479 Sofia Papagiannaki
        if update_form.is_valid():
1036 661c4479 Sofia Papagiannaki
            update_form.save()
1037 661c4479 Sofia Papagiannaki
        if addmembers_form.is_valid():
1038 ae497612 Olga Brani
            try:
1039 ae497612 Olga Brani
                map(obj.approve_member, addmembers_form.valid_users)
1040 ae497612 Olga Brani
            except AssertionError:
1041 ae497612 Olga Brani
                msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1042 ae497612 Olga Brani
                messages.error(request, msg)
1043 661c4479 Sofia Papagiannaki
            addmembers_form = AddGroupMembersForm()
1044 9a06d96f Olga Brani
1045 9a06d96f Olga Brani
    template_name = "%s/%s_detail.html" % (
1046 9a06d96f Olga Brani
        model._meta.app_label, model._meta.object_name.lower())
1047 661c4479 Sofia Papagiannaki
    t = template_loader.get_template(template_name)
1048 661c4479 Sofia Papagiannaki
    c = RequestContext(request, {
1049 661c4479 Sofia Papagiannaki
        'object': obj,
1050 661c4479 Sofia Papagiannaki
    }, context_processors)
1051 9a06d96f Olga Brani
1052 801be7a3 Sofia Papagiannaki
    # validate sorting
1053 bfaeedb6 Sofia Papagiannaki
    sorting = 'person__email'
1054 bfaeedb6 Sofia Papagiannaki
    form = MembersSortForm(request.GET)
1055 bfaeedb6 Sofia Papagiannaki
    if form.is_valid():
1056 bfaeedb6 Sofia Papagiannaki
        sorting = form.cleaned_data.get('sorting')
1057 c630fee6 Kostas Papadimitriou
1058 bdc1c103 Olga Brani
    result = callpoint.list_resources()
1059 3cbd5e47 Olga Brani
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1060 3cbd5e47 Olga Brani
    resource_catalog.update_from_result(result)
1061 3cbd5e47 Olga Brani
1062 792c2f3b Olga Brani
1063 3cbd5e47 Olga Brani
    if not result.is_success:
1064 3cbd5e47 Olga Brani
        messages.error(
1065 3cbd5e47 Olga Brani
            request,
1066 3cbd5e47 Olga Brani
            'Unable to retrieve system resources: %s' % result.reason
1067 3cbd5e47 Olga Brani
    )
1068 792c2f3b Olga Brani
1069 661c4479 Sofia Papagiannaki
    extra_context = {'update_form': update_form,
1070 661c4479 Sofia Papagiannaki
                     'addmembers_form': addmembers_form,
1071 661c4479 Sofia Papagiannaki
                     'page': request.GET.get('page', 1),
1072 bdc1c103 Olga Brani
                     'sorting': sorting,
1073 bdc1c103 Olga Brani
                     'resource_catalog':resource_catalog,
1074 3cbd5e47 Olga Brani
                     'quota':resource_catalog.get_quota(obj.quota)}
1075 661c4479 Sofia Papagiannaki
    for key, value in extra_context.items():
1076 661c4479 Sofia Papagiannaki
        if callable(value):
1077 661c4479 Sofia Papagiannaki
            c[key] = value()
1078 04febd09 Olga Brani
        else:
1079 661c4479 Sofia Papagiannaki
            c[key] = value
1080 661c4479 Sofia Papagiannaki
    response = HttpResponse(t.render(c), mimetype=mimetype)
1081 9a06d96f Olga Brani
    populate_xheaders(
1082 9a06d96f Olga Brani
        request, response, model, getattr(obj, obj._meta.pk.name))
1083 661c4479 Sofia Papagiannaki
    return response
1084 8e45d6fd Sofia Papagiannaki
1085 5ce3ce4f Sofia Papagiannaki
1086 8c804c12 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1087 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1088 01ac12d5 Sofia Papagiannaki
@login_required
1089 95a51cdc Sofia Papagiannaki
def group_search(request, extra_context=None, **kwargs):
1090 d220292f Sofia Papagiannaki
    q = request.GET.get('q')
1091 01ac12d5 Sofia Papagiannaki
    if request.method == 'GET':
1092 d220292f Sofia Papagiannaki
        form = AstakosGroupSearchForm({'q': q} if q else None)
1093 01ac12d5 Sofia Papagiannaki
    else:
1094 01ac12d5 Sofia Papagiannaki
        form = AstakosGroupSearchForm(get_query(request))
1095 01ac12d5 Sofia Papagiannaki
        if form.is_valid():
1096 01ac12d5 Sofia Papagiannaki
            q = form.cleaned_data['q'].strip()
1097 c630fee6 Kostas Papadimitriou
1098 098f333b Sofia Papagiannaki
    sorting = 'groupname'
1099 d220292f Sofia Papagiannaki
    if q:
1100 789bcaf9 Sofia Papagiannaki
        queryset = AstakosGroup.objects.select_related()
1101 29b0ec5a Sofia Papagiannaki
        queryset = queryset.filter(~Q(kind__name='default'))
1102 789bcaf9 Sofia Papagiannaki
        queryset = queryset.filter(name__contains=q)
1103 789bcaf9 Sofia Papagiannaki
        queryset = queryset.filter(approval_date__isnull=False)
1104 789bcaf9 Sofia Papagiannaki
        queryset = queryset.extra(select={
1105 098f333b Sofia Papagiannaki
                                  'groupname': "auth_group.name",
1106 9a06d96f Olga Brani
                                  'kindname': "im_groupkind.name",
1107 9a06d96f Olga Brani
                                  'approved_members_num': """
1108 789bcaf9 Sofia Papagiannaki
                    SELECT COUNT(*) FROM im_membership
1109 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1110 789bcaf9 Sofia Papagiannaki
                    AND date_joined IS NOT NULL""",
1111 9a06d96f Olga Brani
                                  'membership_approval_date': """
1112 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
1113 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1114 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s""" % request.user.id,
1115 9a06d96f Olga Brani
                                  'is_member': """
1116 789bcaf9 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
1117 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
1118 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1119 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s)
1120 701118f4 Sofia Papagiannaki
                    THEN 1 ELSE 0 END""" % request.user.id,
1121 9a06d96f Olga Brani
                                  'is_owner': """
1122 701118f4 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
1123 701118f4 Sofia Papagiannaki
                    SELECT id FROM im_astakosuser_owner
1124 701118f4 Sofia Papagiannaki
                    WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1125 701118f4 Sofia Papagiannaki
                    AND astakosuser_id = %s)
1126 bdc1c103 Olga Brani
                    THEN 1 ELSE 0 END""" % request.user.id,
1127 bdc1c103 Olga Brani
                    'is_owner': """SELECT CASE WHEN EXISTS(
1128 bdc1c103 Olga Brani
                        SELECT id FROM im_astakosuser_owner
1129 bdc1c103 Olga Brani
                        WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1130 bdc1c103 Olga Brani
                        AND astakosuser_id = %s)
1131 792c2f3b Olga Brani
                        THEN 1 ELSE 0 END""" % request.user.id,
1132 bdc1c103 Olga Brani
                    })
1133 c630fee6 Kostas Papadimitriou
1134 098f333b Sofia Papagiannaki
        # validate sorting
1135 098f333b Sofia Papagiannaki
        sort_form = AstakosGroupSortForm(request.GET)
1136 098f333b Sofia Papagiannaki
        if sort_form.is_valid():
1137 098f333b Sofia Papagiannaki
            sorting = sort_form.cleaned_data.get('sorting')
1138 098f333b Sofia Papagiannaki
        queryset = queryset.order_by(sorting)
1139 3cbd5e47 Olga Brani
1140 d220292f Sofia Papagiannaki
    else:
1141 d220292f Sofia Papagiannaki
        queryset = AstakosGroup.objects.none()
1142 d220292f Sofia Papagiannaki
    return object_list(
1143 d220292f Sofia Papagiannaki
        request,
1144 d220292f Sofia Papagiannaki
        queryset,
1145 59728d4e Olga Brani
        paginate_by=PAGINATE_BY_ALL,
1146 d220292f Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1147 d220292f Sofia Papagiannaki
        template_name='im/astakosgroup_list.html',
1148 d220292f Sofia Papagiannaki
        extra_context=dict(form=form,
1149 d220292f Sofia Papagiannaki
                           is_search=True,
1150 04febd09 Olga Brani
                           q=q,
1151 04febd09 Olga Brani
                           sorting=sorting))
1152 5ce3ce4f Sofia Papagiannaki
1153 9a06d96f Olga Brani
1154 ae497612 Olga Brani
@require_http_methods(["GET", "POST"])
1155 df67421c Sofia Papagiannaki
@signed_terms_required
1156 df67421c Sofia Papagiannaki
@login_required
1157 df67421c Sofia Papagiannaki
def group_all(request, extra_context=None, **kwargs):
1158 789bcaf9 Sofia Papagiannaki
    q = AstakosGroup.objects.select_related()
1159 29b0ec5a Sofia Papagiannaki
    q = q.filter(~Q(kind__name='default'))
1160 789bcaf9 Sofia Papagiannaki
    q = q.filter(approval_date__isnull=False)
1161 789bcaf9 Sofia Papagiannaki
    q = q.extra(select={
1162 098f333b Sofia Papagiannaki
                'groupname': "auth_group.name",
1163 789bcaf9 Sofia Papagiannaki
                'kindname': "im_groupkind.name",
1164 789bcaf9 Sofia Papagiannaki
                'approved_members_num': """
1165 789bcaf9 Sofia Papagiannaki
                    SELECT COUNT(*) FROM im_membership
1166 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1167 789bcaf9 Sofia Papagiannaki
                    AND date_joined IS NOT NULL""",
1168 789bcaf9 Sofia Papagiannaki
                'membership_approval_date': """
1169 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
1170 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1171 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s""" % request.user.id,
1172 789bcaf9 Sofia Papagiannaki
                'is_member': """
1173 789bcaf9 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
1174 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
1175 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
1176 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s)
1177 bdc1c103 Olga Brani
                    THEN 1 ELSE 0 END""" % request.user.id,
1178 bdc1c103 Olga Brani
                 'is_owner': """SELECT CASE WHEN EXISTS(
1179 bdc1c103 Olga Brani
                        SELECT id FROM im_astakosuser_owner
1180 bdc1c103 Olga Brani
                        WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1181 bdc1c103 Olga Brani
                        AND astakosuser_id = %s)
1182 bdc1c103 Olga Brani
                        THEN 1 ELSE 0 END""" % request.user.id,   })
1183 c630fee6 Kostas Papadimitriou
1184 098f333b Sofia Papagiannaki
    # validate sorting
1185 098f333b Sofia Papagiannaki
    sorting = 'groupname'
1186 098f333b Sofia Papagiannaki
    sort_form = AstakosGroupSortForm(request.GET)
1187 098f333b Sofia Papagiannaki
    if sort_form.is_valid():
1188 098f333b Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1189 098f333b Sofia Papagiannaki
    q = q.order_by(sorting)
1190 c630fee6 Kostas Papadimitriou
1191 df67421c Sofia Papagiannaki
    return object_list(
1192 9a06d96f Olga Brani
        request,
1193 9a06d96f Olga Brani
        q,
1194 59728d4e Olga Brani
        paginate_by=PAGINATE_BY_ALL,
1195 9a06d96f Olga Brani
        page=request.GET.get('page') or 1,
1196 9a06d96f Olga Brani
        template_name='im/astakosgroup_list.html',
1197 9a06d96f Olga Brani
        extra_context=dict(form=AstakosGroupSearchForm(),
1198 9a06d96f Olga Brani
                           is_search=True,
1199 9a06d96f Olga Brani
                           sorting=sorting))
1200 df67421c Sofia Papagiannaki
1201 01ac12d5 Sofia Papagiannaki
1202 ae497612 Olga Brani
#@require_http_methods(["POST"])
1203 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1204 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1205 01ac12d5 Sofia Papagiannaki
@login_required
1206 01ac12d5 Sofia Papagiannaki
def group_join(request, group_id):
1207 95a51cdc Sofia Papagiannaki
    m = Membership(group_id=group_id,
1208 5ce3ce4f Sofia Papagiannaki
                   person=request.user,
1209 789bcaf9 Sofia Papagiannaki
                   date_requested=datetime.now())
1210 95a51cdc Sofia Papagiannaki
    try:
1211 95a51cdc Sofia Papagiannaki
        m.save()
1212 0f4fa26d Sofia Papagiannaki
        post_save_redirect = reverse(
1213 0f4fa26d Sofia Papagiannaki
            'group_detail',
1214 789bcaf9 Sofia Papagiannaki
            kwargs=dict(group_id=group_id))
1215 95a51cdc Sofia Papagiannaki
        return HttpResponseRedirect(post_save_redirect)
1216 95a51cdc Sofia Papagiannaki
    except IntegrityError, e:
1217 95a51cdc Sofia Papagiannaki
        logger.exception(e)
1218 ae497612 Olga Brani
        msg = _(astakos_messages.GROUP_JOIN_FAILURE)
1219 95a51cdc Sofia Papagiannaki
        messages.error(request, msg)
1220 95a51cdc Sofia Papagiannaki
        return group_search(request)
1221 01ac12d5 Sofia Papagiannaki
1222 5ce3ce4f Sofia Papagiannaki
1223 8c804c12 Sofia Papagiannaki
@require_http_methods(["POST"])
1224 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1225 01ac12d5 Sofia Papagiannaki
@login_required
1226 01ac12d5 Sofia Papagiannaki
def group_leave(request, group_id):
1227 01ac12d5 Sofia Papagiannaki
    try:
1228 0f4fa26d Sofia Papagiannaki
        m = Membership.objects.select_related().get(
1229 0f4fa26d Sofia Papagiannaki
            group__id=group_id,
1230 032ade79 Sofia Papagiannaki
            person=request.user)
1231 01ac12d5 Sofia Papagiannaki
    except Membership.DoesNotExist:
1232 c0b26605 Sofia Papagiannaki
        return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1233 01ac12d5 Sofia Papagiannaki
    if request.user in m.group.owner.all():
1234 ae497612 Olga Brani
        return HttpResponseForbidden(_(astakos_messages.OWNER_CANNOT_LEAVE_GROUP))
1235 0f4fa26d Sofia Papagiannaki
    return delete_object(
1236 0f4fa26d Sofia Papagiannaki
        request,
1237 0f4fa26d Sofia Papagiannaki
        model=Membership,
1238 5ce3ce4f Sofia Papagiannaki
        object_id=m.id,
1239 0f4fa26d Sofia Papagiannaki
        template_name='im/astakosgroup_list.html',
1240 5ce3ce4f Sofia Papagiannaki
        post_delete_redirect=reverse(
1241 0f4fa26d Sofia Papagiannaki
            'group_detail',
1242 032ade79 Sofia Papagiannaki
            kwargs=dict(group_id=group_id)))
1243 01ac12d5 Sofia Papagiannaki
1244 5ce3ce4f Sofia Papagiannaki
1245 1eaeb5b6 Sofia Papagiannaki
def handle_membership(func):
1246 1eaeb5b6 Sofia Papagiannaki
    @wraps(func)
1247 1eaeb5b6 Sofia Papagiannaki
    def wrapper(request, group_id, user_id):
1248 1eaeb5b6 Sofia Papagiannaki
        try:
1249 1eaeb5b6 Sofia Papagiannaki
            m = Membership.objects.select_related().get(
1250 1eaeb5b6 Sofia Papagiannaki
                group__id=group_id,
1251 032ade79 Sofia Papagiannaki
                person__id=user_id)
1252 1eaeb5b6 Sofia Papagiannaki
        except Membership.DoesNotExist:
1253 ae497612 Olga Brani
            return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1254 1eaeb5b6 Sofia Papagiannaki
        else:
1255 1eaeb5b6 Sofia Papagiannaki
            if request.user not in m.group.owner.all():
1256 ae497612 Olga Brani
                return HttpResponseForbidden(_(astakos_messages.NOT_OWNER))
1257 1eaeb5b6 Sofia Papagiannaki
            func(request, m)
1258 56b1281c Sofia Papagiannaki
            return group_detail(request, group_id)
1259 1eaeb5b6 Sofia Papagiannaki
    return wrapper
1260 01ac12d5 Sofia Papagiannaki
1261 5ce3ce4f Sofia Papagiannaki
1262 ae497612 Olga Brani
#@require_http_methods(["POST"])
1263 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1264 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1265 01ac12d5 Sofia Papagiannaki
@login_required
1266 1eaeb5b6 Sofia Papagiannaki
@handle_membership
1267 01ac12d5 Sofia Papagiannaki
def approve_member(request, membership):
1268 01ac12d5 Sofia Papagiannaki
    try:
1269 01ac12d5 Sofia Papagiannaki
        membership.approve()
1270 01ac12d5 Sofia Papagiannaki
        realname = membership.person.realname
1271 ae497612 Olga Brani
        msg = _(astakos_messages.MEMBER_JOINED_GROUP) % locals()
1272 01ac12d5 Sofia Papagiannaki
        messages.success(request, msg)
1273 ae497612 Olga Brani
    except AssertionError:
1274 ae497612 Olga Brani
        msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1275 ae497612 Olga Brani
        messages.error(request, msg)
1276 01ac12d5 Sofia Papagiannaki
    except BaseException, e:
1277 01ac12d5 Sofia Papagiannaki
        logger.exception(e)
1278 56b1281c Sofia Papagiannaki
        realname = membership.person.realname
1279 ae497612 Olga Brani
        msg = _(astakos_messages.GENERIC_ERROR)
1280 01ac12d5 Sofia Papagiannaki
        messages.error(request, msg)
1281 5ce3ce4f Sofia Papagiannaki
1282 5ce3ce4f Sofia Papagiannaki
1283 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1284 01ac12d5 Sofia Papagiannaki
@login_required
1285 1eaeb5b6 Sofia Papagiannaki
@handle_membership
1286 01ac12d5 Sofia Papagiannaki
def disapprove_member(request, membership):
1287 01ac12d5 Sofia Papagiannaki
    try:
1288 01ac12d5 Sofia Papagiannaki
        membership.disapprove()
1289 01ac12d5 Sofia Papagiannaki
        realname = membership.person.realname
1290 666e1351 Sofia Papagiannaki
        msg = astakos_messages.MEMBER_REMOVED % locals()
1291 01ac12d5 Sofia Papagiannaki
        messages.success(request, msg)
1292 01ac12d5 Sofia Papagiannaki
    except BaseException, e:
1293 01ac12d5 Sofia Papagiannaki
        logger.exception(e)
1294 ae497612 Olga Brani
        msg = _(astakos_messages.GENERIC_ERROR)
1295 01ac12d5 Sofia Papagiannaki
        messages.error(request, msg)
1296 ffb1e7a8 Sofia Papagiannaki
1297 5ce3ce4f Sofia Papagiannaki
1298 ae497612 Olga Brani
#@require_http_methods(["GET"])
1299 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1300 ffb1e7a8 Sofia Papagiannaki
@signed_terms_required
1301 ffb1e7a8 Sofia Papagiannaki
@login_required
1302 666c7490 Sofia Papagiannaki
def resource_usage(request):
1303 52343ac8 Olga Brani
    def with_class(entry):
1304 52343ac8 Olga Brani
        entry['load_class'] = 'red'
1305 52343ac8 Olga Brani
        max_value = float(entry['maxValue'])
1306 52343ac8 Olga Brani
        curr_value = float(entry['currValue'])
1307 394c9834 Olga Brani
        entry['ratio_limited']= 0
1308 639e0352 Olga Brani
        if max_value > 0 :
1309 c0b26605 Sofia Papagiannaki
            entry['ratio'] = (curr_value / max_value) * 100
1310 c0b26605 Sofia Papagiannaki
        else:
1311 792c2f3b Olga Brani
            entry['ratio'] = 0
1312 52343ac8 Olga Brani
        if entry['ratio'] < 66:
1313 9a06d96f Olga Brani
            entry['load_class'] = 'yellow'
1314 52343ac8 Olga Brani
        if entry['ratio'] < 33:
1315 9a06d96f Olga Brani
            entry['load_class'] = 'green'
1316 394c9834 Olga Brani
        if entry['ratio']<0:
1317 394c9834 Olga Brani
            entry['ratio'] = 0
1318 394c9834 Olga Brani
        if entry['ratio']>100:
1319 394c9834 Olga Brani
            entry['ratio_limited'] = 100
1320 394c9834 Olga Brani
        else:
1321 394c9834 Olga Brani
            entry['ratio_limited'] = entry['ratio']
1322 c630fee6 Kostas Papadimitriou
1323 9a06d96f Olga Brani
        return entry
1324 9a06d96f Olga Brani
1325 52343ac8 Olga Brani
    def pluralize(entry):
1326 9a06d96f Olga Brani
        entry['plural'] = engine.plural(entry.get('name'))
1327 9a06d96f Olga Brani
        return entry
1328 52343ac8 Olga Brani
1329 666c7490 Sofia Papagiannaki
    result = callpoint.get_user_usage(request.user.id)
1330 820b18e0 Sofia Papagiannaki
    if result.is_success:
1331 820b18e0 Sofia Papagiannaki
        backenddata = map(with_class, result.data)
1332 820b18e0 Sofia Papagiannaki
        data = map(pluralize, result.data)
1333 9a06d96f Olga Brani
    else:
1334 820b18e0 Sofia Papagiannaki
        data = None
1335 820b18e0 Sofia Papagiannaki
        messages.error(request, result.reason)
1336 3cbd5e47 Olga Brani
    resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1337 3cbd5e47 Olga Brani
    resource_catalog.update_from_result_report(result)
1338 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
1339 9a06d96f Olga Brani
                           data=data,
1340 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
1341 c0b26605 Sofia Papagiannaki
                           resource_catalog=resource_catalog,
1342 3cbd5e47 Olga Brani
                           result=result)
1343 9a06d96f Olga Brani
1344 1b866d9e Olga Brani
1345 4b7d68f0 Olga Brani
def group_create_list(request):
1346 9eafaa32 Sofia Papagiannaki
    form = PickResourceForm()
1347 4b7d68f0 Olga Brani
    return render_response(
1348 4b7d68f0 Olga Brani
        template='im/astakosgroup_create_list.html',
1349 032ade79 Sofia Papagiannaki
        context_instance=get_context(request),)
1350 6e029beb Sofia Papagiannaki
1351 5ce3ce4f Sofia Papagiannaki
1352 f8f86e83 root
##@require_http_methods(["GET"])
1353 f8f86e83 root
#@require_http_methods(["POST", "GET"])
1354 f8f86e83 root
#@signed_terms_required
1355 f8f86e83 root
#@login_required
1356 f8f86e83 root
#def billing(request):
1357 f8f86e83 root
#
1358 f8f86e83 root
#    today = datetime.today()
1359 f8f86e83 root
#    month_last_day = calendar.monthrange(today.year, today.month)[1]
1360 f8f86e83 root
#    start = request.POST.get('datefrom', None)
1361 f8f86e83 root
#    if start:
1362 f8f86e83 root
#        today = datetime.fromtimestamp(int(start))
1363 f8f86e83 root
#        month_last_day = calendar.monthrange(today.year, today.month)[1]
1364 f8f86e83 root
#
1365 f8f86e83 root
#    start = datetime(today.year, today.month, 1).strftime("%s")
1366 f8f86e83 root
#    end = datetime(today.year, today.month, month_last_day).strftime("%s")
1367 f8f86e83 root
#    r = request_billing.apply(args=('pgerakios@grnet.gr',
1368 f8f86e83 root
#                                    int(start) * 1000,
1369 f8f86e83 root
#                                    int(end) * 1000))
1370 f8f86e83 root
#    data = {}
1371 f8f86e83 root
#
1372 f8f86e83 root
#    try:
1373 f8f86e83 root
#        status, data = r.result
1374 f8f86e83 root
#        data = _clear_billing_data(data)
1375 f8f86e83 root
#        if status != 200:
1376 f8f86e83 root
#            messages.error(request, _(astakos_messages.BILLING_ERROR) % status)
1377 f8f86e83 root
#    except:
1378 f8f86e83 root
#        messages.error(request, r.result)
1379 f8f86e83 root
#
1380 f8f86e83 root
#    return render_response(
1381 f8f86e83 root
#        template='im/billing.html',
1382 f8f86e83 root
#        context_instance=get_context(request),
1383 f8f86e83 root
#        data=data,
1384 f8f86e83 root
#        zerodate=datetime(month=1, year=1970, day=1),
1385 f8f86e83 root
#        today=today,
1386 f8f86e83 root
#        start=int(start),
1387 f8f86e83 root
#        month_last_day=month_last_day)
1388 9a06d96f Olga Brani
1389 54213d7a Sofia Papagiannaki
1390 f8f86e83 root
#def _clear_billing_data(data):
1391 f8f86e83 root
#
1392 f8f86e83 root
#    # remove addcredits entries
1393 f8f86e83 root
#    def isnotcredit(e):
1394 f8f86e83 root
#        return e['serviceName'] != "addcredits"
1395 f8f86e83 root
#
1396 f8f86e83 root
#    # separate services
1397 f8f86e83 root
#    def servicefilter(service_name):
1398 f8f86e83 root
#        service = service_name
1399 f8f86e83 root
#
1400 f8f86e83 root
#        def fltr(e):
1401 f8f86e83 root
#            return e['serviceName'] == service
1402 f8f86e83 root
#        return fltr
1403 f8f86e83 root
#
1404 f8f86e83 root
#    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
1405 f8f86e83 root
#    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
1406 f8f86e83 root
#    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
1407 f8f86e83 root
#    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
1408 f8f86e83 root
#
1409 f8f86e83 root
#    return data
1410 792c2f3b Olga Brani
1411 792c2f3b Olga Brani
1412 ae497612 Olga Brani
#@require_http_methods(["GET"])
1413 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1414 3bcad004 Sofia Papagiannaki
@signed_terms_required
1415 3bcad004 Sofia Papagiannaki
@login_required
1416 54213d7a Sofia Papagiannaki
def timeline(request):
1417 88305cf0 root
#    data = {'entity':request.user.email}
1418 2925e285 root
    timeline_body = ()
1419 2925e285 root
    timeline_header = ()
1420 88305cf0 root
#    form = TimelineForm(data)
1421 88305cf0 root
    form = TimelineForm()
1422 54213d7a Sofia Papagiannaki
    if request.method == 'POST':
1423 54213d7a Sofia Papagiannaki
        data = request.POST
1424 2925e285 root
        form = TimelineForm(data)
1425 2925e285 root
        if form.is_valid():
1426 2925e285 root
            data = form.cleaned_data
1427 2925e285 root
            timeline_header = ('entity', 'resource',
1428 2925e285 root
                               'event name', 'event date',
1429 2925e285 root
                               'incremental cost', 'total cost')
1430 2925e285 root
            timeline_body = timeline_charge(
1431 9a06d96f Olga Brani
                data['entity'], data['resource'],
1432 9a06d96f Olga Brani
                data['start_date'], data['end_date'],
1433 9a06d96f Olga Brani
                data['details'], data['operation'])
1434 9a06d96f Olga Brani
1435 54213d7a Sofia Papagiannaki
    return render_response(template='im/timeline.html',
1436 54213d7a Sofia Papagiannaki
                           context_instance=get_context(request),
1437 54213d7a Sofia Papagiannaki
                           form=form,
1438 c3f6cdf1 root
                           timeline_header=timeline_header,
1439 c3f6cdf1 root
                           timeline_body=timeline_body)
1440 7c76af95 Olga Brani
    return data
1441 5ebebb20 Olga Brani
1442 792c2f3b Olga Brani
1443 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
1444 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
1445 d2633501 Kostas Papadimitriou
@login_required
1446 d2633501 Kostas Papadimitriou
@signed_terms_required
1447 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
1448 f432088a Kostas Papadimitriou
    try:
1449 f432088a Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=pk)
1450 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
1451 f432088a Kostas Papadimitriou
        raise Http404
1452 f432088a Kostas Papadimitriou
1453 d2633501 Kostas Papadimitriou
    if provider.can_remove():
1454 d2633501 Kostas Papadimitriou
        provider.delete()
1455 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
1456 d2633501 Kostas Papadimitriou
    else:
1457 f432088a Kostas Papadimitriou
        raise PermissionDenied
1458 5ebebb20 Olga Brani
1459 792c2f3b Olga Brani
1460 5ebebb20 Olga Brani
def how_it_works(request):
1461 5ebebb20 Olga Brani
    return render_response(
1462 5ebebb20 Olga Brani
        template='im/how_it_works.html',
1463 792c2f3b Olga Brani
        context_instance=get_context(request),)