Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / views.py @ 120b4498

History | View | Annotate | Download (50.1 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 63836eda 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 63836eda Kostas Papadimitriou
def required_auth_methods_assigned(only_warn=False):
184 63836eda Kostas Papadimitriou
    """
185 63836eda Kostas Papadimitriou
    Decorator that checks whether the request.user has all required auth providers
186 63836eda Kostas Papadimitriou
    assigned.
187 63836eda Kostas Papadimitriou
    """
188 63836eda Kostas Papadimitriou
    required_providers = auth_providers.REQUIRED_PROVIDERS.keys()
189 63836eda Kostas Papadimitriou
190 63836eda Kostas Papadimitriou
    def decorator(func):
191 63836eda Kostas Papadimitriou
        if not required_providers:
192 63836eda Kostas Papadimitriou
            return func
193 63836eda Kostas Papadimitriou
194 63836eda Kostas Papadimitriou
        @wraps(func)
195 63836eda Kostas Papadimitriou
        def wrapper(request, *args, **kwargs):
196 63836eda Kostas Papadimitriou
            if request.user.is_authenticated():
197 63836eda Kostas Papadimitriou
                for required in required_providers:
198 63836eda Kostas Papadimitriou
                    if not request.user.has_auth_provider(required):
199 63836eda Kostas Papadimitriou
                        provider = auth_providers.get_provider(required)
200 63836eda Kostas Papadimitriou
                        if only_warn:
201 63836eda Kostas Papadimitriou
                            messages.error(request,
202 63836eda Kostas Papadimitriou
                                           _(astakos_messages.AUTH_PROVIDER_REQUIRED  % {
203 63836eda Kostas Papadimitriou
                                               'provider': provider.get_title_display}))
204 63836eda Kostas Papadimitriou
                        else:
205 63836eda Kostas Papadimitriou
                            return HttpResponseRedirect(reverse('edit_profile'))
206 63836eda Kostas Papadimitriou
            return func(request, *args, **kwargs)
207 63836eda Kostas Papadimitriou
        return wrapper
208 63836eda Kostas Papadimitriou
    return decorator
209 63836eda Kostas Papadimitriou
210 63836eda Kostas Papadimitriou
211 63836eda Kostas Papadimitriou
def valid_astakos_user_required(func):
212 63836eda Kostas Papadimitriou
    return signed_terms_required(required_auth_methods_assigned()(login_required(func)))
213 63836eda Kostas Papadimitriou
214 63836eda 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 120b4498 Kostas Papadimitriou
    third_party_token = request.GET.get('key', False)
245 120b4498 Kostas Papadimitriou
    if third_party_token:
246 120b4498 Kostas Papadimitriou
        messages.info(request, astakos_messages.AUTH_PROVIDER_LOGIN_TO_ADD)
247 120b4498 Kostas Papadimitriou
248 ef20ea07 Sofia Papagiannaki
    return render_response(
249 ef20ea07 Sofia Papagiannaki
        template_name,
250 ef20ea07 Sofia Papagiannaki
        login_form = LoginForm(request=request),
251 ef20ea07 Sofia Papagiannaki
        context_instance = get_context(request, extra_context)
252 ef20ea07 Sofia Papagiannaki
    )
253 5ce3ce4f Sofia Papagiannaki
254 64cd4730 Antony Chazapis
255 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
256 63836eda Kostas Papadimitriou
@valid_astakos_user_required
257 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
258 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
259 890b0eaf Sofia Papagiannaki
    """
260 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
261 176023aa Kostas Papadimitriou

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

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

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

271 890b0eaf Sofia Papagiannaki
    **Arguments**
272 176023aa Kostas Papadimitriou

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

277 890b0eaf Sofia Papagiannaki
    ``extra_context``
278 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
279 176023aa Kostas Papadimitriou

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

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

284 890b0eaf Sofia Papagiannaki
    **Settings:**
285 176023aa Kostas Papadimitriou

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

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

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

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

347 890b0eaf Sofia Papagiannaki
    **Arguments**
348 176023aa Kostas Papadimitriou

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

353 890b0eaf Sofia Papagiannaki
    ``extra_context``
354 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
355 176023aa Kostas Papadimitriou

356 890b0eaf Sofia Papagiannaki
    **Template:**
357 176023aa Kostas Papadimitriou

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

360 92defad4 Sofia Papagiannaki
    **Settings:**
361 176023aa Kostas Papadimitriou

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

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

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

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

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

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

433 890b0eaf Sofia Papagiannaki
    **Arguments**
434 5ce3ce4f Sofia Papagiannaki

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

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

443 890b0eaf Sofia Papagiannaki
    ``extra_context``
444 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
445 176023aa Kostas Papadimitriou

446 890b0eaf Sofia Papagiannaki
    **Template:**
447 5ce3ce4f Sofia Papagiannaki

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

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

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

544 890b0eaf Sofia Papagiannaki
    **Arguments**
545 176023aa Kostas Papadimitriou

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

550 890b0eaf Sofia Papagiannaki
    ``extra_context``
551 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
552 176023aa Kostas Papadimitriou

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

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

557 890b0eaf Sofia Papagiannaki
    **Settings:**
558 176023aa Kostas Papadimitriou

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

626 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
627 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
628 2126d85d Sofia Papagiannaki
    """
629 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
630 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
631 2126d85d Sofia Papagiannaki
    try:
632 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
633 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
634 279d6e51 Olga Brani
        return HttpResponseBadRequest(_(astakos_messages.ACCOUNT_UNKNOWN))
635 5ce3ce4f Sofia Papagiannaki
636 d1757ca7 Sofia Papagiannaki
    if user.is_active:
637 ae497612 Olga Brani
        message = _(astakos_messages.ACCOUNT_ALREADY_ACTIVE)
638 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
639 279d6e51 Olga Brani
        return index(request)
640 5ce3ce4f Sofia Papagiannaki
641 0a569195 Sofia Papagiannaki
    try:
642 279d6e51 Olga Brani
        activate_func(user, greeting_email_template_name, helpdesk_email_template_name, verify_email=True)
643 ef20ea07 Sofia Papagiannaki
        response = prepare_response(request, user, next, renew=True)
644 ef20ea07 Sofia Papagiannaki
        transaction.commit()
645 279d6e51 Olga Brani
        return response
646 ef20ea07 Sofia Papagiannaki
    except SendMailError, e:
647 ef20ea07 Sofia Papagiannaki
        message = e.message
648 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
649 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
650 279d6e51 Olga Brani
        return index(request)
651 ef20ea07 Sofia Papagiannaki
    except BaseException, e:
652 ef20ea07 Sofia Papagiannaki
        status = messages.ERROR
653 c0b26605 Sofia Papagiannaki
        message = _(astakos_messages.GENERIC_ERROR)
654 ef20ea07 Sofia Papagiannaki
        messages.add_message(request, messages.ERROR, message)
655 ef20ea07 Sofia Papagiannaki
        logger.exception(e)
656 ef20ea07 Sofia Papagiannaki
        transaction.rollback()
657 279d6e51 Olga Brani
        return index(request)
658 270dd48d Sofia Papagiannaki
659 5ce3ce4f Sofia Papagiannaki
660 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
661 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
662 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
663 270dd48d Sofia Papagiannaki
    term = None
664 270dd48d Sofia Papagiannaki
    terms = None
665 270dd48d Sofia Papagiannaki
    if not term_id:
666 270dd48d Sofia Papagiannaki
        try:
667 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
668 270dd48d Sofia Papagiannaki
        except IndexError:
669 270dd48d Sofia Papagiannaki
            pass
670 270dd48d Sofia Papagiannaki
    else:
671 270dd48d Sofia Papagiannaki
        try:
672 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
673 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
674 270dd48d Sofia Papagiannaki
            pass
675 176023aa Kostas Papadimitriou
676 270dd48d Sofia Papagiannaki
    if not term:
677 ae497612 Olga Brani
        messages.error(request, _(astakos_messages.NO_APPROVAL_TERMS))
678 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
679 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
680 270dd48d Sofia Papagiannaki
    terms = f.read()
681 176023aa Kostas Papadimitriou
682 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
683 217994f8 Sofia Papagiannaki
        next = restrict_next(
684 217994f8 Sofia Papagiannaki
            request.POST.get('next'),
685 217994f8 Sofia Papagiannaki
            domain=COOKIE_DOMAIN
686 217994f8 Sofia Papagiannaki
        )
687 270dd48d Sofia Papagiannaki
        if not next:
688 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
689 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
690 270dd48d Sofia Papagiannaki
        if not form.is_valid():
691 270dd48d Sofia Papagiannaki
            return render_response(template_name,
692 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
693 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
694 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
695 270dd48d Sofia Papagiannaki
        user = form.save()
696 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
697 270dd48d Sofia Papagiannaki
    else:
698 586967c0 Sofia Papagiannaki
        form = None
699 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
700 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
701 270dd48d Sofia Papagiannaki
        return render_response(template_name,
702 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
703 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
704 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
705 5ce3ce4f Sofia Papagiannaki
706 270dd48d Sofia Papagiannaki
707 9a06d96f Olga Brani
@require_http_methods(["GET", "POST"])
708 63836eda Kostas Papadimitriou
@valid_astakos_user_required
709 49790d9d Sofia Papagiannaki
@transaction.commit_manually
710 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
711 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
712 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
713 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
714 aab4d540 Sofia Papagiannaki
                 extra_context=None):
715 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
716 49790d9d Sofia Papagiannaki
    if activation_key:
717 49790d9d Sofia Papagiannaki
        try:
718 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
719 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
720 ae497612 Olga Brani
                msg = _(astakos_messages.EMAIL_CHANGED)
721 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
722 49790d9d Sofia Papagiannaki
                auth_logout(request)
723 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
724 49790d9d Sofia Papagiannaki
                transaction.commit()
725 279d6e51 Olga Brani
                return response
726 49790d9d Sofia Papagiannaki
        except ValueError, e:
727 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
728 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
729 279d6e51 Olga Brani
                               modified_user=user if 'user' in locals(
730 279d6e51 Olga Brani
                               ) else None,
731 279d6e51 Olga Brani
                               context_instance=get_context(request,
732 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
733 5ce3ce4f Sofia Papagiannaki
734 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
735 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
736 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
737 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
738 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
739 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
740 49790d9d Sofia Papagiannaki
        try:
741 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
742 49790d9d Sofia Papagiannaki
        except SendMailError, e:
743 49790d9d Sofia Papagiannaki
            msg = e
744 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
745 49790d9d Sofia Papagiannaki
            transaction.rollback()
746 279d6e51 Olga Brani
        except IntegrityError, e:
747 279d6e51 Olga Brani
            msg = _(astakos_messages.PENDING_EMAIL_CHANGE_REQUEST)
748 279d6e51 Olga Brani
            messages.error(request, msg)
749 49790d9d Sofia Papagiannaki
        else:
750 ae497612 Olga Brani
            msg = _(astakos_messages.EMAIL_CHANGE_REGISTERED)
751 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
752 49790d9d Sofia Papagiannaki
            transaction.commit()
753 c0b26605 Sofia Papagiannaki
    return render_response(
754 c0b26605 Sofia Papagiannaki
        form_template_name,
755 c0b26605 Sofia Papagiannaki
        form=form,
756 c0b26605 Sofia Papagiannaki
        context_instance=get_context(request, extra_context)
757 c0b26605 Sofia Papagiannaki
    )
758 1f3b4b39 Sofia Papagiannaki
759 1f3b4b39 Sofia Papagiannaki
760 1f3b4b39 Sofia Papagiannaki
def send_activation(request, user_id, template_name='im/login.html', extra_context=None):
761 792c2f3b Olga Brani
762 63836eda Kostas Papadimitriou
    if request.user.is_authenticated():
763 63836eda Kostas Papadimitriou
        messages.error(request, _(astakos_messages.ALREADY_LOGGED_IN))
764 63836eda Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
765 63836eda Kostas Papadimitriou
766 792c2f3b Olga Brani
    if settings.MODERATION_ENABLED:
767 792c2f3b Olga Brani
        raise PermissionDenied
768 792c2f3b Olga Brani
769 1f3b4b39 Sofia Papagiannaki
    extra_context = extra_context or {}
770 1f3b4b39 Sofia Papagiannaki
    try:
771 1f3b4b39 Sofia Papagiannaki
        u = AstakosUser.objects.get(id=user_id)
772 1f3b4b39 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
773 c0b26605 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.ACCOUNT_UNKNOWN))
774 1f3b4b39 Sofia Papagiannaki
    else:
775 1f3b4b39 Sofia Papagiannaki
        try:
776 1f3b4b39 Sofia Papagiannaki
            send_activation_func(u)
777 c0b26605 Sofia Papagiannaki
            msg = _(astakos_messages.ACTIVATION_SENT)
778 1f3b4b39 Sofia Papagiannaki
            messages.success(request, msg)
779 1f3b4b39 Sofia Papagiannaki
        except SendMailError, e:
780 1f3b4b39 Sofia Papagiannaki
            messages.error(request, e)
781 1f3b4b39 Sofia Papagiannaki
    return render_response(
782 1f3b4b39 Sofia Papagiannaki
        template_name,
783 c0b26605 Sofia Papagiannaki
        login_form = LoginForm(request=request),
784 1f3b4b39 Sofia Papagiannaki
        context_instance = get_context(
785 1f3b4b39 Sofia Papagiannaki
            request,
786 1f3b4b39 Sofia Papagiannaki
            extra_context
787 1f3b4b39 Sofia Papagiannaki
        )
788 1f3b4b39 Sofia Papagiannaki
    )
789 5ce3ce4f Sofia Papagiannaki
790 73fbaec4 Sofia Papagiannaki
791 73fbaec4 Sofia Papagiannaki
# def handle_membership(func):
792 73fbaec4 Sofia Papagiannaki
#     @wraps(func)
793 73fbaec4 Sofia Papagiannaki
#     def wrapper(request, group_id, user_id):
794 73fbaec4 Sofia Papagiannaki
#         try:
795 73fbaec4 Sofia Papagiannaki
#             m = Membership.objects.select_related().get(
796 73fbaec4 Sofia Papagiannaki
#                 group__id=group_id,
797 73fbaec4 Sofia Papagiannaki
#                 person__id=user_id)
798 73fbaec4 Sofia Papagiannaki
#         except Membership.DoesNotExist:
799 73fbaec4 Sofia Papagiannaki
#             return HttpResponseBadRequest(_(astakos_messages.NOT_MEMBER))
800 73fbaec4 Sofia Papagiannaki
#         else:
801 73fbaec4 Sofia Papagiannaki
#             if request.user not in m.group.owner.all():
802 73fbaec4 Sofia Papagiannaki
#                 return HttpResponseForbidden(_(astakos_messages.NOT_OWNER))
803 73fbaec4 Sofia Papagiannaki
#             func(request, m)
804 73fbaec4 Sofia Papagiannaki
#             return group_detail(request, group_id)
805 73fbaec4 Sofia Papagiannaki
#     return wrapper
806 01ac12d5 Sofia Papagiannaki
807 5ce3ce4f Sofia Papagiannaki
808 ae497612 Olga Brani
#@require_http_methods(["POST"])
809 73fbaec4 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
810 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
811 73fbaec4 Sofia Papagiannaki
# @login_required
812 73fbaec4 Sofia Papagiannaki
# @handle_membership
813 73fbaec4 Sofia Papagiannaki
# def approve_member(request, membership):
814 73fbaec4 Sofia Papagiannaki
#     try:
815 73fbaec4 Sofia Papagiannaki
#         membership.approve()
816 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
817 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.MEMBER_JOINED_GROUP) % locals()
818 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
819 73fbaec4 Sofia Papagiannaki
#     except AssertionError:
820 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GROUP_MAX_PARTICIPANT_NUMBER_REACHED)
821 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
822 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
823 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
824 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
825 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
826 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
827 5ce3ce4f Sofia Papagiannaki
828 5ce3ce4f Sofia Papagiannaki
829 73fbaec4 Sofia Papagiannaki
# @signed_terms_required
830 73fbaec4 Sofia Papagiannaki
# @login_required
831 73fbaec4 Sofia Papagiannaki
# @handle_membership
832 73fbaec4 Sofia Papagiannaki
# def disapprove_member(request, membership):
833 73fbaec4 Sofia Papagiannaki
#     try:
834 73fbaec4 Sofia Papagiannaki
#         membership.disapprove()
835 73fbaec4 Sofia Papagiannaki
#         realname = membership.person.realname
836 73fbaec4 Sofia Papagiannaki
#         msg = astakos_messages.MEMBER_REMOVED % locals()
837 73fbaec4 Sofia Papagiannaki
#         messages.success(request, msg)
838 73fbaec4 Sofia Papagiannaki
#     except BaseException, e:
839 73fbaec4 Sofia Papagiannaki
#         logger.exception(e)
840 73fbaec4 Sofia Papagiannaki
#         msg = _(astakos_messages.GENERIC_ERROR)
841 73fbaec4 Sofia Papagiannaki
#         messages.error(request, msg)
842 ffb1e7a8 Sofia Papagiannaki
843 5ce3ce4f Sofia Papagiannaki
844 73fbaec4 Sofia Papagiannaki
@require_http_methods(["GET"])
845 ae497612 Olga Brani
@require_http_methods(["POST", "GET"])
846 63836eda Kostas Papadimitriou
@valid_astakos_user_required
847 666c7490 Sofia Papagiannaki
def resource_usage(request):
848 52343ac8 Olga Brani
    def with_class(entry):
849 52343ac8 Olga Brani
        entry['load_class'] = 'red'
850 52343ac8 Olga Brani
        max_value = float(entry['maxValue'])
851 52343ac8 Olga Brani
        curr_value = float(entry['currValue'])
852 394c9834 Olga Brani
        entry['ratio_limited']= 0
853 639e0352 Olga Brani
        if max_value > 0 :
854 c0b26605 Sofia Papagiannaki
            entry['ratio'] = (curr_value / max_value) * 100
855 c0b26605 Sofia Papagiannaki
        else:
856 792c2f3b Olga Brani
            entry['ratio'] = 0
857 52343ac8 Olga Brani
        if entry['ratio'] < 66:
858 9a06d96f Olga Brani
            entry['load_class'] = 'yellow'
859 52343ac8 Olga Brani
        if entry['ratio'] < 33:
860 9a06d96f Olga Brani
            entry['load_class'] = 'green'
861 394c9834 Olga Brani
        if entry['ratio']<0:
862 394c9834 Olga Brani
            entry['ratio'] = 0
863 394c9834 Olga Brani
        if entry['ratio']>100:
864 394c9834 Olga Brani
            entry['ratio_limited'] = 100
865 394c9834 Olga Brani
        else:
866 394c9834 Olga Brani
            entry['ratio_limited'] = entry['ratio']
867 c630fee6 Kostas Papadimitriou
868 9a06d96f Olga Brani
        return entry
869 9a06d96f Olga Brani
870 52343ac8 Olga Brani
    def pluralize(entry):
871 9a06d96f Olga Brani
        entry['plural'] = engine.plural(entry.get('name'))
872 9a06d96f Olga Brani
        return entry
873 52343ac8 Olga Brani
874 666c7490 Sofia Papagiannaki
    result = callpoint.get_user_usage(request.user.id)
875 820b18e0 Sofia Papagiannaki
    if result.is_success:
876 820b18e0 Sofia Papagiannaki
        backenddata = map(with_class, result.data)
877 820b18e0 Sofia Papagiannaki
        data = map(pluralize, result.data)
878 9a06d96f Olga Brani
    else:
879 820b18e0 Sofia Papagiannaki
        data = None
880 820b18e0 Sofia Papagiannaki
        messages.error(request, result.reason)
881 172ce682 Sofia Papagiannaki
    resource_catalog = result.data
882 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
883 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result_report(result)
884 666c7490 Sofia Papagiannaki
    return render_response('im/resource_usage.html',
885 9a06d96f Olga Brani
                           data=data,
886 3cbd5e47 Olga Brani
                           context_instance=get_context(request),
887 c0b26605 Sofia Papagiannaki
                           resource_catalog=resource_catalog,
888 3cbd5e47 Olga Brani
                           result=result)
889 9a06d96f Olga Brani
890 1b866d9e Olga Brani
891 73fbaec4 Sofia Papagiannaki
# def group_create_list(request):
892 73fbaec4 Sofia Papagiannaki
#     form = PickResourceForm()
893 73fbaec4 Sofia Papagiannaki
#     return render_response(
894 73fbaec4 Sofia Papagiannaki
#         template='im/astakosgroup_create_list.html',
895 73fbaec4 Sofia Papagiannaki
#         context_instance=get_context(request),)
896 6e029beb Sofia Papagiannaki
897 5ce3ce4f Sofia Papagiannaki
898 f8f86e83 root
##@require_http_methods(["GET"])
899 f8f86e83 root
#@require_http_methods(["POST", "GET"])
900 f8f86e83 root
#@signed_terms_required
901 f8f86e83 root
#@login_required
902 f8f86e83 root
#def billing(request):
903 f8f86e83 root
#
904 f8f86e83 root
#    today = datetime.today()
905 f8f86e83 root
#    month_last_day = calendar.monthrange(today.year, today.month)[1]
906 f8f86e83 root
#    start = request.POST.get('datefrom', None)
907 f8f86e83 root
#    if start:
908 f8f86e83 root
#        today = datetime.fromtimestamp(int(start))
909 f8f86e83 root
#        month_last_day = calendar.monthrange(today.year, today.month)[1]
910 f8f86e83 root
#
911 f8f86e83 root
#    start = datetime(today.year, today.month, 1).strftime("%s")
912 f8f86e83 root
#    end = datetime(today.year, today.month, month_last_day).strftime("%s")
913 f8f86e83 root
#    r = request_billing.apply(args=('pgerakios@grnet.gr',
914 f8f86e83 root
#                                    int(start) * 1000,
915 f8f86e83 root
#                                    int(end) * 1000))
916 f8f86e83 root
#    data = {}
917 f8f86e83 root
#
918 f8f86e83 root
#    try:
919 f8f86e83 root
#        status, data = r.result
920 f8f86e83 root
#        data = _clear_billing_data(data)
921 f8f86e83 root
#        if status != 200:
922 f8f86e83 root
#            messages.error(request, _(astakos_messages.BILLING_ERROR) % status)
923 f8f86e83 root
#    except:
924 f8f86e83 root
#        messages.error(request, r.result)
925 f8f86e83 root
#
926 f8f86e83 root
#    return render_response(
927 f8f86e83 root
#        template='im/billing.html',
928 f8f86e83 root
#        context_instance=get_context(request),
929 f8f86e83 root
#        data=data,
930 f8f86e83 root
#        zerodate=datetime(month=1, year=1970, day=1),
931 f8f86e83 root
#        today=today,
932 f8f86e83 root
#        start=int(start),
933 f8f86e83 root
#        month_last_day=month_last_day)
934 9a06d96f Olga Brani
935 54213d7a Sofia Papagiannaki
936 f8f86e83 root
#def _clear_billing_data(data):
937 f8f86e83 root
#
938 f8f86e83 root
#    # remove addcredits entries
939 f8f86e83 root
#    def isnotcredit(e):
940 f8f86e83 root
#        return e['serviceName'] != "addcredits"
941 f8f86e83 root
#
942 f8f86e83 root
#    # separate services
943 f8f86e83 root
#    def servicefilter(service_name):
944 f8f86e83 root
#        service = service_name
945 f8f86e83 root
#
946 f8f86e83 root
#        def fltr(e):
947 f8f86e83 root
#            return e['serviceName'] == service
948 f8f86e83 root
#        return fltr
949 f8f86e83 root
#
950 f8f86e83 root
#    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
951 f8f86e83 root
#    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
952 f8f86e83 root
#    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
953 f8f86e83 root
#    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
954 f8f86e83 root
#
955 f8f86e83 root
#    return data
956 792c2f3b Olga Brani
957 792c2f3b Olga Brani
958 e1a80257 Sofia Papagiannaki
# #@require_http_methods(["GET"])
959 e1a80257 Sofia Papagiannaki
# @require_http_methods(["POST", "GET"])
960 e1a80257 Sofia Papagiannaki
# @signed_terms_required
961 e1a80257 Sofia Papagiannaki
# @login_required
962 e1a80257 Sofia Papagiannaki
# def timeline(request):
963 e1a80257 Sofia Papagiannaki
# #    data = {'entity':request.user.email}
964 e1a80257 Sofia Papagiannaki
#     timeline_body = ()
965 e1a80257 Sofia Papagiannaki
#     timeline_header = ()
966 e1a80257 Sofia Papagiannaki
# #    form = TimelineForm(data)
967 e1a80257 Sofia Papagiannaki
#     form = TimelineForm()
968 e1a80257 Sofia Papagiannaki
#     if request.method == 'POST':
969 e1a80257 Sofia Papagiannaki
#         data = request.POST
970 e1a80257 Sofia Papagiannaki
#         form = TimelineForm(data)
971 e1a80257 Sofia Papagiannaki
#         if form.is_valid():
972 e1a80257 Sofia Papagiannaki
#             data = form.cleaned_data
973 e1a80257 Sofia Papagiannaki
#             timeline_header = ('entity', 'resource',
974 e1a80257 Sofia Papagiannaki
#                                'event name', 'event date',
975 e1a80257 Sofia Papagiannaki
#                                'incremental cost', 'total cost')
976 e1a80257 Sofia Papagiannaki
#             timeline_body = timeline_charge(
977 e1a80257 Sofia Papagiannaki
#                 data['entity'], data['resource'],
978 e1a80257 Sofia Papagiannaki
#                 data['start_date'], data['end_date'],
979 e1a80257 Sofia Papagiannaki
#                 data['details'], data['operation'])
980 120b4498 Kostas Papadimitriou
#
981 e1a80257 Sofia Papagiannaki
#     return render_response(template='im/timeline.html',
982 e1a80257 Sofia Papagiannaki
#                            context_instance=get_context(request),
983 e1a80257 Sofia Papagiannaki
#                            form=form,
984 e1a80257 Sofia Papagiannaki
#                            timeline_header=timeline_header,
985 e1a80257 Sofia Papagiannaki
#                            timeline_body=timeline_body)
986 e1a80257 Sofia Papagiannaki
#     return data
987 5ebebb20 Olga Brani
988 792c2f3b Olga Brani
989 f432088a Kostas Papadimitriou
# TODO: action only on POST and user should confirm the removal
990 d2633501 Kostas Papadimitriou
@require_http_methods(["GET", "POST"])
991 d2633501 Kostas Papadimitriou
@login_required
992 d2633501 Kostas Papadimitriou
@signed_terms_required
993 d2633501 Kostas Papadimitriou
def remove_auth_provider(request, pk):
994 f432088a Kostas Papadimitriou
    try:
995 f432088a Kostas Papadimitriou
        provider = request.user.auth_providers.get(pk=pk)
996 f432088a Kostas Papadimitriou
    except AstakosUserAuthProvider.DoesNotExist:
997 f432088a Kostas Papadimitriou
        raise Http404
998 f432088a Kostas Papadimitriou
999 d2633501 Kostas Papadimitriou
    if provider.can_remove():
1000 d2633501 Kostas Papadimitriou
        provider.delete()
1001 d2633501 Kostas Papadimitriou
        return HttpResponseRedirect(reverse('edit_profile'))
1002 d2633501 Kostas Papadimitriou
    else:
1003 f432088a Kostas Papadimitriou
        raise PermissionDenied
1004 5ebebb20 Olga Brani
1005 792c2f3b Olga Brani
1006 5ebebb20 Olga Brani
def how_it_works(request):
1007 5ebebb20 Olga Brani
    return render_response(
1008 ccab6eb5 Sofia Papagiannaki
        'im/how_it_works.html',
1009 ccab6eb5 Sofia Papagiannaki
        context_instance=get_context(request))
1010 e1a80257 Sofia Papagiannaki
1011 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1012 172ce682 Sofia Papagiannaki
def _create_object(request, model=None, template_name=None,
1013 172ce682 Sofia Papagiannaki
        template_loader=template_loader, extra_context=None, post_save_redirect=None,
1014 172ce682 Sofia Papagiannaki
        login_required=False, context_processors=None, form_class=None):
1015 172ce682 Sofia Papagiannaki
    """
1016 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.create_object which displays a
1017 172ce682 Sofia Papagiannaki
    summary page before creating the object.
1018 172ce682 Sofia Papagiannaki
    """
1019 bfe23b13 Sofia Papagiannaki
    rollback = False
1020 172ce682 Sofia Papagiannaki
    response = None
1021 4e748491 Sofia Papagiannaki
1022 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1023 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1024 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1025 ccab6eb5 Sofia Papagiannaki
    try:
1026 120b4498 Kostas Papadimitriou
1027 172ce682 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1028 172ce682 Sofia Papagiannaki
        extra_context['edit'] = 0
1029 172ce682 Sofia Papagiannaki
        if request.method == 'POST':
1030 172ce682 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES)
1031 172ce682 Sofia Papagiannaki
            if form.is_valid():
1032 172ce682 Sofia Papagiannaki
                verify = request.GET.get('verify')
1033 172ce682 Sofia Papagiannaki
                edit = request.GET.get('edit')
1034 172ce682 Sofia Papagiannaki
                if verify == '1':
1035 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = False
1036 172ce682 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1037 172ce682 Sofia Papagiannaki
                elif edit == '1':
1038 172ce682 Sofia Papagiannaki
                    extra_context['show_form'] = True
1039 172ce682 Sofia Papagiannaki
                else:
1040 172ce682 Sofia Papagiannaki
                    new_object = form.save()
1041 120b4498 Kostas Papadimitriou
1042 172ce682 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was created successfully.") %\
1043 172ce682 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1044 172ce682 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1045 172ce682 Sofia Papagiannaki
                    response = redirect(post_save_redirect, new_object)
1046 172ce682 Sofia Papagiannaki
        else:
1047 172ce682 Sofia Papagiannaki
            form = form_class()
1048 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1049 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1050 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1051 bfe23b13 Sofia Papagiannaki
        rollback = True
1052 bfe23b13 Sofia Papagiannaki
    finally:
1053 bfe23b13 Sofia Papagiannaki
        if rollback:
1054 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1055 bfe23b13 Sofia Papagiannaki
        else:
1056 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1057 4e748491 Sofia Papagiannaki
1058 172ce682 Sofia Papagiannaki
        if response == None:
1059 172ce682 Sofia Papagiannaki
            # Create the template, context, response
1060 172ce682 Sofia Papagiannaki
            if not template_name:
1061 172ce682 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1062 172ce682 Sofia Papagiannaki
                     (model._meta.app_label, model._meta.object_name.lower())
1063 172ce682 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1064 172ce682 Sofia Papagiannaki
            c = RequestContext(request, {
1065 172ce682 Sofia Papagiannaki
                'form': form
1066 172ce682 Sofia Papagiannaki
            }, context_processors)
1067 172ce682 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1068 172ce682 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1069 172ce682 Sofia Papagiannaki
        return response
1070 172ce682 Sofia Papagiannaki
1071 4e748491 Sofia Papagiannaki
@transaction.commit_manually
1072 4e748491 Sofia Papagiannaki
def _update_object(request, model=None, object_id=None, slug=None,
1073 4e748491 Sofia Papagiannaki
        slug_field='slug', template_name=None, template_loader=template_loader,
1074 4e748491 Sofia Papagiannaki
        extra_context=None, post_save_redirect=None, login_required=False,
1075 4e748491 Sofia Papagiannaki
        context_processors=None, template_object_name='object',
1076 4e748491 Sofia Papagiannaki
        form_class=None):
1077 4e748491 Sofia Papagiannaki
    """
1078 4e748491 Sofia Papagiannaki
    Based of django.views.generic.create_update.update_object which displays a
1079 4e748491 Sofia Papagiannaki
    summary page before updating the object.
1080 4e748491 Sofia Papagiannaki
    """
1081 4e748491 Sofia Papagiannaki
    rollback = False
1082 4e748491 Sofia Papagiannaki
    response = None
1083 4e748491 Sofia Papagiannaki
1084 4e748491 Sofia Papagiannaki
    if extra_context is None: extra_context = {}
1085 4e748491 Sofia Papagiannaki
    if login_required and not request.user.is_authenticated():
1086 4e748491 Sofia Papagiannaki
        return redirect_to_login(request.path)
1087 120b4498 Kostas Papadimitriou
1088 4e748491 Sofia Papagiannaki
    try:
1089 4e748491 Sofia Papagiannaki
        model, form_class = get_model_and_form_class(model, form_class)
1090 4e748491 Sofia Papagiannaki
        obj = lookup_object(model, object_id, slug, slug_field)
1091 120b4498 Kostas Papadimitriou
1092 4e748491 Sofia Papagiannaki
        if request.method == 'POST':
1093 4e748491 Sofia Papagiannaki
            form = form_class(request.POST, request.FILES, instance=obj)
1094 4e748491 Sofia Papagiannaki
            if form.is_valid():
1095 4e748491 Sofia Papagiannaki
                verify = request.GET.get('verify')
1096 4e748491 Sofia Papagiannaki
                edit = request.GET.get('edit')
1097 4e748491 Sofia Papagiannaki
                if verify == '1':
1098 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = False
1099 4e748491 Sofia Papagiannaki
                    extra_context['form_data'] = form.cleaned_data
1100 4e748491 Sofia Papagiannaki
                elif edit == '1':
1101 4e748491 Sofia Papagiannaki
                    extra_context['show_form'] = True
1102 120b4498 Kostas Papadimitriou
                else:
1103 4e748491 Sofia Papagiannaki
                    obj = form.save()
1104 4e748491 Sofia Papagiannaki
                    msg = _("The %(verbose_name)s was updated successfully.") %\
1105 4e748491 Sofia Papagiannaki
                                {"verbose_name": model._meta.verbose_name}
1106 4e748491 Sofia Papagiannaki
                    messages.success(request, msg, fail_silently=True)
1107 4e748491 Sofia Papagiannaki
                    response = redirect(post_save_redirect, obj)
1108 4e748491 Sofia Papagiannaki
        else:
1109 4e748491 Sofia Papagiannaki
            form = form_class(instance=obj)
1110 4e748491 Sofia Papagiannaki
    except BaseException, e:
1111 4e748491 Sofia Papagiannaki
        logger.exception(e)
1112 4e748491 Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1113 4e748491 Sofia Papagiannaki
        rollback = True
1114 4e748491 Sofia Papagiannaki
    finally:
1115 4e748491 Sofia Papagiannaki
        if rollback:
1116 4e748491 Sofia Papagiannaki
            transaction.rollback()
1117 4e748491 Sofia Papagiannaki
        else:
1118 4e748491 Sofia Papagiannaki
            transaction.commit()
1119 4e748491 Sofia Papagiannaki
        if response == None:
1120 4e748491 Sofia Papagiannaki
            if not template_name:
1121 4e748491 Sofia Papagiannaki
                template_name = "%s/%s_form.html" %\
1122 4e748491 Sofia Papagiannaki
                    (model._meta.app_label, model._meta.object_name.lower())
1123 4e748491 Sofia Papagiannaki
            t = template_loader.get_template(template_name)
1124 4e748491 Sofia Papagiannaki
            c = RequestContext(request, {
1125 4e748491 Sofia Papagiannaki
                'form': form,
1126 4e748491 Sofia Papagiannaki
                template_object_name: obj,
1127 4e748491 Sofia Papagiannaki
            }, context_processors)
1128 4e748491 Sofia Papagiannaki
            apply_extra_context(extra_context, c)
1129 4e748491 Sofia Papagiannaki
            response = HttpResponse(t.render(c))
1130 4e748491 Sofia Papagiannaki
            populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
1131 4e748491 Sofia Papagiannaki
        return response
1132 4e748491 Sofia Papagiannaki
1133 172ce682 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1134 172ce682 Sofia Papagiannaki
@signed_terms_required
1135 172ce682 Sofia Papagiannaki
@login_required
1136 172ce682 Sofia Papagiannaki
def project_add(request):
1137 172ce682 Sofia Papagiannaki
    result = callpoint.list_resources()
1138 172ce682 Sofia Papagiannaki
    if not result.is_success:
1139 172ce682 Sofia Papagiannaki
        messages.error(
1140 172ce682 Sofia Papagiannaki
            request,
1141 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1142 172ce682 Sofia Papagiannaki
    )
1143 172ce682 Sofia Papagiannaki
    else:
1144 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1145 172ce682 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1146 172ce682 Sofia Papagiannaki
    return _create_object(request, template_name='im/projects/projectapplication_form.html',
1147 172ce682 Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1148 172ce682 Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1149 ccab6eb5 Sofia Papagiannaki
1150 e1a80257 Sofia Papagiannaki
1151 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1152 e1a80257 Sofia Papagiannaki
@signed_terms_required
1153 e1a80257 Sofia Papagiannaki
@login_required
1154 f3342849 Sofia Papagiannaki
def project_list(request):
1155 2a965273 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(owner=request.user)
1156 2a965273 Sofia Papagiannaki
    q |= ProjectApplication.objects.filter(
1157 2a965273 Sofia Papagiannaki
        project__in=request.user.projectmembership_set.values_list('project', flat=True)
1158 2a965273 Sofia Papagiannaki
    )
1159 ccab6eb5 Sofia Papagiannaki
    q = q.select_related()
1160 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1161 8327782d Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1162 8327782d Sofia Papagiannaki
    if sort_form.is_valid():
1163 8327782d Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1164 8327782d Sofia Papagiannaki
    q = q.order_by(sorting)
1165 120b4498 Kostas Papadimitriou
1166 e1a80257 Sofia Papagiannaki
    return object_list(
1167 e1a80257 Sofia Papagiannaki
        request,
1168 2a965273 Sofia Papagiannaki
        q,
1169 e1a80257 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1170 e1a80257 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1171 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1172 71a38edf Sofia Papagiannaki
        extra_context={
1173 71a38edf Sofia Papagiannaki
            'is_search':False,
1174 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1175 71a38edf Sofia Papagiannaki
        }
1176 71a38edf Sofia Papagiannaki
    )
1177 e1a80257 Sofia Papagiannaki
1178 f3342849 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1179 e1a80257 Sofia Papagiannaki
@signed_terms_required
1180 e1a80257 Sofia Papagiannaki
@login_required
1181 73fbaec4 Sofia Papagiannaki
def project_update(request, application_id):
1182 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1183 8327782d Sofia Papagiannaki
    if not result.is_success:
1184 8327782d Sofia Papagiannaki
        messages.error(
1185 8327782d Sofia Papagiannaki
            request,
1186 8327782d Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1187 8327782d Sofia Papagiannaki
    )
1188 172ce682 Sofia Papagiannaki
    else:
1189 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1190 5200e864 Sofia Papagiannaki
    extra_context = {'resource_catalog':resource_catalog, 'show_form':True}
1191 4e748491 Sofia Papagiannaki
    return _update_object(
1192 f3342849 Sofia Papagiannaki
        request,
1193 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1194 8327782d Sofia Papagiannaki
        template_name='im/projects/projectapplication_form.html',
1195 8327782d Sofia Papagiannaki
        extra_context=extra_context, post_save_redirect='/im/project/list/',
1196 8327782d Sofia Papagiannaki
        form_class=ProjectApplicationForm)
1197 17a2f450 Sofia Papagiannaki
1198 e1a80257 Sofia Papagiannaki
1199 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1200 e1a80257 Sofia Papagiannaki
@signed_terms_required
1201 e1a80257 Sofia Papagiannaki
@login_required
1202 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1203 73fbaec4 Sofia Papagiannaki
def project_detail(request, application_id):
1204 8327782d Sofia Papagiannaki
    result = callpoint.list_resources()
1205 172ce682 Sofia Papagiannaki
    if not result.is_success:
1206 172ce682 Sofia Papagiannaki
        messages.error(
1207 172ce682 Sofia Papagiannaki
            request,
1208 172ce682 Sofia Papagiannaki
            'Unable to retrieve system resources: %s' % result.reason
1209 172ce682 Sofia Papagiannaki
    )
1210 172ce682 Sofia Papagiannaki
    else:
1211 172ce682 Sofia Papagiannaki
        resource_catalog = result.data
1212 172ce682 Sofia Papagiannaki
#     resource_catalog = ResourcePresentation(RESOURCES_PRESENTATION_DATA)
1213 172ce682 Sofia Papagiannaki
#     resource_catalog.update_from_result(result)
1214 ccab6eb5 Sofia Papagiannaki
1215 bfe23b13 Sofia Papagiannaki
    addmembers_form = AddProjectMembersForm()
1216 ccab6eb5 Sofia Papagiannaki
    if request.method == 'POST':
1217 bfe23b13 Sofia Papagiannaki
        addmembers_form = AddProjectMembersForm(request.POST)
1218 ccab6eb5 Sofia Papagiannaki
        if addmembers_form.is_valid():
1219 ccab6eb5 Sofia Papagiannaki
            try:
1220 73fbaec4 Sofia Papagiannaki
                rollback = False
1221 73fbaec4 Sofia Papagiannaki
                map(lambda u: accept_membership(
1222 73fbaec4 Sofia Papagiannaki
                        application_id,
1223 73fbaec4 Sofia Papagiannaki
                        u,
1224 73fbaec4 Sofia Papagiannaki
                        request_user=request.user),
1225 73fbaec4 Sofia Papagiannaki
                    addmembers_form.valid_users)
1226 73fbaec4 Sofia Papagiannaki
            except (IOError, PermissionDenied), e:
1227 73fbaec4 Sofia Papagiannaki
                messages.error(request, e)
1228 bfe23b13 Sofia Papagiannaki
            except BaseException, e:
1229 73fbaec4 Sofia Papagiannaki
                rollback = True
1230 bfe23b13 Sofia Papagiannaki
                messages.error(request, e)
1231 73fbaec4 Sofia Papagiannaki
            finally:
1232 73fbaec4 Sofia Papagiannaki
                if rollback == True:
1233 73fbaec4 Sofia Papagiannaki
                    transaction.rollback()
1234 73fbaec4 Sofia Papagiannaki
                else:
1235 73fbaec4 Sofia Papagiannaki
                    transaction.commit()
1236 bfe23b13 Sofia Papagiannaki
            addmembers_form = AddProjectMembersForm()
1237 120b4498 Kostas Papadimitriou
1238 bfe23b13 Sofia Papagiannaki
    # validate sorting
1239 bfe23b13 Sofia Papagiannaki
    sorting = 'person__email'
1240 73fbaec4 Sofia Papagiannaki
    form = ProjectMembersSortForm(request.GET or request.POST)
1241 bfe23b13 Sofia Papagiannaki
    if form.is_valid():
1242 bfe23b13 Sofia Papagiannaki
        sorting = form.cleaned_data.get('sorting')
1243 ccab6eb5 Sofia Papagiannaki
1244 f3342849 Sofia Papagiannaki
    return object_detail(
1245 f3342849 Sofia Papagiannaki
        request,
1246 71a38edf Sofia Papagiannaki
        queryset=ProjectApplication.objects.select_related(),
1247 73fbaec4 Sofia Papagiannaki
        object_id=application_id,
1248 71a38edf Sofia Papagiannaki
        template_name='im/projects/project_detail.html',
1249 71a38edf Sofia Papagiannaki
        extra_context={
1250 8327782d Sofia Papagiannaki
            'resource_catalog':resource_catalog,
1251 bfe23b13 Sofia Papagiannaki
            'sorting':sorting,
1252 bfe23b13 Sofia Papagiannaki
            'addmembers_form':addmembers_form
1253 71a38edf Sofia Papagiannaki
        }
1254 f3342849 Sofia Papagiannaki
    )
1255 e1a80257 Sofia Papagiannaki
1256 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
1257 e1a80257 Sofia Papagiannaki
@signed_terms_required
1258 e1a80257 Sofia Papagiannaki
@login_required
1259 e1a80257 Sofia Papagiannaki
def project_search(request):
1260 6dadd24a Sofia Papagiannaki
    queryset = ProjectApplication.objects
1261 bfe23b13 Sofia Papagiannaki
    if request.method == 'GET':
1262 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm()
1263 6dadd24a Sofia Papagiannaki
        queryset = queryset.none()
1264 bfe23b13 Sofia Papagiannaki
    else:
1265 6dadd24a Sofia Papagiannaki
        form = ProjectSearchForm(request.POST)
1266 bfe23b13 Sofia Papagiannaki
        if form.is_valid():
1267 bfe23b13 Sofia Papagiannaki
            q = form.cleaned_data['q'].strip()
1268 6dadd24a Sofia Papagiannaki
            queryset = queryset.filter(~Q(project__last_approval_date__isnull=True))
1269 73fbaec4 Sofia Papagiannaki
            queryset = queryset.filter(name__contains=q)
1270 120b4498 Kostas Papadimitriou
    sorting = 'name'
1271 bfe23b13 Sofia Papagiannaki
    # validate sorting
1272 73fbaec4 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1273 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1274 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1275 bfe23b13 Sofia Papagiannaki
    queryset = queryset.order_by(sorting)
1276 bfe23b13 Sofia Papagiannaki
    return object_list(
1277 bfe23b13 Sofia Papagiannaki
        request,
1278 bfe23b13 Sofia Papagiannaki
        queryset,
1279 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1280 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1281 6dadd24a Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1282 bfe23b13 Sofia Papagiannaki
        extra_context=dict(
1283 bfe23b13 Sofia Papagiannaki
            form=form,
1284 bfe23b13 Sofia Papagiannaki
            is_search=True,
1285 bfe23b13 Sofia Papagiannaki
            sorting=sorting
1286 bfe23b13 Sofia Papagiannaki
        )
1287 bfe23b13 Sofia Papagiannaki
    )
1288 bfe23b13 Sofia Papagiannaki
1289 e1a80257 Sofia Papagiannaki
1290 e1a80257 Sofia Papagiannaki
@require_http_methods(["GET"])
1291 e1a80257 Sofia Papagiannaki
@signed_terms_required
1292 e1a80257 Sofia Papagiannaki
@login_required
1293 e1a80257 Sofia Papagiannaki
def project_all(request):
1294 73fbaec4 Sofia Papagiannaki
    q = ProjectApplication.objects.filter(
1295 73fbaec4 Sofia Papagiannaki
        ~Q(project__last_approval_date__isnull=True))
1296 bfe23b13 Sofia Papagiannaki
    q = q.select_related()
1297 73fbaec4 Sofia Papagiannaki
    sorting = 'name'
1298 bfe23b13 Sofia Papagiannaki
    sort_form = ProjectSortForm(request.GET)
1299 bfe23b13 Sofia Papagiannaki
    if sort_form.is_valid():
1300 bfe23b13 Sofia Papagiannaki
        sorting = sort_form.cleaned_data.get('sorting')
1301 bfe23b13 Sofia Papagiannaki
    q = q.order_by(sorting)
1302 120b4498 Kostas Papadimitriou
1303 bfe23b13 Sofia Papagiannaki
    return object_list(
1304 bfe23b13 Sofia Papagiannaki
        request,
1305 bfe23b13 Sofia Papagiannaki
        q,
1306 bfe23b13 Sofia Papagiannaki
        paginate_by=PAGINATE_BY_ALL,
1307 bfe23b13 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
1308 bfe23b13 Sofia Papagiannaki
        template_name='im/projects/project_list.html',
1309 bfe23b13 Sofia Papagiannaki
        extra_context={
1310 6dadd24a Sofia Papagiannaki
            'form':ProjectSearchForm(),
1311 bfe23b13 Sofia Papagiannaki
            'is_search':True,
1312 bfe23b13 Sofia Papagiannaki
            'sorting':sorting
1313 bfe23b13 Sofia Papagiannaki
        }
1314 bfe23b13 Sofia Papagiannaki
    )
1315 e1a80257 Sofia Papagiannaki
1316 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1317 e1a80257 Sofia Papagiannaki
@signed_terms_required
1318 e1a80257 Sofia Papagiannaki
@login_required
1319 bfe23b13 Sofia Papagiannaki
@transaction.commit_manually
1320 73fbaec4 Sofia Papagiannaki
def project_join(request, application_id):
1321 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1322 73fbaec4 Sofia Papagiannaki
    if not next:
1323 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1324 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1325 73fbaec4 Sofia Papagiannaki
1326 bfe23b13 Sofia Papagiannaki
    rollback = False
1327 bfe23b13 Sofia Papagiannaki
    try:
1328 73fbaec4 Sofia Papagiannaki
        join_project(application_id, request.user)
1329 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1330 bfe23b13 Sofia Papagiannaki
        messages.error(request, e)
1331 b8f05f8d Sofia Papagiannaki
    except BaseException, e:
1332 b8f05f8d Sofia Papagiannaki
        logger.exception(e)
1333 b8f05f8d Sofia Papagiannaki
        messages.error(request, _(astakos_messages.GENERIC_ERROR))
1334 bfe23b13 Sofia Papagiannaki
        rollback = True
1335 bfe23b13 Sofia Papagiannaki
    else:
1336 bfe23b13 Sofia Papagiannaki
        return project_detail(request, id)
1337 bfe23b13 Sofia Papagiannaki
    finally:
1338 bfe23b13 Sofia Papagiannaki
        if rollback:
1339 bfe23b13 Sofia Papagiannaki
            transaction.rollback()
1340 bfe23b13 Sofia Papagiannaki
        else:
1341 bfe23b13 Sofia Papagiannaki
            transaction.commit()
1342 bfe23b13 Sofia Papagiannaki
1343 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1344 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1345 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1346 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1347 bfe23b13 Sofia Papagiannaki
1348 73fbaec4 Sofia Papagiannaki
@require_http_methods(["POST"])
1349 e1a80257 Sofia Papagiannaki
@signed_terms_required
1350 e1a80257 Sofia Papagiannaki
@login_required
1351 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1352 73fbaec4 Sofia Papagiannaki
def project_leave(request, application_id):
1353 73fbaec4 Sofia Papagiannaki
    next = request.POST.get('next')
1354 73fbaec4 Sofia Papagiannaki
    if not next:
1355 73fbaec4 Sofia Papagiannaki
        return HttpResponseBadRequest(
1356 73fbaec4 Sofia Papagiannaki
            _(astakos_messages.MISSING_NEXT_PARAMETER))
1357 e1a80257 Sofia Papagiannaki
1358 73fbaec4 Sofia Papagiannaki
    rollback = False
1359 73fbaec4 Sofia Papagiannaki
    try:
1360 73fbaec4 Sofia Papagiannaki
        leave_project(application_id, request.user)
1361 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1362 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1363 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1364 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1365 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1366 73fbaec4 Sofia Papagiannaki
        rollback = True
1367 73fbaec4 Sofia Papagiannaki
    finally:
1368 73fbaec4 Sofia Papagiannaki
        if rollback:
1369 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1370 73fbaec4 Sofia Papagiannaki
        else:
1371 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1372 120b4498 Kostas Papadimitriou
1373 73fbaec4 Sofia Papagiannaki
    next = restrict_next(
1374 73fbaec4 Sofia Papagiannaki
        request.POST.get('next'),
1375 73fbaec4 Sofia Papagiannaki
        domain=COOKIE_DOMAIN)
1376 73fbaec4 Sofia Papagiannaki
    return redirect(next)
1377 bfe23b13 Sofia Papagiannaki
1378 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1379 e1a80257 Sofia Papagiannaki
@signed_terms_required
1380 e1a80257 Sofia Papagiannaki
@login_required
1381 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1382 73fbaec4 Sofia Papagiannaki
def project_approve_member(request, application_id, user_id):
1383 73fbaec4 Sofia Papagiannaki
    rollback = False
1384 73fbaec4 Sofia Papagiannaki
    try:
1385 73fbaec4 Sofia Papagiannaki
        m = accept_membership(application_id, user_id, request.user)
1386 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1387 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1388 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1389 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1390 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1391 73fbaec4 Sofia Papagiannaki
        rollback = True
1392 73fbaec4 Sofia Papagiannaki
    else:
1393 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1394 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_JOINED_PROJECT) % locals()
1395 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1396 73fbaec4 Sofia Papagiannaki
    finally:
1397 73fbaec4 Sofia Papagiannaki
        if rollback:
1398 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1399 73fbaec4 Sofia Papagiannaki
        else:
1400 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1401 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1402 bfe23b13 Sofia Papagiannaki
1403 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1404 bfe23b13 Sofia Papagiannaki
@signed_terms_required
1405 bfe23b13 Sofia Papagiannaki
@login_required
1406 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1407 73fbaec4 Sofia Papagiannaki
def project_remove_member(request, application_id, user_id):
1408 73fbaec4 Sofia Papagiannaki
    rollback = False
1409 73fbaec4 Sofia Papagiannaki
    try:
1410 73fbaec4 Sofia Papagiannaki
        m = remove_membership(application_id, user_id, request.user)
1411 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1412 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1413 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1414 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1415 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1416 73fbaec4 Sofia Papagiannaki
        rollback = True
1417 73fbaec4 Sofia Papagiannaki
    else:
1418 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1419 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1420 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1421 73fbaec4 Sofia Papagiannaki
    finally:
1422 73fbaec4 Sofia Papagiannaki
        if rollback:
1423 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1424 73fbaec4 Sofia Papagiannaki
        else:
1425 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1426 73fbaec4 Sofia Papagiannaki
    return project_detail(request, application_id)
1427 bfe23b13 Sofia Papagiannaki
1428 bfe23b13 Sofia Papagiannaki
@require_http_methods(["GET"])
1429 e1a80257 Sofia Papagiannaki
@signed_terms_required
1430 e1a80257 Sofia Papagiannaki
@login_required
1431 73fbaec4 Sofia Papagiannaki
@transaction.commit_manually
1432 73fbaec4 Sofia Papagiannaki
def project_reject_member(request, application_id, user_id):
1433 73fbaec4 Sofia Papagiannaki
    rollback = False
1434 73fbaec4 Sofia Papagiannaki
    try:
1435 73fbaec4 Sofia Papagiannaki
        m = reject_membership(application_id, user_id, request.user)
1436 73fbaec4 Sofia Papagiannaki
    except (IOError, PermissionDenied), e:
1437 73fbaec4 Sofia Papagiannaki
        messages.error(request, e)
1438 73fbaec4 Sofia Papagiannaki
    except BaseException, e:
1439 73fbaec4 Sofia Papagiannaki
        logger.exception(e)
1440 73fbaec4 Sofia Papagiannaki
        messages.error(_(astakos_messages.GENERIC_ERRO))
1441 73fbaec4 Sofia Papagiannaki
        rollback = True
1442 73fbaec4 Sofia Papagiannaki
    else:
1443 73fbaec4 Sofia Papagiannaki
        realname = m.person.realname
1444 73fbaec4 Sofia Papagiannaki
        msg = _(astakos_messages.USER_LEFT_PROJECT) % locals()
1445 73fbaec4 Sofia Papagiannaki
        messages.success(request, msg)
1446 73fbaec4 Sofia Papagiannaki
    finally:
1447 73fbaec4 Sofia Papagiannaki
        if rollback:
1448 73fbaec4 Sofia Papagiannaki
            transaction.rollback()
1449 73fbaec4 Sofia Papagiannaki
        else:
1450 73fbaec4 Sofia Papagiannaki
            transaction.commit()
1451 47b77c8b Sofia Papagiannaki
    return project_detail(request, application_id)
1452 c630fee6 Kostas Papadimitriou