Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / forms.py @ 88305cf0

History | View | Annotate | Download (23.8 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 18ffbee1 Sofia Papagiannaki
#
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 18ffbee1 Sofia Papagiannaki
#
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 18ffbee1 Sofia Papagiannaki
#
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 18ffbee1 Sofia Papagiannaki
#
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 18ffbee1 Sofia Papagiannaki
#
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 8f378756 Sofia Papagiannaki
from urlparse import urljoin
34 64cd4730 Antony Chazapis
35 64cd4730 Antony Chazapis
from django import forms
36 64cd4730 Antony Chazapis
from django.utils.translation import ugettext as _
37 aab4d540 Sofia Papagiannaki
from django.contrib.auth.forms import (UserCreationForm, AuthenticationForm,
38 5ce3ce4f Sofia Papagiannaki
                                       PasswordResetForm, PasswordChangeForm
39 5ce3ce4f Sofia Papagiannaki
                                       )
40 e2125441 Sofia Papagiannaki
from django.core.mail import send_mail
41 e2125441 Sofia Papagiannaki
from django.contrib.auth.tokens import default_token_generator
42 e2125441 Sofia Papagiannaki
from django.template import Context, loader
43 e2125441 Sofia Papagiannaki
from django.utils.http import int_to_base36
44 374611bc Sofia Papagiannaki
from django.core.urlresolvers import reverse
45 18ffbee1 Sofia Papagiannaki
from django.utils.safestring import mark_safe
46 49790d9d Sofia Papagiannaki
from django.utils.encoding import smart_str
47 8e45d6fd Sofia Papagiannaki
from django.forms.extras.widgets import SelectDateWidget
48 1cbce16f Sofia Papagiannaki
from django.conf import settings
49 5ed6816e Sofia Papagiannaki
50 54213d7a Sofia Papagiannaki
from astakos.im.models import (AstakosUser, EmailChange, AstakosGroup,
51 54213d7a Sofia Papagiannaki
                               Invitation, Membership, GroupKind, Resource,
52 54213d7a Sofia Papagiannaki
                               get_latest_terms)
53 1cbce16f Sofia Papagiannaki
from astakos.im.settings import (INVITATIONS_PER_LEVEL, BASEURL, SITENAME,
54 54213d7a Sofia Papagiannaki
                                 RECAPTCHA_PRIVATE_KEY, RECAPTCHA_ENABLED,
55 54213d7a Sofia Papagiannaki
                                 DEFAULT_CONTACT_EMAIL, LOGGING_LEVEL)
56 4f78c22c Sofia Papagiannaki
57 45f8d9ff Sofia Papagiannaki
from astakos.im.widgets import DummyWidget, RecaptchaWidget
58 49790d9d Sofia Papagiannaki
from astakos.im.functions import send_change_email
59 270dd48d Sofia Papagiannaki
60 aab4d540 Sofia Papagiannaki
from astakos.im.util import reserved_email, get_query
61 64cd4730 Antony Chazapis
62 3bf924ec Sofia Papagiannaki
import logging
63 49790d9d Sofia Papagiannaki
import hashlib
64 db7fecd9 Sofia Papagiannaki
import recaptcha.client.captcha as captcha
65 49790d9d Sofia Papagiannaki
from random import random
66 64cd4730 Antony Chazapis
67 e015e9e6 Sofia Papagiannaki
logger = logging.getLogger(__name__)
68 e015e9e6 Sofia Papagiannaki
69 5ce3ce4f Sofia Papagiannaki
70 15efc749 Sofia Papagiannaki
class LocalUserCreationForm(UserCreationForm):
71 890b0eaf Sofia Papagiannaki
    """
72 890b0eaf Sofia Papagiannaki
    Extends the built in UserCreationForm in several ways:
73 18ffbee1 Sofia Papagiannaki

74 8316698a Sofia Papagiannaki
    * Adds email, first_name, last_name, recaptcha_challenge_field, recaptcha_response_field field.
75 5ed6816e Sofia Papagiannaki
    * The username field isn't visible and it is assigned a generated id.
76 18ffbee1 Sofia Papagiannaki
    * User created is not active.
77 890b0eaf Sofia Papagiannaki
    """
78 db7fecd9 Sofia Papagiannaki
    recaptcha_challenge_field = forms.CharField(widget=DummyWidget)
79 5ce3ce4f Sofia Papagiannaki
    recaptcha_response_field = forms.CharField(
80 5ce3ce4f Sofia Papagiannaki
        widget=RecaptchaWidget, label='')
81 18ffbee1 Sofia Papagiannaki
82 794852f2 Sofia Papagiannaki
    class Meta:
83 794852f2 Sofia Papagiannaki
        model = AstakosUser
84 5ce3ce4f Sofia Papagiannaki
        fields = ("email", "first_name", "last_name",
85 5ce3ce4f Sofia Papagiannaki
                  "has_signed_terms", "has_signed_terms")
86 18ffbee1 Sofia Papagiannaki
87 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
88 64cd4730 Antony Chazapis
        """
89 890b0eaf Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
90 64cd4730 Antony Chazapis
        """
91 672d445a Sofia Papagiannaki
        request = kwargs.get('request', None)
92 672d445a Sofia Papagiannaki
        if request:
93 672d445a Sofia Papagiannaki
            kwargs.pop('request')
94 672d445a Sofia Papagiannaki
            self.ip = request.META.get('REMOTE_ADDR',
95 672d445a Sofia Papagiannaki
                                       request.META.get('HTTP_X_REAL_IP', None))
96 5ce3ce4f Sofia Papagiannaki
97 15efc749 Sofia Papagiannaki
        super(LocalUserCreationForm, self).__init__(*args, **kwargs)
98 890b0eaf Sofia Papagiannaki
        self.fields.keyOrder = ['email', 'first_name', 'last_name',
99 d8f63346 Sofia Papagiannaki
                                'password1', 'password2']
100 1b3398a0 Olga Brani
101 53bf2659 Sofia Papagiannaki
        if RECAPTCHA_ENABLED:
102 53bf2659 Sofia Papagiannaki
            self.fields.keyOrder.extend(['recaptcha_challenge_field',
103 5ce3ce4f Sofia Papagiannaki
                                         'recaptcha_response_field', ])
104 1b3398a0 Olga Brani
        if get_latest_terms():
105 82b05401 root
                self.fields.keyOrder.append('has_signed_terms')
106 5ce3ce4f Sofia Papagiannaki
107 18ffbee1 Sofia Papagiannaki
        if 'has_signed_terms' in self.fields:
108 18ffbee1 Sofia Papagiannaki
            # Overriding field label since we need to apply a link
109 18ffbee1 Sofia Papagiannaki
            # to the terms within the label
110 18ffbee1 Sofia Papagiannaki
            terms_link_html = '<a href="%s" target="_blank">%s</a>' \
111 5ce3ce4f Sofia Papagiannaki
                % (reverse('latest_terms'), _("the terms"))
112 18ffbee1 Sofia Papagiannaki
            self.fields['has_signed_terms'].label = \
113 5ce3ce4f Sofia Papagiannaki
                mark_safe("I agree with %s" % terms_link_html)
114 18ffbee1 Sofia Papagiannaki
115 af4eb974 Sofia Papagiannaki
    def clean_email(self):
116 af4eb974 Sofia Papagiannaki
        email = self.cleaned_data['email']
117 881c856c Sofia Papagiannaki
        if not email:
118 881c856c Sofia Papagiannaki
            raise forms.ValidationError(_("This field is required"))
119 0a569195 Sofia Papagiannaki
        if reserved_email(email):
120 c37263ea Sofia Papagiannaki
            raise forms.ValidationError(_("This email is already used"))
121 0a569195 Sofia Papagiannaki
        return email
122 18ffbee1 Sofia Papagiannaki
123 270dd48d Sofia Papagiannaki
    def clean_has_signed_terms(self):
124 270dd48d Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
125 270dd48d Sofia Papagiannaki
        if not has_signed_terms:
126 270dd48d Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
127 270dd48d Sofia Papagiannaki
        return has_signed_terms
128 18ffbee1 Sofia Papagiannaki
129 db7fecd9 Sofia Papagiannaki
    def clean_recaptcha_response_field(self):
130 db7fecd9 Sofia Papagiannaki
        if 'recaptcha_challenge_field' in self.cleaned_data:
131 db7fecd9 Sofia Papagiannaki
            self.validate_captcha()
132 db7fecd9 Sofia Papagiannaki
        return self.cleaned_data['recaptcha_response_field']
133 db7fecd9 Sofia Papagiannaki
134 db7fecd9 Sofia Papagiannaki
    def clean_recaptcha_challenge_field(self):
135 db7fecd9 Sofia Papagiannaki
        if 'recaptcha_response_field' in self.cleaned_data:
136 db7fecd9 Sofia Papagiannaki
            self.validate_captcha()
137 db7fecd9 Sofia Papagiannaki
        return self.cleaned_data['recaptcha_challenge_field']
138 db7fecd9 Sofia Papagiannaki
139 db7fecd9 Sofia Papagiannaki
    def validate_captcha(self):
140 db7fecd9 Sofia Papagiannaki
        rcf = self.cleaned_data['recaptcha_challenge_field']
141 db7fecd9 Sofia Papagiannaki
        rrf = self.cleaned_data['recaptcha_response_field']
142 db7fecd9 Sofia Papagiannaki
        check = captcha.submit(rcf, rrf, RECAPTCHA_PRIVATE_KEY, self.ip)
143 db7fecd9 Sofia Papagiannaki
        if not check.is_valid:
144 5ce3ce4f Sofia Papagiannaki
            raise forms.ValidationError(
145 5ce3ce4f Sofia Papagiannaki
                _('You have not entered the correct words'))
146 18ffbee1 Sofia Papagiannaki
147 890b0eaf Sofia Papagiannaki
    def save(self, commit=True):
148 64cd4730 Antony Chazapis
        """
149 890b0eaf Sofia Papagiannaki
        Saves the email, first_name and last_name properties, after the normal
150 890b0eaf Sofia Papagiannaki
        save behavior is complete.
151 890b0eaf Sofia Papagiannaki
        """
152 15efc749 Sofia Papagiannaki
        user = super(LocalUserCreationForm, self).save(commit=False)
153 3bf924ec Sofia Papagiannaki
        user.renew_token()
154 9fb8e808 Sofia Papagiannaki
        if commit:
155 9fb8e808 Sofia Papagiannaki
            user.save()
156 aab4d540 Sofia Papagiannaki
            logger.log(LOGGING_LEVEL, 'Created user %s' % user.email)
157 890b0eaf Sofia Papagiannaki
        return user
158 64cd4730 Antony Chazapis
159 5ce3ce4f Sofia Papagiannaki
160 15efc749 Sofia Papagiannaki
class InvitedLocalUserCreationForm(LocalUserCreationForm):
161 890b0eaf Sofia Papagiannaki
    """
162 062c970c Sofia Papagiannaki
    Extends the LocalUserCreationForm: email is readonly.
163 890b0eaf Sofia Papagiannaki
    """
164 794852f2 Sofia Papagiannaki
    class Meta:
165 794852f2 Sofia Papagiannaki
        model = AstakosUser
166 270dd48d Sofia Papagiannaki
        fields = ("email", "first_name", "last_name", "has_signed_terms")
167 18ffbee1 Sofia Papagiannaki
168 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
169 64cd4730 Antony Chazapis
        """
170 3bf924ec Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
171 64cd4730 Antony Chazapis
        """
172 15efc749 Sofia Papagiannaki
        super(InvitedLocalUserCreationForm, self).__init__(*args, **kwargs)
173 18ffbee1 Sofia Papagiannaki
174 64cd4730 Antony Chazapis
        #set readonly form fields
175 062c970c Sofia Papagiannaki
        ro = ('email', 'username',)
176 4e30244e Sofia Papagiannaki
        for f in ro:
177 4e30244e Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
178 4f78c22c Sofia Papagiannaki
    
179 9fb8e808 Sofia Papagiannaki
    def save(self, commit=True):
180 15efc749 Sofia Papagiannaki
        user = super(InvitedLocalUserCreationForm, self).save(commit=False)
181 881c856c Sofia Papagiannaki
        level = user.invitation.inviter.level + 1
182 881c856c Sofia Papagiannaki
        user.level = level
183 8316698a Sofia Papagiannaki
        user.invitations = INVITATIONS_PER_LEVEL.get(level, 0)
184 8316698a Sofia Papagiannaki
        user.email_verified = True
185 9fb8e808 Sofia Papagiannaki
        if commit:
186 9fb8e808 Sofia Papagiannaki
            user.save()
187 9fb8e808 Sofia Papagiannaki
        return user
188 5ed6816e Sofia Papagiannaki
189 5ce3ce4f Sofia Papagiannaki
190 18ffbee1 Sofia Papagiannaki
class ThirdPartyUserCreationForm(forms.ModelForm):
191 8f5a3a06 Sofia Papagiannaki
    class Meta:
192 8f5a3a06 Sofia Papagiannaki
        model = AstakosUser
193 5ce3ce4f Sofia Papagiannaki
        fields = ("email", "first_name", "last_name",
194 5ce3ce4f Sofia Papagiannaki
                  "third_party_identifier", "has_signed_terms")
195 4f78c22c Sofia Papagiannaki
    
196 8f5a3a06 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
197 8f5a3a06 Sofia Papagiannaki
        """
198 8f5a3a06 Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
199 8f5a3a06 Sofia Papagiannaki
        """
200 0a569195 Sofia Papagiannaki
        self.request = kwargs.get('request', None)
201 0a569195 Sofia Papagiannaki
        if self.request:
202 0a569195 Sofia Papagiannaki
            kwargs.pop('request')
203 8f5a3a06 Sofia Papagiannaki
        super(ThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
204 5ce3ce4f Sofia Papagiannaki
        self.fields.keyOrder = ['email', 'first_name', 'last_name',
205 5ce3ce4f Sofia Papagiannaki
                                'third_party_identifier']
206 8f5a3a06 Sofia Papagiannaki
        if get_latest_terms():
207 8f5a3a06 Sofia Papagiannaki
            self.fields.keyOrder.append('has_signed_terms')
208 18ffbee1 Sofia Papagiannaki
        #set readonly form fields
209 ca828a10 Sofia Papagiannaki
        ro = ["third_party_identifier"]
210 18ffbee1 Sofia Papagiannaki
        for f in ro:
211 18ffbee1 Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
212 5ce3ce4f Sofia Papagiannaki
213 18ffbee1 Sofia Papagiannaki
        if 'has_signed_terms' in self.fields:
214 18ffbee1 Sofia Papagiannaki
            # Overriding field label since we need to apply a link
215 18ffbee1 Sofia Papagiannaki
            # to the terms within the label
216 18ffbee1 Sofia Papagiannaki
            terms_link_html = '<a href="%s" target="_blank">%s</a>' \
217 5ce3ce4f Sofia Papagiannaki
                % (reverse('latest_terms'), _("the terms"))
218 18ffbee1 Sofia Papagiannaki
            self.fields['has_signed_terms'].label = \
219 5ce3ce4f Sofia Papagiannaki
                mark_safe("I agree with %s" % terms_link_html)
220 4f78c22c Sofia Papagiannaki
    
221 18ffbee1 Sofia Papagiannaki
    def clean_email(self):
222 18ffbee1 Sofia Papagiannaki
        email = self.cleaned_data['email']
223 18ffbee1 Sofia Papagiannaki
        if not email:
224 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_("This field is required"))
225 0a569195 Sofia Papagiannaki
        return email
226 5ce3ce4f Sofia Papagiannaki
227 18ffbee1 Sofia Papagiannaki
    def clean_has_signed_terms(self):
228 18ffbee1 Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
229 18ffbee1 Sofia Papagiannaki
        if not has_signed_terms:
230 18ffbee1 Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
231 18ffbee1 Sofia Papagiannaki
        return has_signed_terms
232 5ce3ce4f Sofia Papagiannaki
233 8f5a3a06 Sofia Papagiannaki
    def save(self, commit=True):
234 8f5a3a06 Sofia Papagiannaki
        user = super(ThirdPartyUserCreationForm, self).save(commit=False)
235 8f5a3a06 Sofia Papagiannaki
        user.set_unusable_password()
236 18ffbee1 Sofia Papagiannaki
        user.renew_token()
237 0a569195 Sofia Papagiannaki
        user.provider = get_query(self.request).get('provider')
238 8f5a3a06 Sofia Papagiannaki
        if commit:
239 8f5a3a06 Sofia Papagiannaki
            user.save()
240 aab4d540 Sofia Papagiannaki
            logger.log(LOGGING_LEVEL, 'Created user %s' % user.email)
241 8f5a3a06 Sofia Papagiannaki
        return user
242 8f5a3a06 Sofia Papagiannaki
243 5ce3ce4f Sofia Papagiannaki
244 8f5a3a06 Sofia Papagiannaki
class InvitedThirdPartyUserCreationForm(ThirdPartyUserCreationForm):
245 4e30244e Sofia Papagiannaki
    """
246 062c970c Sofia Papagiannaki
    Extends the ThirdPartyUserCreationForm: email is readonly.
247 4e30244e Sofia Papagiannaki
    """
248 8f5a3a06 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
249 4e30244e Sofia Papagiannaki
        """
250 4e30244e Sofia Papagiannaki
        Changes the order of fields, and removes the username field.
251 4e30244e Sofia Papagiannaki
        """
252 5ce3ce4f Sofia Papagiannaki
        super(
253 5ce3ce4f Sofia Papagiannaki
            InvitedThirdPartyUserCreationForm, self).__init__(*args, **kwargs)
254 4e30244e Sofia Papagiannaki
255 8f5a3a06 Sofia Papagiannaki
        #set readonly form fields
256 062c970c Sofia Papagiannaki
        ro = ('email',)
257 4e30244e Sofia Papagiannaki
        for f in ro:
258 4e30244e Sofia Papagiannaki
            self.fields[f].widget.attrs['readonly'] = True
259 5ce3ce4f Sofia Papagiannaki
260 4e30244e Sofia Papagiannaki
    def save(self, commit=True):
261 5ce3ce4f Sofia Papagiannaki
        user = super(
262 5ce3ce4f Sofia Papagiannaki
            InvitedThirdPartyUserCreationForm, self).save(commit=False)
263 4e30244e Sofia Papagiannaki
        level = user.invitation.inviter.level + 1
264 4e30244e Sofia Papagiannaki
        user.level = level
265 4e30244e Sofia Papagiannaki
        user.invitations = INVITATIONS_PER_LEVEL.get(level, 0)
266 4e30244e Sofia Papagiannaki
        user.email_verified = True
267 4e30244e Sofia Papagiannaki
        if commit:
268 4e30244e Sofia Papagiannaki
            user.save()
269 4e30244e Sofia Papagiannaki
        return user
270 8f5a3a06 Sofia Papagiannaki
271 5ce3ce4f Sofia Papagiannaki
272 18ffbee1 Sofia Papagiannaki
class ShibbolethUserCreationForm(ThirdPartyUserCreationForm):
273 5ce3ce4f Sofia Papagiannaki
    additional_email = forms.CharField(
274 5ce3ce4f Sofia Papagiannaki
        widget=forms.HiddenInput(), label='', required=False)
275 4f78c22c Sofia Papagiannaki
    
276 ca828a10 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
277 ca828a10 Sofia Papagiannaki
        super(ShibbolethUserCreationForm, self).__init__(*args, **kwargs)
278 ca828a10 Sofia Papagiannaki
        self.fields.keyOrder.append('additional_email')
279 ca828a10 Sofia Papagiannaki
        # copy email value to additional_mail in case user will change it
280 ca828a10 Sofia Papagiannaki
        name = 'email'
281 ca828a10 Sofia Papagiannaki
        field = self.fields[name]
282 5ce3ce4f Sofia Papagiannaki
        self.initial['additional_email'] = self.initial.get(name,
283 5ce3ce4f Sofia Papagiannaki
                                                            field.initial)
284 4f78c22c Sofia Papagiannaki
    
285 18ffbee1 Sofia Papagiannaki
    def clean_email(self):
286 18ffbee1 Sofia Papagiannaki
        email = self.cleaned_data['email']
287 5ce3ce4f Sofia Papagiannaki
        for user in AstakosUser.objects.filter(email=email):
288 0a569195 Sofia Papagiannaki
            if user.provider == 'shibboleth':
289 18ffbee1 Sofia Papagiannaki
                raise forms.ValidationError(_("This email is already associated with another shibboleth account."))
290 591d0505 Sofia Papagiannaki
            elif not user.is_active:
291 591d0505 Sofia Papagiannaki
                raise forms.ValidationError(_("This email is already associated with an inactive account. \
292 591d0505 Sofia Papagiannaki
                                              You need to wait to be activated before being able to switch to a shibboleth account."))
293 ab8f7956 Sofia Papagiannaki
        super(ShibbolethUserCreationForm, self).clean_email()
294 0a569195 Sofia Papagiannaki
        return email
295 4e30244e Sofia Papagiannaki
296 5ce3ce4f Sofia Papagiannaki
297 0a569195 Sofia Papagiannaki
class InvitedShibbolethUserCreationForm(ShibbolethUserCreationForm, InvitedThirdPartyUserCreationForm):
298 4e30244e Sofia Papagiannaki
    pass
299 5ce3ce4f Sofia Papagiannaki
300 5ce3ce4f Sofia Papagiannaki
301 5ed6816e Sofia Papagiannaki
class LoginForm(AuthenticationForm):
302 5ed6816e Sofia Papagiannaki
    username = forms.EmailField(label=_("Email"))
303 672d445a Sofia Papagiannaki
    recaptcha_challenge_field = forms.CharField(widget=DummyWidget)
304 5ce3ce4f Sofia Papagiannaki
    recaptcha_response_field = forms.CharField(
305 5ce3ce4f Sofia Papagiannaki
        widget=RecaptchaWidget, label='')
306 4f78c22c Sofia Papagiannaki
    
307 672d445a Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
308 672d445a Sofia Papagiannaki
        was_limited = kwargs.get('was_limited', False)
309 672d445a Sofia Papagiannaki
        request = kwargs.get('request', None)
310 672d445a Sofia Papagiannaki
        if request:
311 672d445a Sofia Papagiannaki
            self.ip = request.META.get('REMOTE_ADDR',
312 672d445a Sofia Papagiannaki
                                       request.META.get('HTTP_X_REAL_IP', None))
313 5ce3ce4f Sofia Papagiannaki
314 672d445a Sofia Papagiannaki
        t = ('request', 'was_limited')
315 672d445a Sofia Papagiannaki
        for elem in t:
316 672d445a Sofia Papagiannaki
            if elem in kwargs.keys():
317 672d445a Sofia Papagiannaki
                kwargs.pop(elem)
318 672d445a Sofia Papagiannaki
        super(LoginForm, self).__init__(*args, **kwargs)
319 5ce3ce4f Sofia Papagiannaki
320 672d445a Sofia Papagiannaki
        self.fields.keyOrder = ['username', 'password']
321 672d445a Sofia Papagiannaki
        if was_limited and RECAPTCHA_ENABLED:
322 672d445a Sofia Papagiannaki
            self.fields.keyOrder.extend(['recaptcha_challenge_field',
323 5ce3ce4f Sofia Papagiannaki
                                         'recaptcha_response_field', ])
324 4f78c22c Sofia Papagiannaki
    
325 672d445a Sofia Papagiannaki
    def clean_recaptcha_response_field(self):
326 672d445a Sofia Papagiannaki
        if 'recaptcha_challenge_field' in self.cleaned_data:
327 672d445a Sofia Papagiannaki
            self.validate_captcha()
328 672d445a Sofia Papagiannaki
        return self.cleaned_data['recaptcha_response_field']
329 672d445a Sofia Papagiannaki
330 672d445a Sofia Papagiannaki
    def clean_recaptcha_challenge_field(self):
331 672d445a Sofia Papagiannaki
        if 'recaptcha_response_field' in self.cleaned_data:
332 672d445a Sofia Papagiannaki
            self.validate_captcha()
333 672d445a Sofia Papagiannaki
        return self.cleaned_data['recaptcha_challenge_field']
334 672d445a Sofia Papagiannaki
335 672d445a Sofia Papagiannaki
    def validate_captcha(self):
336 672d445a Sofia Papagiannaki
        rcf = self.cleaned_data['recaptcha_challenge_field']
337 672d445a Sofia Papagiannaki
        rrf = self.cleaned_data['recaptcha_response_field']
338 672d445a Sofia Papagiannaki
        check = captcha.submit(rcf, rrf, RECAPTCHA_PRIVATE_KEY, self.ip)
339 672d445a Sofia Papagiannaki
        if not check.is_valid:
340 5ce3ce4f Sofia Papagiannaki
            raise forms.ValidationError(
341 5ce3ce4f Sofia Papagiannaki
                _('You have not entered the correct words'))
342 4f78c22c Sofia Papagiannaki
    
343 eedb3923 Sofia Papagiannaki
    def clean(self):
344 eedb3923 Sofia Papagiannaki
        super(LoginForm, self).clean()
345 21f89374 Sofia Papagiannaki
        if self.user_cache and self.user_cache.provider not in ('local', ''):
346 eedb3923 Sofia Papagiannaki
            raise forms.ValidationError(_('Local login is not the current authentication method for this account.'))
347 eedb3923 Sofia Papagiannaki
        return self.cleaned_data
348 64cd4730 Antony Chazapis
349 5ce3ce4f Sofia Papagiannaki
350 890b0eaf Sofia Papagiannaki
class ProfileForm(forms.ModelForm):
351 890b0eaf Sofia Papagiannaki
    """
352 890b0eaf Sofia Papagiannaki
    Subclass of ``ModelForm`` for permiting user to edit his/her profile.
353 890b0eaf Sofia Papagiannaki
    Most of the fields are readonly since the user is not allowed to change them.
354 18ffbee1 Sofia Papagiannaki

355 890b0eaf Sofia Papagiannaki
    The class defines a save method which sets ``is_verified`` to True so as the user
356 890b0eaf Sofia Papagiannaki
    during the next login will not to be redirected to profile page.
357 890b0eaf Sofia Papagiannaki
    """
358 c301698f Sofia Papagiannaki
    renew = forms.BooleanField(label='Renew token', required=False)
359 18ffbee1 Sofia Papagiannaki
360 890b0eaf Sofia Papagiannaki
    class Meta:
361 890b0eaf Sofia Papagiannaki
        model = AstakosUser
362 5ce3ce4f Sofia Papagiannaki
        fields = ('email', 'first_name', 'last_name', 'auth_token',
363 5ce3ce4f Sofia Papagiannaki
                  'auth_token_expires')
364 18ffbee1 Sofia Papagiannaki
365 64cd4730 Antony Chazapis
    def __init__(self, *args, **kwargs):
366 890b0eaf Sofia Papagiannaki
        super(ProfileForm, self).__init__(*args, **kwargs)
367 890b0eaf Sofia Papagiannaki
        instance = getattr(self, 'instance', None)
368 0a569195 Sofia Papagiannaki
        ro_fields = ('email', 'auth_token', 'auth_token_expires')
369 890b0eaf Sofia Papagiannaki
        if instance and instance.id:
370 890b0eaf Sofia Papagiannaki
            for field in ro_fields:
371 890b0eaf Sofia Papagiannaki
                self.fields[field].widget.attrs['readonly'] = True
372 18ffbee1 Sofia Papagiannaki
373 890b0eaf Sofia Papagiannaki
    def save(self, commit=True):
374 890b0eaf Sofia Papagiannaki
        user = super(ProfileForm, self).save(commit=False)
375 890b0eaf Sofia Papagiannaki
        user.is_verified = True
376 c301698f Sofia Papagiannaki
        if self.cleaned_data.get('renew'):
377 c301698f Sofia Papagiannaki
            user.renew_token()
378 890b0eaf Sofia Papagiannaki
        if commit:
379 890b0eaf Sofia Papagiannaki
            user.save()
380 890b0eaf Sofia Papagiannaki
        return user
381 64cd4730 Antony Chazapis
382 5ce3ce4f Sofia Papagiannaki
383 890b0eaf Sofia Papagiannaki
class FeedbackForm(forms.Form):
384 890b0eaf Sofia Papagiannaki
    """
385 890b0eaf Sofia Papagiannaki
    Form for writing feedback.
386 890b0eaf Sofia Papagiannaki
    """
387 0a569195 Sofia Papagiannaki
    feedback_msg = forms.CharField(widget=forms.Textarea, label=u'Message')
388 8f5a3a06 Sofia Papagiannaki
    feedback_data = forms.CharField(widget=forms.HiddenInput(), label='',
389 8f5a3a06 Sofia Papagiannaki
                                    required=False)
390 5ed6816e Sofia Papagiannaki
391 5ce3ce4f Sofia Papagiannaki
392 5ed6816e Sofia Papagiannaki
class SendInvitationForm(forms.Form):
393 5ed6816e Sofia Papagiannaki
    """
394 5ed6816e Sofia Papagiannaki
    Form for sending an invitations
395 5ed6816e Sofia Papagiannaki
    """
396 18ffbee1 Sofia Papagiannaki
397 5ce3ce4f Sofia Papagiannaki
    email = forms.EmailField(required=True, label='Email address')
398 5ce3ce4f Sofia Papagiannaki
    first_name = forms.EmailField(label='First name')
399 5ce3ce4f Sofia Papagiannaki
    last_name = forms.EmailField(label='Last name')
400 5ce3ce4f Sofia Papagiannaki
401 e2125441 Sofia Papagiannaki
402 e2125441 Sofia Papagiannaki
class ExtendedPasswordResetForm(PasswordResetForm):
403 e2125441 Sofia Papagiannaki
    """
404 e2125441 Sofia Papagiannaki
    Extends PasswordResetForm by overriding save method:
405 e2125441 Sofia Papagiannaki
    passes a custom from_email in send_mail.
406 18ffbee1 Sofia Papagiannaki

407 e2125441 Sofia Papagiannaki
    Since Django 1.3 this is useless since ``django.contrib.auth.views.reset_password``
408 e2125441 Sofia Papagiannaki
    accepts a from_email argument.
409 e2125441 Sofia Papagiannaki
    """
410 23c271b3 Sofia Papagiannaki
    def clean_email(self):
411 23c271b3 Sofia Papagiannaki
        email = super(ExtendedPasswordResetForm, self).clean_email()
412 23c271b3 Sofia Papagiannaki
        try:
413 0a569195 Sofia Papagiannaki
            user = AstakosUser.objects.get(email=email, is_active=True)
414 23c271b3 Sofia Papagiannaki
            if not user.has_usable_password():
415 5ce3ce4f Sofia Papagiannaki
                raise forms.ValidationError(
416 5ce3ce4f Sofia Papagiannaki
                    _("This account has not a usable password."))
417 aab4d540 Sofia Papagiannaki
        except AstakosUser.DoesNotExist:
418 23c271b3 Sofia Papagiannaki
            raise forms.ValidationError(_('That e-mail address doesn\'t have an associated user account. Are you sure you\'ve registered?'))
419 23c271b3 Sofia Papagiannaki
        return email
420 5ce3ce4f Sofia Papagiannaki
421 5ce3ce4f Sofia Papagiannaki
    def save(
422 5ce3ce4f Sofia Papagiannaki
        self, domain_override=None, email_template_name='registration/password_reset_email.html',
423 5ce3ce4f Sofia Papagiannaki
            use_https=False, token_generator=default_token_generator, request=None):
424 e2125441 Sofia Papagiannaki
        """
425 e2125441 Sofia Papagiannaki
        Generates a one-use only link for resetting password and sends to the user.
426 e2125441 Sofia Papagiannaki
        """
427 e2125441 Sofia Papagiannaki
        for user in self.users_cache:
428 18ffbee1 Sofia Papagiannaki
            url = reverse('django.contrib.auth.views.password_reset_confirm',
429 5ce3ce4f Sofia Papagiannaki
                          kwargs={'uidb36': int_to_base36(user.id),
430 5ce3ce4f Sofia Papagiannaki
                                  'token': token_generator.make_token(user)
431 5ce3ce4f Sofia Papagiannaki
                                  }
432 5ce3ce4f Sofia Papagiannaki
                          )
433 a53b19da Sofia Papagiannaki
            url = urljoin(BASEURL, url)
434 e2125441 Sofia Papagiannaki
            t = loader.get_template(email_template_name)
435 e2125441 Sofia Papagiannaki
            c = {
436 e2125441 Sofia Papagiannaki
                'email': user.email,
437 8f378756 Sofia Papagiannaki
                'url': url,
438 374611bc Sofia Papagiannaki
                'site_name': SITENAME,
439 e2125441 Sofia Papagiannaki
                'user': user,
440 a53b19da Sofia Papagiannaki
                'baseurl': BASEURL,
441 09122dd8 Sofia Papagiannaki
                'support': DEFAULT_CONTACT_EMAIL
442 e2125441 Sofia Papagiannaki
            }
443 1cbce16f Sofia Papagiannaki
            from_email = settings.SERVER_EMAIL
444 4abc7b29 Sofia Papagiannaki
            send_mail(_("Password reset on %s alpha2 testing") % SITENAME,
445 5ce3ce4f Sofia Papagiannaki
                      t.render(Context(c)), from_email, [user.email])
446 5ce3ce4f Sofia Papagiannaki
447 270dd48d Sofia Papagiannaki
448 49790d9d Sofia Papagiannaki
class EmailChangeForm(forms.ModelForm):
449 49790d9d Sofia Papagiannaki
    class Meta:
450 49790d9d Sofia Papagiannaki
        model = EmailChange
451 49790d9d Sofia Papagiannaki
        fields = ('new_email_address',)
452 5ce3ce4f Sofia Papagiannaki
453 49790d9d Sofia Papagiannaki
    def clean_new_email_address(self):
454 49790d9d Sofia Papagiannaki
        addr = self.cleaned_data['new_email_address']
455 49790d9d Sofia Papagiannaki
        if AstakosUser.objects.filter(email__iexact=addr):
456 49790d9d Sofia Papagiannaki
            raise forms.ValidationError(_(u'This email address is already in use. Please supply a different email address.'))
457 49790d9d Sofia Papagiannaki
        return addr
458 5ce3ce4f Sofia Papagiannaki
459 49790d9d Sofia Papagiannaki
    def save(self, email_template_name, request, commit=True):
460 49790d9d Sofia Papagiannaki
        ec = super(EmailChangeForm, self).save(commit=False)
461 49790d9d Sofia Papagiannaki
        ec.user = request.user
462 5ce3ce4f Sofia Papagiannaki
        activation_key = hashlib.sha1(
463 5ce3ce4f Sofia Papagiannaki
            str(random()) + smart_str(ec.new_email_address))
464 5ce3ce4f Sofia Papagiannaki
        ec.activation_key = activation_key.hexdigest()
465 49790d9d Sofia Papagiannaki
        if commit:
466 49790d9d Sofia Papagiannaki
            ec.save()
467 49790d9d Sofia Papagiannaki
        send_change_email(ec, request, email_template_name=email_template_name)
468 49790d9d Sofia Papagiannaki
469 5ce3ce4f Sofia Papagiannaki
470 270dd48d Sofia Papagiannaki
class SignApprovalTermsForm(forms.ModelForm):
471 270dd48d Sofia Papagiannaki
    class Meta:
472 270dd48d Sofia Papagiannaki
        model = AstakosUser
473 270dd48d Sofia Papagiannaki
        fields = ("has_signed_terms",)
474 18ffbee1 Sofia Papagiannaki
475 270dd48d Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
476 270dd48d Sofia Papagiannaki
        super(SignApprovalTermsForm, self).__init__(*args, **kwargs)
477 18ffbee1 Sofia Papagiannaki
478 270dd48d Sofia Papagiannaki
    def clean_has_signed_terms(self):
479 270dd48d Sofia Papagiannaki
        has_signed_terms = self.cleaned_data['has_signed_terms']
480 270dd48d Sofia Papagiannaki
        if not has_signed_terms:
481 270dd48d Sofia Papagiannaki
            raise forms.ValidationError(_('You have to agree with the terms'))
482 270dd48d Sofia Papagiannaki
        return has_signed_terms
483 8f5a3a06 Sofia Papagiannaki
484 5ce3ce4f Sofia Papagiannaki
485 8f5a3a06 Sofia Papagiannaki
class InvitationForm(forms.ModelForm):
486 8f5a3a06 Sofia Papagiannaki
    username = forms.EmailField(label=_("Email"))
487 5ce3ce4f Sofia Papagiannaki
488 18ffbee1 Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
489 18ffbee1 Sofia Papagiannaki
        super(InvitationForm, self).__init__(*args, **kwargs)
490 5ce3ce4f Sofia Papagiannaki
491 8f5a3a06 Sofia Papagiannaki
    class Meta:
492 8f5a3a06 Sofia Papagiannaki
        model = Invitation
493 8f5a3a06 Sofia Papagiannaki
        fields = ('username', 'realname')
494 5ce3ce4f Sofia Papagiannaki
495 8f5a3a06 Sofia Papagiannaki
    def clean_username(self):
496 8f5a3a06 Sofia Papagiannaki
        username = self.cleaned_data['username']
497 8f5a3a06 Sofia Papagiannaki
        try:
498 5ce3ce4f Sofia Papagiannaki
            Invitation.objects.get(username=username)
499 5ce3ce4f Sofia Papagiannaki
            raise forms.ValidationError(
500 5ce3ce4f Sofia Papagiannaki
                _('There is already invitation for this email.'))
501 8f5a3a06 Sofia Papagiannaki
        except Invitation.DoesNotExist:
502 8f5a3a06 Sofia Papagiannaki
            pass
503 18ffbee1 Sofia Papagiannaki
        return username
504 1039bab1 Sofia Papagiannaki
505 5ce3ce4f Sofia Papagiannaki
506 1039bab1 Sofia Papagiannaki
class ExtendedPasswordChangeForm(PasswordChangeForm):
507 1039bab1 Sofia Papagiannaki
    """
508 1039bab1 Sofia Papagiannaki
    Extends PasswordChangeForm by enabling user
509 1039bab1 Sofia Papagiannaki
    to optionally renew also the token.
510 1039bab1 Sofia Papagiannaki
    """
511 1039bab1 Sofia Papagiannaki
    renew = forms.BooleanField(label='Renew token', required=False)
512 5ce3ce4f Sofia Papagiannaki
513 1039bab1 Sofia Papagiannaki
    def __init__(self, user, *args, **kwargs):
514 1039bab1 Sofia Papagiannaki
        super(ExtendedPasswordChangeForm, self).__init__(user, *args, **kwargs)
515 5ce3ce4f Sofia Papagiannaki
516 1039bab1 Sofia Papagiannaki
    def save(self, commit=True):
517 1039bab1 Sofia Papagiannaki
        user = super(ExtendedPasswordChangeForm, self).save(commit=False)
518 1039bab1 Sofia Papagiannaki
        if self.cleaned_data.get('renew'):
519 1039bab1 Sofia Papagiannaki
            user.renew_token()
520 1039bab1 Sofia Papagiannaki
        if commit:
521 1039bab1 Sofia Papagiannaki
            user.save()
522 8e45d6fd Sofia Papagiannaki
        return user
523 8e45d6fd Sofia Papagiannaki
524 5ce3ce4f Sofia Papagiannaki
525 0f4fa26d Sofia Papagiannaki
class AstakosGroupCreationForm(forms.ModelForm):
526 0f4fa26d Sofia Papagiannaki
    kind = forms.ModelChoiceField(
527 0f4fa26d Sofia Papagiannaki
        queryset=GroupKind.objects.all(),
528 0f4fa26d Sofia Papagiannaki
        label="",
529 0f4fa26d Sofia Papagiannaki
        widget=forms.HiddenInput()
530 0f4fa26d Sofia Papagiannaki
    )
531 0f4fa26d Sofia Papagiannaki
    name = forms.URLField()
532 1831a0fe Olga Brani
    moderation_enabled = forms.BooleanField(
533 1831a0fe Olga Brani
        help_text="Check if you want to approve members participation manually",
534 1831a0fe Olga Brani
        required=False   
535 1831a0fe Olga Brani
    )
536 8e45d6fd Sofia Papagiannaki
    
537 0f4fa26d Sofia Papagiannaki
    class Meta:
538 0f4fa26d Sofia Papagiannaki
        model = AstakosGroup
539 5ce3ce4f Sofia Papagiannaki
540 0f4fa26d Sofia Papagiannaki
    def __init__(self, *args, **kwargs):
541 0f4fa26d Sofia Papagiannaki
        try:
542 0f4fa26d Sofia Papagiannaki
            resources = kwargs.pop('resources')
543 0f4fa26d Sofia Papagiannaki
        except KeyError:
544 0f4fa26d Sofia Papagiannaki
            resources = {}
545 0f4fa26d Sofia Papagiannaki
        super(AstakosGroupCreationForm, self).__init__(*args, **kwargs)
546 7faeaef3 Olga Brani
        self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc', 'issue_date',
547 0f4fa26d Sofia Papagiannaki
                                'expiration_date', 'estimated_participants',
548 0f4fa26d Sofia Papagiannaki
                                'moderation_enabled']
549 0f4fa26d Sofia Papagiannaki
        for id, r in resources.iteritems():
550 0f4fa26d Sofia Papagiannaki
            self.fields['resource_%s' % id] = forms.IntegerField(
551 0f4fa26d Sofia Papagiannaki
                label=r,
552 0f4fa26d Sofia Papagiannaki
                required=False,
553 0f4fa26d Sofia Papagiannaki
                help_text=_('Leave it blank for no additional quota.')
554 0f4fa26d Sofia Papagiannaki
            )
555 5ce3ce4f Sofia Papagiannaki
556 0f4fa26d Sofia Papagiannaki
    def resources(self):
557 0f4fa26d Sofia Papagiannaki
        for name, value in self.cleaned_data.items():
558 0f4fa26d Sofia Papagiannaki
            prefix, delimiter, suffix = name.partition('resource_')
559 0f4fa26d Sofia Papagiannaki
            if suffix:
560 0f4fa26d Sofia Papagiannaki
                # yield only those having a value
561 0f4fa26d Sofia Papagiannaki
                if not value:
562 0f4fa26d Sofia Papagiannaki
                    continue
563 0f4fa26d Sofia Papagiannaki
                yield (suffix, value)
564 01ac12d5 Sofia Papagiannaki
565 51c57c9c Sofia Papagiannaki
class AstakosGroupUpdateForm(forms.ModelForm):
566 51c57c9c Sofia Papagiannaki
    class Meta:
567 51c57c9c Sofia Papagiannaki
        model = AstakosGroup
568 51c57c9c Sofia Papagiannaki
        fields = ('homepage', 'desc')
569 5ce3ce4f Sofia Papagiannaki
570 a4233484 Sofia Papagiannaki
class AddGroupMembersForm(forms.Form):
571 a4233484 Sofia Papagiannaki
    q = forms.CharField(max_length=800, widget=forms.Textarea, label=_('Search users'),
572 a4233484 Sofia Papagiannaki
                        help_text=_('Add comma separated user emails'),
573 a4233484 Sofia Papagiannaki
                        required=True)
574 a4233484 Sofia Papagiannaki
    
575 a4233484 Sofia Papagiannaki
    def clean(self):
576 a4233484 Sofia Papagiannaki
        q = self.cleaned_data.get('q') or ''
577 a4233484 Sofia Papagiannaki
        users = q.split(',')
578 a4233484 Sofia Papagiannaki
        users = list(u.strip() for u in users if u)
579 a4233484 Sofia Papagiannaki
        db_entries = AstakosUser.objects.filter(email__in=users)
580 a4233484 Sofia Papagiannaki
        unknown = list(set(users) - set(u.email for u in db_entries))
581 a4233484 Sofia Papagiannaki
        if unknown:
582 a4233484 Sofia Papagiannaki
            raise forms.ValidationError(
583 9e5075ef Sofia Papagiannaki
                _('Unknown users: %s' % ','.join(unknown)))
584 a4233484 Sofia Papagiannaki
        self.valid_users = db_entries
585 a4233484 Sofia Papagiannaki
        return self.cleaned_data
586 a4233484 Sofia Papagiannaki
    
587 a4233484 Sofia Papagiannaki
    def get_valid_users(self):
588 a4233484 Sofia Papagiannaki
        """Should be called after form cleaning"""
589 a4233484 Sofia Papagiannaki
        try:
590 a4233484 Sofia Papagiannaki
            return self.valid_users
591 a4233484 Sofia Papagiannaki
        except:
592 a4233484 Sofia Papagiannaki
            return ()
593 a4233484 Sofia Papagiannaki
594 a4233484 Sofia Papagiannaki
595 01ac12d5 Sofia Papagiannaki
class AstakosGroupSearchForm(forms.Form):
596 5ce3ce4f Sofia Papagiannaki
    q = forms.CharField(max_length=200, label='Search group')
597 54213d7a Sofia Papagiannaki
598 54213d7a Sofia Papagiannaki
class TimelineForm(forms.Form):
599 88305cf0 root
#    entity = forms.CharField(
600 88305cf0 root
#        widget=forms.HiddenInput(), label='')
601 88305cf0 root
    entity = forms.ModelChoiceField(
602 88305cf0 root
        queryset=AstakosUser.objects.filter(is_active = True)
603 88305cf0 root
    )
604 54213d7a Sofia Papagiannaki
    resource = forms.ModelChoiceField(
605 6e52912b Sofia Papagiannaki
        queryset=Resource.objects.all()
606 54213d7a Sofia Papagiannaki
    )
607 54213d7a Sofia Papagiannaki
    start_date = forms.DateTimeField()
608 54213d7a Sofia Papagiannaki
    end_date = forms.DateTimeField()
609 82b05401 root
    details = forms.BooleanField(required=False, label="Detailed Listing")
610 82b05401 root
    operation = forms.ChoiceField(
611 82b05401 root
                        label   = 'Charge Method',
612 82b05401 root
                        choices = ( ('',                '-------------'),
613 82b05401 root
                                    ('charge_usage',    'Charge Usage'),
614 82b05401 root
                                    ('charge_traffic',  'Charge Traffic'), )
615 82b05401 root
                )
616 6e52912b Sofia Papagiannaki
    def clean(self):
617 6e52912b Sofia Papagiannaki
        super(TimelineForm, self).clean()
618 6e52912b Sofia Papagiannaki
        d = self.cleaned_data
619 6e52912b Sofia Papagiannaki
        if 'resource' in d:
620 6e52912b Sofia Papagiannaki
            d['resource'] = str(d['resource'])
621 6e52912b Sofia Papagiannaki
        if 'start_date' in d:
622 c3f6cdf1 root
            d['start_date'] = d['start_date'].strftime("%Y-%m-%dT%H:%M:%S.%f")[:24]
623 6e52912b Sofia Papagiannaki
        if 'end_date' in d:
624 c3f6cdf1 root
            d['end_date'] = d['end_date'].strftime("%Y-%m-%dT%H:%M:%S.%f")[:24]
625 88305cf0 root
        if 'entity' in d:
626 88305cf0 root
            d['entity'] = d['entity'].email 
627 c3f6cdf1 root
        return d
628 c3f6cdf1 root
629 789bcaf9 Sofia Papagiannaki
class AstakosGroupSortForm(forms.Form):
630 789bcaf9 Sofia Papagiannaki
    sort_by = forms.ChoiceField(label='Sort by',
631 789bcaf9 Sofia Papagiannaki
                                choices=(('groupname', 'Name'), ('kindname', 'Type')),
632 1b3db4f0 root
                                required=False)