Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ f9aea9c8

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

170 890b0eaf Sofia Papagiannaki
    **Arguments**
171 176023aa Kostas Papadimitriou

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

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

180 890b0eaf Sofia Papagiannaki
    ``extra_context``
181 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
182 176023aa Kostas Papadimitriou

183 890b0eaf Sofia Papagiannaki
    **Template:**
184 176023aa Kostas Papadimitriou

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

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

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

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

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

217 890b0eaf Sofia Papagiannaki
    **Arguments**
218 176023aa Kostas Papadimitriou

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

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

226 890b0eaf Sofia Papagiannaki
    **Template:**
227 176023aa Kostas Papadimitriou

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

230 890b0eaf Sofia Papagiannaki
    **Settings:**
231 176023aa Kostas Papadimitriou

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

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

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

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

292 890b0eaf Sofia Papagiannaki
    **Arguments**
293 176023aa Kostas Papadimitriou

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

298 890b0eaf Sofia Papagiannaki
    ``extra_context``
299 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
300 176023aa Kostas Papadimitriou

301 890b0eaf Sofia Papagiannaki
    **Template:**
302 176023aa Kostas Papadimitriou

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

305 92defad4 Sofia Papagiannaki
    **Settings:**
306 176023aa Kostas Papadimitriou

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

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

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

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

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

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

378 890b0eaf Sofia Papagiannaki
    **Arguments**
379 5ce3ce4f Sofia Papagiannaki

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

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

388 890b0eaf Sofia Papagiannaki
    ``extra_context``
389 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
390 176023aa Kostas Papadimitriou

391 890b0eaf Sofia Papagiannaki
    **Template:**
392 5ce3ce4f Sofia Papagiannaki

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

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

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

483 890b0eaf Sofia Papagiannaki
    **Arguments**
484 176023aa Kostas Papadimitriou

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

489 890b0eaf Sofia Papagiannaki
    ``extra_context``
490 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
491 176023aa Kostas Papadimitriou

492 890b0eaf Sofia Papagiannaki
    **Template:**
493 176023aa Kostas Papadimitriou

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

496 890b0eaf Sofia Papagiannaki
    **Settings:**
497 176023aa Kostas Papadimitriou

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

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