Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (69.3 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 176023aa Kostas Papadimitriou
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 176023aa Kostas Papadimitriou
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 176023aa Kostas Papadimitriou
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 176023aa Kostas Papadimitriou
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 176023aa Kostas Papadimitriou
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 64cd4730 Antony Chazapis
import logging
35 6e029beb Sofia Papagiannaki
import calendar
36 9a06d96f Olga Brani
import inflect
37 9a06d96f Olga Brani
38 9a06d96f Olga Brani
engine = inflect.engine()
39 64cd4730 Antony Chazapis
40 0905ccd2 Sofia Papagiannaki
from urllib import quote
41 63ecdd20 Sofia Papagiannaki
from functools import wraps
42 c0b26605 Sofia Papagiannaki
from datetime import datetime
43 64cd4730 Antony Chazapis
44 c630fee6 Kostas Papadimitriou
from django.shortcuts import get_object_or_404
45 890b0eaf Sofia Papagiannaki
from django.contrib import messages
46 01ac12d5 Sofia Papagiannaki
from django.contrib.auth.decorators import login_required
47 01ac12d5 Sofia Papagiannaki
from django.core.urlresolvers import reverse
48 01ac12d5 Sofia Papagiannaki
from django.db import transaction
49 01ac12d5 Sofia Papagiannaki
from django.db.utils import IntegrityError
50 73fbaec4 Sofia Papagiannaki
from django.http import (
51 73fbaec4 Sofia Papagiannaki
    HttpResponse, HttpResponseBadRequest,
52 73fbaec4 Sofia Papagiannaki
    HttpResponseForbidden, HttpResponseRedirect,
53 73fbaec4 Sofia Papagiannaki
    HttpResponseBadRequest, Http404)
54 01ac12d5 Sofia Papagiannaki
from django.shortcuts import redirect
55 661c4479 Sofia Papagiannaki
from django.template import RequestContext, loader as template_loader
56 01ac12d5 Sofia Papagiannaki
from django.utils.http import urlencode
57 01ac12d5 Sofia Papagiannaki
from django.utils.translation import ugettext as _
58 e1a80257 Sofia Papagiannaki
from django.views.generic.create_update import (
59 4e748491 Sofia Papagiannaki
    apply_extra_context, lookup_object, delete_object, get_model_and_form_class)
60 f3342849 Sofia Papagiannaki
from django.views.generic.list_detail import object_list, object_detail
61 661c4479 Sofia Papagiannaki
from django.core.xheaders import populate_xheaders
62 792c2f3b Olga Brani
from django.core.exceptions import ValidationError, PermissionDenied
63 c0b26605 Sofia Papagiannaki
from django.template.loader import render_to_string
64 9a06d96f Olga Brani
from django.views.decorators.http import require_http_methods
65 29b0ec5a Sofia Papagiannaki
from django.db.models import Q
66 bfe23b13 Sofia Papagiannaki
from django.core.exceptions import PermissionDenied
67 c0b26605 Sofia Papagiannaki
68 c630fee6 Kostas Papadimitriou
import astakos.im.messages as astakos_messages
69 c630fee6 Kostas Papadimitriou
70 29b0ec5a Sofia Papagiannaki
from astakos.im.activation_backends import get_backend, SimpleBackend
71 e1a80257 Sofia Papagiannaki
from astakos.im.models import (
72 73fbaec4 Sofia Papagiannaki
    AstakosUser, ApprovalTerms,
73 73fbaec4 Sofia Papagiannaki
#     AstakosGroup, Membership
74 73fbaec4 Sofia Papagiannaki
    EmailChange, GroupKind,
75 e1a80257 Sofia Papagiannaki
    RESOURCE_SEPARATOR, AstakosUserAuthProvider,
76 73fbaec4 Sofia Papagiannaki
    ProjectApplication, ProjectMembership, Project)
77 73fbaec4 Sofia Papagiannaki
from astakos.im.util import (
78 73fbaec4 Sofia Papagiannaki
    get_context, prepare_response, get_query, restrict_next)
79 e1a80257 Sofia Papagiannaki
from astakos.im.forms import (
80 e1a80257 Sofia Papagiannaki
    LoginForm, InvitationForm, ProfileForm,
81 e1a80257 Sofia Papagiannaki
    FeedbackForm, SignApprovalTermsForm,
82 e1a80257 Sofia Papagiannaki
    EmailChangeForm,
83 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationForm, AstakosGroupSearchForm,
84 73fbaec4 Sofia Papagiannaki
#     AstakosGroupUpdateForm, AddGroupMembersForm,
85 73fbaec4 Sofia Papagiannaki
#     MembersSortForm, AstakosGroupSortForm,
86 73fbaec4 Sofia Papagiannaki
#     TimelineForm, PickResourceForm,
87 73fbaec4 Sofia Papagiannaki
#     AstakosGroupCreationSummaryForm,
88 bfe23b13 Sofia Papagiannaki
    ProjectApplicationForm, ProjectSortForm,
89 73fbaec4 Sofia Papagiannaki
    AddProjectMembersForm, ProjectSearchForm,
90 73fbaec4 Sofia Papagiannaki
    ProjectMembersSortForm)
91 f3342849 Sofia Papagiannaki
from astakos.im.functions import (
92 f3342849 Sofia Papagiannaki
    send_feedback, SendMailError,
93 f3342849 Sofia Papagiannaki
    logout as auth_logout,
94 f3342849 Sofia Papagiannaki
    activate as activate_func,
95 73fbaec4 Sofia Papagiannaki
    invite,
96 f3342849 Sofia Papagiannaki
    send_activation as send_activation_func,
97 73fbaec4 Sofia Papagiannaki
#     send_group_creation_notification,
98 73fbaec4 Sofia Papagiannaki
    SendNotificationError,
99 73fbaec4 Sofia Papagiannaki
    accept_membership, reject_membership, remove_membership,
100 73fbaec4 Sofia Papagiannaki
    leave_project, join_project)
101 73fbaec4 Sofia Papagiannaki
# from astakos.im.endpoints.qh import timeline_charge
102 f3342849 Sofia Papagiannaki
from astakos.im.settings import (
103 f3342849 Sofia Papagiannaki
    COOKIE_DOMAIN, LOGOUT_NEXT,
104 f3342849 Sofia Papagiannaki
    LOGGING_LEVEL, PAGINATE_BY,
105 73fbaec4 Sofia Papagiannaki
    RESOURCES_PRESENTATION_DATA, PAGINATE_BY_ALL)
106 f8f86e83 root
#from astakos.im.tasks import request_billing
107 820b18e0 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosCallpoint
108 64cd4730 Antony Chazapis
109 792c2f3b Olga Brani
from astakos.im import settings
110 792c2f3b Olga Brani
from astakos.im import auth_providers
111 ae497612 Olga Brani
112 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
113 e015e9e6 Sofia Papagiannaki
114 820b18e0 Sofia Papagiannaki
callpoint = AstakosCallpoint()
115 9a06d96f Olga Brani
116 b2ffa772 Sofia Papagiannaki
def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
117 890b0eaf Sofia Papagiannaki
    """
118 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
119 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
120 890b0eaf Sofia Papagiannaki
    specified ``status``.
121 890b0eaf Sofia Papagiannaki
    """
122 64cd4730 Antony Chazapis
    if tab is None:
123 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
124 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
125 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
126 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
127 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
128 c301698f Sofia Papagiannaki
    return response
129 64cd4730 Antony Chazapis
130 792c2f3b Olga Brani
def requires_auth_provider(provider_id, **perms):
131 792c2f3b Olga Brani
    """
132 792c2f3b Olga Brani
    """
133 792c2f3b Olga Brani
    def decorator(func, *args, **kwargs):
134 792c2f3b Olga Brani
        @wraps(func)
135 792c2f3b Olga Brani
        def wrapper(request, *args, **kwargs):
136 792c2f3b Olga Brani
            provider = auth_providers.get_provider(provider_id)
137 792c2f3b Olga Brani
138 792c2f3b Olga Brani
            if not provider or not provider.is_active():
139 792c2f3b Olga Brani
                raise PermissionDenied
140 792c2f3b Olga Brani
141 792c2f3b Olga Brani
            if provider:
142 792c2f3b Olga Brani
                for pkey, value in perms.iteritems():
143 792c2f3b Olga Brani
                    attr = 'is_available_for_%s' % pkey.lower()
144 792c2f3b Olga Brani
                    if getattr(provider, attr)() != value:
145 279d6e51 Olga Brani
                        #TODO: add session message
146 c630fee6 Kostas Papadimitriou
                        return HttpResponseRedirect(reverse('login'))
147 792c2f3b Olga Brani
            return func(request, *args)
148 792c2f3b Olga Brani
        return wrapper
149 792c2f3b Olga Brani
    return decorator
150 792c2f3b Olga Brani
151 63ecdd20 Sofia Papagiannaki
152 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
153 63ecdd20 Sofia Papagiannaki
    """
154 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
155 7482228b Sofia Papagiannaki
    redirects to `logout`.
156 63ecdd20 Sofia Papagiannaki
    """
157 63ecdd20 Sofia Papagiannaki
    @wraps(func)
158 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
159 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
160 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
161 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
162 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
163 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
164 63ecdd20 Sofia Papagiannaki
    return wrapper
165 63ecdd20 Sofia Papagiannaki
166 5ce3ce4f Sofia Papagiannaki
167 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
168 270dd48d Sofia Papagiannaki
    """
169 badcb2a9 Kostas Papadimitriou
    Decorator checks whether the request.user is Anonymous and in that case
170 270dd48d Sofia Papagiannaki
    redirects to `logout`.
171 270dd48d Sofia Papagiannaki
    """
172 270dd48d Sofia Papagiannaki
    @wraps(func)
173 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
174 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
175 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
176 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
177 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
178 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
179 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
180 270dd48d Sofia Papagiannaki
    return wrapper
181 270dd48d Sofia Papagiannaki
182 5ce3ce4f Sofia Papagiannaki
183 badcb2a9 Kostas Papadimitriou
def required_auth_methods_assigned(only_warn=False):
184 badcb2a9 Kostas Papadimitriou
    """
185 badcb2a9 Kostas Papadimitriou
    Decorator that checks whether the request.user has all required auth providers
186 badcb2a9 Kostas Papadimitriou
    assigned.
187 badcb2a9 Kostas Papadimitriou
    """
188 badcb2a9 Kostas Papadimitriou
    required_providers = auth_providers.REQUIRED_PROVIDERS.keys()
189 badcb2a9 Kostas Papadimitriou
190 badcb2a9 Kostas Papadimitriou
    def decorator(func):
191 badcb2a9 Kostas Papadimitriou
        if not required_providers:
192 badcb2a9 Kostas Papadimitriou
            return func
193 badcb2a9 Kostas Papadimitriou
194 badcb2a9 Kostas Papadimitriou
        @wraps(func)
195 badcb2a9 Kostas Papadimitriou
        def wrapper(request, *args, **kwargs):
196 badcb2a9 Kostas Papadimitriou
            if request.user.is_authenticated():
197 badcb2a9 Kostas Papadimitriou
                for required in required_providers:
198 badcb2a9 Kostas Papadimitriou
                    if not request.user.has_auth_provider(required):
199 badcb2a9 Kostas Papadimitriou
                        provider = auth_providers.get_provider(required)
200 badcb2a9 Kostas Papadimitriou
                        if only_warn:
201 badcb2a9 Kostas Papadimitriou
                            messages.error(request,
202 badcb2a9 Kostas Papadimitriou
                                           _(astakos_messages.AUTH_PROVIDER_REQUIRED  % {
203 badcb2a9 Kostas Papadimitriou
                                               'provider': provider.get_title_display}))
204 badcb2a9 Kostas Papadimitriou
                        else:
205 badcb2a9 Kostas Papadimitriou
                            return HttpResponseRedirect(reverse('edit_profile'))
206 badcb2a9 Kostas Papadimitriou
            return func(request, *args, **kwargs)
207 badcb2a9 Kostas Papadimitriou
        return wrapper
208 badcb2a9 Kostas Papadimitriou
    return decorator
209 badcb2a9 Kostas Papadimitriou
210 badcb2a9 Kostas Papadimitriou
211 badcb2a9 Kostas Papadimitriou
def valid_astakos_user_required(func):
212 badcb2a9 Kostas Papadimitriou
    return signed_terms_required(required_auth_methods_assigned()(login_required(func)))
213 badcb2a9 Kostas Papadimitriou
214 badcb2a9 Kostas Papadimitriou
215 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
216 270dd48d Sofia Papagiannaki
@signed_terms_required
217 1f3b4b39 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', profile_template_name='im/profile.html', extra_context=None):
218 890b0eaf Sofia Papagiannaki
    """
219 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
220 176023aa Kostas Papadimitriou

221 890b0eaf Sofia Papagiannaki
    **Arguments**
222 176023aa Kostas Papadimitriou

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

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

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

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

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

238 890b0eaf Sofia Papagiannaki
    """
239 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
240 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
241 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
242 f534fb96 Sofia Papagiannaki
        return HttpResponseRedirect(reverse('astakos.im.views.edit_profile'))
243 792c2f3b Olga Brani
244 ef20ea07 Sofia Papagiannaki
    return render_response(
245 ef20ea07 Sofia Papagiannaki
        template_name,
246 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
247 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
248 ef20ea07 Sofia Papagiannaki
    )
249 5ce3ce4f Sofia Papagiannaki
250 64cd4730 Antony Chazapis
251 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
252 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
253 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
254 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
255 890b0eaf Sofia Papagiannaki
    """
256 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
257 176023aa Kostas Papadimitriou

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

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

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

267 890b0eaf Sofia Papagiannaki
    **Arguments**
268 176023aa Kostas Papadimitriou

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

273 890b0eaf Sofia Papagiannaki
    ``extra_context``
274 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
275 176023aa Kostas Papadimitriou

276 890b0eaf Sofia Papagiannaki
    **Template:**
277 176023aa Kostas Papadimitriou

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

280 890b0eaf Sofia Papagiannaki
    **Settings:**
281 176023aa Kostas Papadimitriou

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

284 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
285 890b0eaf Sofia Papagiannaki
    """
286 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
287 64cd4730 Antony Chazapis
    status = None
288 64cd4730 Antony Chazapis
    message = None
289 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
290 5ce3ce4f Sofia Papagiannaki
291 18ffbee1 Sofia Papagiannaki
    inviter = request.user
292 64cd4730 Antony Chazapis
    if request.method == 'POST':
293 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
294 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
295 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
296 8f5a3a06 Sofia Papagiannaki
                try:
297 9a06d96f Olga Brani
                    email = form.cleaned_data.get('username')
298 9a06d96f Olga Brani
                    realname = form.cleaned_data.get('realname')
299 73fbaec4 Sofia Papagiannaki
                    invite(inviter, email, realname)
300 ae497612 Olga Brani
                    message = _(astakos_messages.INVITATION_SENT) % locals()
301 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
302 8f5a3a06 Sofia Papagiannaki
                except SendMailError, e:
303 8f5a3a06 Sofia Papagiannaki
                    message = e.message
304 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
305 8f5a3a06 Sofia Papagiannaki
                    transaction.rollback()
306 18ffbee1 Sofia Papagiannaki
                except BaseException, e:
307 ae497612 Olga Brani
                    message = _(astakos_messages.GENERIC_ERROR)
308 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
309 18ffbee1 Sofia Papagiannaki
                    logger.exception(e)
310 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
311 18ffbee1 Sofia Papagiannaki
                else:
312 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
313 64cd4730 Antony Chazapis
        else:
314 ae497612 Olga Brani
            message = _(astakos_messages.MAX_INVITATION_NUMBER_REACHED)
315 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
316 176023aa Kostas Papadimitriou
317 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
318 d6ae71a2 root
             'realname': inv.realname,
319 d6ae71a2 root
             'is_consumed': inv.is_consumed}
320 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
321 77e2ad52 root
    kwargs = {'inviter': inviter,
322 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
323 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
324 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
325 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
326 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
327 5ce3ce4f Sofia Papagiannaki
328 64cd4730 Antony Chazapis
329 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
330 badcb2a9 Kostas Papadimitriou
@required_auth_methods_assigned(only_warn=True)
331 890b0eaf Sofia Papagiannaki
@login_required
332 270dd48d Sofia Papagiannaki
@signed_terms_required
333 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
334 890b0eaf Sofia Papagiannaki
    """
335 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
336 176023aa Kostas Papadimitriou

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

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

343 890b0eaf Sofia Papagiannaki
    **Arguments**
344 176023aa Kostas Papadimitriou

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

349 890b0eaf Sofia Papagiannaki
    ``extra_context``
350 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
351 176023aa Kostas Papadimitriou

352 890b0eaf Sofia Papagiannaki
    **Template:**
353 176023aa Kostas Papadimitriou

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

356 92defad4 Sofia Papagiannaki
    **Settings:**
357 176023aa Kostas Papadimitriou

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

360 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
361 890b0eaf Sofia Papagiannaki
    """
362 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
363 bf0c6de5 Sofia Papagiannaki
    form = ProfileForm(
364 bf0c6de5 Sofia Papagiannaki
        instance=request.user,
365 bf0c6de5 Sofia Papagiannaki
        session_key=request.session.session_key
366 bf0c6de5 Sofia Papagiannaki
    )
367 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
368 64cd4730 Antony Chazapis
    if request.method == 'POST':
369 bf0c6de5 Sofia Papagiannaki
        form = ProfileForm(
370 bf0c6de5 Sofia Papagiannaki
            request.POST,
371 bf0c6de5 Sofia Papagiannaki
            instance=request.user,
372 bf0c6de5 Sofia Papagiannaki
            session_key=request.session.session_key
373 bf0c6de5 Sofia Papagiannaki
        )
374 890b0eaf Sofia Papagiannaki
        if form.is_valid():
375 64cd4730 Antony Chazapis
            try:
376 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
377 c301698f Sofia Papagiannaki
                user = form.save()
378 bf0c6de5 Sofia Papagiannaki
                form = ProfileForm(
379 bf0c6de5 Sofia Papagiannaki
                    instance=user,
380 bf0c6de5 Sofia Papagiannaki
                    session_key=request.session.session_key
381 bf0c6de5 Sofia Papagiannaki
                )
382 217994f8 Sofia Papagiannaki
                next = restrict_next(
383 217994f8 Sofia Papagiannaki
                    request.POST.get('next'),
384 217994f8 Sofia Papagiannaki
                    domain=COOKIE_DOMAIN
385 217994f8 Sofia Papagiannaki
                )
386 1a3675a0 Sofia Papagiannaki
                if next:
387 1a3675a0 Sofia Papagiannaki
                    return redirect(next)
388 ae497612 Olga Brani
                msg = _(astakos_messages.PROFILE_UPDATED)
389 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
390 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
391 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
392 23447441 Sofia Papagiannaki
    elif request.method == "GET":
393 792c2f3b Olga Brani
        request.user.is_verified = True
394 792c2f3b Olga Brani
        request.user.save()
395 792c2f3b Olga Brani
396 792c2f3b Olga Brani
    # existing providers
397 792c2f3b Olga Brani
    user_providers = request.user.get_active_auth_providers()
398 792c2f3b Olga Brani
399 792c2f3b Olga Brani
    # providers that user can add
400 792c2f3b Olga Brani
    user_available_providers = request.user.get_available_auth_providers()
401 792c2f3b Olga Brani
402 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
403 8f5a3a06 Sofia Papagiannaki
                           profile_form = form,
404 792c2f3b Olga Brani
                           user_providers = user_providers,
405 792c2f3b Olga Brani
                           user_available_providers = user_available_providers,
406 0905ccd2 Sofia Papagiannaki
                           context_instance = get_context(request,
407 c301698f Sofia Papagiannaki
                                                          extra_context))
408 5ce3ce4f Sofia Papagiannaki
409 64cd4730 Antony Chazapis
410 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
411 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
412 279d6e51 Olga Brani
def signup(request, template_name='im/signup.html', on_success='im/signup_complete.html', extra_context=None, backend=None):
413 890b0eaf Sofia Papagiannaki
    """
414 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
415 176023aa Kostas Papadimitriou

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

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

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

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

429 890b0eaf Sofia Papagiannaki
    **Arguments**
430 5ce3ce4f Sofia Papagiannaki

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

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

439 890b0eaf Sofia Papagiannaki
    ``extra_context``
440 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
441 176023aa Kostas Papadimitriou

442 890b0eaf Sofia Papagiannaki
    **Template:**
443 5ce3ce4f Sofia Papagiannaki

444 8f5a3a06 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
445 5ce3ce4f Sofia Papagiannaki
    im/signup_complete.html or ``on_success`` keyword argument.
446 890b0eaf Sofia Papagiannaki
    """
447 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
448 0d02a287 Sofia Papagiannaki
    if request.user.is_authenticated():
449 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('edit_profile'))
450 5ce3ce4f Sofia Papagiannaki
451 0a569195 Sofia Papagiannaki
    provider = get_query(request).get('provider', 'local')
452 279d6e51 Olga Brani
    if not auth_providers.get_provider(provider).is_available_for_create():
453 279d6e51 Olga Brani
        raise PermissionDenied
454 279d6e51 Olga Brani
455 6c8a3f7c Sofia Papagiannaki
    id = get_query(request).get('id')
456 6c8a3f7c Sofia Papagiannaki
    try:
457 6c8a3f7c Sofia Papagiannaki
        instance = AstakosUser.objects.get(id=id) if id else None
458 6c8a3f7c Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
459 6c8a3f7c Sofia Papagiannaki
        instance = None
460 6c8a3f7c Sofia Papagiannaki
461 8ab484ea Kostas Papadimitriou
    third_party_token = request.REQUEST.get('third_party_token', None)
462 c630fee6 Kostas Papadimitriou
    if third_party_token:
463 c630fee6 Kostas Papadimitriou
        pending = get_object_or_404(PendingThirdPartyUser,
464 c630fee6 Kostas Papadimitriou
                                    token=third_party_token)
465 c630fee6 Kostas Papadimitriou
        provider = pending.provider
466 c630fee6 Kostas Papadimitriou
        instance = pending.get_user_instance()
467 8ab484ea Kostas Papadimitriou
468 890b0eaf Sofia Papagiannaki
    try:
469 18ffbee1 Sofia Papagiannaki
        if not backend:
470 18ffbee1 Sofia Papagiannaki
            backend = get_backend(request)
471 6c8a3f7c Sofia Papagiannaki
        form = backend.get_signup_form(provider, instance)
472 0a569195 Sofia Papagiannaki
    except Exception, e:
473 4e30244e Sofia Papagiannaki
        form = SimpleBackend(request).get_signup_form(provider)
474 24406ae3 Sofia Papagiannaki
        messages.error(request, e)
475 8f5a3a06 Sofia Papagiannaki
    if request.method == 'POST':
476 8f5a3a06 Sofia Papagiannaki
        if form.is_valid():
477 18ffbee1 Sofia Papagiannaki
            user = form.save(commit=False)
478 8f5a3a06 Sofia Papagiannaki
            try:
479 8f5a3a06 Sofia Papagiannaki
                result = backend.handle_activation(user)
480 8f5a3a06 Sofia Papagiannaki
                status = messages.SUCCESS
481 18ffbee1 Sofia Papagiannaki
                message = result.message
482 792c2f3b Olga Brani
483 792c2f3b Olga Brani
                form.store_user(user, request)
484 792c2f3b Olga Brani
485 ca828a10 Sofia Papagiannaki
                if 'additional_email' in form.cleaned_data:
486 ca828a10 Sofia Papagiannaki
                    additional_email = form.cleaned_data['additional_email']
487 ca828a10 Sofia Papagiannaki
                    if additional_email != user.email:
488 ca828a10 Sofia Papagiannaki
                        user.additionalmail_set.create(email=additional_email)
489 5ce3ce4f Sofia Papagiannaki
                        msg = 'Additional email: %s saved for user %s.' % (
490 6c8a3f7c Sofia Papagiannaki
                            additional_email,
491 6c8a3f7c Sofia Papagiannaki
                            user.email
492 6c8a3f7c Sofia Papagiannaki
                        )
493 b669d9c0 Sofia Papagiannaki
                        logger._log(LOGGING_LEVEL, msg, [])
494 8f5a3a06 Sofia Papagiannaki
                if user and user.is_active:
495 8f5a3a06 Sofia Papagiannaki
                    next = request.POST.get('next', '')
496 40a0cd8b Sofia Papagiannaki
                    response = prepare_response(request, user, next=next)
497 c3f6cdf1 root
                    transaction.commit()
498 40a0cd8b Sofia Papagiannaki
                    return response
499 8f5a3a06 Sofia Papagiannaki
                messages.add_message(request, status, message)
500 792c2f3b Olga Brani
                transaction.commit()
501 279d6e51 Olga Brani
                return render_response(
502 279d6e51 Olga Brani
                    on_success,
503 279d6e51 Olga Brani
                    context_instance=get_context(
504 279d6e51 Olga Brani
                        request,
505 279d6e51 Olga Brani
                        extra_context
506 279d6e51 Olga Brani
                    )
507 279d6e51 Olga Brani
                )
508 18ffbee1 Sofia Papagiannaki
            except SendMailError, e:
509 c44955a6 Sofia Papagiannaki
                logger.exception(e)
510 18ffbee1 Sofia Papagiannaki
                status = messages.ERROR
511 18ffbee1 Sofia Papagiannaki
                message = e.message
512 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
513 10ed0073 Sofia Papagiannaki
                transaction.rollback()
514 18ffbee1 Sofia Papagiannaki
            except BaseException, e:
515 678b2236 Sofia Papagiannaki
                logger.exception(e)
516 ae497612 Olga Brani
                message = _(astakos_messages.GENERIC_ERROR)
517 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
518 0a569195 Sofia Papagiannaki
                logger.exception(e)
519 10ed0073 Sofia Papagiannaki
                transaction.rollback()
520 8f5a3a06 Sofia Papagiannaki
    return render_response(template_name,
521 5ce3ce4f Sofia Papagiannaki
                           signup_form=form,
522 8ab484ea Kostas Papadimitriou
                           third_party_token=third_party_token,
523 5ce3ce4f Sofia Papagiannaki
                           provider=provider,
524 890b0eaf Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
525 64cd4730 Antony Chazapis
526 5ce3ce4f Sofia Papagiannaki
527 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
528 badcb2a9 Kostas Papadimitriou
@required_auth_methods_assigned(only_warn=True)
529 890b0eaf Sofia Papagiannaki
@login_required
530 270dd48d Sofia Papagiannaki
@signed_terms_required
531 aab4d540 Sofia Papagiannaki
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context=None):
532 890b0eaf Sofia Papagiannaki
    """
533 890b0eaf Sofia Papagiannaki
    Allows a user to send feedback.
534 176023aa Kostas Papadimitriou

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

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

540 890b0eaf Sofia Papagiannaki
    **Arguments**
541 176023aa Kostas Papadimitriou

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

546 890b0eaf Sofia Papagiannaki
    ``extra_context``
547 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
548 176023aa Kostas Papadimitriou

549 890b0eaf Sofia Papagiannaki
    **Template:**
550 176023aa Kostas Papadimitriou

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

553 890b0eaf Sofia Papagiannaki
    **Settings:**
554 176023aa Kostas Papadimitriou

555 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
556 890b0eaf Sofia Papagiannaki
    """
557 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
558 64cd4730 Antony Chazapis
    if request.method == 'GET':
559 890b0eaf Sofia Papagiannaki
        form = FeedbackForm()
560 890b0eaf Sofia Papagiannaki
    if request.method == 'POST':
561 890b0eaf Sofia Papagiannaki
        if not request.user:
562 890b0eaf Sofia Papagiannaki
            return HttpResponse('Unauthorized', status=401)
563 176023aa Kostas Papadimitriou
564 890b0eaf Sofia Papagiannaki
        form = FeedbackForm(request.POST)
565 890b0eaf Sofia Papagiannaki
        if form.is_valid():
566 e9083112 Sofia Papagiannaki
            msg = form.cleaned_data['feedback_msg']
567 8f5a3a06 Sofia Papagiannaki
            data = form.cleaned_data['feedback_data']
568 538ccdd5 Sofia Papagiannaki
            try:
569 8f5a3a06 Sofia Papagiannaki
                send_feedback(msg, data, request.user, email_template_name)
570 8f5a3a06 Sofia Papagiannaki
            except SendMailError, e:
571 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
572 8f5a3a06 Sofia Papagiannaki
            else:
573 ae497612 Olga Brani
                message = _(astakos_messages.FEEDBACK_SENT)
574 aab4d540 Sofia Papagiannaki
                messages.success(request, message)
575 890b0eaf Sofia Papagiannaki
    return render_response(template_name,
576 5ce3ce4f Sofia Papagiannaki
                           feedback_form=form,
577 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
578 5ce3ce4f Sofia Papagiannaki
579 15efc749 Sofia Papagiannaki
580 217994f8 Sofia Papagiannaki
@require_http_methods(["GET"])
581 8e45d6fd Sofia Papagiannaki
@signed_terms_required
582 aab4d540 Sofia Papagiannaki
def logout(request, template='registration/logged_out.html', extra_context=None):
583 63ecdd20 Sofia Papagiannaki
    """
584 b2ffa772 Sofia Papagiannaki
    Wraps `django.contrib.auth.logout`.
585 63ecdd20 Sofia Papagiannaki
    """
586 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
587 7482228b Sofia Papagiannaki
    response = HttpResponse()
588 8e45d6fd Sofia Papagiannaki
    if request.user.is_authenticated():
589 8e45d6fd Sofia Papagiannaki
        email = request.user.email
590 8e45d6fd Sofia Papagiannaki
        auth_logout(request)
591 c630fee6 Kostas Papadimitriou
    else:
592 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
593 c630fee6 Kostas Papadimitriou
        response.status_code = 301
594 c630fee6 Kostas Papadimitriou
        return response
595 c630fee6 Kostas Papadimitriou
596 217994f8 Sofia Papagiannaki
    next = restrict_next(
597 217994f8 Sofia Papagiannaki
        request.GET.get('next'),
598 217994f8 Sofia Papagiannaki
        domain=COOKIE_DOMAIN
599 217994f8 Sofia Papagiannaki
    )
600 c630fee6 Kostas Papadimitriou
601 63ecdd20 Sofia Papagiannaki
    if next:
602 63ecdd20 Sofia Papagiannaki
        response['Location'] = next
603 63ecdd20 Sofia Papagiannaki
        response.status_code = 302
604 0d02a287 Sofia Papagiannaki
    elif LOGOUT_NEXT:
605 0d02a287 Sofia Papagiannaki
        response['Location'] = LOGOUT_NEXT
606 0d02a287 Sofia Papagiannaki
        response.status_code = 301
607 b2ffa772 Sofia Papagiannaki
    else:
608 c0b26605 Sofia Papagiannaki
        messages.add_message(request, messages.SUCCESS, _(astakos_messages.LOGOUT_SUCCESS))
609 c630fee6 Kostas Papadimitriou
        response['Location'] = reverse('index')
610 c630fee6 Kostas Papadimitriou
        response.status_code = 301
611 49df775e Sofia Papagiannaki
    return response
612 2126d85d Sofia Papagiannaki
613 5ce3ce4f Sofia Papagiannaki
614 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
615 683cf244 Sofia Papagiannaki
@transaction.commit_manually
616 3bb604eb Sofia Papagiannaki
def activate(request, greeting_email_template_name='im/welcome_email.txt',
617 3bb604eb Sofia Papagiannaki
             helpdesk_email_template_name='im/helpdesk_notification.txt'):
618 2126d85d Sofia Papagiannaki
    """
619 683cf244 Sofia Papagiannaki
    Activates the user identified by the ``auth`` request parameter, sends a welcome email
620 683cf244 Sofia Papagiannaki
    and renews the user token.
621 176023aa Kostas Papadimitriou

622 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
623 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
624 2126d85d Sofia Papagiannaki
    """
625 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
626 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
627 2126d85d Sofia Papagiannaki
    try:
628 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
629 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
630 279d6e51 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN))
631 5ce3ce4f Sofia Papagiannaki
632 d1757ca7 Sofia Papagiannaki
    if user.is_active:
633 ae497612 Olga Brani
        message = _(astakos_messages.ACCOUNT_ALREADY_ACTIVE)
634 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
635 279d6e51 Olga Brani
        return index(request)
636 5ce3ce4f Sofia Papagiannaki
637 0a569195 Sofia Papagiannaki
    try:
638 279d6e51 Olga Brani
        activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True)
639 ef20ea07 Sofia Papagiannaki
        response = prepare_response(request, user, next, renew=True)
640 ef20ea07 Sofia Papagiannaki
        transaction.commit()
641 279d6e51 Olga Brani
        return response
642 ef20ea07 Sofia Papagiannaki
    except SendMailError, e:
643 ef20ea07 Sofia Papagiannaki
        message = e.message
644 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
645 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
646 279d6e51 Olga Brani
        return index(request)
647 ef20ea07 Sofia Papagiannaki
    except BaseException, e:
648 ef20ea07 Sofia Papagiannaki
        status = messages.ERROR
649 c0b26605 Sofia Papagiannaki
        message = _(astakos_messages.GENERIC_ERROR)
650 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
651 ef20ea07 Sofia Papagiannaki
        logger.exception(e)
652 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
653 279d6e51 Olga Brani
        return index(request)
654 270dd48d Sofia Papagiannaki
655 5ce3ce4f Sofia Papagiannaki
656 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
657 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
658 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
659 270dd48d Sofia Papagiannaki
    term = None
660 270dd48d Sofia Papagiannaki
    terms = None
661 270dd48d Sofia Papagiannaki
    if not term_id:
662 270dd48d Sofia Papagiannaki
        try:
663 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
664 270dd48d Sofia Papagiannaki
        except IndexError:
665 270dd48d Sofia Papagiannaki
            pass
666 270dd48d Sofia Papagiannaki
    else:
667 270dd48d Sofia Papagiannaki
        try:
668 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
669 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
670 270dd48d Sofia Papagiannaki
            pass
671 176023aa Kostas Papadimitriou
672 270dd48d Sofia Papagiannaki
    if not term:
673 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
674 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
675 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
676 270dd48d Sofia Papagiannaki
    terms = f.read()
677 176023aa Kostas Papadimitriou
678 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
679 217994f8 Sofia Papagiannaki
        next = restrict_next(
680 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
681 217994f8 Sofia Papagiannaki
            domain=COOKIE_DOMAIN
682 217994f8 Sofia Papagiannaki
        )
683 270dd48d Sofia Papagiannaki
        if not next:
684 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
685 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
686 270dd48d Sofia Papagiannaki
        if not form.is_valid():
687 270dd48d Sofia Papagiannaki
            return render_response(template_name,
688 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
689 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
690 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
691 270dd48d Sofia Papagiannaki
        user = form.save()
692 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
693 270dd48d Sofia Papagiannaki
    else:
694 586967c0 Sofia Papagiannaki
        form = None
695 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
696 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
697 270dd48d Sofia Papagiannaki
        return render_response(template_name,
698 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
699 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
700 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
701 5ce3ce4f Sofia Papagiannaki
702 270dd48d Sofia Papagiannaki
703 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
704 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
705 49790d9d Sofia Papagiannaki
@transaction.commit_manually
706 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
707 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
708 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
709 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
710 aab4d540 Sofia Papagiannaki
                 extra_context=None):
711 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
712 49790d9d Sofia Papagiannaki
    if activation_key:
713 49790d9d Sofia Papagiannaki
        try:
714 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
715 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
716 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
717 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
718 49790d9d Sofia Papagiannaki
                auth_logout(request)
719 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
720 49790d9d Sofia Papagiannaki
                transaction.commit()
721 279d6e51 Olga Brani
                return response
722 49790d9d Sofia Papagiannaki
        except ValueError, e:
723 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
724 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
725 279d6e51 Olga Brani
                               modified_user=user if 'user' in locals(
726 279d6e51 Olga Brani
                               ) else None,
727 279d6e51 Olga Brani
                               context_instance=get_context(request,
728 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
729 5ce3ce4f Sofia Papagiannaki
730 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
731 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
732 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
733 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
734 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
735 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
736 49790d9d Sofia Papagiannaki
        try:
737 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
738 49790d9d Sofia Papagiannaki
        except SendMailError, e:
739 49790d9d Sofia Papagiannaki
            msg = e
740 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
741 49790d9d Sofia Papagiannaki
            transaction.rollback()
742 279d6e51 Olga Brani
        except IntegrityError, e:
743 279d6e51 Olga Brani
            msg = _(astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
744 279d6e51 Olga Brani
            messages.error(request, msg)
745 49790d9d Sofia Papagiannaki
        else:
746 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
747 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
748 49790d9d Sofia Papagiannaki
            transaction.commit()
749 c0b26605 Sofia Papagiannaki
    return render_response(
750 c0b26605 Sofia Papagiannaki
        form_template_name,
751 c0b26605 Sofia Papagiannaki
        form=form,
752 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
753 c0b26605 Sofia Papagiannaki
    )
754 1f3b4b39 Sofia Papagiannaki
755 1f3b4b39 Sofia Papagiannaki
756 1f3b4b39 Sofia Papagiannaki
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
757 792c2f3b Olga Brani
758 badcb2a9 Kostas Papadimitriou
    if request.user.is_authenticated():
759 badcb2a9 Kostas Papadimitriou
        messages.error(request, _(astakos_messages.ALREADY_LOGGED_IN))
760 badcb2a9 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
761 badcb2a9 Kostas Papadimitriou
762 792c2f3b Olga Brani
    if settings.MODERATION_ENABLED:
763 792c2f3b Olga Brani
        raise PermissionDenied
764 792c2f3b Olga Brani
765 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
766 1f3b4b39 Sofia Papagiannaki
    try:
767 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
768 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
769 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
770 1f3b4b39 Sofia Papagiannaki
    else:
771 1f3b4b39 Sofia Papagiannaki
        try:
772 1f3b4b39 Sofia Papagiannaki
            send_activation_func(u)
773 c0b26605 Sofia Papagiannaki
            msg = _(astakos_messages.ACTIVATION_SENT)
774 1f3b4b39 Sofia Papagiannaki
            messages.success(request, msg)
775 1f3b4b39 Sofia Papagiannaki
        except SendMailError, e:
776 1f3b4b39 Sofia Papagiannaki
            messages.error(request, e)
777 1f3b4b39 Sofia Papagiannaki
    return render_response(
778 1f3b4b39 Sofia Papagiannaki
        template_name,
779 c0b26605 Sofia Papagiannaki
        login_form = LoginForm(request=request),
780 1f3b4b39 Sofia Papagiannaki
        context_instance = get_context(
781 1f3b4b39 Sofia Papagiannaki
            request,
782 1f3b4b39 Sofia Papagiannaki
            extra_context
783 1f3b4b39 Sofia Papagiannaki
        )
784 1f3b4b39 Sofia Papagiannaki
    )
785 5ce3ce4f Sofia Papagiannaki
786 172ce682 Sofia Papagiannaki
# class ResourcePresentation():
787 172ce682 Sofia Papagiannaki
# 
788 172ce682 Sofia Papagiannaki
#     def __init__(self, data):
789 172ce682 Sofia Papagiannaki
#         self.data = data
790 172ce682 Sofia Papagiannaki
# 
791 172ce682 Sofia Papagiannaki
#     def update_from_result(self, result):
792 172ce682 Sofia Papagiannaki
#         if result.is_success:
793 172ce682 Sofia Papagiannaki
#             for r in result.data:
794 172ce682 Sofia Papagiannaki
#                 rname = '%s%s%s' % (r.get('service'), RESOURCE_SEPARATOR, r.get('name'))
795 172ce682 Sofia Papagiannaki
#                 if not rname in self.data['resources']:
796 172ce682 Sofia Papagiannaki
#                     self.data['resources'][rname] = {}
797 172ce682 Sofia Papagiannaki
# 
798 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname].update(r)
799 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname]['id'] = rname
800 172ce682 Sofia Papagiannaki
#                 group = r.get('group')
801 172ce682 Sofia Papagiannaki
#                 if not group in self.data['groups']:
802 172ce682 Sofia Papagiannaki
#                     self.data['groups'][group] = {}
803 172ce682 Sofia Papagiannaki
# 
804 172ce682 Sofia Papagiannaki
#                 self.data['groups'][r.get('group')].update({'name': r.get('group')})
805 172ce682 Sofia Papagiannaki
# 
806 172ce682 Sofia Papagiannaki
#     def test(self, quota_dict):
807 172ce682 Sofia Papagiannaki
#         for k, v in quota_dict.iteritems():
808 172ce682 Sofia Papagiannaki
#             rname = k
809 172ce682 Sofia Papagiannaki
#             value = v
810 172ce682 Sofia Papagiannaki
#             if not rname in self.data['resources']:
811 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname] = {}
812 172ce682 Sofia Papagiannaki
# 
813 172ce682 Sofia Papagiannaki
# 
814 172ce682 Sofia Papagiannaki
#             self.data['resources'][rname]['value'] = value
815 172ce682 Sofia Papagiannaki
# 
816 172ce682 Sofia Papagiannaki
# 
817 172ce682 Sofia Papagiannaki
#     def update_from_result_report(self, result):
818 172ce682 Sofia Papagiannaki
#         if result.is_success:
819 172ce682 Sofia Papagiannaki
#             for r in result.data:
820 172ce682 Sofia Papagiannaki
#                 rname = r.get('name')
821 172ce682 Sofia Papagiannaki
#                 if not rname in self.data['resources']:
822 172ce682 Sofia Papagiannaki
#                     self.data['resources'][rname] = {}
823 172ce682 Sofia Papagiannaki
# 
824 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname].update(r)
825 172ce682 Sofia Papagiannaki
#                 self.data['resources'][rname]['id'] = rname
826 172ce682 Sofia Papagiannaki
#                 group = r.get('group')
827 172ce682 Sofia Papagiannaki
#                 if not group in self.data['groups']:
828 172ce682 Sofia Papagiannaki
#                     self.data['groups'][group] = {}
829 172ce682 Sofia Papagiannaki
# 
830 172ce682 Sofia Papagiannaki
#                 self.data['groups'][r.get('group')].update({'name': r.get('group')})
831 172ce682 Sofia Papagiannaki
# 
832 172ce682 Sofia Papagiannaki
#     def get_group_resources(self, group):
833 172ce682 Sofia Papagiannaki
#         return dict(filter(lambda t: t[1].get('group') == group, self.data['resources'].iteritems()))
834 172ce682 Sofia Papagiannaki
# 
835 172ce682 Sofia Papagiannaki
#     def get_groups_resources(self):
836 172ce682 Sofia Papagiannaki
#         for g in self.data['groups']:
837 172ce682 Sofia Papagiannaki
#             yield g, self.get_group_resources(g)
838 172ce682 Sofia Papagiannaki
# 
839 172ce682 Sofia Papagiannaki
#     def get_quota(self, group_quotas):
840 172ce682 Sofia Papagiannaki
#         for r, v in group_quotas:
841 172ce682 Sofia Papagiannaki
#             rname = str(r)
842 172ce682 Sofia Papagiannaki
#             quota = self.data['resources'].get(rname)
843 172ce682 Sofia Papagiannaki
#             quota['value'] = v
844 172ce682 Sofia Papagiannaki
#             yield quota
845 172ce682 Sofia Papagiannaki
# 
846 172ce682 Sofia Papagiannaki
# 
847 172ce682 Sofia Papagiannaki
#     def get_policies(self, policies_data):
848 172ce682 Sofia Papagiannaki
#         for policy in policies_data:
849 172ce682 Sofia Papagiannaki
#             rname = '%s%s%s' % (policy.get('service'), RESOURCE_SEPARATOR, policy.get('resource'))
850 172ce682 Sofia Papagiannaki
#             policy.update(self.data['resources'].get(rname))
851 172ce682 Sofia Papagiannaki
#             yield policy
852 172ce682 Sofia Papagiannaki
# 
853 172ce682 Sofia Papagiannaki
#     def __repr__(self):
854 172ce682 Sofia Papagiannaki
#         return self.data.__repr__()
855 172ce682 Sofia Papagiannaki
# 
856 172ce682 Sofia Papagiannaki
#     def __iter__(self, *args, **kwargs):
857 172ce682 Sofia Papagiannaki
#         return self.data.__iter__(*args, **kwargs)
858 172ce682 Sofia Papagiannaki
# 
859 172ce682 Sofia Papagiannaki
#     def __getitem__(self, *args, **kwargs):
860 172ce682 Sofia Papagiannaki
#         return self.data.__getitem__(*args, **kwargs)
861 172ce682 Sofia Papagiannaki
# 
862 172ce682 Sofia Papagiannaki
#     def get(self, *args, **kwargs):
863 172ce682 Sofia Papagiannaki
#         return self.data.get(*args, **kwargs)
864 792c2f3b Olga Brani
865 792c2f3b Olga Brani
866 12269b45 Olga Brani
867 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
868 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
869 73fbaec4 Sofia Papagiannaki
# @login_required
870 73fbaec4 Sofia Papagiannaki
# def group_add(request, kind_name='default'):
871 73fbaec4 Sofia Papagiannaki
#     result = callpoint.list_resources()
872 73fbaec4 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
873 73fbaec4 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
874 73fbaec4 Sofia Papagiannaki
# 
875 73fbaec4 Sofia Papagiannaki
#     if not result.is_success:
876 73fbaec4 Sofia Papagiannaki
#         messages.error(
877 73fbaec4 Sofia Papagiannaki
#             request,
878 73fbaec4 Sofia Papagiannaki
#             'Unable to retrieve system resources: %s' % result.reason
879 73fbaec4 Sofia Papagiannaki
#     )
880 73fbaec4 Sofia Papagiannaki
# 
881 73fbaec4 Sofia Papagiannaki
#     try:
882 73fbaec4 Sofia Papagiannaki
#         kind = GroupKind.objects.get(name=kind_name)
883 73fbaec4 Sofia Papagiannaki
#     except:
884 73fbaec4 Sofia Papagiannaki
#         return HttpResponseBadRequest(_(astakos_messages.GROUPKIND_UNKNOWN))
885 73fbaec4 Sofia Papagiannaki
# 
886 73fbaec4 Sofia Papagiannaki
# 
887 73fbaec4 Sofia Papagiannaki
# 
888 73fbaec4 Sofia Papagiannaki
#     post_save_redirect = '/im/group/%(id)s/'
889 73fbaec4 Sofia Papagiannaki
#     context_processors = None
890 73fbaec4 Sofia Papagiannaki
#     model, form_class = get_model_and_form_class(
891 73fbaec4 Sofia Papagiannaki
#         model=None,
892 73fbaec4 Sofia Papagiannaki
#         form_class=AstakosGroupCreationForm
893 73fbaec4 Sofia Papagiannaki
#     )
894 73fbaec4 Sofia Papagiannaki
# 
895 73fbaec4 Sofia Papagiannaki
#     if request.method == 'POST':
896 73fbaec4 Sofia Papagiannaki
#         form = form_class(request.POST, request.FILES)
897 73fbaec4 Sofia Papagiannaki
#         if form.is_valid():
898 73fbaec4 Sofia Papagiannaki
#             policies = form.policies()
899 73fbaec4 Sofia Papagiannaki
#             return render_response(
900 73fbaec4 Sofia Papagiannaki
#                 template='im/astakosgroup_form_summary.html',
901 73fbaec4 Sofia Papagiannaki
#                 context_instance=get_context(request),
902 73fbaec4 Sofia Papagiannaki
#                 form=AstakosGroupCreationSummaryForm(form.cleaned_data),
903 73fbaec4 Sofia Papagiannaki
#                 policies=resource_catalog.get_policies(policies)
904 73fbaec4 Sofia Papagiannaki
#             )
905 73fbaec4 Sofia Papagiannaki
#     else:
906 73fbaec4 Sofia Papagiannaki
#         now = datetime.now()
907 73fbaec4 Sofia Papagiannaki
#         data = {
908 73fbaec4 Sofia Papagiannaki
#             'kind': kind,
909 73fbaec4 Sofia Papagiannaki
#         }
910 73fbaec4 Sofia Papagiannaki
#         for group, resources in resource_catalog.get_groups_resources():
911 73fbaec4 Sofia Papagiannaki
#             data['is_selected_%s' % group] = False
912 73fbaec4 Sofia Papagiannaki
#             for resource in resources:
913 73fbaec4 Sofia Papagiannaki
#                 data['%s_uplimit' % resource] = ''
914 73fbaec4 Sofia Papagiannaki
# 
915 73fbaec4 Sofia Papagiannaki
#         form = form_class(data)
916 73fbaec4 Sofia Papagiannaki
# 
917 73fbaec4 Sofia Papagiannaki
#     # Create the template, context, response
918 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_form.html" % (
919 73fbaec4 Sofia Papagiannaki
#         model._meta.app_label,
920 73fbaec4 Sofia Papagiannaki
#         model._meta.object_name.lower()
921 73fbaec4 Sofia Papagiannaki
#     )
922 73fbaec4 Sofia Papagiannaki
#     t = template_loader.get_template(template_name)
923 73fbaec4 Sofia Papagiannaki
#     c = RequestContext(request, {
924 73fbaec4 Sofia Papagiannaki
#         'form': form,
925 73fbaec4 Sofia Papagiannaki
#         'kind': kind,
926 73fbaec4 Sofia Papagiannaki
#         'resource_catalog':resource_catalog,
927 73fbaec4 Sofia Papagiannaki
#     }, context_processors)
928 73fbaec4 Sofia Papagiannaki
#     return HttpResponse(t.render(c))
929 73fbaec4 Sofia Papagiannaki
930 73fbaec4 Sofia Papagiannaki
931 73fbaec4 Sofia Papagiannaki
##@require_hsttp_methods(["POST"])
932 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
933 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
934 73fbaec4 Sofia Papagiannaki
# @login_required
935 73fbaec4 Sofia Papagiannaki
# @transaction.commit_manually
936 73fbaec4 Sofia Papagiannaki
# def group_add_complete(request):
937 73fbaec4 Sofia Papagiannaki
#     model = AstakosGroup
938 73fbaec4 Sofia Papagiannaki
#     form = AstakosGroupCreationSummaryForm(request.POST)
939 73fbaec4 Sofia Papagiannaki
#     if form.is_valid():
940 73fbaec4 Sofia Papagiannaki
#         d = form.cleaned_data
941 73fbaec4 Sofia Papagiannaki
#         d['owners'] = [request.user]
942 73fbaec4 Sofia Papagiannaki
#         result = callpoint.create_groups((d,)).next()
943 73fbaec4 Sofia Papagiannaki
#         if result.is_success:
944 73fbaec4 Sofia Papagiannaki
#             new_object = result.data[0]
945 73fbaec4 Sofia Papagiannaki
#             # send notification
946 73fbaec4 Sofia Papagiannaki
#             try:
947 73fbaec4 Sofia Papagiannaki
#                 send_group_creation_notification(
948 73fbaec4 Sofia Papagiannaki
#                     template_name='im/group_creation_notification.txt',
949 73fbaec4 Sofia Papagiannaki
#                     dictionary={
950 73fbaec4 Sofia Papagiannaki
#                         'group': new_object,
951 73fbaec4 Sofia Papagiannaki
#                         'owner': request.user,
952 73fbaec4 Sofia Papagiannaki
#                         'policies': d.get('policies', [])
953 73fbaec4 Sofia Papagiannaki
#                     }
954 73fbaec4 Sofia Papagiannaki
#                 )
955 73fbaec4 Sofia Papagiannaki
#             except SendNotificationError, e:
956 73fbaec4 Sofia Papagiannaki
#                 messages.error(request, e, fail_silently=True)
957 73fbaec4 Sofia Papagiannaki
#                 transaction.rollback()
958 73fbaec4 Sofia Papagiannaki
#             else:
959 73fbaec4 Sofia Papagiannaki
#                 msg = _(astakos_messages.OBJECT_CREATED) %\
960 73fbaec4 Sofia Papagiannaki
#                     {"verbose_name": model._meta.verbose_name}
961 73fbaec4 Sofia Papagiannaki
#                 message = _(astakos_messages.NOTIFICATION_SENT) % 'a project'
962 73fbaec4 Sofia Papagiannaki
#                 messages.success(request, msg, fail_silently=True)
963 73fbaec4 Sofia Papagiannaki
#                 transaction.commit()
964 73fbaec4 Sofia Papagiannaki
#         else:
965 73fbaec4 Sofia Papagiannaki
#             d = {"verbose_name": model._meta.verbose_name,
966 73fbaec4 Sofia Papagiannaki
#                  "reason":result.reason}
967 73fbaec4 Sofia Papagiannaki
#             msg = _(astakos_messages.OBJECT_CREATED_FAILED) % d
968 73fbaec4 Sofia Papagiannaki
#             messages.error(request, msg, fail_silently=True)
969 73fbaec4 Sofia Papagiannaki
#     return render_response(
970 73fbaec4 Sofia Papagiannaki
#         template='im/astakosgroup_form_summary.html',
971 73fbaec4 Sofia Papagiannaki
#         context_instance=get_context(request),
972 73fbaec4 Sofia Papagiannaki
#         form=form,
973 73fbaec4 Sofia Papagiannaki
#         policies=form.cleaned_data.get('policies')
974 73fbaec4 Sofia Papagiannaki
#     )
975 01ac12d5 Sofia Papagiannaki
976 73fbaec4 Sofia Papagiannaki
##@require_http_methods(["GET"])
977 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
978 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
979 73fbaec4 Sofia Papagiannaki
# @login_required
980 73fbaec4 Sofia Papagiannaki
# def group_list(request):
981 73fbaec4 Sofia Papagiannaki
#     none = request.user.astakos_groups.none()
982 73fbaec4 Sofia Papagiannaki
#     query = """
983 73fbaec4 Sofia Papagiannaki
#         SELECT auth_group.id,
984 73fbaec4 Sofia Papagiannaki
#         auth_group.name AS groupname,
985 73fbaec4 Sofia Papagiannaki
#         im_groupkind.name AS kindname,
986 73fbaec4 Sofia Papagiannaki
#         im_astakosgroup.*,
987 73fbaec4 Sofia Papagiannaki
#         owner.email AS groupowner,
988 73fbaec4 Sofia Papagiannaki
#         (SELECT COUNT(*) FROM im_membership
989 73fbaec4 Sofia Papagiannaki
#             WHERE group_id = im_astakosgroup.group_ptr_id
990 73fbaec4 Sofia Papagiannaki
#             AND date_joined IS NOT NULL) AS approved_members_num,
991 73fbaec4 Sofia Papagiannaki
#         (SELECT CASE WHEN(
992 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
993 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
994 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %(id)s) IS NULL
995 73fbaec4 Sofia Papagiannaki
#                     THEN 0 ELSE 1 END) AS membership_status
996 73fbaec4 Sofia Papagiannaki
#         FROM im_astakosgroup
997 73fbaec4 Sofia Papagiannaki
#         INNER JOIN im_membership ON (
998 73fbaec4 Sofia Papagiannaki
#             im_astakosgroup.group_ptr_id = im_membership.group_id)
999 73fbaec4 Sofia Papagiannaki
#         INNER JOIN auth_group ON(im_astakosgroup.group_ptr_id = auth_group.id)
1000 73fbaec4 Sofia Papagiannaki
#         INNER JOIN im_groupkind ON (im_astakosgroup.kind_id = im_groupkind.id)
1001 73fbaec4 Sofia Papagiannaki
#         LEFT JOIN im_astakosuser_owner ON (
1002 73fbaec4 Sofia Papagiannaki
#             im_astakosuser_owner.astakosgroup_id = im_astakosgroup.group_ptr_id)
1003 73fbaec4 Sofia Papagiannaki
#         LEFT JOIN auth_user as owner ON (
1004 73fbaec4 Sofia Papagiannaki
#             im_astakosuser_owner.astakosuser_id = owner.id)
1005 73fbaec4 Sofia Papagiannaki
#         WHERE im_membership.person_id = %(id)s
1006 73fbaec4 Sofia Papagiannaki
#         AND im_groupkind.name != 'default'
1007 73fbaec4 Sofia Papagiannaki
#         """ % request.user.__dict__
1008 73fbaec4 Sofia Papagiannaki
# 
1009 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1010 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1011 73fbaec4 Sofia Papagiannaki
#     sort_form = AstakosGroupSortForm(request.GET)
1012 73fbaec4 Sofia Papagiannaki
#     if sort_form.is_valid():
1013 73fbaec4 Sofia Papagiannaki
#         sorting = sort_form.cleaned_data.get('sorting')
1014 73fbaec4 Sofia Papagiannaki
#     query = query+" ORDER BY %s ASC" %sorting
1015 73fbaec4 Sofia Papagiannaki
#     
1016 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.raw(query)
1017 73fbaec4 Sofia Papagiannaki
#     
1018 73fbaec4 Sofia Papagiannaki
#     # Create the template, context, response
1019 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_list.html" % (
1020 73fbaec4 Sofia Papagiannaki
#         q.model._meta.app_label,
1021 73fbaec4 Sofia Papagiannaki
#         q.model._meta.object_name.lower()
1022 73fbaec4 Sofia Papagiannaki
#     )
1023 73fbaec4 Sofia Papagiannaki
#     extra_context = dict(
1024 73fbaec4 Sofia Papagiannaki
#         is_search=False,
1025 73fbaec4 Sofia Papagiannaki
#         q=q,
1026 73fbaec4 Sofia Papagiannaki
#         sorting=sorting,
1027 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page', 1)
1028 73fbaec4 Sofia Papagiannaki
#     )
1029 73fbaec4 Sofia Papagiannaki
#     return render_response(template_name,
1030 73fbaec4 Sofia Papagiannaki
#                            context_instance=get_context(request, extra_context)
1031 73fbaec4 Sofia Papagiannaki
#     )
1032 73fbaec4 Sofia Papagiannaki
1033 73fbaec4 Sofia Papagiannaki
1034 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1035 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1036 73fbaec4 Sofia Papagiannaki
# @login_required
1037 73fbaec4 Sofia Papagiannaki
# def group_detail(request, group_id):
1038 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.select_related().filter(pk=group_id)
1039 73fbaec4 Sofia Papagiannaki
#     q = q.extra(select={
1040 73fbaec4 Sofia Papagiannaki
#         'is_member': """SELECT CASE WHEN EXISTS(
1041 73fbaec4 Sofia Papagiannaki
#                             SELECT id FROM im_membership
1042 73fbaec4 Sofia Papagiannaki
#                             WHERE group_id = im_astakosgroup.group_ptr_id
1043 73fbaec4 Sofia Papagiannaki
#                             AND person_id = %s)
1044 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1045 73fbaec4 Sofia Papagiannaki
#         'is_owner': """SELECT CASE WHEN EXISTS(
1046 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1047 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1048 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1049 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1050 73fbaec4 Sofia Papagiannaki
#         'is_active_member': """SELECT CASE WHEN(
1051 73fbaec4 Sofia Papagiannaki
#                         SELECT date_joined FROM im_membership
1052 73fbaec4 Sofia Papagiannaki
#                         WHERE group_id = im_astakosgroup.group_ptr_id
1053 73fbaec4 Sofia Papagiannaki
#                         AND person_id = %s) IS NULL
1054 73fbaec4 Sofia Papagiannaki
#                         THEN 0 ELSE 1 END""" % request.user.id,
1055 73fbaec4 Sofia Papagiannaki
#         'kindname': """SELECT name FROM im_groupkind
1056 73fbaec4 Sofia Papagiannaki
#                        WHERE id = im_astakosgroup.kind_id"""})
1057 73fbaec4 Sofia Papagiannaki
# 
1058 73fbaec4 Sofia Papagiannaki
#     model = q.model
1059 73fbaec4 Sofia Papagiannaki
#     context_processors = None
1060 73fbaec4 Sofia Papagiannaki
#     mimetype = None
1061 73fbaec4 Sofia Papagiannaki
#     try:
1062 73fbaec4 Sofia Papagiannaki
#         obj = q.get()
1063 73fbaec4 Sofia Papagiannaki
#     except AstakosGroup.DoesNotExist:
1064 73fbaec4 Sofia Papagiannaki
#         raise Http404("No %s found matching the query" % (
1065 73fbaec4 Sofia Papagiannaki
#             model._meta.verbose_name))
1066 73fbaec4 Sofia Papagiannaki
# 
1067 73fbaec4 Sofia Papagiannaki
#     update_form = AstakosGroupUpdateForm(instance=obj)
1068 73fbaec4 Sofia Papagiannaki
#     addmembers_form = AddGroupMembersForm()
1069 73fbaec4 Sofia Papagiannaki
#     if request.method == 'POST':
1070 73fbaec4 Sofia Papagiannaki
#         update_data = {}
1071 73fbaec4 Sofia Papagiannaki
#         addmembers_data = {}
1072 73fbaec4 Sofia Papagiannaki
#         for k, v in request.POST.iteritems():
1073 73fbaec4 Sofia Papagiannaki
#             if k in update_form.fields:
1074 73fbaec4 Sofia Papagiannaki
#                 update_data[k] = v
1075 73fbaec4 Sofia Papagiannaki
#             if k in addmembers_form.fields:
1076 73fbaec4 Sofia Papagiannaki
#                 addmembers_data[k] = v
1077 73fbaec4 Sofia Papagiannaki
#         update_data = update_data or None
1078 73fbaec4 Sofia Papagiannaki
#         addmembers_data = addmembers_data or None
1079 73fbaec4 Sofia Papagiannaki
#         update_form = AstakosGroupUpdateForm(update_data, instance=obj)
1080 73fbaec4 Sofia Papagiannaki
#         addmembers_form = AddGroupMembersForm(addmembers_data)
1081 73fbaec4 Sofia Papagiannaki
#         if update_form.is_valid():
1082 73fbaec4 Sofia Papagiannaki
#             update_form.save()
1083 73fbaec4 Sofia Papagiannaki
#         if addmembers_form.is_valid():
1084 73fbaec4 Sofia Papagiannaki
#             try:
1085 73fbaec4 Sofia Papagiannaki
#                 map(obj.approve_member, addmembers_form.valid_users)
1086 73fbaec4 Sofia Papagiannaki
#             except AssertionError:
1087 73fbaec4 Sofia Papagiannaki
#                 msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1088 73fbaec4 Sofia Papagiannaki
#                 messages.error(request, msg)
1089 73fbaec4 Sofia Papagiannaki
#             addmembers_form = AddGroupMembersForm()
1090 73fbaec4 Sofia Papagiannaki
# 
1091 73fbaec4 Sofia Papagiannaki
#     template_name = "%s/%s_detail.html" % (
1092 73fbaec4 Sofia Papagiannaki
#         model._meta.app_label, model._meta.object_name.lower())
1093 73fbaec4 Sofia Papagiannaki
#     t = template_loader.get_template(template_name)
1094 73fbaec4 Sofia Papagiannaki
#     c = RequestContext(request, {
1095 73fbaec4 Sofia Papagiannaki
#         'object': obj,
1096 73fbaec4 Sofia Papagiannaki
#     }, context_processors)
1097 73fbaec4 Sofia Papagiannaki
# 
1098 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1099 73fbaec4 Sofia Papagiannaki
#     sorting = 'person__email'
1100 73fbaec4 Sofia Papagiannaki
#     form = MembersSortForm(request.GET)
1101 73fbaec4 Sofia Papagiannaki
#     if form.is_valid():
1102 73fbaec4 Sofia Papagiannaki
#         sorting = form.cleaned_data.get('sorting')
1103 73fbaec4 Sofia Papagiannaki
#     
1104 73fbaec4 Sofia Papagiannaki
#     result = callpoint.list_resources()
1105 73fbaec4 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1106 73fbaec4 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
1107 73fbaec4 Sofia Papagiannaki
# 
1108 73fbaec4 Sofia Papagiannaki
# 
1109 73fbaec4 Sofia Papagiannaki
#     if not result.is_success:
1110 73fbaec4 Sofia Papagiannaki
#         messages.error(
1111 73fbaec4 Sofia Papagiannaki
#             request,
1112 73fbaec4 Sofia Papagiannaki
#             'Unable to retrieve system resources: %s' % result.reason
1113 73fbaec4 Sofia Papagiannaki
#     )
1114 73fbaec4 Sofia Papagiannaki
# 
1115 73fbaec4 Sofia Papagiannaki
#     extra_context = {'update_form': update_form,
1116 73fbaec4 Sofia Papagiannaki
#                      'addmembers_form': addmembers_form,
1117 73fbaec4 Sofia Papagiannaki
#                      'page': request.GET.get('page', 1),
1118 73fbaec4 Sofia Papagiannaki
#                      'sorting': sorting,
1119 73fbaec4 Sofia Papagiannaki
#                      'resource_catalog':resource_catalog,
1120 73fbaec4 Sofia Papagiannaki
#                      'quota':resource_catalog.get_quota(obj.quota)}
1121 73fbaec4 Sofia Papagiannaki
#     for key, value in extra_context.items():
1122 73fbaec4 Sofia Papagiannaki
#         if callable(value):
1123 73fbaec4 Sofia Papagiannaki
#             c[key] = value()
1124 73fbaec4 Sofia Papagiannaki
#         else:
1125 73fbaec4 Sofia Papagiannaki
#             c[key] = value
1126 73fbaec4 Sofia Papagiannaki
#     response = HttpResponse(t.render(c), mimetype=mimetype)
1127 73fbaec4 Sofia Papagiannaki
#     populate_xheaders(
1128 73fbaec4 Sofia Papagiannaki
#         request, response, model, getattr(obj, obj._meta.pk.name))
1129 73fbaec4 Sofia Papagiannaki
#     return response
1130 73fbaec4 Sofia Papagiannaki
1131 73fbaec4 Sofia Papagiannaki
1132 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1133 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1134 73fbaec4 Sofia Papagiannaki
# @login_required
1135 73fbaec4 Sofia Papagiannaki
# def group_search(request, extra_context=None, **kwargs):
1136 73fbaec4 Sofia Papagiannaki
#     q = request.GET.get('q')
1137 73fbaec4 Sofia Papagiannaki
#     if request.method == 'GET':
1138 73fbaec4 Sofia Papagiannaki
#         form = AstakosGroupSearchForm({'q': q} if q else None)
1139 73fbaec4 Sofia Papagiannaki
#     else:
1140 73fbaec4 Sofia Papagiannaki
#         form = AstakosGroupSearchForm(get_query(request))
1141 73fbaec4 Sofia Papagiannaki
#         if form.is_valid():
1142 73fbaec4 Sofia Papagiannaki
#             q = form.cleaned_data['q'].strip()
1143 73fbaec4 Sofia Papagiannaki
#     
1144 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1145 73fbaec4 Sofia Papagiannaki
#     if q:
1146 73fbaec4 Sofia Papagiannaki
#         queryset = AstakosGroup.objects.select_related()
1147 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(~Q(kind__name='default'))
1148 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(name__contains=q)
1149 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.filter(approval_date__isnull=False)
1150 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.extra(select={
1151 73fbaec4 Sofia Papagiannaki
#                                   'groupname': "auth_group.name",
1152 73fbaec4 Sofia Papagiannaki
#                                   'kindname': "im_groupkind.name",
1153 73fbaec4 Sofia Papagiannaki
#                                   'approved_members_num': """
1154 73fbaec4 Sofia Papagiannaki
#                     SELECT COUNT(*) FROM im_membership
1155 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1156 73fbaec4 Sofia Papagiannaki
#                     AND date_joined IS NOT NULL""",
1157 73fbaec4 Sofia Papagiannaki
#                                   'membership_approval_date': """
1158 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1159 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1160 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s""" % request.user.id,
1161 73fbaec4 Sofia Papagiannaki
#                                   'is_member': """
1162 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1163 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1164 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1165 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s)
1166 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1167 73fbaec4 Sofia Papagiannaki
#                                   'is_owner': """
1168 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1169 73fbaec4 Sofia Papagiannaki
#                     SELECT id FROM im_astakosuser_owner
1170 73fbaec4 Sofia Papagiannaki
#                     WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1171 73fbaec4 Sofia Papagiannaki
#                     AND astakosuser_id = %s)
1172 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1173 73fbaec4 Sofia Papagiannaki
#                     'is_owner': """SELECT CASE WHEN EXISTS(
1174 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1175 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1176 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1177 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,
1178 73fbaec4 Sofia Papagiannaki
#                     })
1179 73fbaec4 Sofia Papagiannaki
#         
1180 73fbaec4 Sofia Papagiannaki
#         # validate sorting
1181 73fbaec4 Sofia Papagiannaki
#         sort_form = AstakosGroupSortForm(request.GET)
1182 73fbaec4 Sofia Papagiannaki
#         if sort_form.is_valid():
1183 73fbaec4 Sofia Papagiannaki
#             sorting = sort_form.cleaned_data.get('sorting')
1184 73fbaec4 Sofia Papagiannaki
#         queryset = queryset.order_by(sorting)
1185 73fbaec4 Sofia Papagiannaki
# 
1186 73fbaec4 Sofia Papagiannaki
#     else:
1187 73fbaec4 Sofia Papagiannaki
#         queryset = AstakosGroup.objects.none()
1188 73fbaec4 Sofia Papagiannaki
#     return object_list(
1189 73fbaec4 Sofia Papagiannaki
#         request,
1190 73fbaec4 Sofia Papagiannaki
#         queryset,
1191 73fbaec4 Sofia Papagiannaki
#         paginate_by=PAGINATE_BY_ALL,
1192 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page') or 1,
1193 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1194 73fbaec4 Sofia Papagiannaki
#         extra_context=dict(form=form,
1195 73fbaec4 Sofia Papagiannaki
#                            is_search=True,
1196 73fbaec4 Sofia Papagiannaki
#                            q=q,
1197 73fbaec4 Sofia Papagiannaki
#                            sorting=sorting))
1198 73fbaec4 Sofia Papagiannaki
1199 73fbaec4 Sofia Papagiannaki
1200 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["GET", "POST"])
1201 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1202 73fbaec4 Sofia Papagiannaki
# @login_required
1203 73fbaec4 Sofia Papagiannaki
# def group_all(request, extra_context=None, **kwargs):
1204 73fbaec4 Sofia Papagiannaki
#     q = AstakosGroup.objects.select_related()
1205 73fbaec4 Sofia Papagiannaki
#     q = q.filter(~Q(kind__name='default'))
1206 73fbaec4 Sofia Papagiannaki
#     q = q.filter(approval_date__isnull=False)
1207 73fbaec4 Sofia Papagiannaki
#     q = q.extra(select={
1208 73fbaec4 Sofia Papagiannaki
#                 'groupname': "auth_group.name",
1209 73fbaec4 Sofia Papagiannaki
#                 'kindname': "im_groupkind.name",
1210 73fbaec4 Sofia Papagiannaki
#                 'approved_members_num': """
1211 73fbaec4 Sofia Papagiannaki
#                     SELECT COUNT(*) FROM im_membership
1212 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1213 73fbaec4 Sofia Papagiannaki
#                     AND date_joined IS NOT NULL""",
1214 73fbaec4 Sofia Papagiannaki
#                 'membership_approval_date': """
1215 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1216 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1217 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s""" % request.user.id,
1218 73fbaec4 Sofia Papagiannaki
#                 'is_member': """
1219 73fbaec4 Sofia Papagiannaki
#                     SELECT CASE WHEN EXISTS(
1220 73fbaec4 Sofia Papagiannaki
#                     SELECT date_joined FROM im_membership
1221 73fbaec4 Sofia Papagiannaki
#                     WHERE group_id = im_astakosgroup.group_ptr_id
1222 73fbaec4 Sofia Papagiannaki
#                     AND person_id = %s)
1223 73fbaec4 Sofia Papagiannaki
#                     THEN 1 ELSE 0 END""" % request.user.id,
1224 73fbaec4 Sofia Papagiannaki
#                  'is_owner': """SELECT CASE WHEN EXISTS(
1225 73fbaec4 Sofia Papagiannaki
#                         SELECT id FROM im_astakosuser_owner
1226 73fbaec4 Sofia Papagiannaki
#                         WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
1227 73fbaec4 Sofia Papagiannaki
#                         AND astakosuser_id = %s)
1228 73fbaec4 Sofia Papagiannaki
#                         THEN 1 ELSE 0 END""" % request.user.id,   })
1229 73fbaec4 Sofia Papagiannaki
#     
1230 73fbaec4 Sofia Papagiannaki
#     # validate sorting
1231 73fbaec4 Sofia Papagiannaki
#     sorting = 'groupname'
1232 73fbaec4 Sofia Papagiannaki
#     sort_form = AstakosGroupSortForm(request.GET)
1233 73fbaec4 Sofia Papagiannaki
#     if sort_form.is_valid():
1234 73fbaec4 Sofia Papagiannaki
#         sorting = sort_form.cleaned_data.get('sorting')
1235 73fbaec4 Sofia Papagiannaki
#     q = q.order_by(sorting)
1236 73fbaec4 Sofia Papagiannaki
#     
1237 73fbaec4 Sofia Papagiannaki
#     return object_list(
1238 73fbaec4 Sofia Papagiannaki
#         request,
1239 73fbaec4 Sofia Papagiannaki
#         q,
1240 73fbaec4 Sofia Papagiannaki
#         paginate_by=PAGINATE_BY_ALL,
1241 73fbaec4 Sofia Papagiannaki
#         page=request.GET.get('page') or 1,
1242 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1243 73fbaec4 Sofia Papagiannaki
#         extra_context=dict(form=AstakosGroupSearchForm(),
1244 73fbaec4 Sofia Papagiannaki
#                            is_search=True,
1245 73fbaec4 Sofia Papagiannaki
#                            sorting=sorting))
1246 73fbaec4 Sofia Papagiannaki
1247 73fbaec4 Sofia Papagiannaki
1248 73fbaec4 Sofia Papagiannaki
##@require_http_methods(["POST"])
1249 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1250 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1251 73fbaec4 Sofia Papagiannaki
# @login_required
1252 73fbaec4 Sofia Papagiannaki
# def group_join(request, group_id):
1253 73fbaec4 Sofia Papagiannaki
#     m = Membership(group_id=group_id,
1254 73fbaec4 Sofia Papagiannaki
#                    person=request.user,
1255 73fbaec4 Sofia Papagiannaki
#                    date_requested=datetime.now())
1256 73fbaec4 Sofia Papagiannaki
#     try:
1257 73fbaec4 Sofia Papagiannaki
#         m.save()
1258 73fbaec4 Sofia Papagiannaki
#         post_save_redirect = reverse(
1259 73fbaec4 Sofia Papagiannaki
#             'group_detail',
1260 73fbaec4 Sofia Papagiannaki
#             kwargs=dict(group_id=group_id))
1261 73fbaec4 Sofia Papagiannaki
#         return HttpResponseRedirect(post_save_redirect)
1262 73fbaec4 Sofia Papagiannaki
#     except IntegrityError, e:
1263 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1264 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GROUP_JOIN_FAILURE)
1265 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1266 73fbaec4 Sofia Papagiannaki
#         return group_search(request)
1267 73fbaec4 Sofia Papagiannaki
# 
1268 73fbaec4 Sofia Papagiannaki
# 
1269 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST"])
1270 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1271 73fbaec4 Sofia Papagiannaki
# @login_required
1272 73fbaec4 Sofia Papagiannaki
# def group_leave(request, group_id):
1273 73fbaec4 Sofia Papagiannaki
#     try:
1274 73fbaec4 Sofia Papagiannaki
#         m = Membership.objects.select_related().get(
1275 73fbaec4 Sofia Papagiannaki
#             group__id=group_id,
1276 73fbaec4 Sofia Papagiannaki
#             person=request.user)
1277 73fbaec4 Sofia Papagiannaki
#     except Membership.DoesNotExist:
1278 73fbaec4 Sofia Papagiannaki
#         return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1279 73fbaec4 Sofia Papagiannaki
#     if request.user in m.group.owner.all():
1280 73fbaec4 Sofia Papagiannaki
#         return HttpResponseForbidden(_(astakos_messages.OWNER_CANNOT_LEAVE_GROUP))
1281 73fbaec4 Sofia Papagiannaki
#     return delete_object(
1282 73fbaec4 Sofia Papagiannaki
#         request,
1283 73fbaec4 Sofia Papagiannaki
#         model=Membership,
1284 73fbaec4 Sofia Papagiannaki
#         object_id=m.id,
1285 73fbaec4 Sofia Papagiannaki
#         template_name='im/astakosgroup_list.html',
1286 73fbaec4 Sofia Papagiannaki
#         post_delete_redirect=reverse(
1287 73fbaec4 Sofia Papagiannaki
#             'group_detail',
1288 73fbaec4 Sofia Papagiannaki
#             kwargs=dict(group_id=group_id)))
1289 73fbaec4 Sofia Papagiannaki
1290 73fbaec4 Sofia Papagiannaki
1291 73fbaec4 Sofia Papagiannaki
# def handle_membership(func):
1292 73fbaec4 Sofia Papagiannaki
#     @wraps(func)
1293 73fbaec4 Sofia Papagiannaki
#     def wrapper(request, group_id, user_id):
1294 73fbaec4 Sofia Papagiannaki
#         try:
1295 73fbaec4 Sofia Papagiannaki
#             m = Membership.objects.select_related().get(
1296 73fbaec4 Sofia Papagiannaki
#                 group__id=group_id,
1297 73fbaec4 Sofia Papagiannaki
#                 person__id=user_id)
1298 73fbaec4 Sofia Papagiannaki
#         except Membership.DoesNotExist:
1299 73fbaec4 Sofia Papagiannaki
#             return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
1300 73fbaec4 Sofia Papagiannaki
#         else:
1301 73fbaec4 Sofia Papagiannaki
#             if request.user not in m.group.owner.all():
1302 73fbaec4 Sofia Papagiannaki
#                 return HttpResponseForbidden(_(astakos_messages.NOT_OWNER))
1303 73fbaec4 Sofia Papagiannaki
#             func(request, m)
1304 73fbaec4 Sofia Papagiannaki
#             return group_detail(request, group_id)
1305 73fbaec4 Sofia Papagiannaki
#     return wrapper
1306 01ac12d5 Sofia Papagiannaki
1307 5ce3ce4f Sofia Papagiannaki
1308 ae497612 Olga Brani
#@require_http_methods(["POST"])
1309 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1310 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1311 73fbaec4 Sofia Papagiannaki
# @login_required
1312 73fbaec4 Sofia Papagiannaki
# @handle_membership
1313 73fbaec4 Sofia Papagiannaki
# def approve_member(request, membership):
1314 73fbaec4 Sofia Papagiannaki
#     try:
1315 73fbaec4 Sofia Papagiannaki
#         membership.approve()
1316 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1317 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.MEMBER_JOINED_GROUP) % locals()
1318 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
1319 73fbaec4 Sofia Papagiannaki
#     except AssertionError:
1320 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
1321 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1322 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
1323 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1324 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1325 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
1326 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1327 5ce3ce4f Sofia Papagiannaki
1328 5ce3ce4f Sofia Papagiannaki
1329 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
1330 73fbaec4 Sofia Papagiannaki
# @login_required
1331 73fbaec4 Sofia Papagiannaki
# @handle_membership
1332 73fbaec4 Sofia Papagiannaki
# def disapprove_member(request, membership):
1333 73fbaec4 Sofia Papagiannaki
#     try:
1334 73fbaec4 Sofia Papagiannaki
#         membership.disapprove()
1335 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
1336 73fbaec4 Sofia Papagiannaki
#         msg = astakos_messages.MEMBER_REMOVED % locals()
1337 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
1338 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
1339 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
1340 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
1341 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
1342 ffb1e7a8 Sofia Papagiannaki
1343 5ce3ce4f Sofia Papagiannaki
1344 73fbaec4 Sofia Papagiannaki
@require_http_methods(["GET"])
1345 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
1346 badcb2a9 Kostas Papadimitriou
@valid_astakos_user_required
1347 666c7490 Sofia Papagiannaki
def resource_usage(request):
1348 52343ac8 Olga Brani
    def with_class(entry):
1349 52343ac8 Olga Brani
        entry['load_class'] = 'red'
1350 52343ac8 Olga Brani
        max_value = float(entry['maxValue'])
1351 52343ac8 Olga Brani
        curr_value = float(entry['currValue'])
1352 394c9834 Olga Brani
        entry['ratio_limited']= 0
1353 639e0352 Olga Brani
        if max_value > 0 :
1354 c0b26605 Sofia Papagiannaki
            entry['ratio'] = (curr_value / max_value) * 100
1355 c0b26605 Sofia Papagiannaki
        else:
1356 792c2f3b Olga Brani
            entry['ratio'] = 0
1357 52343ac8 Olga Brani
        if entry['ratio'] < 66:
1358 9a06d96f Olga Brani
            entry['load_class'] = 'yellow'
1359 52343ac8 Olga Brani
        if entry['ratio'] < 33:
1360 9a06d96f Olga Brani
            entry['load_class'] = 'green'
1361 394c9834 Olga Brani
        if entry['ratio']<0:
1362 394c9834 Olga Brani
            entry['ratio'] = 0
1363 394c9834 Olga Brani
        if entry['ratio']>100:
1364 394c9834 Olga Brani
            entry['ratio_limited'] = 100
1365 394c9834 Olga Brani
        else:
1366 394c9834 Olga Brani
            entry['ratio_limited'] = entry['ratio']
1367 c630fee6 Kostas Papadimitriou
1368 9a06d96f Olga Brani
        return entry
1369 9a06d96f Olga Brani
1370 52343ac8 Olga Brani
    def pluralize(entry):
1371 9a06d96f Olga Brani
        entry['plural'] = engine.plural(entry.get('name'))
1372 9a06d96f Olga Brani
        return entry
1373 52343ac8 Olga Brani
1374 666c7490 Sofia Papagiannaki
    result = callpoint.get_user_usage(request.user.id)
1375 820b18e0 Sofia Papagiannaki
    if result.is_success:
1376 820b18e0 Sofia Papagiannaki
        backenddata = map(with_class, result.data)
1377 820b18e0 Sofia Papagiannaki
        data = map(pluralize, result.data)
1378 9a06d96f Olga Brani
    else:
1379 820b18e0 Sofia Papagiannaki
        data = None
1380 820b18e0 Sofia Papagiannaki
        messages.error(request, result.reason)
1381 172ce682 Sofia Papagiannaki
    resource_catalog = result.data
1382 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1383 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result_report(result)
1384 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
1385 9a06d96f Olga Brani
                           data=data,
1386 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
1387 c0b26605 Sofia Papagiannaki
                           resource_catalog=resource_catalog,
1388 3cbd5e47 Olga Brani
                           result=result)
1389 9a06d96f Olga Brani
1390 1b866d9e Olga Brani
1391 73fbaec4 Sofia Papagiannaki
# def group_create_list(request):
1392 73fbaec4 Sofia Papagiannaki
#     form = PickResourceForm()
1393 73fbaec4 Sofia Papagiannaki
#     return render_response(
1394 73fbaec4 Sofia Papagiannaki
#         template='im/astakosgroup_create_list.html',
1395 73fbaec4 Sofia Papagiannaki
#         context_instance=get_context(request),)
1396 6e029beb Sofia Papagiannaki
1397 5ce3ce4f Sofia Papagiannaki
1398 f8f86e83 root
##@require_http_methods(["GET"])
1399 f8f86e83 root
#@require_http_methods(["POST", "GET"])
1400 f8f86e83 root
#@signed_terms_required
1401 f8f86e83 root
#@login_required
1402 f8f86e83 root
#def billing(request):
1403 f8f86e83 root
#
1404 f8f86e83 root
#    today = datetime.today()
1405 f8f86e83 root
#    month_last_day = calendar.monthrange(today.year, today.month)[1]
1406 f8f86e83 root
#    start = request.POST.get('datefrom', None)
1407 f8f86e83 root
#    if start:
1408 f8f86e83 root
#        today = datetime.fromtimestamp(int(start))
1409 f8f86e83 root
#        month_last_day = calendar.monthrange(today.year, today.month)[1]
1410 f8f86e83 root
#
1411 f8f86e83 root
#    start = datetime(today.year, today.month, 1).strftime("%s")
1412 f8f86e83 root
#    end = datetime(today.year, today.month, month_last_day).strftime("%s")
1413 f8f86e83 root
#    r = request_billing.apply(args=('pgerakios@grnet.gr',
1414 f8f86e83 root
#                                    int(start) * 1000,
1415 f8f86e83 root
#                                    int(end) * 1000))
1416 f8f86e83 root
#    data = {}
1417 f8f86e83 root
#
1418 f8f86e83 root
#    try:
1419 f8f86e83 root
#        status, data = r.result
1420 f8f86e83 root
#        data = _clear_billing_data(data)
1421 f8f86e83 root
#        if status != 200:
1422 f8f86e83 root
#            messages.error(request, _(astakos_messages.BILLING_ERROR) % status)
1423 f8f86e83 root
#    except:
1424 f8f86e83 root
#        messages.error(request, r.result)
1425 f8f86e83 root
#
1426 f8f86e83 root
#    return render_response(
1427 f8f86e83 root
#        template='im/billing.html',
1428 f8f86e83 root
#        context_instance=get_context(request),
1429 f8f86e83 root
#        data=data,
1430 f8f86e83 root
#        zerodate=datetime(month=1, year=1970, day=1),
1431 f8f86e83 root
#        today=today,
1432 f8f86e83 root
#        start=int(start),
1433 f8f86e83 root
#        month_last_day=month_last_day)
1434 9a06d96f Olga Brani
1435 54213d7a Sofia Papagiannaki
1436 f8f86e83 root
#def _clear_billing_data(data):
1437 f8f86e83 root
#
1438 f8f86e83 root
#    # remove addcredits entries
1439 f8f86e83 root
#    def isnotcredit(e):
1440 f8f86e83 root
#        return e['serviceName'] != "addcredits"
1441 f8f86e83 root
#
1442 f8f86e83 root
#    # separate services
1443 f8f86e83 root
#    def servicefilter(service_name):
1444 f8f86e83 root
#        service = service_name
1445 f8f86e83 root
#
1446 f8f86e83 root
#        def fltr(e):
1447 f8f86e83 root
#            return e['serviceName'] == service
1448 f8f86e83 root
#        return fltr
1449 f8f86e83 root
#
1450 f8f86e83 root
#    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
1451 f8f86e83 root
#    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
1452 f8f86e83 root
#    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
1453 f8f86e83 root
#    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
1454 f8f86e83 root
#
1455 f8f86e83 root
#    return data
1456 792c2f3b Olga Brani
1457 792c2f3b Olga Brani
1458 e1a80257 Sofia Papagiannaki
# #@require_http_methods(["GET"])
1459 e1a80257 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
1460 e1a80257 Sofia Papagiannaki
# @signed_terms_required
1461 e1a80257 Sofia Papagiannaki
# @login_required
1462 e1a80257 Sofia Papagiannaki
# def timeline(request):
1463 e1a80257 Sofia Papagiannaki
# #    data = {'entity':request.user.email}
1464 e1a80257 Sofia Papagiannaki
#     timeline_body = ()
1465 e1a80257 Sofia Papagiannaki
#     timeline_header = ()
1466 e1a80257 Sofia Papagiannaki
# #    form = TimelineForm(data)
1467 e1a80257 Sofia Papagiannaki
#     form = TimelineForm()
1468 e1a80257 Sofia Papagiannaki
#     if request.method == 'POST':
1469 e1a80257 Sofia Papagiannaki
#         data = request.POST
1470 e1a80257 Sofia Papagiannaki
#         form = TimelineForm(data)
1471 e1a80257 Sofia Papagiannaki
#         if form.is_valid():
1472 e1a80257 Sofia Papagiannaki
#             data = form.cleaned_data
1473 e1a80257 Sofia Papagiannaki
#             timeline_header = ('entity', 'resource',
1474 e1a80257 Sofia Papagiannaki
#                                'event name', 'event date',
1475 e1a80257 Sofia Papagiannaki
#                                'incremental cost', 'total cost')
1476 e1a80257 Sofia Papagiannaki
#             timeline_body = timeline_charge(
1477 e1a80257 Sofia Papagiannaki
#                 data['entity'], data['resource'],
1478 e1a80257 Sofia Papagiannaki
#                 data['start_date'], data['end_date'],
1479 e1a80257 Sofia Papagiannaki
#                 data['details'], data['operation'])
1480 e1a80257 Sofia Papagiannaki
# 
1481 e1a80257 Sofia Papagiannaki
#     return render_response(template='im/timeline.html',
1482 e1a80257 Sofia Papagiannaki
#                            context_instance=get_context(request),
1483 e1a80257 Sofia Papagiannaki
#                            form=form,
1484 e1a80257 Sofia Papagiannaki
#                            timeline_header=timeline_header,
1485 e1a80257 Sofia Papagiannaki
#                            timeline_body=timeline_body)
1486 e1a80257 Sofia Papagiannaki
#     return data
1487 5ebebb20 Olga Brani
1488 792c2f3b Olga Brani
1489 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
1490 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
1491 d2633501 Kostas Papadimitriou
@login_required
1492 d2633501 Kostas Papadimitriou
@signed_terms_required
1493 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
1494 f432088a Kostas Papadimitriou
    try:
1495 f432088a Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=pk)
1496 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
1497 f432088a Kostas Papadimitriou
        raise Http404
1498 f432088a Kostas Papadimitriou
1499 d2633501 Kostas Papadimitriou
    if provider.can_remove():
1500 d2633501 Kostas Papadimitriou
        provider.delete()
1501 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
1502 d2633501 Kostas Papadimitriou
    else:
1503 f432088a Kostas Papadimitriou
        raise PermissionDenied
1504 5ebebb20 Olga Brani
1505 792c2f3b Olga Brani
1506 5ebebb20 Olga Brani
def how_it_works(request):
1507 5ebebb20 Olga Brani
    return render_response(
1508 ccab6eb5 Sofia Papagiannaki
        'im/how_it_works.html',
1509 ccab6eb5 Sofia Papagiannaki
        context_instance=get_context(request))
1510 e1a80257 Sofia Papagiannaki
1511 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1512 172ce682 Sofia Papagiannaki
def _create_object(request, model=None, template_name=None,
1513 172ce682 Sofia Papagiannaki
        template_loader=template_loader, extra_context=None, post_save_redirect=None,
1514 172ce682 Sofia Papagiannaki
        login_required=False, context_processors=None, form_class=None):
1515 172ce682 Sofia Papagiannaki
    """
1516 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.create_object which displays a
1517 172ce682 Sofia Papagiannaki
    summary page before creating the object.
1518 172ce682 Sofia Papagiannaki
    """
1519 bfe23b13 Sofia Papagiannaki
    rollback = False
1520 172ce682 Sofia Papagiannaki
    response = None
1521 4e748491 Sofia Papagiannaki
1522 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1523 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1524 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1525 ccab6eb5 Sofia Papagiannaki
    try:
1526 172ce682 Sofia Papagiannaki
    
1527 172ce682 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1528 172ce682 Sofia Papagiannaki
        extra_context['edit'] = 0
1529 172ce682 Sofia Papagiannaki
        if request.method == 'POST':
1530 172ce682 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES)
1531 172ce682 Sofia Papagiannaki
            if form.is_valid():
1532 172ce682 Sofia Papagiannaki
                verify = request.GET.get('verify')
1533 172ce682 Sofia Papagiannaki
                edit = request.GET.get('edit')
1534 172ce682 Sofia Papagiannaki
                if verify == '1':
1535 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = False
1536 172ce682 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1537 172ce682 Sofia Papagiannaki
                elif edit == '1':
1538 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = True
1539 172ce682 Sofia Papagiannaki
                else:
1540 172ce682 Sofia Papagiannaki
                    new_object = form.save()
1541 172ce682 Sofia Papagiannaki
                    
1542 172ce682 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was created successfully.") %\
1543 172ce682 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1544 172ce682 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1545 172ce682 Sofia Papagiannaki
                    response = redirect(post_save_redirect, new_object)
1546 172ce682 Sofia Papagiannaki
        else:
1547 172ce682 Sofia Papagiannaki
            form = form_class()
1548 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1549 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1550 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1551 bfe23b13 Sofia Papagiannaki
        rollback = True
1552 bfe23b13 Sofia Papagiannaki
    finally:
1553 bfe23b13 Sofia Papagiannaki
        if rollback:
1554 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1555 bfe23b13 Sofia Papagiannaki
        else:
1556 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1557 4e748491 Sofia Papagiannaki
1558 172ce682 Sofia Papagiannaki
        if response == None:
1559 172ce682 Sofia Papagiannaki
            # Create the template, context, response
1560 172ce682 Sofia Papagiannaki
            if not template_name:
1561 172ce682 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1562 172ce682 Sofia Papagiannaki
                     (model._meta.app_label, model._meta.object_name.lower())
1563 172ce682 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1564 172ce682 Sofia Papagiannaki
            c = RequestContext(request, {
1565 172ce682 Sofia Papagiannaki
                'form': form
1566 172ce682 Sofia Papagiannaki
            }, context_processors)
1567 172ce682 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1568 172ce682 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1569 172ce682 Sofia Papagiannaki
        return response
1570 172ce682 Sofia Papagiannaki
1571 4e748491 Sofia Papagiannaki
@transaction.commit_manually
1572 4e748491 Sofia Papagiannaki
def _update_object(request, model=None, object_id=None, slug=None,
1573 4e748491 Sofia Papagiannaki
        slug_field='slug', template_name=None, template_loader=template_loader,
1574 4e748491 Sofia Papagiannaki
        extra_context=None, post_save_redirect=None, login_required=False,
1575 4e748491 Sofia Papagiannaki
        context_processors=None, template_object_name='object',
1576 4e748491 Sofia Papagiannaki
        form_class=None):
1577 4e748491 Sofia Papagiannaki
    """
1578 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.update_object which displays a
1579 4e748491 Sofia Papagiannaki
    summary page before updating the object.
1580 4e748491 Sofia Papagiannaki
    """
1581 4e748491 Sofia Papagiannaki
    rollback = False
1582 4e748491 Sofia Papagiannaki
    response = None
1583 4e748491 Sofia Papagiannaki
1584 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1585 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1586 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1587 4e748491 Sofia Papagiannaki
    
1588 4e748491 Sofia Papagiannaki
    try:
1589 4e748491 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1590 4e748491 Sofia Papagiannaki
        obj = lookup_object(model, object_id, slug, slug_field)
1591 4e748491 Sofia Papagiannaki
    
1592 4e748491 Sofia Papagiannaki
        if request.method == 'POST':
1593 4e748491 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES, instance=obj)
1594 4e748491 Sofia Papagiannaki
            if form.is_valid():
1595 4e748491 Sofia Papagiannaki
                verify = request.GET.get('verify')
1596 4e748491 Sofia Papagiannaki
                edit = request.GET.get('edit')
1597 4e748491 Sofia Papagiannaki
                if verify == '1':
1598 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = False
1599 4e748491 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1600 4e748491 Sofia Papagiannaki
                elif edit == '1':
1601 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = True
1602 4e748491 Sofia Papagiannaki
                else:                
1603 4e748491 Sofia Papagiannaki
                    obj = form.save()
1604 4e748491 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was updated successfully.") %\
1605 4e748491 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1606 4e748491 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1607 4e748491 Sofia Papagiannaki
                    response = redirect(post_save_redirect, obj)
1608 4e748491 Sofia Papagiannaki
        else:
1609 4e748491 Sofia Papagiannaki
            form = form_class(instance=obj)
1610 4e748491 Sofia Papagiannaki
    except BaseException, e:
1611 4e748491 Sofia Papagiannaki
        logger.exception(e)
1612 4e748491 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1613 4e748491 Sofia Papagiannaki
        rollback = True
1614 4e748491 Sofia Papagiannaki
    finally:
1615 4e748491 Sofia Papagiannaki
        if rollback:
1616 4e748491 Sofia Papagiannaki
            transaction.rollback()
1617 4e748491 Sofia Papagiannaki
        else:
1618 4e748491 Sofia Papagiannaki
            transaction.commit()
1619 4e748491 Sofia Papagiannaki
        if response == None:
1620 4e748491 Sofia Papagiannaki
            if not template_name:
1621 4e748491 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1622 4e748491 Sofia Papagiannaki
                    (model._meta.app_label, model._meta.object_name.lower())
1623 4e748491 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1624 4e748491 Sofia Papagiannaki
            c = RequestContext(request, {
1625 4e748491 Sofia Papagiannaki
                'form': form,
1626 4e748491 Sofia Papagiannaki
                template_object_name: obj,
1627 4e748491 Sofia Papagiannaki
            }, context_processors)
1628 4e748491 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1629 4e748491 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1630 4e748491 Sofia Papagiannaki
            populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
1631 4e748491 Sofia Papagiannaki
        return response
1632 4e748491 Sofia Papagiannaki
1633 172ce682 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1634 172ce682 Sofia Papagiannaki
@signed_terms_required
1635 172ce682 Sofia Papagiannaki
@login_required
1636 172ce682 Sofia Papagiannaki
def project_add(request):
1637 172ce682 Sofia Papagiannaki
    result = callpoint.list_resources()
1638 172ce682 Sofia Papagiannaki
    if not result.is_success:
1639 172ce682 Sofia Papagiannaki
        messages.error(
1640 172ce682 Sofia Papagiannaki
            request,
1641 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1642 172ce682 Sofia Papagiannaki
    )
1643 172ce682 Sofia Papagiannaki
    else:
1644 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1645 172ce682 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1646 172ce682 Sofia Papagiannaki
    return _create_object(request, template_name='im/projects/projectapplication_form.html',
1647 172ce682 Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1648 172ce682 Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1649 ccab6eb5 Sofia Papagiannaki
1650 e1a80257 Sofia Papagiannaki
1651 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1652 e1a80257 Sofia Papagiannaki
@signed_terms_required
1653 e1a80257 Sofia Papagiannaki
@login_required
1654 f3342849 Sofia Papagiannaki
def project_list(request):
1655 2a965273 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(owner=request.user)
1656 2a965273 Sofia Papagiannaki
    q |= ProjectApplication.objects.filter(
1657 2a965273 Sofia Papagiannaki
        project__in=request.user.projectmembership_set.values_list('project', flat=True)
1658 2a965273 Sofia Papagiannaki
    )
1659 ccab6eb5 Sofia Papagiannaki
    q = q.select_related()
1660 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1661 8327782d Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1662 8327782d Sofia Papagiannaki
    if sort_form.is_valid():
1663 8327782d Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1664 8327782d Sofia Papagiannaki
    q = q.order_by(sorting)
1665 8327782d Sofia Papagiannaki
    
1666 e1a80257 Sofia Papagiannaki
    return object_list(
1667 e1a80257 Sofia Papagiannaki
        request,
1668 2a965273 Sofia Papagiannaki
        q,
1669 e1a80257 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1670 e1a80257 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1671 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1672 71a38edf Sofia Papagiannaki
        extra_context={
1673 71a38edf Sofia Papagiannaki
            'is_search':False,
1674 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1675 71a38edf Sofia Papagiannaki
        }
1676 71a38edf Sofia Papagiannaki
    )
1677 e1a80257 Sofia Papagiannaki
1678 f3342849 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1679 e1a80257 Sofia Papagiannaki
@signed_terms_required
1680 e1a80257 Sofia Papagiannaki
@login_required
1681 73fbaec4 Sofia Papagiannaki
def project_update(request, application_id):
1682 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1683 8327782d Sofia Papagiannaki
    if not result.is_success:
1684 8327782d Sofia Papagiannaki
        messages.error(
1685 8327782d Sofia Papagiannaki
            request,
1686 8327782d Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1687 8327782d Sofia Papagiannaki
    )
1688 172ce682 Sofia Papagiannaki
    else:
1689 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1690 5200e864 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1691 4e748491 Sofia Papagiannaki
    return _update_object(
1692 f3342849 Sofia Papagiannaki
        request,
1693 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1694 8327782d Sofia Papagiannaki
        template_name='im/projects/projectapplication_form.html',
1695 8327782d Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1696 8327782d Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1697 17a2f450 Sofia Papagiannaki
1698 e1a80257 Sofia Papagiannaki
1699 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1700 e1a80257 Sofia Papagiannaki
@signed_terms_required
1701 e1a80257 Sofia Papagiannaki
@login_required
1702 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1703 73fbaec4 Sofia Papagiannaki
def project_detail(request, application_id):
1704 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1705 172ce682 Sofia Papagiannaki
    if not result.is_success:
1706 172ce682 Sofia Papagiannaki
        messages.error(
1707 172ce682 Sofia Papagiannaki
            request,
1708 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1709 172ce682 Sofia Papagiannaki
    )
1710 172ce682 Sofia Papagiannaki
    else:
1711 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1712 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1713 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
1714 ccab6eb5 Sofia Papagiannaki
1715 bfe23b13 Sofia Papagiannaki
    addmembers_form = AddProjectMembersForm()
1716 ccab6eb5 Sofia Papagiannaki
    if request.method == 'POST':
1717 bfe23b13 Sofia Papagiannaki
        addmembers_form = AddProjectMembersForm(request.POST)
1718 ccab6eb5 Sofia Papagiannaki
        if addmembers_form.is_valid():
1719 ccab6eb5 Sofia Papagiannaki
            try:
1720 73fbaec4 Sofia Papagiannaki
                rollback = False
1721 73fbaec4 Sofia Papagiannaki
                map(lambda u: accept_membership(
1722 73fbaec4 Sofia Papagiannaki
                        application_id,
1723 73fbaec4 Sofia Papagiannaki
                        u,
1724 73fbaec4 Sofia Papagiannaki
                        request_user=request.user),
1725 73fbaec4 Sofia Papagiannaki
                    addmembers_form.valid_users)
1726 73fbaec4 Sofia Papagiannaki
            except (IOError, PermissionDenied), e:
1727 73fbaec4 Sofia Papagiannaki
                messages.error(request, e)
1728 bfe23b13 Sofia Papagiannaki
            except BaseException, e:
1729 73fbaec4 Sofia Papagiannaki
                rollback = True
1730 bfe23b13 Sofia Papagiannaki
                messages.error(request, e)
1731 73fbaec4 Sofia Papagiannaki
            finally:
1732 73fbaec4 Sofia Papagiannaki
                if rollback == True:
1733 73fbaec4 Sofia Papagiannaki
                    transaction.rollback()
1734 73fbaec4 Sofia Papagiannaki
                else:
1735 73fbaec4 Sofia Papagiannaki
                    transaction.commit()
1736 bfe23b13 Sofia Papagiannaki
            addmembers_form = AddProjectMembersForm()
1737 bfe23b13 Sofia Papagiannaki
    
1738 bfe23b13 Sofia Papagiannaki
    # validate sorting
1739 bfe23b13 Sofia Papagiannaki
    sorting = 'person__email'
1740 73fbaec4 Sofia Papagiannaki
    form = ProjectMembersSortForm(request.GET or request.POST)
1741 bfe23b13 Sofia Papagiannaki
    if form.is_valid():
1742 bfe23b13 Sofia Papagiannaki
        sorting = form.cleaned_data.get('sorting')
1743 ccab6eb5 Sofia Papagiannaki
1744 f3342849 Sofia Papagiannaki
    return object_detail(
1745 f3342849 Sofia Papagiannaki
        request,
1746 71a38edf Sofia Papagiannaki
        queryset=ProjectApplication.objects.select_related(),
1747 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1748 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_detail.html',
1749 71a38edf Sofia Papagiannaki
        extra_context={
1750 8327782d Sofia Papagiannaki
            'resource_catalog':resource_catalog,
1751 bfe23b13 Sofia Papagiannaki
            'sorting':sorting,
1752 bfe23b13 Sofia Papagiannaki
            'addmembers_form':addmembers_form
1753 71a38edf Sofia Papagiannaki
        }
1754 f3342849 Sofia Papagiannaki
    )
1755 e1a80257 Sofia Papagiannaki
1756 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1757 e1a80257 Sofia Papagiannaki
@signed_terms_required
1758 e1a80257 Sofia Papagiannaki
@login_required
1759 e1a80257 Sofia Papagiannaki
def project_search(request):
1760 6dadd24a Sofia Papagiannaki
    queryset = ProjectApplication.objects
1761 bfe23b13 Sofia Papagiannaki
    if request.method == 'GET':
1762 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm()
1763 6dadd24a Sofia Papagiannaki
        queryset = queryset.none()
1764 bfe23b13 Sofia Papagiannaki
    else:
1765 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm(request.POST)
1766 bfe23b13 Sofia Papagiannaki
        if form.is_valid():
1767 bfe23b13 Sofia Papagiannaki
            q = form.cleaned_data['q'].strip()
1768 6dadd24a Sofia Papagiannaki
            queryset = queryset.filter(~Q(project__last_approval_date__isnull=True))
1769 73fbaec4 Sofia Papagiannaki
            queryset = queryset.filter(name__contains=q)
1770 73fbaec4 Sofia Papagiannaki
    sorting = 'name'        
1771 bfe23b13 Sofia Papagiannaki
    # validate sorting
1772 73fbaec4 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1773 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1774 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1775 bfe23b13 Sofia Papagiannaki
    queryset = queryset.order_by(sorting)
1776 bfe23b13 Sofia Papagiannaki
    return object_list(
1777 bfe23b13 Sofia Papagiannaki
        request,
1778 bfe23b13 Sofia Papagiannaki
        queryset,
1779 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1780 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1781 6dadd24a Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1782 bfe23b13 Sofia Papagiannaki
        extra_context=dict(
1783 bfe23b13 Sofia Papagiannaki
            form=form,
1784 bfe23b13 Sofia Papagiannaki
            is_search=True,
1785 bfe23b13 Sofia Papagiannaki
            sorting=sorting
1786 bfe23b13 Sofia Papagiannaki
        )
1787 bfe23b13 Sofia Papagiannaki
    )
1788 bfe23b13 Sofia Papagiannaki
1789 e1a80257 Sofia Papagiannaki
1790 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1791 e1a80257 Sofia Papagiannaki
@signed_terms_required
1792 e1a80257 Sofia Papagiannaki
@login_required
1793 e1a80257 Sofia Papagiannaki
def project_all(request):
1794 73fbaec4 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(
1795 73fbaec4 Sofia Papagiannaki
        ~Q(project__last_approval_date__isnull=True))
1796 bfe23b13 Sofia Papagiannaki
    q = q.select_related()
1797 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1798 bfe23b13 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1799 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1800 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1801 bfe23b13 Sofia Papagiannaki
    q = q.order_by(sorting)
1802 bfe23b13 Sofia Papagiannaki
    
1803 bfe23b13 Sofia Papagiannaki
    return object_list(
1804 bfe23b13 Sofia Papagiannaki
        request,
1805 bfe23b13 Sofia Papagiannaki
        q,
1806 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1807 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1808 bfe23b13 Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1809 bfe23b13 Sofia Papagiannaki
        extra_context={
1810 6dadd24a Sofia Papagiannaki
            'form':ProjectSearchForm(),
1811 bfe23b13 Sofia Papagiannaki
            'is_search':True,
1812 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1813 bfe23b13 Sofia Papagiannaki
        }
1814 bfe23b13 Sofia Papagiannaki
    )
1815 e1a80257 Sofia Papagiannaki
1816 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1817 e1a80257 Sofia Papagiannaki
@signed_terms_required
1818 e1a80257 Sofia Papagiannaki
@login_required
1819 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1820 73fbaec4 Sofia Papagiannaki
def project_join(request, application_id):
1821 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1822 73fbaec4 Sofia Papagiannaki
    if not next:
1823 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1824 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1825 73fbaec4 Sofia Papagiannaki
1826 bfe23b13 Sofia Papagiannaki
    rollback = False
1827 bfe23b13 Sofia Papagiannaki
    try:
1828 73fbaec4 Sofia Papagiannaki
        join_project(application_id, request.user)
1829 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1830 bfe23b13 Sofia Papagiannaki
        messages.error(request, e)
1831 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1832 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1833 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1834 bfe23b13 Sofia Papagiannaki
        rollback = True
1835 bfe23b13 Sofia Papagiannaki
    else:
1836 bfe23b13 Sofia Papagiannaki
        return project_detail(request, id)
1837 bfe23b13 Sofia Papagiannaki
    finally:
1838 bfe23b13 Sofia Papagiannaki
        if rollback:
1839 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1840 bfe23b13 Sofia Papagiannaki
        else:
1841 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1842 bfe23b13 Sofia Papagiannaki
1843 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1844 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1845 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1846 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1847 bfe23b13 Sofia Papagiannaki
1848 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1849 e1a80257 Sofia Papagiannaki
@signed_terms_required
1850 e1a80257 Sofia Papagiannaki
@login_required
1851 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1852 73fbaec4 Sofia Papagiannaki
def project_leave(request, application_id):
1853 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1854 73fbaec4 Sofia Papagiannaki
    if not next:
1855 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1856 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1857 e1a80257 Sofia Papagiannaki
1858 73fbaec4 Sofia Papagiannaki
    rollback = False
1859 73fbaec4 Sofia Papagiannaki
    try:
1860 73fbaec4 Sofia Papagiannaki
        leave_project(application_id, request.user)
1861 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1862 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1863 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1864 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1865 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1866 73fbaec4 Sofia Papagiannaki
        rollback = True
1867 73fbaec4 Sofia Papagiannaki
    finally:
1868 73fbaec4 Sofia Papagiannaki
        if rollback:
1869 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1870 73fbaec4 Sofia Papagiannaki
        else:
1871 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1872 73fbaec4 Sofia Papagiannaki
    
1873 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1874 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1875 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1876 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1877 bfe23b13 Sofia Papagiannaki
1878 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1879 e1a80257 Sofia Papagiannaki
@signed_terms_required
1880 e1a80257 Sofia Papagiannaki
@login_required
1881 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1882 73fbaec4 Sofia Papagiannaki
def project_approve_member(request, application_id, user_id):
1883 73fbaec4 Sofia Papagiannaki
    rollback = False
1884 73fbaec4 Sofia Papagiannaki
    try:
1885 73fbaec4 Sofia Papagiannaki
        m = accept_membership(application_id, user_id, request.user)
1886 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1887 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1888 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1889 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1890 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1891 73fbaec4 Sofia Papagiannaki
        rollback = True
1892 73fbaec4 Sofia Papagiannaki
    else:
1893 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1894 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_JOINED_PROJECT) % locals()
1895 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1896 73fbaec4 Sofia Papagiannaki
    finally:
1897 73fbaec4 Sofia Papagiannaki
        if rollback:
1898 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1899 73fbaec4 Sofia Papagiannaki
        else:
1900 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1901 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1902 bfe23b13 Sofia Papagiannaki
1903 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1904 bfe23b13 Sofia Papagiannaki
@signed_terms_required
1905 bfe23b13 Sofia Papagiannaki
@login_required
1906 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1907 73fbaec4 Sofia Papagiannaki
def project_remove_member(request, application_id, user_id):
1908 73fbaec4 Sofia Papagiannaki
    rollback = False
1909 73fbaec4 Sofia Papagiannaki
    try:
1910 73fbaec4 Sofia Papagiannaki
        m = remove_membership(application_id, user_id, request.user)
1911 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1912 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1913 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1914 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1915 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1916 73fbaec4 Sofia Papagiannaki
        rollback = True
1917 73fbaec4 Sofia Papagiannaki
    else:
1918 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1919 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1920 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1921 73fbaec4 Sofia Papagiannaki
    finally:
1922 73fbaec4 Sofia Papagiannaki
        if rollback:
1923 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1924 73fbaec4 Sofia Papagiannaki
        else:
1925 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1926 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1927 bfe23b13 Sofia Papagiannaki
1928 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1929 e1a80257 Sofia Papagiannaki
@signed_terms_required
1930 e1a80257 Sofia Papagiannaki
@login_required
1931 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1932 73fbaec4 Sofia Papagiannaki
def project_reject_member(request, application_id, user_id):
1933 73fbaec4 Sofia Papagiannaki
    rollback = False
1934 73fbaec4 Sofia Papagiannaki
    try:
1935 73fbaec4 Sofia Papagiannaki
        m = reject_membership(application_id, user_id, request.user)
1936 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1937 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1938 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1939 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1940 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1941 73fbaec4 Sofia Papagiannaki
        rollback = True
1942 73fbaec4 Sofia Papagiannaki
    else:
1943 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1944 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1945 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1946 73fbaec4 Sofia Papagiannaki
    finally:
1947 73fbaec4 Sofia Papagiannaki
        if rollback:
1948 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1949 73fbaec4 Sofia Papagiannaki
        else:
1950 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1951 47b77c8b Sofia Papagiannaki
    return project_detail(request, application_id)
1952 c630fee6 Kostas Papadimitriou