Revision ef1fb98b

b/snf-astakos-app/astakos/im/forms.py
191 191
        save behavior is complete.
192 192
        """
193 193
        user = super(LocalUserCreationForm, self).save(commit=False, **kwargs)
194
        user.has_signed_terms = True
194 195
        user.date_signed_terms = datetime.now()
195 196
        user.renew_token()
196 197
        if commit:
......
303 304
                                                            **kwargs)
304 305
        user.set_unusable_password()
305 306
        user.renew_token()
307
        user.has_signed_terms = True
306 308
        user.date_signed_terms = datetime.now()
307 309
        if commit:
308 310
            user.save(**kwargs)
b/snf-astakos-app/astakos/im/management/commands/term-add.py
34 34
from os.path import abspath
35 35

  
36 36
from django.core.management.base import BaseCommand, CommandError
37
from django.db import transaction
37 38

  
38
from astakos.im.models import ApprovalTerms
39
from astakos.im.models import ApprovalTerms, AstakosUser
39 40

  
40 41

  
41 42
class Command(BaseCommand):
42 43
    args = "<location>"
43 44
    help = "Insert approval terms"
44 45

  
46
    @transaction.commit_on_success
45 47
    def handle(self, *args, **options):
46 48
        if len(args) != 1:
47 49
            raise CommandError("Invalid number of arguments")
......
54 56

  
55 57
        terms = ApprovalTerms(location=location)
56 58
        terms.save()
59
        AstakosUser.objects.select_for_update().\
60
            filter(has_signed_terms=True).\
61
            update(has_signed_terms=False, date_signed_terms=None)
57 62

  
58 63
        msg = "Created term id %d" % (terms.id,)
59 64
        self.stdout.write(msg + '\n')
b/snf-astakos-app/astakos/im/management/commands/user-add.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
from optparse import make_option
35
from datetime import datetime
35 36

  
36 37
from django.db import transaction
37 38
from django.core.management.base import BaseCommand, CommandError
38 39
from django.core.validators import validate_email
39 40
from django.core.exceptions import ValidationError
40 41

  
41
from astakos.im.models import AstakosUser
42
from astakos.im.models import AstakosUser, get_latest_terms
42 43

  
43 44

  
44 45
class Command(BaseCommand):
......
83 84
        except ValidationError:
84 85
            raise CommandError("Invalid email")
85 86

  
87
        if get_latest_terms() is not None:
88
            has_signed_terms = False
89
            date_signed_terms = None
90
        else:
91
            has_signed_terms = True
92
            date_signed_terms = datetime.now()
93

  
86 94
        try:
87 95
            u = AstakosUser(email=email,
88 96
                            first_name=first_name,
89 97
                            last_name=last_name,
98
                            has_signed_terms=has_signed_terms,
99
                            date_signed_terms=date_signed_terms,
90 100
                            is_superuser=options['is_superuser'])
91 101
            u.set_password(password)
92 102
            u.save()
b/snf-astakos-app/astakos/im/management/commands/user-modify.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
import string
35
from datetime import datetime
35 36

  
36 37
from optparse import make_option
37 38

  
......
138 139
        make_option('--reject-reason',
139 140
                    dest='reject_reason',
140 141
                    help="Reason user got rejected"),
142
        make_option('--sign-terms',
143
                    default=False,
144
                    action='store_true',
145
                    help="Sign terms"),
141 146
        make_option('--base-quota',
142 147
                    dest='set_base_quota',
143 148
                    metavar='<resource> <capacity>',
......
311 316
        if options['renew_token']:
312 317
            user.renew_token()
313 318

  
319
        if options['sign_terms']:
320
            user.has_signed_terms = True
321
            user.date_signed_terms = datetime.now()
322

  
314 323
        try:
315 324
            user.save()
316 325
        except ValidationError, e:
b/snf-astakos-app/astakos/im/migrations/0059_sign_terms.py
1
# -*- coding: utf-8 -*-
2
import datetime
3
from south.db import db
4
from south.v2 import DataMigration
5
from django.db import models
6

  
7
class Migration(DataMigration):
8

  
9
    def forwards(self, orm):
10
        if orm.ApprovalTerms.objects.all().count() == 0:
11
            orm.AstakosUser.objects.update(
12
                has_signed_terms=True,
13
                date_signed_terms=datetime.datetime.now())
14

  
15
    def backwards(self, orm):
16
        "Write your backwards methods here."
17

  
18
    models = {
19
        'auth.group': {
20
            'Meta': {'object_name': 'Group'},
21
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
22
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
23
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
24
        },
25
        'auth.permission': {
26
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
27
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
28
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
29
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
30
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
31
        },
32
        'auth.user': {
33
            'Meta': {'object_name': 'User'},
34
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
35
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
36
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
37
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
38
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
39
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
40
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
41
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
42
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
43
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
44
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
45
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
46
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
47
        },
48
        'contenttypes.contenttype': {
49
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
50
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
51
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
52
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
53
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
54
        },
55
        'im.additionalmail': {
56
            'Meta': {'object_name': 'AdditionalMail'},
57
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
58
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
60
        },
61
        'im.approvalterms': {
62
            'Meta': {'object_name': 'ApprovalTerms'},
63
            'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
64
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
65
            'location': ('django.db.models.fields.CharField', [], {'max_length': '255'})
66
        },
67
        'im.astakosuser': {
68
            'Meta': {'object_name': 'AstakosUser', '_ormbases': ['auth.User']},
69
            'accepted_email': ('django.db.models.fields.EmailField', [], {'default': 'None', 'max_length': '75', 'null': 'True', 'blank': 'True'}),
70
            'accepted_policy': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}),
71
            'activation_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
72
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
73
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
74
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
75
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
76
            'date_signed_terms': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
77
            'deactivated_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
78
            'deactivated_reason': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
79
            'disturbed_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
80
            'email_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
81
            'has_credits': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
82
            'has_signed_terms': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
83
            'invitations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
84
            'is_rejected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
85
            'is_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
86
            'level': ('django.db.models.fields.IntegerField', [], {'default': '4'}),
87
            'moderated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
88
            'moderated_at': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
89
            'moderated_data': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
90
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosUserQuota']", 'symmetrical': 'False'}),
91
            'rejected_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
92
            'updated': ('django.db.models.fields.DateTimeField', [], {}),
93
            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}),
94
            'uuid': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True'}),
95
            'verification_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True'}),
96
            'verified_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
97
        },
98
        'im.astakosuserauthprovider': {
99
            'Meta': {'ordering': "('module', 'created')", 'unique_together': "(('identifier', 'module', 'user'),)", 'object_name': 'AstakosUserAuthProvider'},
100
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
101
            'affiliation': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}),
102
            'auth_backend': ('django.db.models.fields.CharField', [], {'default': "'astakos'", 'max_length': '255'}),
103
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
104
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
105
            'identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
106
            'info_data': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': 'True'}),
107
            'module': ('django.db.models.fields.CharField', [], {'default': "'local'", 'max_length': '255'}),
108
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_providers'", 'to': "orm['im.AstakosUser']"})
109
        },
110
        'im.astakosuserquota': {
111
            'Meta': {'unique_together': "(('resource', 'user'),)", 'object_name': 'AstakosUserQuota'},
112
            'capacity': ('django.db.models.fields.BigIntegerField', [], {}),
113
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
114
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
115
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
116
        },
117
        'im.authproviderpolicyprofile': {
118
            'Meta': {'ordering': "['priority']", 'object_name': 'AuthProviderPolicyProfile'},
119
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
120
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authpolicy_profiles'", 'symmetrical': 'False', 'to': "orm['auth.Group']"}),
121
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
122
            'is_exclusive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
123
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
124
            'policy_add': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
125
            'policy_automoderate': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
126
            'policy_create': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
127
            'policy_limit': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
128
            'policy_login': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
129
            'policy_remove': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
130
            'policy_required': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
131
            'policy_switch': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
132
            'priority': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
133
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
134
            'users': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authpolicy_profiles'", 'symmetrical': 'False', 'to': "orm['im.AstakosUser']"})
135
        },
136
        'im.chain': {
137
            'Meta': {'object_name': 'Chain'},
138
            'chain': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
139
        },
140
        'im.component': {
141
            'Meta': {'object_name': 'Component'},
142
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '64', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
143
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
144
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
145
            'base_url': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
146
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
147
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
148
            'url': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'})
149
        },
150
        'im.emailchange': {
151
            'Meta': {'object_name': 'EmailChange'},
152
            'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
153
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
154
            'new_email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
155
            'requested_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
156
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emailchanges'", 'unique': 'True', 'to': "orm['im.AstakosUser']"})
157
        },
158
        'im.endpoint': {
159
            'Meta': {'object_name': 'Endpoint'},
160
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
161
            'service': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'endpoints'", 'to': "orm['im.Service']"})
162
        },
163
        'im.endpointdata': {
164
            'Meta': {'unique_together': "(('endpoint', 'key'),)", 'object_name': 'EndpointData'},
165
            'endpoint': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'data'", 'to': "orm['im.Endpoint']"}),
166
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
167
            'key': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
168
            'value': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
169
        },
170
        'im.invitation': {
171
            'Meta': {'object_name': 'Invitation'},
172
            'code': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
173
            'consumed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
174
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
175
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
176
            'inviter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'invitations_sent'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
177
            'is_consumed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
178
            'realname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
179
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
180
        },
181
        'im.pendingthirdpartyuser': {
182
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'PendingThirdPartyUser'},
183
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
184
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
185
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
186
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
187
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
188
            'info': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': 'True'}),
189
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
190
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
191
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
192
            'token': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
193
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
194
        },
195
        'im.project': {
196
            'Meta': {'object_name': 'Project'},
197
            'application': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'project'", 'unique': 'True', 'to': "orm['im.ProjectApplication']"}),
198
            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
199
            'id': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True', 'db_column': "'id'"}),
200
            'members': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.AstakosUser']", 'through': "orm['im.ProjectMembership']", 'symmetrical': 'False'}),
201
            'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True', 'null': 'True', 'db_index': 'True'}),
202
            'state': ('django.db.models.fields.IntegerField', [], {'default': '1', 'db_index': 'True'})
203
        },
204
        'im.projectapplication': {
205
            'Meta': {'unique_together': "(('chain', 'id'),)", 'object_name': 'ProjectApplication'},
206
            'applicant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'projects_applied'", 'to': "orm['im.AstakosUser']"}),
207
            'chain': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'chained_apps'", 'db_column': "'chain'", 'to': "orm['im.Project']"}),
208
            'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
209
            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
210
            'end_date': ('django.db.models.fields.DateTimeField', [], {}),
211
            'homepage': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True'}),
212
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
213
            'issue_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
214
            'limit_on_members_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
215
            'member_join_policy': ('django.db.models.fields.IntegerField', [], {}),
216
            'member_leave_policy': ('django.db.models.fields.IntegerField', [], {}),
217
            'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
218
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'projects_owned'", 'to': "orm['im.AstakosUser']"}),
219
            'resource_grants': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.ProjectResourceGrant']", 'blank': 'True'}),
220
            'response': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
221
            'response_actor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'responded_apps'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
222
            'response_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
223
            'start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
224
            'state': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}),
225
            'waive_actor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'waived_apps'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
226
            'waive_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
227
            'waive_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
228
        },
229
        'im.projectlock': {
230
            'Meta': {'object_name': 'ProjectLock'},
231
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
232
        },
233
        'im.projectlog': {
234
            'Meta': {'object_name': 'ProjectLog'},
235
            'actor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']", 'null': 'True'}),
236
            'comments': ('django.db.models.fields.TextField', [], {'null': 'True'}),
237
            'date': ('django.db.models.fields.DateTimeField', [], {}),
238
            'from_state': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
239
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
240
            'project': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'log'", 'to': "orm['im.Project']"}),
241
            'reason': ('django.db.models.fields.TextField', [], {'null': 'True'}),
242
            'to_state': ('django.db.models.fields.IntegerField', [], {})
243
        },
244
        'im.projectmembership': {
245
            'Meta': {'unique_together': "(('person', 'project'),)", 'object_name': 'ProjectMembership'},
246
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
247
            'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"}),
248
            'project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Project']"}),
249
            'state': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'})
250
        },
251
        'im.projectmembershiplog': {
252
            'Meta': {'object_name': 'ProjectMembershipLog'},
253
            'actor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']", 'null': 'True'}),
254
            'comments': ('django.db.models.fields.TextField', [], {'null': 'True'}),
255
            'date': ('django.db.models.fields.DateTimeField', [], {}),
256
            'from_state': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
257
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
258
            'membership': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'log'", 'to': "orm['im.ProjectMembership']"}),
259
            'reason': ('django.db.models.fields.TextField', [], {'null': 'True'}),
260
            'to_state': ('django.db.models.fields.IntegerField', [], {})
261
        },
262
        'im.projectresourcegrant': {
263
            'Meta': {'unique_together': "(('resource', 'project_application'),)", 'object_name': 'ProjectResourceGrant'},
264
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
265
            'member_capacity': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
266
            'project_application': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.ProjectApplication']", 'null': 'True'}),
267
            'project_capacity': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
268
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"})
269
        },
270
        'im.resource': {
271
            'Meta': {'object_name': 'Resource'},
272
            'api_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
273
            'desc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
274
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
275
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
276
            'service_origin': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
277
            'service_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
278
            'ui_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
279
            'unit': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
280
            'uplimit': ('django.db.models.fields.BigIntegerField', [], {'default': '0'})
281
        },
282
        'im.service': {
283
            'Meta': {'object_name': 'Service'},
284
            'component': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Component']"}),
285
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
286
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
287
            'type': ('django.db.models.fields.CharField', [], {'max_length': '255'})
288
        },
289
        'im.sessioncatalog': {
290
            'Meta': {'object_name': 'SessionCatalog'},
291
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
292
            'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
293
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sessions'", 'null': 'True', 'to': "orm['im.AstakosUser']"})
294
        },
295
        'im.usersetting': {
296
            'Meta': {'unique_together': "(('user', 'setting'),)", 'object_name': 'UserSetting'},
297
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
298
            'setting': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
299
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"}),
300
            'value': ('django.db.models.fields.IntegerField', [], {})
301
        }
302
    }
303

  
304
    complete_apps = ['im']
305
    symmetrical = True
b/snf-astakos-app/astakos/im/models.py
631 631

  
632 632
    @property
633 633
    def signed_terms(self):
634
        term = get_latest_terms()
635
        if not term:
636
            return True
637
        if not self.has_signed_terms:
638
            return False
639
        if not self.date_signed_terms:
640
            return False
641
        if self.date_signed_terms < term.date:
642
            self.has_signed_terms = False
643
            self.date_signed_terms = None
644
            self.save()
645
            return False
646
        return True
634
        return self.has_signed_terms
647 635

  
648 636
    def set_invitations_level(self):
649 637
        """
b/snf-astakos-app/astakos/im/tests/api.py
409 409

  
410 410
        self.user1 = AstakosUser.objects.create(
411 411
            email='test1', email_verified=True, moderated=True,
412
            has_signed_terms=True,
412 413
            is_rejected=False)
413 414
        backend.activate_user(self.user1)
414 415
        assert self.user1.is_active is True
415 416

  
416 417
        self.user2 = AstakosUser.objects.create(
417 418
            email='test2', email_verified=True, moderated=True,
419
            has_signed_terms=True,
418 420
            is_rejected=False)
419 421
        backend.activate_user(self.user2)
420 422
        assert self.user2.is_active is True
......
610 612
    def test_get_uuid_displayname_catalogs(self):
611 613
        self.user = AstakosUser.objects.create(
612 614
            email='test1', email_verified=True, moderated=True,
615
            has_signed_terms=True,
613 616
            is_rejected=False)
614 617

  
615 618
        client = Client()
b/snf-astakos-app/astakos/im/tests/common.py
152 152
                'email': username,
153 153
                'is_active': True,
154 154
                'activation_sent': datetime.now(),
155
                'has_signed_terms': True,
156
                'date_signed_terms': datetime.now(),
155 157
                'email_verified': True
156 158
            }
157 159
            user_params.update(kwargs)
b/snf-astakos-app/astakos/im/tests/views.py
80 80
        terms = ApprovalTerms(location='terms')
81 81
        terms.save()
82 82

  
83
        self.user = get_local_user('user@synnefo.org')
83
        self.user = get_local_user('user@synnefo.org',
84
                                   has_signed_terms=False,
85
                                   date_signed_terms=None)
84 86
        self.assertTrue(not self.user.signed_terms)
85 87
        self.assertTrue(self.user.date_signed_terms is None)
86 88
        self.user_client = get_user_client(self.user.username)

Also available in: Unified diff