Revision 272cf735

b/snf-astakos-app/astakos/im/context_processors.py
34 34
from astakos.im.settings import (
35 35
    IM_MODULES, INVITATIONS_ENABLED, IM_STATIC_URL,
36 36
    LOGIN_MESSAGES, SIGNUP_MESSAGES, PROFILE_MESSAGES,
37
    GLOBAL_MESSAGES, PROFILE_EXTRA_LINKS)
37
    GLOBAL_MESSAGES, PROFILE_EXTRA_LINKS,
38
    PROJECT_MEMBER_JOIN_POLICIES, PROJECT_MEMBER_LEAVE_POLICIES)
38 39
from astakos.im.api import get_menu
39 40
from astakos.im.util import get_query
40 41
from astakos.im.auth_providers import PROVIDERS as AUTH_PROVIDERS
......
107 108
        return {}
108 109
    else:
109 110
        return {'menu': menu_items}
111

  
112
def membership_policies(request):
113
    return {'join_policies':PROJECT_MEMBER_JOIN_POLICIES,
114
            'leave_policies':PROJECT_MEMBER_LEAVE_POLICIES}
115

  
b/snf-astakos-app/astakos/im/forms.py
56 56
from astakos.im.models import (
57 57
    AstakosUser, EmailChange, Invitation,
58 58
    Resource, PendingThirdPartyUser, get_latest_terms, RESOURCE_SEPARATOR,
59
    ProjectApplication, MemberJoinPolicy, MemberLeavePolicy)
59
    ProjectApplication)
60 60
from astakos.im.settings import (
61 61
    INVITATIONS_PER_LEVEL, BASEURL, SITENAME, RECAPTCHA_PRIVATE_KEY,
62 62
    RECAPTCHA_ENABLED, DEFAULT_CONTACT_EMAIL, LOGGING_LEVEL,
63 63
    PASSWORD_RESET_EMAIL_SUBJECT, NEWPASSWD_INVALIDATE_TOKEN,
64
    MODERATION_ENABLED)
64
    MODERATION_ENABLED, PROJECT_MEMBER_JOIN_POLICIES,
65
    PROJECT_MEMBER_LEAVE_POLICIES)
65 66
from astakos.im.widgets import DummyWidget, RecaptchaWidget
66 67
from astakos.im.functions import send_change_email, submit_application
67 68

  
......
650 651
        required=False
651 652
     )
652 653
    comments = forms.CharField(widget=forms.Textarea, required=False)
653
    member_join_policy = forms.ModelChoiceField(
654
        queryset=MemberJoinPolicy.objects.all(),
655
        empty_label=None)
656
    member_leave_policy = forms.ModelChoiceField(
657
        queryset=MemberLeavePolicy.objects.all(),
658
        empty_label=None)
659

  
654
    member_join_policy = forms.ChoiceField(
655
        choices=PROJECT_MEMBER_JOIN_POLICIES.iteritems())
656
    member_leave_policy = forms.ChoiceField(
657
        choices=PROJECT_MEMBER_LEAVE_POLICIES.iteritems())
660 658

  
661 659
    class Meta:
662 660
        model = ProjectApplication
b/snf-astakos-app/astakos/im/functions.py
61 61
    EMAIL_CHANGE_EMAIL_SUBJECT,
62 62
    PROJECT_CREATION_SUBJECT, PROJECT_APPROVED_SUBJECT,
63 63
    PROJECT_TERMINATION_SUBJECT, PROJECT_SUSPENSION_SUBJECT,
64
    PROJECT_MEMBERSHIP_CHANGE_SUBJECT)
64
    PROJECT_MEMBERSHIP_CHANGE_SUBJECT,
65
    PROJECT_MEMBER_JOIN_POLICIES, PROJECT_MEMBER_LEAVE_POLICIES)
65 66
from astakos.im.notifications import build_notification, NotificationError
66 67
from astakos.im.models import (
67 68
    AstakosUser, ProjectMembership, ProjectApplication, Project,
68
    MemberLeavePolicy, MemberJoinPolicy,
69 69
    trigger_sync)
70 70

  
71 71
import astakos.im.messages as astakos_messages
......
368 368
### PROJECT VIEWS ###
369 369

  
370 370
def get_join_policy(str_policy):
371
    try:
372
        return MemberJoinPolicy.objects.get(policy=str_policy)
373
    except:
374
        return None
371
    return PROJECT_MEMBER_JOIN_POLICIES.get(str_policy)
375 372

  
376 373
def get_leave_policy(str_policy):
377
    try:
378
        return MemberLeavePolicy.objects.get(policy=str_policy)
379
    except BaseException, e:
380
        return None
381
    
374
    return PROJECT_MEMBER_LEAVE_POLICIES.get(str_policy)
375

  
382 376
_auto_accept_join = None
383 377
def get_auto_accept_join_policy():
384 378
    global _auto_accept_join
b/snf-astakos-app/astakos/im/migrations/0048_auto__del_memberleavepolicy__del_memberjoinpolicy__chg_field_projectap.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import SchemaMigration
5
from django.db import models
6

  
7
class Migration(SchemaMigration):
8

  
9
    def forwards(self, orm):
10
        
11
        # Deleting model 'MemberLeavePolicy'
12
        db.delete_table('im_memberleavepolicy')
13

  
14
        # Deleting model 'MemberJoinPolicy'
15
        db.delete_table('im_memberjoinpolicy')
16

  
17
        # Renaming column for 'ProjectApplication.member_join_policy' to match new field type.
18
        db.rename_column('im_projectapplication', 'member_join_policy_id', 'member_join_policy')
19
        # Changing field 'ProjectApplication.member_join_policy'
20
        db.alter_column('im_projectapplication', 'member_join_policy', self.gf('django.db.models.fields.IntegerField')())
21

  
22
        # Removing index on 'ProjectApplication', fields ['member_join_policy']
23
        db.delete_index('im_projectapplication', ['member_join_policy_id'])
24

  
25
        # Renaming column for 'ProjectApplication.member_leave_policy' to match new field type.
26
        db.rename_column('im_projectapplication', 'member_leave_policy_id', 'member_leave_policy')
27
        # Changing field 'ProjectApplication.member_leave_policy'
28
        db.alter_column('im_projectapplication', 'member_leave_policy', self.gf('django.db.models.fields.IntegerField')())
29

  
30
        # Removing index on 'ProjectApplication', fields ['member_leave_policy']
31
        db.delete_index('im_projectapplication', ['member_leave_policy_id'])
32

  
33

  
34
    def backwards(self, orm):
35
        
36
        # Adding index on 'ProjectApplication', fields ['member_leave_policy']
37
        db.create_index('im_projectapplication', ['member_leave_policy_id'])
38

  
39
        # Adding index on 'ProjectApplication', fields ['member_join_policy']
40
        db.create_index('im_projectapplication', ['member_join_policy_id'])
41

  
42
        # Adding model 'MemberLeavePolicy'
43
        db.create_table('im_memberleavepolicy', (
44
            ('policy', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, db_index=True)),
45
            ('description', self.gf('django.db.models.fields.CharField')(max_length=80)),
46
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
47
        ))
48
        db.send_create_signal('im', ['MemberLeavePolicy'])
49

  
50
        # Adding model 'MemberJoinPolicy'
51
        db.create_table('im_memberjoinpolicy', (
52
            ('policy', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, db_index=True)),
53
            ('description', self.gf('django.db.models.fields.CharField')(max_length=80)),
54
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
55
        ))
56
        db.send_create_signal('im', ['MemberJoinPolicy'])
57

  
58
        # Renaming column for 'ProjectApplication.member_join_policy' to match new field type.
59
        db.rename_column('im_projectapplication', 'member_join_policy', 'member_join_policy_id')
60
        # Changing field 'ProjectApplication.member_join_policy'
61
        db.alter_column('im_projectapplication', 'member_join_policy_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.MemberJoinPolicy']))
62

  
63
        # Renaming column for 'ProjectApplication.member_leave_policy' to match new field type.
64
        db.rename_column('im_projectapplication', 'member_leave_policy', 'member_leave_policy_id')
65
        # Changing field 'ProjectApplication.member_leave_policy'
66
        db.alter_column('im_projectapplication', 'member_leave_policy_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.MemberLeavePolicy']))
67

  
68

  
69
    models = {
70
        'auth.group': {
71
            'Meta': {'object_name': 'Group'},
72
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
73
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
74
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
75
        },
76
        'auth.permission': {
77
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
78
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
79
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
80
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
81
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
82
        },
83
        'auth.user': {
84
            'Meta': {'object_name': 'User'},
85
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
86
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
87
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
88
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
89
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
90
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
91
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
92
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
93
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
94
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
95
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
96
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
97
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
98
        },
99
        'contenttypes.contenttype': {
100
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
101
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
102
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
103
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
104
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
105
        },
106
        'im.additionalmail': {
107
            'Meta': {'object_name': 'AdditionalMail'},
108
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
109
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
110
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
111
        },
112
        'im.approvalterms': {
113
            'Meta': {'object_name': 'ApprovalTerms'},
114
            'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 1, 4, 18, 59, 31, 212689)', 'db_index': 'True'}),
115
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
116
            'location': ('django.db.models.fields.CharField', [], {'max_length': '255'})
117
        },
118
        'im.astakosuser': {
119
            'Meta': {'object_name': 'AstakosUser', '_ormbases': ['auth.User']},
120
            'activation_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
121
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
122
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
123
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
124
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
125
            'date_signed_terms': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
126
            'disturbed_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
127
            'email_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
128
            'has_credits': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
129
            'has_signed_terms': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
130
            'invitations': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
131
            'is_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
132
            'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
133
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosUserQuota']", 'symmetrical': 'False'}),
134
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
135
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
136
            'updated': ('django.db.models.fields.DateTimeField', [], {}),
137
            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}),
138
            'uuid': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True'})
139
        },
140
        'im.astakosuserauthprovider': {
141
            'Meta': {'ordering': "('module', 'created')", 'unique_together': "(('identifier', 'module', 'user'),)", 'object_name': 'AstakosUserAuthProvider'},
142
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
143
            'affiliation': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}),
144
            'auth_backend': ('django.db.models.fields.CharField', [], {'default': "'astakos'", 'max_length': '255'}),
145
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
146
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
147
            'identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
148
            'info_data': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': 'True'}),
149
            'module': ('django.db.models.fields.CharField', [], {'default': "'local'", 'max_length': '255'}),
150
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_providers'", 'to': "orm['im.AstakosUser']"})
151
        },
152
        'im.astakosuserquota': {
153
            'Meta': {'unique_together': "(('resource', 'user'),)", 'object_name': 'AstakosUserQuota'},
154
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
155
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
156
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
157
            'uplimit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
158
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
159
        },
160
        'im.emailchange': {
161
            'Meta': {'object_name': 'EmailChange'},
162
            'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
163
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
164
            'new_email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
165
            'requested_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 1, 4, 18, 59, 31, 214577)'}),
166
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emailchanges'", 'unique': 'True', 'to': "orm['im.AstakosUser']"})
167
        },
168
        'im.invitation': {
169
            'Meta': {'object_name': 'Invitation'},
170
            'code': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
171
            'consumed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
172
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
173
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
174
            'inviter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'invitations_sent'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
175
            'is_consumed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
176
            'realname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
177
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
178
        },
179
        'im.pendingthirdpartyuser': {
180
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'PendingThirdPartyUser'},
181
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
182
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
183
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
184
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
185
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
186
            'info': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True', 'blank': 'True'}),
187
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
188
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
189
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
190
            'token': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
191
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
192
        },
193
        'im.project': {
194
            'Meta': {'object_name': 'Project'},
195
            'application': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'project'", 'unique': 'True', 'to': "orm['im.ProjectApplication']"}),
196
            'creation_date': ('django.db.models.fields.DateTimeField', [], {}),
197
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
198
            'last_approval_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
199
            'members': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.AstakosUser']", 'through': "orm['im.ProjectMembership']", 'symmetrical': 'False'}),
200
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80', 'db_index': 'True'}),
201
            'termination_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
202
            'termination_start_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'})
203
        },
204
        'im.projectapplication': {
205
            'Meta': {'object_name': 'ProjectApplication'},
206
            'applicant': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'projects_applied'", 'to': "orm['im.AstakosUser']"}),
207
            'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
208
            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
209
            'end_date': ('django.db.models.fields.DateTimeField', [], {}),
210
            'homepage': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
211
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
212
            'issue_date': ('django.db.models.fields.DateTimeField', [], {}),
213
            'limit_on_members_number': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
214
            'member_join_policy': ('django.db.models.fields.IntegerField', [], {}),
215
            'member_leave_policy': ('django.db.models.fields.IntegerField', [], {}),
216
            'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
217
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'projects_owned'", 'to': "orm['im.AstakosUser']"}),
218
            'precursor_application': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['im.ProjectApplication']", 'unique': 'True', 'null': 'True', 'blank': 'True'}),
219
            'resource_grants': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.ProjectResourceGrant']", 'blank': 'True'}),
220
            'start_date': ('django.db.models.fields.DateTimeField', [], {}),
221
            'state': ('django.db.models.fields.CharField', [], {'default': "'Unknown'", 'max_length': '80'})
222
        },
223
        'im.projectmembership': {
224
            'Meta': {'unique_together': "(('person', 'project'),)", 'object_name': 'ProjectMembership'},
225
            'acceptance_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'db_index': 'True'}),
226
            'application': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'memberships'", 'null': 'True', 'to': "orm['im.ProjectApplication']"}),
227
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
228
            'leave_request_date': ('django.db.models.fields.DateField', [], {'null': 'True'}),
229
            'pending_application': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pending_memebrships'", 'null': 'True', 'to': "orm['im.ProjectApplication']"}),
230
            'pending_serial': ('django.db.models.fields.BigIntegerField', [], {'null': 'True', 'db_index': 'True'}),
231
            'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"}),
232
            'project': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Project']"}),
233
            'request_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2013, 1, 4, 18, 59, 31, 222965)'}),
234
            'state': ('django.db.models.fields.IntegerField', [], {'default': '0'})
235
        },
236
        'im.projectmembershiphistory': {
237
            'Meta': {'object_name': 'ProjectMembershipHistory'},
238
            'date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime.now'}),
239
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
240
            'person': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
241
            'project': ('django.db.models.fields.BigIntegerField', [], {}),
242
            'reason': ('django.db.models.fields.IntegerField', [], {}),
243
            'serial': ('django.db.models.fields.BigIntegerField', [], {})
244
        },
245
        'im.projectresourcegrant': {
246
            'Meta': {'unique_together': "(('resource', 'project_application'),)", 'object_name': 'ProjectResourceGrant'},
247
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
248
            'member_capacity': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
249
            'member_export_limit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
250
            'member_import_limit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
251
            'project_application': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.ProjectApplication']", 'null': 'True'}),
252
            'project_capacity': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
253
            'project_export_limit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
254
            'project_import_limit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
255
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"})
256
        },
257
        'im.resource': {
258
            'Meta': {'unique_together': "(('name', 'service'),)", 'object_name': 'Resource'},
259
            'desc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
260
            'group': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
261
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
262
            'meta': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.ResourceMetadata']", 'symmetrical': 'False'}),
263
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
264
            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Service']"}),
265
            'unit': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'})
266
        },
267
        'im.resourcemetadata': {
268
            'Meta': {'object_name': 'ResourceMetadata'},
269
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
270
            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
271
            'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
272
        },
273
        'im.serial': {
274
            'Meta': {'object_name': 'Serial'},
275
            'serial': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
276
        },
277
        'im.service': {
278
            'Meta': {'object_name': 'Service'},
279
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
280
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
281
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
282
            'icon': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
283
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
284
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
285
            'url': ('django.db.models.fields.FilePathField', [], {'max_length': '100'})
286
        },
287
        'im.sessioncatalog': {
288
            'Meta': {'object_name': 'SessionCatalog'},
289
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
290
            'session_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
291
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sessions'", 'null': 'True', 'to': "orm['im.AstakosUser']"})
292
        }
293
    }
294

  
295
    complete_apps = ['im']
b/snf-astakos-app/astakos/im/models.py
1004 1004
### PROJECTS ###
1005 1005
################
1006 1006

  
1007
class MemberJoinPolicy(models.Model):
1008
    policy = models.CharField(_('Policy'), max_length=255, unique=True, db_index=True)
1009
    description = models.CharField(_('Description'), max_length=80)
1010

  
1011
    def __str__(self):
1012
        return self.description.capitalize()
1013

  
1014
class MemberLeavePolicy(models.Model):
1015
    policy = models.CharField(_('Policy'), max_length=255, unique=True, db_index=True)
1016
    description = models.CharField(_('Description'), max_length=80)
1017

  
1018
    def __str__(self):
1019
        return self.description.capitalize()
1020

  
1021 1007
def synced_model_metaclass(class_name, class_parents, class_attributes):
1022 1008

  
1023 1009
    new_attributes = {}
......
1176 1162
                                                 help_text=_("Please provide a short but descriptive abstract of your Project, so that anyone searching can quickly understand what this Project is about. "))
1177 1163
    start_date              =   models.DateTimeField(help_text=_("Here you specify the date you want your Project to start granting its resources. Its members will get the resources coming from this Project on this exact date."))
1178 1164
    end_date                =   models.DateTimeField(help_text=_("Here you specify the date you want your Project to cease. This means that after this date all members will no longer be able to allocate resources from this Project.  "))
1179
    member_join_policy      =   models.ForeignKey(MemberJoinPolicy)
1180
    member_leave_policy     =   models.ForeignKey(MemberLeavePolicy)
1165
    member_join_policy      =   models.IntegerField()
1166
    member_leave_policy     =   models.IntegerField()
1181 1167
    limit_on_members_number =   models.PositiveIntegerField(null=True,
1182 1168
                                                            blank=True,help_text=_("Here you specify the number of members this Project is going to have. This means that this number of people will be granted the resources you will specify in the next step. This can be '1' if you are the only one wanting to get resources. "))
1183 1169
    resource_grants         =   models.ManyToManyField(
b/snf-astakos-app/astakos/im/settings.py
303 303
SHIBBOLETH_REQUIRE_NAME_INFO = getattr(settings,
304 304
                                       'ASTAKOS_SHIBBOLETH_REQUIRE_NAME_INFO',
305 305
                                       False)
306

  
307
PROJECT_MEMBER_JOIN_POLICIES = getattr(settings,
308
                                'ASTAKOS_PROJECT_MEMBER_JOIN_POLICIES',
309
                                {1:'automatically accepted by the system',
310
                                 2:'accepted by the owner of the project',
311
                                 3:'members can not join the project'})
312

  
313
PROJECT_MEMBER_LEAVE_POLICIES = getattr(settings,
314
                                'ASTAKOS_PROJECT_MEMBER_LEAVE_POLICIES',
315
                                {1:'automatically accepted by the system',
316
                                 2:'accepted by the owner of the project',
317
                                 3:'members can not leave the project'})
b/snf-astakos-app/astakos/im/synnefo_settings.py
60 60
    'astakos.im.context_processors.menu',
61 61
    'astakos.im.context_processors.custom_messages',
62 62
    'astakos.im.context_processors.last_login_method',
63
    'astakos.im.context_processors.membership_policies',
63 64
    'synnefo.lib.context_processors.cloudbar'
64 65
]
65 66

  
b/snf-astakos-app/astakos/im/templates/im/projects/project_detail.html
81 81
		 	<dd>{% if object.limit_on_members_number%}{{object.limit_on_members_number}}{% else %}&nbsp;{% endif %}</dd>
82 82
		 	<dt>Member join policy</dt>
83 83
            <dd>
84
                {{ object.member_join_policy }}
84
                {{ join_policies|lookup:object.member_join_policy }}
85 85
            </dd>
86 86
		 	<dt>Member leave policy</dt>
87 87
            <dd>
88
                {{ object.member_leave_policy }}
88
                {{ leave_policies|lookup:object.member_leave_policy }}
89 89
            </dd>
90 90
		 </dl>
91 91
	 </div>
b/snf-astakos-app/astakos/im/templates/im/projects/projectapplication_form_summary.html
37 37
			 <h3>MEMBERSHIP OPTIONS</h3>
38 38
			 <dl class="alt-style">			    
39 39
                <dt>Member join policy</dt>
40
			 	<dd>{{ form_data.member_join_policy }}</dd>
40
			 	<dd>{{ join_policies|lookup:form_data.member_join_policy }}</dd>
41 41
			 	<dt>Member leave policy</dt>
42
			 	<dd>{{ form_data.member_leave_policy }}</dd>			   
42
			 	<dd>{{ leave_policies|lookup:form_data.member_leave_policy }}</dd>
43 43
			 	<dt>Total number of members</dt>
44 44
			 	<dd>{{ form_data.limit_on_members_number }}</dd>
45 45
			 </dl>

Also available in: Unified diff