Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (46.7 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 f46c95c4 Sofia Papagiannaki
import inflect
37 f46c95c4 Sofia Papagiannaki
38 f46c95c4 Sofia Papagiannaki
engine = inflect.engine()
39 64cd4730 Antony Chazapis
40 0905ccd2 Sofia Papagiannaki
from urllib import quote
41 63ecdd20 Sofia Papagiannaki
from functools import wraps
42 aab4d540 Sofia Papagiannaki
from datetime import datetime, timedelta
43 789bcaf9 Sofia Papagiannaki
from collections import defaultdict
44 64cd4730 Antony Chazapis
45 890b0eaf Sofia Papagiannaki
from django.contrib import messages
46 01ac12d5 Sofia Papagiannaki
from django.contrib.auth.decorators import login_required
47 270dd48d Sofia Papagiannaki
from django.contrib.auth.views import password_change
48 01ac12d5 Sofia Papagiannaki
from django.core.urlresolvers import reverse
49 01ac12d5 Sofia Papagiannaki
from django.db import transaction
50 d1757ca7 Sofia Papagiannaki
from django.db.models import Q
51 01ac12d5 Sofia Papagiannaki
from django.db.utils import IntegrityError
52 01ac12d5 Sofia Papagiannaki
from django.forms.fields import URLField
53 f46c95c4 Sofia Papagiannaki
from django.http import (HttpResponse, HttpResponseBadRequest,
54 f46c95c4 Sofia Papagiannaki
                         HttpResponseForbidden, HttpResponseRedirect,
55 f46c95c4 Sofia Papagiannaki
                         HttpResponseBadRequest, Http404)
56 01ac12d5 Sofia Papagiannaki
from django.shortcuts import redirect
57 661c4479 Sofia Papagiannaki
from django.template import RequestContext, loader as template_loader
58 01ac12d5 Sofia Papagiannaki
from django.utils.http import urlencode
59 01ac12d5 Sofia Papagiannaki
from django.utils.translation import ugettext as _
60 aab4d540 Sofia Papagiannaki
from django.views.generic.create_update import (create_object, delete_object,
61 de4ed385 Sofia Papagiannaki
                                                get_model_and_form_class)
62 aab4d540 Sofia Papagiannaki
from django.views.generic.list_detail import object_list, object_detail
63 51c57c9c Sofia Papagiannaki
from django.http import HttpResponseBadRequest
64 661c4479 Sofia Papagiannaki
from django.core.xheaders import populate_xheaders
65 64cd4730 Antony Chazapis
66 f46c95c4 Sofia Papagiannaki
from astakos.im.models import (AstakosUser, ApprovalTerms, AstakosGroup,
67 f46c95c4 Sofia Papagiannaki
                               Resource, EmailChange, GroupKind, Membership,
68 f46c95c4 Sofia Papagiannaki
                               AstakosGroupQuota, RESOURCE_SEPARATOR)
69 f46c95c4 Sofia Papagiannaki
from django.views.decorators.http import require_http_methods
70 f46c95c4 Sofia Papagiannaki
71 4e30244e Sofia Papagiannaki
from astakos.im.activation_backends import get_backend, SimpleBackend
72 1662ac2d Sofia Papagiannaki
from astakos.im.util import get_context, prepare_response, set_cookie, get_query
73 51c57c9c Sofia Papagiannaki
from astakos.im.forms import (LoginForm, InvitationForm, ProfileForm,
74 51c57c9c Sofia Papagiannaki
                              FeedbackForm, SignApprovalTermsForm,
75 51c57c9c Sofia Papagiannaki
                              ExtendedPasswordChangeForm, EmailChangeForm,
76 51c57c9c Sofia Papagiannaki
                              AstakosGroupCreationForm, AstakosGroupSearchForm,
77 789bcaf9 Sofia Papagiannaki
                              AstakosGroupUpdateForm, AddGroupMembersForm,
78 3bb604eb Sofia Papagiannaki
                              AstakosGroupSortForm, MembersSortForm,
79 9eafaa32 Sofia Papagiannaki
                              TimelineForm, PickResourceForm)
80 aab4d540 Sofia Papagiannaki
from astakos.im.functions import (send_feedback, SendMailError,
81 f46c95c4 Sofia Papagiannaki
                                  logout as auth_logout,
82 51c57c9c Sofia Papagiannaki
                                  activate as activate_func,
83 51c57c9c Sofia Papagiannaki
                                  switch_account_to_shibboleth,
84 f46c95c4 Sofia Papagiannaki
                                  send_group_creation_notification,
85 51c57c9c Sofia Papagiannaki
                                  SendNotificationError)
86 2925e285 root
from astakos.im.endpoints.quotaholder import timeline_charge
87 f46c95c4 Sofia Papagiannaki
from astakos.im.settings import (COOKIE_NAME, COOKIE_DOMAIN, LOGOUT_NEXT,
88 f46c95c4 Sofia Papagiannaki
                                 LOGGING_LEVEL, PAGINATE_BY)
89 6e029beb Sofia Papagiannaki
from astakos.im.tasks import request_billing
90 f46c95c4 Sofia Papagiannaki
from astakos.im.api.callpoint import AstakosDjangoDBCallpoint
91 64cd4730 Antony Chazapis
92 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
93 e015e9e6 Sofia Papagiannaki
94 5ce3ce4f Sofia Papagiannaki
95 789bcaf9 Sofia Papagiannaki
DB_REPLACE_GROUP_SCHEME = """REPLACE(REPLACE("auth_group".name, 'http://', ''),
96 789bcaf9 Sofia Papagiannaki
                                     'https://', '')"""
97 789bcaf9 Sofia Papagiannaki
98 f46c95c4 Sofia Papagiannaki
callpoint = AstakosDjangoDBCallpoint()
99 f46c95c4 Sofia Papagiannaki
100 51c57c9c Sofia Papagiannaki
def render_response(template, tab=None, status=200, reset_cookie=False,
101 51c57c9c Sofia Papagiannaki
                    context_instance=None, **kwargs):
102 890b0eaf Sofia Papagiannaki
    """
103 890b0eaf Sofia Papagiannaki
    Calls ``django.template.loader.render_to_string`` with an additional ``tab``
104 890b0eaf Sofia Papagiannaki
    keyword argument and returns an ``django.http.HttpResponse`` with the
105 890b0eaf Sofia Papagiannaki
    specified ``status``.
106 890b0eaf Sofia Papagiannaki
    """
107 64cd4730 Antony Chazapis
    if tab is None:
108 881c856c Sofia Papagiannaki
        tab = template.partition('_')[0].partition('.html')[0]
109 64cd4730 Antony Chazapis
    kwargs.setdefault('tab', tab)
110 661c4479 Sofia Papagiannaki
    html = template_loader.render_to_string(
111 5ce3ce4f Sofia Papagiannaki
        template, kwargs, context_instance=context_instance)
112 c301698f Sofia Papagiannaki
    response = HttpResponse(html, status=status)
113 c301698f Sofia Papagiannaki
    if reset_cookie:
114 c301698f Sofia Papagiannaki
        set_cookie(response, context_instance['request'].user)
115 c301698f Sofia Papagiannaki
    return response
116 64cd4730 Antony Chazapis
117 63ecdd20 Sofia Papagiannaki
118 63ecdd20 Sofia Papagiannaki
def requires_anonymous(func):
119 63ecdd20 Sofia Papagiannaki
    """
120 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is not Anonymous and in that case
121 7482228b Sofia Papagiannaki
    redirects to `logout`.
122 63ecdd20 Sofia Papagiannaki
    """
123 63ecdd20 Sofia Papagiannaki
    @wraps(func)
124 63ecdd20 Sofia Papagiannaki
    def wrapper(request, *args):
125 63ecdd20 Sofia Papagiannaki
        if not request.user.is_anonymous():
126 63ecdd20 Sofia Papagiannaki
            next = urlencode({'next': request.build_absolute_uri()})
127 270dd48d Sofia Papagiannaki
            logout_uri = reverse(logout) + '?' + next
128 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(logout_uri)
129 63ecdd20 Sofia Papagiannaki
        return func(request, *args)
130 63ecdd20 Sofia Papagiannaki
    return wrapper
131 63ecdd20 Sofia Papagiannaki
132 5ce3ce4f Sofia Papagiannaki
133 270dd48d Sofia Papagiannaki
def signed_terms_required(func):
134 270dd48d Sofia Papagiannaki
    """
135 270dd48d Sofia Papagiannaki
    Decorator checkes whether the request.user is Anonymous and in that case
136 270dd48d Sofia Papagiannaki
    redirects to `logout`.
137 270dd48d Sofia Papagiannaki
    """
138 270dd48d Sofia Papagiannaki
    @wraps(func)
139 270dd48d Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
140 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
141 270dd48d Sofia Papagiannaki
            params = urlencode({'next': request.build_absolute_uri(),
142 5ce3ce4f Sofia Papagiannaki
                                'show_form': ''})
143 270dd48d Sofia Papagiannaki
            terms_uri = reverse('latest_terms') + '?' + params
144 270dd48d Sofia Papagiannaki
            return HttpResponseRedirect(terms_uri)
145 270dd48d Sofia Papagiannaki
        return func(request, *args, **kwargs)
146 270dd48d Sofia Papagiannaki
    return wrapper
147 270dd48d Sofia Papagiannaki
148 5ce3ce4f Sofia Papagiannaki
149 270dd48d Sofia Papagiannaki
@signed_terms_required
150 aab4d540 Sofia Papagiannaki
def index(request, login_template_name='im/login.html', extra_context=None):
151 890b0eaf Sofia Papagiannaki
    """
152 dcf55476 Sofia Papagiannaki
    If there is logged on user renders the profile page otherwise renders login page.
153 176023aa Kostas Papadimitriou

154 890b0eaf Sofia Papagiannaki
    **Arguments**
155 176023aa Kostas Papadimitriou

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

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

164 890b0eaf Sofia Papagiannaki
    ``extra_context``
165 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
166 176023aa Kostas Papadimitriou

167 890b0eaf Sofia Papagiannaki
    **Template:**
168 176023aa Kostas Papadimitriou

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

171 890b0eaf Sofia Papagiannaki
    """
172 dcf55476 Sofia Papagiannaki
    template_name = login_template_name
173 dcf55476 Sofia Papagiannaki
    if request.user.is_authenticated():
174 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('edit_profile'))
175 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
176 5ce3ce4f Sofia Papagiannaki
                           login_form=LoginForm(request=request),
177 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
178 5ce3ce4f Sofia Papagiannaki
179 64cd4730 Antony Chazapis
180 890b0eaf Sofia Papagiannaki
@login_required
181 270dd48d Sofia Papagiannaki
@signed_terms_required
182 890b0eaf Sofia Papagiannaki
@transaction.commit_manually
183 aab4d540 Sofia Papagiannaki
def invite(request, template_name='im/invitations.html', extra_context=None):
184 890b0eaf Sofia Papagiannaki
    """
185 890b0eaf Sofia Papagiannaki
    Allows a user to invite somebody else.
186 176023aa Kostas Papadimitriou

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

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

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

196 890b0eaf Sofia Papagiannaki
    **Arguments**
197 176023aa Kostas Papadimitriou

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

202 890b0eaf Sofia Papagiannaki
    ``extra_context``
203 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
204 176023aa Kostas Papadimitriou

205 890b0eaf Sofia Papagiannaki
    **Template:**
206 176023aa Kostas Papadimitriou

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

209 890b0eaf Sofia Papagiannaki
    **Settings:**
210 176023aa Kostas Papadimitriou

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

213 890b0eaf Sofia Papagiannaki
    * LOGIN_URL: login uri
214 2cbaacd5 Sofia Papagiannaki
    * ASTAKOS_DEFAULT_CONTACT_EMAIL: service support email
215 890b0eaf Sofia Papagiannaki
    """
216 64cd4730 Antony Chazapis
    status = None
217 64cd4730 Antony Chazapis
    message = None
218 8f5a3a06 Sofia Papagiannaki
    form = InvitationForm()
219 5ce3ce4f Sofia Papagiannaki
220 18ffbee1 Sofia Papagiannaki
    inviter = request.user
221 64cd4730 Antony Chazapis
    if request.method == 'POST':
222 8f5a3a06 Sofia Papagiannaki
        form = InvitationForm(request.POST)
223 64cd4730 Antony Chazapis
        if inviter.invitations > 0:
224 8f5a3a06 Sofia Papagiannaki
            if form.is_valid():
225 8f5a3a06 Sofia Papagiannaki
                try:
226 f46c95c4 Sofia Papagiannaki
                    email = form.cleaned_data.get('username')
227 f46c95c4 Sofia Papagiannaki
                    realname = form.cleaned_data.get('realname')
228 f46c95c4 Sofia Papagiannaki
                    inviter.invite(email, realname)
229 f46c95c4 Sofia Papagiannaki
                    message = _('Invitation sent to %s' % email)
230 24406ae3 Sofia Papagiannaki
                    messages.success(request, message)
231 8f5a3a06 Sofia Papagiannaki
                except SendMailError, e:
232 8f5a3a06 Sofia Papagiannaki
                    message = e.message
233 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
234 8f5a3a06 Sofia Papagiannaki
                    transaction.rollback()
235 18ffbee1 Sofia Papagiannaki
                except BaseException, e:
236 18ffbee1 Sofia Papagiannaki
                    message = _('Something went wrong.')
237 24406ae3 Sofia Papagiannaki
                    messages.error(request, message)
238 18ffbee1 Sofia Papagiannaki
                    logger.exception(e)
239 18ffbee1 Sofia Papagiannaki
                    transaction.rollback()
240 18ffbee1 Sofia Papagiannaki
                else:
241 18ffbee1 Sofia Papagiannaki
                    transaction.commit()
242 64cd4730 Antony Chazapis
        else:
243 64cd4730 Antony Chazapis
            message = _('No invitations left')
244 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
245 176023aa Kostas Papadimitriou
246 a196eb7e Sofia Papagiannaki
    sent = [{'email': inv.username,
247 d6ae71a2 root
             'realname': inv.realname,
248 d6ae71a2 root
             'is_consumed': inv.is_consumed}
249 5ce3ce4f Sofia Papagiannaki
            for inv in request.user.invitations_sent.all()]
250 77e2ad52 root
    kwargs = {'inviter': inviter,
251 5ce3ce4f Sofia Papagiannaki
              'sent': sent}
252 0905ccd2 Sofia Papagiannaki
    context = get_context(request, extra_context, **kwargs)
253 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
254 5ce3ce4f Sofia Papagiannaki
                           invitation_form=form,
255 5ce3ce4f Sofia Papagiannaki
                           context_instance=context)
256 5ce3ce4f Sofia Papagiannaki
257 64cd4730 Antony Chazapis
258 890b0eaf Sofia Papagiannaki
@login_required
259 270dd48d Sofia Papagiannaki
@signed_terms_required
260 aab4d540 Sofia Papagiannaki
def edit_profile(request, template_name='im/profile.html', extra_context=None):
261 890b0eaf Sofia Papagiannaki
    """
262 890b0eaf Sofia Papagiannaki
    Allows a user to edit his/her profile.
263 176023aa Kostas Papadimitriou

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

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

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

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

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

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

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

283 92defad4 Sofia Papagiannaki
    **Settings:**
284 176023aa Kostas Papadimitriou

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

287 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
288 890b0eaf Sofia Papagiannaki
    """
289 aab4d540 Sofia Papagiannaki
    extra_context = extra_context or {}
290 15efc749 Sofia Papagiannaki
    form = ProfileForm(instance=request.user)
291 15efc749 Sofia Papagiannaki
    extra_context['next'] = request.GET.get('next')
292 c301698f Sofia Papagiannaki
    reset_cookie = False
293 64cd4730 Antony Chazapis
    if request.method == 'POST':
294 15efc749 Sofia Papagiannaki
        form = ProfileForm(request.POST, instance=request.user)
295 890b0eaf Sofia Papagiannaki
        if form.is_valid():
296 64cd4730 Antony Chazapis
            try:
297 c301698f Sofia Papagiannaki
                prev_token = request.user.auth_token
298 c301698f Sofia Papagiannaki
                user = form.save()
299 c301698f Sofia Papagiannaki
                reset_cookie = user.auth_token != prev_token
300 c301698f Sofia Papagiannaki
                form = ProfileForm(instance=user)
301 1a3675a0 Sofia Papagiannaki
                next = request.POST.get('next')
302 1a3675a0 Sofia Papagiannaki
                if next:
303 1a3675a0 Sofia Papagiannaki
                    return redirect(next)
304 890b0eaf Sofia Papagiannaki
                msg = _('Profile has been updated successfully')
305 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
306 890b0eaf Sofia Papagiannaki
            except ValueError, ve:
307 24406ae3 Sofia Papagiannaki
                messages.success(request, ve)
308 23447441 Sofia Papagiannaki
    elif request.method == "GET":
309 fff4343a Sofia Papagiannaki
        if not request.user.is_verified:
310 fff4343a Sofia Papagiannaki
            request.user.is_verified = True
311 fff4343a Sofia Papagiannaki
            request.user.save()
312 0905ccd2 Sofia Papagiannaki
    return render_response(template_name,
313 5ce3ce4f Sofia Papagiannaki
                           reset_cookie=reset_cookie,
314 5ce3ce4f Sofia Papagiannaki
                           profile_form=form,
315 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request,
316 5ce3ce4f Sofia Papagiannaki
                                                        extra_context))
317 5ce3ce4f Sofia Papagiannaki
318 64cd4730 Antony Chazapis
319 10ed0073 Sofia Papagiannaki
@transaction.commit_manually
320 aab4d540 Sofia Papagiannaki
def signup(request, template_name='im/signup.html', on_success='im/signup_complete.html', extra_context=None, backend=None):
321 890b0eaf Sofia Papagiannaki
    """
322 890b0eaf Sofia Papagiannaki
    Allows a user to create a local account.
323 176023aa Kostas Papadimitriou

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

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

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

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

337 890b0eaf Sofia Papagiannaki
    **Arguments**
338 5ce3ce4f Sofia Papagiannaki

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

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

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

350 890b0eaf Sofia Papagiannaki
    **Template:**
351 5ce3ce4f Sofia Papagiannaki

352 8f5a3a06 Sofia Papagiannaki
    im/signup.html or ``template_name`` keyword argument.
353 5ce3ce4f Sofia Papagiannaki
    im/signup_complete.html or ``on_success`` keyword argument.
354 890b0eaf Sofia Papagiannaki
    """
355 0d02a287 Sofia Papagiannaki
    if request.user.is_authenticated():
356 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('edit_profile'))
357 5ce3ce4f Sofia Papagiannaki
358 0a569195 Sofia Papagiannaki
    provider = get_query(request).get('provider', 'local')
359 890b0eaf Sofia Papagiannaki
    try:
360 18ffbee1 Sofia Papagiannaki
        if not backend:
361 18ffbee1 Sofia Papagiannaki
            backend = get_backend(request)
362 8f5a3a06 Sofia Papagiannaki
        form = backend.get_signup_form(provider)
363 0a569195 Sofia Papagiannaki
    except Exception, e:
364 4e30244e Sofia Papagiannaki
        form = SimpleBackend(request).get_signup_form(provider)
365 24406ae3 Sofia Papagiannaki
        messages.error(request, e)
366 8f5a3a06 Sofia Papagiannaki
    if request.method == 'POST':
367 8f5a3a06 Sofia Papagiannaki
        if form.is_valid():
368 18ffbee1 Sofia Papagiannaki
            user = form.save(commit=False)
369 8f5a3a06 Sofia Papagiannaki
            try:
370 8f5a3a06 Sofia Papagiannaki
                result = backend.handle_activation(user)
371 8f5a3a06 Sofia Papagiannaki
                status = messages.SUCCESS
372 18ffbee1 Sofia Papagiannaki
                message = result.message
373 18ffbee1 Sofia Papagiannaki
                user.save()
374 ca828a10 Sofia Papagiannaki
                if 'additional_email' in form.cleaned_data:
375 ca828a10 Sofia Papagiannaki
                    additional_email = form.cleaned_data['additional_email']
376 ca828a10 Sofia Papagiannaki
                    if additional_email != user.email:
377 ca828a10 Sofia Papagiannaki
                        user.additionalmail_set.create(email=additional_email)
378 5ce3ce4f Sofia Papagiannaki
                        msg = 'Additional email: %s saved for user %s.' % (
379 5ce3ce4f Sofia Papagiannaki
                            additional_email, user.email)
380 aab4d540 Sofia Papagiannaki
                        logger.log(LOGGING_LEVEL, msg)
381 8f5a3a06 Sofia Papagiannaki
                if user and user.is_active:
382 8f5a3a06 Sofia Papagiannaki
                    next = request.POST.get('next', '')
383 c3f6cdf1 root
                    transaction.commit()
384 8f5a3a06 Sofia Papagiannaki
                    return prepare_response(request, user, next=next)
385 8f5a3a06 Sofia Papagiannaki
                messages.add_message(request, status, message)
386 c3f6cdf1 root
                transaction.commit()
387 8f5a3a06 Sofia Papagiannaki
                return render_response(on_success,
388 8f5a3a06 Sofia Papagiannaki
                                       context_instance=get_context(request, extra_context))
389 18ffbee1 Sofia Papagiannaki
            except SendMailError, e:
390 18ffbee1 Sofia Papagiannaki
                message = e.message
391 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
392 10ed0073 Sofia Papagiannaki
                transaction.rollback()
393 18ffbee1 Sofia Papagiannaki
            except BaseException, e:
394 18ffbee1 Sofia Papagiannaki
                message = _('Something went wrong.')
395 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
396 0a569195 Sofia Papagiannaki
                logger.exception(e)
397 10ed0073 Sofia Papagiannaki
                transaction.rollback()
398 8f5a3a06 Sofia Papagiannaki
    return render_response(template_name,
399 5ce3ce4f Sofia Papagiannaki
                           signup_form=form,
400 5ce3ce4f Sofia Papagiannaki
                           provider=provider,
401 890b0eaf Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
402 64cd4730 Antony Chazapis
403 5ce3ce4f Sofia Papagiannaki
404 890b0eaf Sofia Papagiannaki
@login_required
405 270dd48d Sofia Papagiannaki
@signed_terms_required
406 aab4d540 Sofia Papagiannaki
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context=None):
407 890b0eaf Sofia Papagiannaki
    """
408 890b0eaf Sofia Papagiannaki
    Allows a user to send feedback.
409 176023aa Kostas Papadimitriou

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

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

415 890b0eaf Sofia Papagiannaki
    **Arguments**
416 176023aa Kostas Papadimitriou

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

421 890b0eaf Sofia Papagiannaki
    ``extra_context``
422 890b0eaf Sofia Papagiannaki
        An dictionary of variables to add to the template context.
423 176023aa Kostas Papadimitriou

424 890b0eaf Sofia Papagiannaki
    **Template:**
425 176023aa Kostas Papadimitriou

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

428 890b0eaf Sofia Papagiannaki
    **Settings:**
429 176023aa Kostas Papadimitriou

430 92defad4 Sofia Papagiannaki
    * LOGIN_URL: login uri
431 2cbaacd5 Sofia Papagiannaki
    * ASTAKOS_DEFAULT_CONTACT_EMAIL: List of feedback recipients
432 890b0eaf Sofia Papagiannaki
    """
433 64cd4730 Antony Chazapis
    if request.method == 'GET':
434 890b0eaf Sofia Papagiannaki
        form = FeedbackForm()
435 890b0eaf Sofia Papagiannaki
    if request.method == 'POST':
436 890b0eaf Sofia Papagiannaki
        if not request.user:
437 890b0eaf Sofia Papagiannaki
            return HttpResponse('Unauthorized', status=401)
438 176023aa Kostas Papadimitriou
439 890b0eaf Sofia Papagiannaki
        form = FeedbackForm(request.POST)
440 890b0eaf Sofia Papagiannaki
        if form.is_valid():
441 e9083112 Sofia Papagiannaki
            msg = form.cleaned_data['feedback_msg']
442 8f5a3a06 Sofia Papagiannaki
            data = form.cleaned_data['feedback_data']
443 538ccdd5 Sofia Papagiannaki
            try:
444 8f5a3a06 Sofia Papagiannaki
                send_feedback(msg, data, request.user, email_template_name)
445 8f5a3a06 Sofia Papagiannaki
            except SendMailError, e:
446 24406ae3 Sofia Papagiannaki
                messages.error(request, message)
447 8f5a3a06 Sofia Papagiannaki
            else:
448 538ccdd5 Sofia Papagiannaki
                message = _('Feedback successfully sent')
449 aab4d540 Sofia Papagiannaki
                messages.success(request, message)
450 890b0eaf Sofia Papagiannaki
    return render_response(template_name,
451 5ce3ce4f Sofia Papagiannaki
                           feedback_form=form,
452 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request, extra_context))
453 5ce3ce4f Sofia Papagiannaki
454 15efc749 Sofia Papagiannaki
455 8e45d6fd Sofia Papagiannaki
@signed_terms_required
456 aab4d540 Sofia Papagiannaki
def logout(request, template='registration/logged_out.html', extra_context=None):
457 63ecdd20 Sofia Papagiannaki
    """
458 7482228b Sofia Papagiannaki
    Wraps `django.contrib.auth.logout` and delete the cookie.
459 63ecdd20 Sofia Papagiannaki
    """
460 7482228b Sofia Papagiannaki
    response = HttpResponse()
461 8e45d6fd Sofia Papagiannaki
    if request.user.is_authenticated():
462 8e45d6fd Sofia Papagiannaki
        email = request.user.email
463 8e45d6fd Sofia Papagiannaki
        auth_logout(request)
464 8e45d6fd Sofia Papagiannaki
        response.delete_cookie(COOKIE_NAME, path='/', domain=COOKIE_DOMAIN)
465 8e45d6fd Sofia Papagiannaki
        msg = 'Cookie deleted for %s' % email
466 aab4d540 Sofia Papagiannaki
        logger.log(LOGGING_LEVEL, msg)
467 63ecdd20 Sofia Papagiannaki
    next = request.GET.get('next')
468 63ecdd20 Sofia Papagiannaki
    if next:
469 63ecdd20 Sofia Papagiannaki
        response['Location'] = next
470 63ecdd20 Sofia Papagiannaki
        response.status_code = 302
471 63ecdd20 Sofia Papagiannaki
        return response
472 0d02a287 Sofia Papagiannaki
    elif LOGOUT_NEXT:
473 0d02a287 Sofia Papagiannaki
        response['Location'] = LOGOUT_NEXT
474 0d02a287 Sofia Papagiannaki
        response.status_code = 301
475 0d02a287 Sofia Papagiannaki
        return response
476 24406ae3 Sofia Papagiannaki
    messages.success(request, _('You have successfully logged out.'))
477 49df775e Sofia Papagiannaki
    context = get_context(request, extra_context)
478 f46c95c4 Sofia Papagiannaki
    response.write(
479 f46c95c4 Sofia Papagiannaki
        template_loader.render_to_string(template, context_instance=context))
480 49df775e Sofia Papagiannaki
    return response
481 2126d85d Sofia Papagiannaki
482 5ce3ce4f Sofia Papagiannaki
483 683cf244 Sofia Papagiannaki
@transaction.commit_manually
484 3bb604eb Sofia Papagiannaki
def activate(request, greeting_email_template_name='im/welcome_email.txt',
485 3bb604eb Sofia Papagiannaki
             helpdesk_email_template_name='im/helpdesk_notification.txt'):
486 2126d85d Sofia Papagiannaki
    """
487 683cf244 Sofia Papagiannaki
    Activates the user identified by the ``auth`` request parameter, sends a welcome email
488 683cf244 Sofia Papagiannaki
    and renews the user token.
489 176023aa Kostas Papadimitriou

490 683cf244 Sofia Papagiannaki
    The view uses commit_manually decorator in order to ensure the user state will be updated
491 683cf244 Sofia Papagiannaki
    only if the email will be send successfully.
492 2126d85d Sofia Papagiannaki
    """
493 2126d85d Sofia Papagiannaki
    token = request.GET.get('auth')
494 2126d85d Sofia Papagiannaki
    next = request.GET.get('next')
495 2126d85d Sofia Papagiannaki
    try:
496 2126d85d Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=token)
497 2126d85d Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
498 683cf244 Sofia Papagiannaki
        return HttpResponseBadRequest(_('No such user'))
499 5ce3ce4f Sofia Papagiannaki
500 d1757ca7 Sofia Papagiannaki
    if user.is_active:
501 23b9b72f Sofia Papagiannaki
        message = _('Account already active.')
502 24406ae3 Sofia Papagiannaki
        messages.error(request, message)
503 23b9b72f Sofia Papagiannaki
        return index(request)
504 5ce3ce4f Sofia Papagiannaki
505 0a569195 Sofia Papagiannaki
    try:
506 3abf6c78 Sofia Papagiannaki
        local_user = AstakosUser.objects.get(
507 5ce3ce4f Sofia Papagiannaki
            ~Q(id=user.id),
508 3abf6c78 Sofia Papagiannaki
            email=user.email,
509 3abf6c78 Sofia Papagiannaki
            is_active=True
510 3abf6c78 Sofia Papagiannaki
        )
511 0a569195 Sofia Papagiannaki
    except AstakosUser.DoesNotExist:
512 27e26a41 Sofia Papagiannaki
        try:
513 3abf6c78 Sofia Papagiannaki
            activate_func(
514 3abf6c78 Sofia Papagiannaki
                user,
515 3abf6c78 Sofia Papagiannaki
                greeting_email_template_name,
516 3abf6c78 Sofia Papagiannaki
                helpdesk_email_template_name,
517 3abf6c78 Sofia Papagiannaki
                verify_email=True
518 3abf6c78 Sofia Papagiannaki
            )
519 23b9b72f Sofia Papagiannaki
            response = prepare_response(request, user, next, renew=True)
520 23b9b72f Sofia Papagiannaki
            transaction.commit()
521 23b9b72f Sofia Papagiannaki
            return response
522 23b9b72f Sofia Papagiannaki
        except SendMailError, e:
523 23b9b72f Sofia Papagiannaki
            message = e.message
524 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
525 23b9b72f Sofia Papagiannaki
            transaction.rollback()
526 23b9b72f Sofia Papagiannaki
            return index(request)
527 23b9b72f Sofia Papagiannaki
        except BaseException, e:
528 23b9b72f Sofia Papagiannaki
            message = _('Something went wrong.')
529 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
530 23b9b72f Sofia Papagiannaki
            logger.exception(e)
531 23b9b72f Sofia Papagiannaki
            transaction.rollback()
532 23b9b72f Sofia Papagiannaki
            return index(request)
533 0a569195 Sofia Papagiannaki
    else:
534 23b9b72f Sofia Papagiannaki
        try:
535 3abf6c78 Sofia Papagiannaki
            user = switch_account_to_shibboleth(
536 3abf6c78 Sofia Papagiannaki
                user,
537 3abf6c78 Sofia Papagiannaki
                local_user,
538 3abf6c78 Sofia Papagiannaki
                greeting_email_template_name
539 3abf6c78 Sofia Papagiannaki
            )
540 23b9b72f Sofia Papagiannaki
            response = prepare_response(request, user, next, renew=True)
541 23b9b72f Sofia Papagiannaki
            transaction.commit()
542 23b9b72f Sofia Papagiannaki
            return response
543 23b9b72f Sofia Papagiannaki
        except SendMailError, e:
544 23b9b72f Sofia Papagiannaki
            message = e.message
545 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
546 23b9b72f Sofia Papagiannaki
            transaction.rollback()
547 23b9b72f Sofia Papagiannaki
            return index(request)
548 23b9b72f Sofia Papagiannaki
        except BaseException, e:
549 23b9b72f Sofia Papagiannaki
            message = _('Something went wrong.')
550 24406ae3 Sofia Papagiannaki
            messages.error(request, message)
551 23b9b72f Sofia Papagiannaki
            logger.exception(e)
552 23b9b72f Sofia Papagiannaki
            transaction.rollback()
553 23b9b72f Sofia Papagiannaki
            return index(request)
554 270dd48d Sofia Papagiannaki
555 5ce3ce4f Sofia Papagiannaki
556 aab4d540 Sofia Papagiannaki
def approval_terms(request, term_id=None, template_name='im/approval_terms.html', extra_context=None):
557 270dd48d Sofia Papagiannaki
    term = None
558 270dd48d Sofia Papagiannaki
    terms = None
559 270dd48d Sofia Papagiannaki
    if not term_id:
560 270dd48d Sofia Papagiannaki
        try:
561 270dd48d Sofia Papagiannaki
            term = ApprovalTerms.objects.order_by('-id')[0]
562 270dd48d Sofia Papagiannaki
        except IndexError:
563 270dd48d Sofia Papagiannaki
            pass
564 270dd48d Sofia Papagiannaki
    else:
565 270dd48d Sofia Papagiannaki
        try:
566 aab4d540 Sofia Papagiannaki
            term = ApprovalTerms.objects.get(id=term_id)
567 aab4d540 Sofia Papagiannaki
        except ApprovalTerms.DoesNotExist, e:
568 270dd48d Sofia Papagiannaki
            pass
569 176023aa Kostas Papadimitriou
570 270dd48d Sofia Papagiannaki
    if not term:
571 f46c95c4 Sofia Papagiannaki
        messages.error(request, 'There are no approval terms.')
572 6ff7a7ca Sofia Papagiannaki
        return HttpResponseRedirect(reverse('index'))
573 270dd48d Sofia Papagiannaki
    f = open(term.location, 'r')
574 270dd48d Sofia Papagiannaki
    terms = f.read()
575 176023aa Kostas Papadimitriou
576 270dd48d Sofia Papagiannaki
    if request.method == 'POST':
577 270dd48d Sofia Papagiannaki
        next = request.POST.get('next')
578 270dd48d Sofia Papagiannaki
        if not next:
579 6ff7a7ca Sofia Papagiannaki
            next = reverse('index')
580 270dd48d Sofia Papagiannaki
        form = SignApprovalTermsForm(request.POST, instance=request.user)
581 270dd48d Sofia Papagiannaki
        if not form.is_valid():
582 270dd48d Sofia Papagiannaki
            return render_response(template_name,
583 5ce3ce4f Sofia Papagiannaki
                                   terms=terms,
584 5ce3ce4f Sofia Papagiannaki
                                   approval_terms_form=form,
585 5ce3ce4f Sofia Papagiannaki
                                   context_instance=get_context(request, extra_context))
586 270dd48d Sofia Papagiannaki
        user = form.save()
587 270dd48d Sofia Papagiannaki
        return HttpResponseRedirect(next)
588 270dd48d Sofia Papagiannaki
    else:
589 586967c0 Sofia Papagiannaki
        form = None
590 fcf90160 Sofia Papagiannaki
        if request.user.is_authenticated() and not request.user.signed_terms:
591 586967c0 Sofia Papagiannaki
            form = SignApprovalTermsForm(instance=request.user)
592 270dd48d Sofia Papagiannaki
        return render_response(template_name,
593 5ce3ce4f Sofia Papagiannaki
                               terms=terms,
594 5ce3ce4f Sofia Papagiannaki
                               approval_terms_form=form,
595 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request, extra_context))
596 5ce3ce4f Sofia Papagiannaki
597 270dd48d Sofia Papagiannaki
598 270dd48d Sofia Papagiannaki
@signed_terms_required
599 270dd48d Sofia Papagiannaki
def change_password(request):
600 1039bab1 Sofia Papagiannaki
    return password_change(request,
601 5ce3ce4f Sofia Papagiannaki
                           post_change_redirect=reverse('edit_profile'),
602 5ce3ce4f Sofia Papagiannaki
                           password_change_form=ExtendedPasswordChangeForm)
603 5ce3ce4f Sofia Papagiannaki
604 49790d9d Sofia Papagiannaki
605 f46c95c4 Sofia Papagiannaki
@require_http_methods(["GET", "POST"])
606 8e45d6fd Sofia Papagiannaki
@signed_terms_required
607 8e45d6fd Sofia Papagiannaki
@login_required
608 49790d9d Sofia Papagiannaki
@transaction.commit_manually
609 49790d9d Sofia Papagiannaki
def change_email(request, activation_key=None,
610 49790d9d Sofia Papagiannaki
                 email_template_name='registration/email_change_email.txt',
611 49790d9d Sofia Papagiannaki
                 form_template_name='registration/email_change_form.html',
612 49790d9d Sofia Papagiannaki
                 confirm_template_name='registration/email_change_done.html',
613 aab4d540 Sofia Papagiannaki
                 extra_context=None):
614 49790d9d Sofia Papagiannaki
    if activation_key:
615 49790d9d Sofia Papagiannaki
        try:
616 49790d9d Sofia Papagiannaki
            user = EmailChange.objects.change_email(activation_key)
617 49790d9d Sofia Papagiannaki
            if request.user.is_authenticated() and request.user == user:
618 49790d9d Sofia Papagiannaki
                msg = _('Email changed successfully.')
619 24406ae3 Sofia Papagiannaki
                messages.success(request, msg)
620 49790d9d Sofia Papagiannaki
                auth_logout(request)
621 49790d9d Sofia Papagiannaki
                response = prepare_response(request, user)
622 49790d9d Sofia Papagiannaki
                transaction.commit()
623 49790d9d Sofia Papagiannaki
                return response
624 49790d9d Sofia Papagiannaki
        except ValueError, e:
625 24406ae3 Sofia Papagiannaki
            messages.error(request, e)
626 49790d9d Sofia Papagiannaki
        return render_response(confirm_template_name,
627 5ce3ce4f Sofia Papagiannaki
                               modified_user=user if 'user' in locals(
628 5ce3ce4f Sofia Papagiannaki
                               ) else None,
629 5ce3ce4f Sofia Papagiannaki
                               context_instance=get_context(request,
630 5ce3ce4f Sofia Papagiannaki
                                                            extra_context))
631 5ce3ce4f Sofia Papagiannaki
632 49790d9d Sofia Papagiannaki
    if not request.user.is_authenticated():
633 49790d9d Sofia Papagiannaki
        path = quote(request.get_full_path())
634 6ff7a7ca Sofia Papagiannaki
        url = request.build_absolute_uri(reverse('index'))
635 49790d9d Sofia Papagiannaki
        return HttpResponseRedirect(url + '?next=' + path)
636 49790d9d Sofia Papagiannaki
    form = EmailChangeForm(request.POST or None)
637 49790d9d Sofia Papagiannaki
    if request.method == 'POST' and form.is_valid():
638 49790d9d Sofia Papagiannaki
        try:
639 49790d9d Sofia Papagiannaki
            ec = form.save(email_template_name, request)
640 49790d9d Sofia Papagiannaki
        except SendMailError, e:
641 49790d9d Sofia Papagiannaki
            msg = e
642 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
643 49790d9d Sofia Papagiannaki
            transaction.rollback()
644 49790d9d Sofia Papagiannaki
        except IntegrityError, e:
645 49790d9d Sofia Papagiannaki
            msg = _('There is already a pending change email request.')
646 24406ae3 Sofia Papagiannaki
            messages.error(request, msg)
647 49790d9d Sofia Papagiannaki
        else:
648 49790d9d Sofia Papagiannaki
            msg = _('Change email request has been registered succefully.\
649 49790d9d Sofia Papagiannaki
                    You are going to receive a verification email in the new address.')
650 24406ae3 Sofia Papagiannaki
            messages.success(request, msg)
651 49790d9d Sofia Papagiannaki
            transaction.commit()
652 49790d9d Sofia Papagiannaki
    return render_response(form_template_name,
653 5ce3ce4f Sofia Papagiannaki
                           form=form,
654 5ce3ce4f Sofia Papagiannaki
                           context_instance=get_context(request,
655 5ce3ce4f Sofia Papagiannaki
                                                        extra_context))
656 5ce3ce4f Sofia Papagiannaki
657 8e45d6fd Sofia Papagiannaki
658 8e45d6fd Sofia Papagiannaki
@signed_terms_required
659 01ac12d5 Sofia Papagiannaki
@login_required
660 0f4fa26d Sofia Papagiannaki
def group_add(request, kind_name='default'):
661 0f4fa26d Sofia Papagiannaki
    try:
662 5ce3ce4f Sofia Papagiannaki
        kind = GroupKind.objects.get(name=kind_name)
663 0f4fa26d Sofia Papagiannaki
    except:
664 0f4fa26d Sofia Papagiannaki
        return HttpResponseBadRequest(_('No such group kind'))
665 5ce3ce4f Sofia Papagiannaki
666 5ce3ce4f Sofia Papagiannaki
    post_save_redirect = '/im/group/%(id)s/'
667 5ce3ce4f Sofia Papagiannaki
    context_processors = None
668 0f4fa26d Sofia Papagiannaki
    model, form_class = get_model_and_form_class(
669 0f4fa26d Sofia Papagiannaki
        model=None,
670 0f4fa26d Sofia Papagiannaki
        form_class=AstakosGroupCreationForm
671 0f4fa26d Sofia Papagiannaki
    )
672 5ce3ce4f Sofia Papagiannaki
    resources = dict(
673 5ce3ce4f Sofia Papagiannaki
        (str(r.id), r) for r in Resource.objects.select_related().all())
674 3abf6c78 Sofia Papagiannaki
    policies = []
675 0f4fa26d Sofia Papagiannaki
    if request.method == 'POST':
676 0f4fa26d Sofia Papagiannaki
        form = form_class(request.POST, request.FILES, resources=resources)
677 0f4fa26d Sofia Papagiannaki
        if form.is_valid():
678 0f4fa26d Sofia Papagiannaki
            new_object = form.save()
679 5ce3ce4f Sofia Papagiannaki
680 3abf6c78 Sofia Papagiannaki
            # save owner
681 0f4fa26d Sofia Papagiannaki
            new_object.owners = [request.user]
682 5ce3ce4f Sofia Papagiannaki
683 3abf6c78 Sofia Papagiannaki
            # save quota policies
684 670de92a Sofia Papagiannaki
            for (rid, uplimit) in form.resources():
685 0f4fa26d Sofia Papagiannaki
                try:
686 0f4fa26d Sofia Papagiannaki
                    r = resources[rid]
687 0f4fa26d Sofia Papagiannaki
                except KeyError, e:
688 0f4fa26d Sofia Papagiannaki
                    logger.exception(e)
689 3abf6c78 Sofia Papagiannaki
                    # TODO Should I stay or should I go???
690 0f4fa26d Sofia Papagiannaki
                    continue
691 0f4fa26d Sofia Papagiannaki
                else:
692 0f4fa26d Sofia Papagiannaki
                    new_object.astakosgroupquota_set.create(
693 5ce3ce4f Sofia Papagiannaki
                        resource=r,
694 670de92a Sofia Papagiannaki
                        uplimit=uplimit
695 0f4fa26d Sofia Papagiannaki
                    )
696 670de92a Sofia Papagiannaki
                policies.append('%s %d' % (r, uplimit))
697 0f4fa26d Sofia Papagiannaki
            msg = _("The %(verbose_name)s was created successfully.") %\
698 5ce3ce4f Sofia Papagiannaki
                {"verbose_name": model._meta.verbose_name}
699 0f4fa26d Sofia Papagiannaki
            messages.success(request, msg, fail_silently=True)
700 5ce3ce4f Sofia Papagiannaki
701 3abf6c78 Sofia Papagiannaki
            # send notification
702 3abf6c78 Sofia Papagiannaki
            try:
703 f46c95c4 Sofia Papagiannaki
                send_group_creation_notification(
704 3abf6c78 Sofia Papagiannaki
                    template_name='im/group_creation_notification.txt',
705 3abf6c78 Sofia Papagiannaki
                    dictionary={
706 5ce3ce4f Sofia Papagiannaki
                        'group': new_object,
707 5ce3ce4f Sofia Papagiannaki
                        'owner': request.user,
708 5ce3ce4f Sofia Papagiannaki
                        'policies': policies,
709 f46c95c4 Sofia Papagiannaki
                    }
710 3abf6c78 Sofia Papagiannaki
                )
711 3abf6c78 Sofia Papagiannaki
            except SendNotificationError, e:
712 3abf6c78 Sofia Papagiannaki
                messages.error(request, e, fail_silently=True)
713 aab4d540 Sofia Papagiannaki
            return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
714 0f4fa26d Sofia Papagiannaki
    else:
715 0f4fa26d Sofia Papagiannaki
        now = datetime.now()
716 0f4fa26d Sofia Papagiannaki
        data = {
717 5ce3ce4f Sofia Papagiannaki
            'kind': kind
718 0f4fa26d Sofia Papagiannaki
        }
719 0f4fa26d Sofia Papagiannaki
        form = form_class(data, resources=resources)
720 0f4fa26d Sofia Papagiannaki
721 0f4fa26d Sofia Papagiannaki
    # Create the template, context, response
722 0f4fa26d Sofia Papagiannaki
    template_name = "%s/%s_form.html" % (
723 0f4fa26d Sofia Papagiannaki
        model._meta.app_label,
724 0f4fa26d Sofia Papagiannaki
        model._meta.object_name.lower()
725 0f4fa26d Sofia Papagiannaki
    )
726 0f4fa26d Sofia Papagiannaki
    t = template_loader.get_template(template_name)
727 0f4fa26d Sofia Papagiannaki
    c = RequestContext(request, {
728 c8977d75 Olga Brani
        'form': form,
729 c8977d75 Olga Brani
        'kind': kind,
730 0f4fa26d Sofia Papagiannaki
    }, context_processors)
731 0f4fa26d Sofia Papagiannaki
    return HttpResponse(t.render(c))
732 8e45d6fd Sofia Papagiannaki
733 5ce3ce4f Sofia Papagiannaki
734 8e45d6fd Sofia Papagiannaki
@signed_terms_required
735 8e45d6fd Sofia Papagiannaki
@login_required
736 ade90760 Sofia Papagiannaki
def group_list(request):
737 789bcaf9 Sofia Papagiannaki
    none = request.user.astakos_groups.none()
738 789bcaf9 Sofia Papagiannaki
    q = AstakosGroup.objects.raw("""
739 789bcaf9 Sofia Papagiannaki
        SELECT auth_group.id,
740 789bcaf9 Sofia Papagiannaki
        %s AS groupname,
741 789bcaf9 Sofia Papagiannaki
        im_groupkind.name AS kindname,
742 789bcaf9 Sofia Papagiannaki
        im_astakosgroup.*,
743 789bcaf9 Sofia Papagiannaki
        owner.email AS groupowner,
744 789bcaf9 Sofia Papagiannaki
        (SELECT COUNT(*) FROM im_membership
745 789bcaf9 Sofia Papagiannaki
            WHERE group_id = im_astakosgroup.group_ptr_id
746 789bcaf9 Sofia Papagiannaki
            AND date_joined IS NOT NULL) AS approved_members_num,
747 04febd09 Olga Brani
        (SELECT CASE WHEN(
748 04febd09 Olga Brani
                    SELECT date_joined FROM im_membership
749 04febd09 Olga Brani
                    WHERE group_id = im_astakosgroup.group_ptr_id
750 04febd09 Olga Brani
                    AND person_id = %s) IS NULL
751 0f225db4 Sofia Papagiannaki
                    THEN 0 ELSE 1 END) AS membership_status
752 789bcaf9 Sofia Papagiannaki
        FROM im_astakosgroup
753 789bcaf9 Sofia Papagiannaki
        INNER JOIN im_membership ON (
754 789bcaf9 Sofia Papagiannaki
            im_astakosgroup.group_ptr_id = im_membership.group_id)
755 789bcaf9 Sofia Papagiannaki
        INNER JOIN auth_group ON(im_astakosgroup.group_ptr_id = auth_group.id)
756 789bcaf9 Sofia Papagiannaki
        INNER JOIN im_groupkind ON (im_astakosgroup.kind_id = im_groupkind.id)
757 789bcaf9 Sofia Papagiannaki
        LEFT JOIN im_astakosuser_owner ON (
758 789bcaf9 Sofia Papagiannaki
            im_astakosuser_owner.astakosgroup_id = im_astakosgroup.group_ptr_id)
759 789bcaf9 Sofia Papagiannaki
        LEFT JOIN auth_user as owner ON (
760 789bcaf9 Sofia Papagiannaki
            im_astakosuser_owner.astakosuser_id = owner.id)
761 789bcaf9 Sofia Papagiannaki
        WHERE im_membership.person_id = %s
762 789bcaf9 Sofia Papagiannaki
        """ % (DB_REPLACE_GROUP_SCHEME, request.user.id, request.user.id))
763 789bcaf9 Sofia Papagiannaki
    d = defaultdict(list)
764 789bcaf9 Sofia Papagiannaki
    for g in q:
765 789bcaf9 Sofia Papagiannaki
        if request.user.email == g.groupowner:
766 789bcaf9 Sofia Papagiannaki
            d['own'].append(g)
767 789bcaf9 Sofia Papagiannaki
        else:
768 789bcaf9 Sofia Papagiannaki
            d['other'].append(g)
769 f46c95c4 Sofia Papagiannaki
770 801be7a3 Sofia Papagiannaki
    # validate sorting
771 801be7a3 Sofia Papagiannaki
    fields = ('own', 'other')
772 801be7a3 Sofia Papagiannaki
    for f in fields:
773 801be7a3 Sofia Papagiannaki
        v = globals()['%s_sorting' % f] = request.GET.get('%s_sorting' % f)
774 801be7a3 Sofia Papagiannaki
        if v:
775 801be7a3 Sofia Papagiannaki
            form = AstakosGroupSortForm({'sort_by': v})
776 801be7a3 Sofia Papagiannaki
            if not form.is_valid():
777 801be7a3 Sofia Papagiannaki
                globals()['%s_sorting' % f] = form.cleaned_data.get('sort_by')
778 789bcaf9 Sofia Papagiannaki
    return object_list(request, queryset=none,
779 f46c95c4 Sofia Papagiannaki
                       extra_context={'is_search': False,
780 77aaed51 Sofia Papagiannaki
                                      'mine': d['own'],
781 77aaed51 Sofia Papagiannaki
                                      'other': d['other'],
782 801be7a3 Sofia Papagiannaki
                                      'own_sorting': own_sorting,
783 801be7a3 Sofia Papagiannaki
                                      'other_sorting': other_sorting,
784 77aaed51 Sofia Papagiannaki
                                      'own_page': request.GET.get('own_page', 1),
785 801be7a3 Sofia Papagiannaki
                                      'other_page': request.GET.get('other_page', 1)
786 789bcaf9 Sofia Papagiannaki
                                      })
787 5ce3ce4f Sofia Papagiannaki
788 8e45d6fd Sofia Papagiannaki
789 8e45d6fd Sofia Papagiannaki
@signed_terms_required
790 8e45d6fd Sofia Papagiannaki
@login_required
791 8e45d6fd Sofia Papagiannaki
def group_detail(request, group_id):
792 032ade79 Sofia Papagiannaki
    q = AstakosGroup.objects.select_related().filter(pk=group_id)
793 661c4479 Sofia Papagiannaki
    q = q.extra(select={
794 661c4479 Sofia Papagiannaki
        'is_member': """SELECT CASE WHEN EXISTS(
795 661c4479 Sofia Papagiannaki
                            SELECT id FROM im_membership
796 661c4479 Sofia Papagiannaki
                            WHERE group_id = im_astakosgroup.group_ptr_id
797 661c4479 Sofia Papagiannaki
                            AND person_id = %s)
798 661c4479 Sofia Papagiannaki
                        THEN 1 ELSE 0 END""" % request.user.id,
799 661c4479 Sofia Papagiannaki
        'is_owner': """SELECT CASE WHEN EXISTS(
800 032ade79 Sofia Papagiannaki
                        SELECT id FROM im_astakosuser_owner
801 032ade79 Sofia Papagiannaki
                        WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
802 032ade79 Sofia Papagiannaki
                        AND astakosuser_id = %s)
803 661c4479 Sofia Papagiannaki
                        THEN 1 ELSE 0 END""" % request.user.id,
804 661c4479 Sofia Papagiannaki
        'kindname': """SELECT name FROM im_groupkind
805 661c4479 Sofia Papagiannaki
                       WHERE id = im_astakosgroup.kind_id"""})
806 f46c95c4 Sofia Papagiannaki
807 661c4479 Sofia Papagiannaki
    model = q.model
808 661c4479 Sofia Papagiannaki
    context_processors = None
809 661c4479 Sofia Papagiannaki
    mimetype = None
810 8e45d6fd Sofia Papagiannaki
    try:
811 661c4479 Sofia Papagiannaki
        obj = q.get()
812 032ade79 Sofia Papagiannaki
    except AstakosGroup.DoesNotExist:
813 032ade79 Sofia Papagiannaki
        raise Http404("No %s found matching the query" % (
814 032ade79 Sofia Papagiannaki
            model._meta.verbose_name))
815 f46c95c4 Sofia Papagiannaki
816 661c4479 Sofia Papagiannaki
    update_form = AstakosGroupUpdateForm(instance=obj)
817 661c4479 Sofia Papagiannaki
    addmembers_form = AddGroupMembersForm()
818 661c4479 Sofia Papagiannaki
    if request.method == 'POST':
819 661c4479 Sofia Papagiannaki
        update_data = {}
820 661c4479 Sofia Papagiannaki
        addmembers_data = {}
821 f46c95c4 Sofia Papagiannaki
        for k, v in request.POST.iteritems():
822 661c4479 Sofia Papagiannaki
            if k in update_form.fields:
823 661c4479 Sofia Papagiannaki
                update_data[k] = v
824 661c4479 Sofia Papagiannaki
            if k in addmembers_form.fields:
825 661c4479 Sofia Papagiannaki
                addmembers_data[k] = v
826 661c4479 Sofia Papagiannaki
        update_data = update_data or None
827 661c4479 Sofia Papagiannaki
        addmembers_data = addmembers_data or None
828 661c4479 Sofia Papagiannaki
        update_form = AstakosGroupUpdateForm(update_data, instance=obj)
829 661c4479 Sofia Papagiannaki
        addmembers_form = AddGroupMembersForm(addmembers_data)
830 661c4479 Sofia Papagiannaki
        if update_form.is_valid():
831 661c4479 Sofia Papagiannaki
            update_form.save()
832 661c4479 Sofia Papagiannaki
        if addmembers_form.is_valid():
833 661c4479 Sofia Papagiannaki
            map(obj.approve_member, addmembers_form.valid_users)
834 661c4479 Sofia Papagiannaki
            addmembers_form = AddGroupMembersForm()
835 f46c95c4 Sofia Papagiannaki
836 f46c95c4 Sofia Papagiannaki
    template_name = "%s/%s_detail.html" % (
837 f46c95c4 Sofia Papagiannaki
        model._meta.app_label, model._meta.object_name.lower())
838 661c4479 Sofia Papagiannaki
    t = template_loader.get_template(template_name)
839 661c4479 Sofia Papagiannaki
    c = RequestContext(request, {
840 661c4479 Sofia Papagiannaki
        'object': obj,
841 661c4479 Sofia Papagiannaki
    }, context_processors)
842 f46c95c4 Sofia Papagiannaki
843 801be7a3 Sofia Papagiannaki
    # validate sorting
844 f46c95c4 Sofia Papagiannaki
    sorting = request.GET.get('sorting')
845 801be7a3 Sofia Papagiannaki
    if sorting:
846 801be7a3 Sofia Papagiannaki
        form = MembersSortForm({'sort_by': sorting})
847 801be7a3 Sofia Papagiannaki
        if form.is_valid():
848 801be7a3 Sofia Papagiannaki
            sorting = form.cleaned_data.get('sort_by')
849 f46c95c4 Sofia Papagiannaki
850 661c4479 Sofia Papagiannaki
    extra_context = {'update_form': update_form,
851 661c4479 Sofia Papagiannaki
                     'addmembers_form': addmembers_form,
852 661c4479 Sofia Papagiannaki
                     'page': request.GET.get('page', 1),
853 801be7a3 Sofia Papagiannaki
                     'sorting': sorting}
854 661c4479 Sofia Papagiannaki
    for key, value in extra_context.items():
855 661c4479 Sofia Papagiannaki
        if callable(value):
856 661c4479 Sofia Papagiannaki
            c[key] = value()
857 04febd09 Olga Brani
        else:
858 661c4479 Sofia Papagiannaki
            c[key] = value
859 661c4479 Sofia Papagiannaki
    response = HttpResponse(t.render(c), mimetype=mimetype)
860 f46c95c4 Sofia Papagiannaki
    populate_xheaders(
861 f46c95c4 Sofia Papagiannaki
        request, response, model, getattr(obj, obj._meta.pk.name))
862 661c4479 Sofia Papagiannaki
    return response
863 8e45d6fd Sofia Papagiannaki
864 5ce3ce4f Sofia Papagiannaki
865 01ac12d5 Sofia Papagiannaki
@signed_terms_required
866 01ac12d5 Sofia Papagiannaki
@login_required
867 95a51cdc Sofia Papagiannaki
def group_search(request, extra_context=None, **kwargs):
868 d220292f Sofia Papagiannaki
    q = request.GET.get('q')
869 04febd09 Olga Brani
    sorting = request.GET.get('sorting')
870 01ac12d5 Sofia Papagiannaki
    if request.method == 'GET':
871 d220292f Sofia Papagiannaki
        form = AstakosGroupSearchForm({'q': q} if q else None)
872 01ac12d5 Sofia Papagiannaki
    else:
873 01ac12d5 Sofia Papagiannaki
        form = AstakosGroupSearchForm(get_query(request))
874 01ac12d5 Sofia Papagiannaki
        if form.is_valid():
875 01ac12d5 Sofia Papagiannaki
            q = form.cleaned_data['q'].strip()
876 d220292f Sofia Papagiannaki
    if q:
877 789bcaf9 Sofia Papagiannaki
        queryset = AstakosGroup.objects.select_related()
878 789bcaf9 Sofia Papagiannaki
        queryset = queryset.filter(name__contains=q)
879 789bcaf9 Sofia Papagiannaki
        queryset = queryset.filter(approval_date__isnull=False)
880 789bcaf9 Sofia Papagiannaki
        queryset = queryset.extra(select={
881 f46c95c4 Sofia Papagiannaki
                                  'groupname': DB_REPLACE_GROUP_SCHEME,
882 f46c95c4 Sofia Papagiannaki
                                  'kindname': "im_groupkind.name",
883 f46c95c4 Sofia Papagiannaki
                                  'approved_members_num': """
884 789bcaf9 Sofia Papagiannaki
                    SELECT COUNT(*) FROM im_membership
885 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
886 789bcaf9 Sofia Papagiannaki
                    AND date_joined IS NOT NULL""",
887 f46c95c4 Sofia Papagiannaki
                                  'membership_approval_date': """
888 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
889 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
890 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s""" % request.user.id,
891 f46c95c4 Sofia Papagiannaki
                                  'is_member': """
892 789bcaf9 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
893 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
894 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
895 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s)
896 701118f4 Sofia Papagiannaki
                    THEN 1 ELSE 0 END""" % request.user.id,
897 f46c95c4 Sofia Papagiannaki
                                  'is_owner': """
898 701118f4 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
899 701118f4 Sofia Papagiannaki
                    SELECT id FROM im_astakosuser_owner
900 701118f4 Sofia Papagiannaki
                    WHERE astakosgroup_id = im_astakosgroup.group_ptr_id
901 701118f4 Sofia Papagiannaki
                    AND astakosuser_id = %s)
902 789bcaf9 Sofia Papagiannaki
                    THEN 1 ELSE 0 END""" % request.user.id})
903 04febd09 Olga Brani
        if sorting:
904 04febd09 Olga Brani
            # TODO check sorting value
905 04febd09 Olga Brani
            queryset = queryset.order_by(sorting)
906 d220292f Sofia Papagiannaki
    else:
907 d220292f Sofia Papagiannaki
        queryset = AstakosGroup.objects.none()
908 d220292f Sofia Papagiannaki
    return object_list(
909 d220292f Sofia Papagiannaki
        request,
910 d220292f Sofia Papagiannaki
        queryset,
911 d220292f Sofia Papagiannaki
        paginate_by=PAGINATE_BY,
912 d220292f Sofia Papagiannaki
        page=request.GET.get('page') or 1,
913 d220292f Sofia Papagiannaki
        template_name='im/astakosgroup_list.html',
914 d220292f Sofia Papagiannaki
        extra_context=dict(form=form,
915 d220292f Sofia Papagiannaki
                           is_search=True,
916 04febd09 Olga Brani
                           q=q,
917 04febd09 Olga Brani
                           sorting=sorting))
918 5ce3ce4f Sofia Papagiannaki
919 f46c95c4 Sofia Papagiannaki
920 df67421c Sofia Papagiannaki
@signed_terms_required
921 df67421c Sofia Papagiannaki
@login_required
922 df67421c Sofia Papagiannaki
def group_all(request, extra_context=None, **kwargs):
923 789bcaf9 Sofia Papagiannaki
    q = AstakosGroup.objects.select_related()
924 789bcaf9 Sofia Papagiannaki
    q = q.filter(approval_date__isnull=False)
925 789bcaf9 Sofia Papagiannaki
    q = q.extra(select={
926 789bcaf9 Sofia Papagiannaki
                'groupname': DB_REPLACE_GROUP_SCHEME,
927 789bcaf9 Sofia Papagiannaki
                'kindname': "im_groupkind.name",
928 789bcaf9 Sofia Papagiannaki
                'approved_members_num': """
929 789bcaf9 Sofia Papagiannaki
                    SELECT COUNT(*) FROM im_membership
930 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
931 789bcaf9 Sofia Papagiannaki
                    AND date_joined IS NOT NULL""",
932 789bcaf9 Sofia Papagiannaki
                'membership_approval_date': """
933 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
934 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
935 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s""" % request.user.id,
936 789bcaf9 Sofia Papagiannaki
                'is_member': """
937 789bcaf9 Sofia Papagiannaki
                    SELECT CASE WHEN EXISTS(
938 789bcaf9 Sofia Papagiannaki
                    SELECT date_joined FROM im_membership
939 789bcaf9 Sofia Papagiannaki
                    WHERE group_id = im_astakosgroup.group_ptr_id
940 789bcaf9 Sofia Papagiannaki
                    AND person_id = %s)
941 789bcaf9 Sofia Papagiannaki
                    THEN 1 ELSE 0 END""" % request.user.id})
942 04febd09 Olga Brani
    sorting = request.GET.get('sorting')
943 04febd09 Olga Brani
    if sorting:
944 04febd09 Olga Brani
        # TODO check sorting value
945 04febd09 Olga Brani
        q = q.order_by(sorting)
946 df67421c Sofia Papagiannaki
    return object_list(
947 f46c95c4 Sofia Papagiannaki
        request,
948 f46c95c4 Sofia Papagiannaki
        q,
949 f46c95c4 Sofia Papagiannaki
        paginate_by=PAGINATE_BY,
950 f46c95c4 Sofia Papagiannaki
        page=request.GET.get('page') or 1,
951 f46c95c4 Sofia Papagiannaki
        template_name='im/astakosgroup_list.html',
952 f46c95c4 Sofia Papagiannaki
        extra_context=dict(form=AstakosGroupSearchForm(),
953 f46c95c4 Sofia Papagiannaki
                           is_search=True,
954 f46c95c4 Sofia Papagiannaki
                           sorting=sorting))
955 df67421c Sofia Papagiannaki
956 01ac12d5 Sofia Papagiannaki
957 01ac12d5 Sofia Papagiannaki
@signed_terms_required
958 01ac12d5 Sofia Papagiannaki
@login_required
959 01ac12d5 Sofia Papagiannaki
def group_join(request, group_id):
960 95a51cdc Sofia Papagiannaki
    m = Membership(group_id=group_id,
961 5ce3ce4f Sofia Papagiannaki
                   person=request.user,
962 789bcaf9 Sofia Papagiannaki
                   date_requested=datetime.now())
963 95a51cdc Sofia Papagiannaki
    try:
964 95a51cdc Sofia Papagiannaki
        m.save()
965 0f4fa26d Sofia Papagiannaki
        post_save_redirect = reverse(
966 0f4fa26d Sofia Papagiannaki
            'group_detail',
967 789bcaf9 Sofia Papagiannaki
            kwargs=dict(group_id=group_id))
968 95a51cdc Sofia Papagiannaki
        return HttpResponseRedirect(post_save_redirect)
969 95a51cdc Sofia Papagiannaki
    except IntegrityError, e:
970 95a51cdc Sofia Papagiannaki
        logger.exception(e)
971 95a51cdc Sofia Papagiannaki
        msg = _('Failed to join group.')
972 95a51cdc Sofia Papagiannaki
        messages.error(request, msg)
973 95a51cdc Sofia Papagiannaki
        return group_search(request)
974 01ac12d5 Sofia Papagiannaki
975 5ce3ce4f Sofia Papagiannaki
976 01ac12d5 Sofia Papagiannaki
@signed_terms_required
977 01ac12d5 Sofia Papagiannaki
@login_required
978 01ac12d5 Sofia Papagiannaki
def group_leave(request, group_id):
979 01ac12d5 Sofia Papagiannaki
    try:
980 0f4fa26d Sofia Papagiannaki
        m = Membership.objects.select_related().get(
981 0f4fa26d Sofia Papagiannaki
            group__id=group_id,
982 032ade79 Sofia Papagiannaki
            person=request.user)
983 01ac12d5 Sofia Papagiannaki
    except Membership.DoesNotExist:
984 01ac12d5 Sofia Papagiannaki
        return HttpResponseBadRequest(_('Invalid membership.'))
985 01ac12d5 Sofia Papagiannaki
    if request.user in m.group.owner.all():
986 01ac12d5 Sofia Papagiannaki
        return HttpResponseForbidden(_('Owner can not leave the group.'))
987 0f4fa26d Sofia Papagiannaki
    return delete_object(
988 0f4fa26d Sofia Papagiannaki
        request,
989 0f4fa26d Sofia Papagiannaki
        model=Membership,
990 5ce3ce4f Sofia Papagiannaki
        object_id=m.id,
991 0f4fa26d Sofia Papagiannaki
        template_name='im/astakosgroup_list.html',
992 5ce3ce4f Sofia Papagiannaki
        post_delete_redirect=reverse(
993 0f4fa26d Sofia Papagiannaki
            'group_detail',
994 032ade79 Sofia Papagiannaki
            kwargs=dict(group_id=group_id)))
995 01ac12d5 Sofia Papagiannaki
996 5ce3ce4f Sofia Papagiannaki
997 1eaeb5b6 Sofia Papagiannaki
def handle_membership(func):
998 1eaeb5b6 Sofia Papagiannaki
    @wraps(func)
999 1eaeb5b6 Sofia Papagiannaki
    def wrapper(request, group_id, user_id):
1000 1eaeb5b6 Sofia Papagiannaki
        try:
1001 1eaeb5b6 Sofia Papagiannaki
            m = Membership.objects.select_related().get(
1002 1eaeb5b6 Sofia Papagiannaki
                group__id=group_id,
1003 032ade79 Sofia Papagiannaki
                person__id=user_id)
1004 1eaeb5b6 Sofia Papagiannaki
        except Membership.DoesNotExist:
1005 1eaeb5b6 Sofia Papagiannaki
            return HttpResponseBadRequest(_('Invalid membership.'))
1006 1eaeb5b6 Sofia Papagiannaki
        else:
1007 1eaeb5b6 Sofia Papagiannaki
            if request.user not in m.group.owner.all():
1008 1eaeb5b6 Sofia Papagiannaki
                return HttpResponseForbidden(_('User is not a group owner.'))
1009 1eaeb5b6 Sofia Papagiannaki
            func(request, m)
1010 56b1281c Sofia Papagiannaki
            return group_detail(request, group_id)
1011 1eaeb5b6 Sofia Papagiannaki
    return wrapper
1012 01ac12d5 Sofia Papagiannaki
1013 5ce3ce4f Sofia Papagiannaki
1014 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1015 01ac12d5 Sofia Papagiannaki
@login_required
1016 1eaeb5b6 Sofia Papagiannaki
@handle_membership
1017 01ac12d5 Sofia Papagiannaki
def approve_member(request, membership):
1018 01ac12d5 Sofia Papagiannaki
    try:
1019 01ac12d5 Sofia Papagiannaki
        membership.approve()
1020 01ac12d5 Sofia Papagiannaki
        realname = membership.person.realname
1021 01ac12d5 Sofia Papagiannaki
        msg = _('%s has been successfully joined the group.' % realname)
1022 01ac12d5 Sofia Papagiannaki
        messages.success(request, msg)
1023 01ac12d5 Sofia Papagiannaki
    except BaseException, e:
1024 01ac12d5 Sofia Papagiannaki
        logger.exception(e)
1025 56b1281c Sofia Papagiannaki
        realname = membership.person.realname
1026 01ac12d5 Sofia Papagiannaki
        msg = _('Something went wrong during %s\'s approval.' % realname)
1027 01ac12d5 Sofia Papagiannaki
        messages.error(request, msg)
1028 5ce3ce4f Sofia Papagiannaki
1029 5ce3ce4f Sofia Papagiannaki
1030 01ac12d5 Sofia Papagiannaki
@signed_terms_required
1031 01ac12d5 Sofia Papagiannaki
@login_required
1032 1eaeb5b6 Sofia Papagiannaki
@handle_membership
1033 01ac12d5 Sofia Papagiannaki
def disapprove_member(request, membership):
1034 01ac12d5 Sofia Papagiannaki
    try:
1035 01ac12d5 Sofia Papagiannaki
        membership.disapprove()
1036 01ac12d5 Sofia Papagiannaki
        realname = membership.person.realname
1037 01ac12d5 Sofia Papagiannaki
        msg = _('%s has been successfully removed from the group.' % realname)
1038 01ac12d5 Sofia Papagiannaki
        messages.success(request, msg)
1039 01ac12d5 Sofia Papagiannaki
    except BaseException, e:
1040 01ac12d5 Sofia Papagiannaki
        logger.exception(e)
1041 01ac12d5 Sofia Papagiannaki
        msg = _('Something went wrong during %s\'s disapproval.' % realname)
1042 01ac12d5 Sofia Papagiannaki
        messages.error(request, msg)
1043 ffb1e7a8 Sofia Papagiannaki
1044 5ce3ce4f Sofia Papagiannaki
1045 ffb1e7a8 Sofia Papagiannaki
@signed_terms_required
1046 ffb1e7a8 Sofia Papagiannaki
@login_required
1047 ffb1e7a8 Sofia Papagiannaki
def resource_list(request):
1048 f46c95c4 Sofia Papagiannaki
#     if request.method == 'POST':
1049 f46c95c4 Sofia Papagiannaki
#         form = PickResourceForm(request.POST)
1050 f46c95c4 Sofia Papagiannaki
#         if form.is_valid():
1051 f46c95c4 Sofia Papagiannaki
#             r = form.cleaned_data.get('resource')
1052 f46c95c4 Sofia Papagiannaki
#             if r:
1053 f46c95c4 Sofia Papagiannaki
#                 groups = request.user.membership_set.only('group').filter(
1054 f46c95c4 Sofia Papagiannaki
#                     date_joined__isnull=False)
1055 f46c95c4 Sofia Papagiannaki
#                 groups = [g.group_id for g in groups]
1056 f46c95c4 Sofia Papagiannaki
#                 q = AstakosGroupQuota.objects.select_related().filter(
1057 f46c95c4 Sofia Papagiannaki
#                     resource=r, group__in=groups)
1058 f46c95c4 Sofia Papagiannaki
#     else:
1059 f46c95c4 Sofia Papagiannaki
#         form = PickResourceForm()
1060 f46c95c4 Sofia Papagiannaki
#         q = AstakosGroupQuota.objects.none()
1061 f46c95c4 Sofia Papagiannaki
#
1062 f46c95c4 Sofia Papagiannaki
#     return object_list(request, q,
1063 f46c95c4 Sofia Papagiannaki
#                        template_name='im/astakosuserquota_list.html',
1064 f46c95c4 Sofia Papagiannaki
#                        extra_context={'form': form, 'data':data})
1065 f46c95c4 Sofia Papagiannaki
1066 52343ac8 Olga Brani
    def with_class(entry):
1067 52343ac8 Olga Brani
        entry['load_class'] = 'red'
1068 52343ac8 Olga Brani
        max_value = float(entry['maxValue'])
1069 52343ac8 Olga Brani
        curr_value = float(entry['currValue'])
1070 f46c95c4 Sofia Papagiannaki
        entry['ratio'] = (curr_value / max_value) * 100
1071 52343ac8 Olga Brani
        if entry['ratio'] < 66:
1072 f46c95c4 Sofia Papagiannaki
            entry['load_class'] = 'yellow'
1073 52343ac8 Olga Brani
        if entry['ratio'] < 33:
1074 f46c95c4 Sofia Papagiannaki
            entry['load_class'] = 'green'
1075 f46c95c4 Sofia Papagiannaki
1076 f46c95c4 Sofia Papagiannaki
        return entry
1077 f46c95c4 Sofia Papagiannaki
1078 52343ac8 Olga Brani
    def pluralize(entry):
1079 f46c95c4 Sofia Papagiannaki
        entry['plural'] = engine.plural(entry.get('name'))
1080 f46c95c4 Sofia Papagiannaki
        return entry
1081 f46c95c4 Sofia Papagiannaki
1082 f46c95c4 Sofia Papagiannaki
    c = AstakosDjangoDBCallpoint()
1083 f46c95c4 Sofia Papagiannaki
    try:
1084 f46c95c4 Sofia Papagiannaki
        data = c.get_user_status(request.user.id)
1085 f46c95c4 Sofia Papagiannaki
    except Exception, e:
1086 f46c95c4 Sofia Papagiannaki
        data = None
1087 f46c95c4 Sofia Papagiannaki
        messages.error(request, e)
1088 f46c95c4 Sofia Papagiannaki
    else:
1089 f46c95c4 Sofia Papagiannaki
        backenddata = map(with_class, data)
1090 f46c95c4 Sofia Papagiannaki
        data = map(pluralize, data)
1091 f46c95c4 Sofia Papagiannaki
    return render_response('im/resource_list.html',
1092 f46c95c4 Sofia Papagiannaki
                           data=data,
1093 f46c95c4 Sofia Papagiannaki
                           context_instance=get_context(request))
1094 52343ac8 Olga Brani
1095 f46c95c4 Sofia Papagiannaki
@signed_terms_required
1096 f46c95c4 Sofia Papagiannaki
@login_required
1097 f46c95c4 Sofia Papagiannaki
def group_create_demo(request, kind_name='default'):
1098 f46c95c4 Sofia Papagiannaki
    resources = callpoint.list_resources()
1099 f46c95c4 Sofia Papagiannaki
    resource_catalog = {'resources':defaultdict(defaultdict),
1100 f46c95c4 Sofia Papagiannaki
                        'groups':defaultdict(list)}
1101 f46c95c4 Sofia Papagiannaki
    for r in resources:
1102 f46c95c4 Sofia Papagiannaki
        service = r.get('service', '')
1103 f46c95c4 Sofia Papagiannaki
        name = r.get('name', '')
1104 f46c95c4 Sofia Papagiannaki
        group = r.get('group', '')
1105 f46c95c4 Sofia Papagiannaki
        unit = r.get('unit', '')
1106 f46c95c4 Sofia Papagiannaki
        fullname = '%s%s%s' % (service, RESOURCE_SEPARATOR, name)
1107 f46c95c4 Sofia Papagiannaki
        resource_catalog['resources'][fullname] = dict(unit=unit)
1108 f46c95c4 Sofia Papagiannaki
        resource_catalog['groups'][group].append(fullname)
1109 52343ac8 Olga Brani
    
1110 f46c95c4 Sofia Papagiannaki
    resource_catalog = dict(resource_catalog)
1111 f46c95c4 Sofia Papagiannaki
    for k, v in resource_catalog.iteritems():
1112 f46c95c4 Sofia Papagiannaki
        resource_catalog[k] = dict(v)
1113 f46c95c4 Sofia Papagiannaki
    try:
1114 f46c95c4 Sofia Papagiannaki
        kind = GroupKind.objects.get(name=kind_name)
1115 f46c95c4 Sofia Papagiannaki
    except:
1116 f46c95c4 Sofia Papagiannaki
        return HttpResponseBadRequest(_('No such group kind'))
1117 5ce3ce4f Sofia Papagiannaki
1118 f46c95c4 Sofia Papagiannaki
    post_save_redirect = '/im/group/%(id)s/'
1119 f46c95c4 Sofia Papagiannaki
    context_processors = None
1120 f46c95c4 Sofia Papagiannaki
    model, form_class = get_model_and_form_class(
1121 f46c95c4 Sofia Papagiannaki
        model=None,
1122 f46c95c4 Sofia Papagiannaki
        form_class=AstakosGroupCreationForm
1123 f46c95c4 Sofia Papagiannaki
    )
1124 f46c95c4 Sofia Papagiannaki
    
1125 f46c95c4 Sofia Papagiannaki
    if request.method == 'POST':
1126 f46c95c4 Sofia Papagiannaki
        form = form_class(request.POST, request.FILES)
1127 f46c95c4 Sofia Papagiannaki
        if form.is_valid():
1128 f46c95c4 Sofia Papagiannaki
            new_object = form.save()
1129 f46c95c4 Sofia Papagiannaki
            new_object.policies = form.policies()
1130 5ce3ce4f Sofia Papagiannaki
1131 f46c95c4 Sofia Papagiannaki
            # save owner
1132 f46c95c4 Sofia Papagiannaki
            new_object.owners = [request.user]
1133 f46c95c4 Sofia Papagiannaki
            
1134 f46c95c4 Sofia Papagiannaki
            msg = _("The %(verbose_name)s was created successfully.") %\
1135 f46c95c4 Sofia Papagiannaki
                {"verbose_name": model._meta.verbose_name}
1136 f46c95c4 Sofia Papagiannaki
            messages.success(request, msg, fail_silently=True)
1137 1b866d9e Olga Brani
1138 f46c95c4 Sofia Papagiannaki
            # send notification
1139 f46c95c4 Sofia Papagiannaki
            try:
1140 f46c95c4 Sofia Papagiannaki
                send_group_creation_notification(
1141 f46c95c4 Sofia Papagiannaki
                    template_name='im/group_creation_notification.txt',
1142 f46c95c4 Sofia Papagiannaki
                    dictionary={
1143 f46c95c4 Sofia Papagiannaki
                        'group': new_object,
1144 f46c95c4 Sofia Papagiannaki
                        'owner': request.user,
1145 f46c95c4 Sofia Papagiannaki
                        'policies': list(form.policies()),
1146 f46c95c4 Sofia Papagiannaki
                    }
1147 f46c95c4 Sofia Papagiannaki
                )
1148 f46c95c4 Sofia Papagiannaki
            except SendNotificationError, e:
1149 f46c95c4 Sofia Papagiannaki
                messages.error(request, e, fail_silently=True)
1150 f46c95c4 Sofia Papagiannaki
            return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
1151 f46c95c4 Sofia Papagiannaki
    else:
1152 f46c95c4 Sofia Papagiannaki
        now = datetime.now()
1153 f46c95c4 Sofia Papagiannaki
        data = {
1154 f46c95c4 Sofia Papagiannaki
            'kind': kind
1155 1b866d9e Olga Brani
        }
1156 f46c95c4 Sofia Papagiannaki
        form = form_class(data)
1157 f46c95c4 Sofia Papagiannaki
1158 f46c95c4 Sofia Papagiannaki
    # Create the template, context, response
1159 f46c95c4 Sofia Papagiannaki
    template_name = "%s/%s_form_demo.html" % (
1160 f46c95c4 Sofia Papagiannaki
        model._meta.app_label,
1161 f46c95c4 Sofia Papagiannaki
        model._meta.object_name.lower()
1162 f46c95c4 Sofia Papagiannaki
    )
1163 f46c95c4 Sofia Papagiannaki
    t = template_loader.get_template(template_name)
1164 f46c95c4 Sofia Papagiannaki
    c = RequestContext(request, {
1165 f46c95c4 Sofia Papagiannaki
        'form': form,
1166 f46c95c4 Sofia Papagiannaki
        'kind': kind,
1167 f46c95c4 Sofia Papagiannaki
        'resource_catalog':resource_catalog
1168 f46c95c4 Sofia Papagiannaki
    }, context_processors)
1169 f46c95c4 Sofia Papagiannaki
    return HttpResponse(t.render(c))
1170 1b866d9e Olga Brani
1171 1b866d9e Olga Brani
1172 4b7d68f0 Olga Brani
def group_create_list(request):
1173 f46c95c4 Sofia Papagiannaki
    form = P ickResourceForm()
1174 4b7d68f0 Olga Brani
    return render_response(
1175 4b7d68f0 Olga Brani
        template='im/astakosgroup_create_list.html',
1176 032ade79 Sofia Papagiannaki
        context_instance=get_context(request),)
1177 6e029beb Sofia Papagiannaki
1178 5ce3ce4f Sofia Papagiannaki
1179 6e029beb Sofia Papagiannaki
@signed_terms_required
1180 6e029beb Sofia Papagiannaki
@login_required
1181 6e029beb Sofia Papagiannaki
def billing(request):
1182 f46c95c4 Sofia Papagiannaki
1183 6e029beb Sofia Papagiannaki
    today = datetime.today()
1184 f46c95c4 Sofia Papagiannaki
    month_last_day = calendar.monthrange(today.year, today.month)[1]
1185 f46c95c4 Sofia Papagiannaki
    data['resources'] = map(with_class, data['resources'])
1186 5056da3d Olga Brani
    start = request.POST.get('datefrom', None)
1187 5056da3d Olga Brani
    if start:
1188 5056da3d Olga Brani
        today = datetime.fromtimestamp(int(start))
1189 f46c95c4 Sofia Papagiannaki
        month_last_day = calendar.monthrange(today.year, today.month)[1]
1190 f46c95c4 Sofia Papagiannaki
1191 6e029beb Sofia Papagiannaki
    start = datetime(today.year, today.month, 1).strftime("%s")
1192 6e029beb Sofia Papagiannaki
    end = datetime(today.year, today.month, month_last_day).strftime("%s")
1193 4de59eac Olga Brani
    r = request_billing.apply(args=('pgerakios@grnet.gr',
1194 5ce3ce4f Sofia Papagiannaki
                                    int(start) * 1000,
1195 5056da3d Olga Brani
                                    int(end) * 1000))
1196 5056da3d Olga Brani
    data = {}
1197 f46c95c4 Sofia Papagiannaki
1198 6e029beb Sofia Papagiannaki
    try:
1199 6e029beb Sofia Papagiannaki
        status, data = r.result
1200 f46c95c4 Sofia Papagiannaki
        data = _clear_billing_data(data)
1201 6e029beb Sofia Papagiannaki
        if status != 200:
1202 6e029beb Sofia Papagiannaki
            messages.error(request, _('Service response status: %d' % status))
1203 6e029beb Sofia Papagiannaki
    except:
1204 6e029beb Sofia Papagiannaki
        messages.error(request, r.result)
1205 f46c95c4 Sofia Papagiannaki
1206 5056da3d Olga Brani
    print type(start)
1207 f46c95c4 Sofia Papagiannaki
1208 6e029beb Sofia Papagiannaki
    return render_response(
1209 6e029beb Sofia Papagiannaki
        template='im/billing.html',
1210 6e029beb Sofia Papagiannaki
        context_instance=get_context(request),
1211 5056da3d Olga Brani
        data=data,
1212 f46c95c4 Sofia Papagiannaki
        zerodate=datetime(month=1, year=1970, day=1),
1213 5056da3d Olga Brani
        today=today,
1214 5056da3d Olga Brani
        start=int(start),
1215 f46c95c4 Sofia Papagiannaki
        month_last_day=month_last_day)
1216 f46c95c4 Sofia Papagiannaki
1217 f46c95c4 Sofia Papagiannaki
1218 0f225db4 Sofia Papagiannaki
def _clear_billing_data(data):
1219 f46c95c4 Sofia Papagiannaki
1220 5056da3d Olga Brani
    # remove addcredits entries
1221 5056da3d Olga Brani
    def isnotcredit(e):
1222 5056da3d Olga Brani
        return e['serviceName'] != "addcredits"
1223 f46c95c4 Sofia Papagiannaki
1224 f46c95c4 Sofia Papagiannaki
    # separate services
1225 5056da3d Olga Brani
    def servicefilter(service_name):
1226 5056da3d Olga Brani
        service = service_name
1227 f46c95c4 Sofia Papagiannaki
1228 5056da3d Olga Brani
        def fltr(e):
1229 5056da3d Olga Brani
            return e['serviceName'] == service
1230 5056da3d Olga Brani
        return fltr
1231 f46c95c4 Sofia Papagiannaki
1232 5056da3d Olga Brani
    data['bill_nocredits'] = filter(isnotcredit, data['bill'])
1233 5056da3d Olga Brani
    data['bill_vmtime'] = filter(servicefilter('vmtime'), data['bill'])
1234 5056da3d Olga Brani
    data['bill_diskspace'] = filter(servicefilter('diskspace'), data['bill'])
1235 4de59eac Olga Brani
    data['bill_addcredits'] = filter(servicefilter('addcredits'), data['bill'])
1236 f46c95c4 Sofia Papagiannaki
1237 bde71886 Olga Brani
    return data
1238 bde71886 Olga Brani
1239 54213d7a Sofia Papagiannaki
1240 f46c95c4 Sofia Papagiannaki
def group_create_demo(request):
1241 f46c95c4 Sofia Papagiannaki
    return render_response(
1242 f46c95c4 Sofia Papagiannaki
        template='im/astakosgroup_form_demo.html',
1243 f46c95c4 Sofia Papagiannaki
        context_instance=get_context(request))
1244 f46c95c4 Sofia Papagiannaki
1245 f46c95c4 Sofia Papagiannaki
    return data
1246 1b866d9e Olga Brani
     
1247 1b866d9e Olga Brani
     
1248 3bcad004 Sofia Papagiannaki
@signed_terms_required
1249 3bcad004 Sofia Papagiannaki
@login_required
1250 54213d7a Sofia Papagiannaki
def timeline(request):
1251 88305cf0 root
#    data = {'entity':request.user.email}
1252 2925e285 root
    timeline_body = ()
1253 2925e285 root
    timeline_header = ()
1254 88305cf0 root
#    form = TimelineForm(data)
1255 88305cf0 root
    form = TimelineForm()
1256 54213d7a Sofia Papagiannaki
    if request.method == 'POST':
1257 54213d7a Sofia Papagiannaki
        data = request.POST
1258 2925e285 root
        form = TimelineForm(data)
1259 2925e285 root
        if form.is_valid():
1260 2925e285 root
            data = form.cleaned_data
1261 2925e285 root
            timeline_header = ('entity', 'resource',
1262 2925e285 root
                               'event name', 'event date',
1263 2925e285 root
                               'incremental cost', 'total cost')
1264 2925e285 root
            timeline_body = timeline_charge(
1265 f46c95c4 Sofia Papagiannaki
                data['entity'], data['resource'],
1266 f46c95c4 Sofia Papagiannaki
                data['start_date'], data['end_date'],
1267 f46c95c4 Sofia Papagiannaki
                data['details'], data['operation'])
1268 f46c95c4 Sofia Papagiannaki
1269 54213d7a Sofia Papagiannaki
    return render_response(template='im/timeline.html',
1270 54213d7a Sofia Papagiannaki
                           context_instance=get_context(request),
1271 54213d7a Sofia Papagiannaki
                           form=form,
1272 c3f6cdf1 root
                           timeline_header=timeline_header,
1273 c3f6cdf1 root
                           timeline_body=timeline_body)
1274 52343ac8 Olga Brani
    return data