Revision 304acb60

b/snf-astakos-app/astakos/im/api/__init__.py
146 146

  
147 147
@api_method()
148 148
def get_menu(request, with_extra_links=False, with_signout=True):
149
    index_url = reverse('index')
149
    user = request.user
150
    if not isinstance(user, AstakosUser):
151
        cookie = unquote(request.COOKIES.get(COOKIE_NAME, ''))
152
        email = cookie.partition('|')[0]
153
        try:
154
            if email:
155
                user = AstakosUser.objects.get(email=email, is_active=True)
156
        except AstakosUser.DoesNotExist:
157
            pass
158
    
150 159
    absolute = lambda (url): request.build_absolute_uri(url)
151
    l = [{ 'url': absolute(index_url), 'name': "Sign in"}]
152
    cookie = unquote(request.COOKIES.get(COOKIE_NAME, ''))
153
    email = cookie.partition('|')[0]
154
    try:
155
        if not email:
156
            raise ValueError
157
        user = AstakosUser.objects.get(email=email, is_active=True)
158
    except AstakosUser.DoesNotExist:
159
        pass
160
    except ValueError:
161
        pass
160
    if not isinstance(user, AstakosUser):
161
        index_url = reverse('index')
162
        l = [{ 'url': absolute(index_url), 'name': "Sign in"}]
162 163
    else:
163 164
        l = []
164 165
        l.append(dict(url=absolute(reverse('index')), name=user.email))
/dev/null
1
[
2
    {
3
        "model": "auth.group",
4
        "pk": 1,
5
        "fields": {
6
            "name": "default"
7
        }
8
    },
9
    {
10
        "model": "auth.group",
11
        "pk": 2,
12
        "fields": {
13
            "name": "academic"
14
        }
15
    },
16
    {
17
        "model": "auth.group",
18
        "pk": 3,
19
        "fields": {
20
            "name": "shibboleth"
21
        }
22
    },
23
    {
24
        "model": "auth.group",
25
        "pk": 4,
26
        "fields": {
27
            "name": "helpdesk"
28
        }
29
    },
30
    {
31
        "model": "auth.group",
32
        "pk": 4,
33
        "fields": {
34
            "name": "faculty"
35
        },
36
        "permissions": ""
37
    },
38
    {
39
        "model": "auth.group",
40
        "pk": 4,
41
        "fields": {
42
            "name": "ugrad"
43
        }
44
    },
45
    {
46
        "model": "auth.group",
47
        "pk": 4,
48
        "fields": {
49
            "name": "grad"
50
        }
51
    },
52
    {
53
        "model": "auth.group",
54
        "pk": 4,
55
        "fields": {
56
            "name": "researcher"
57
        }
58
    },
59
    {
60
        "model": "auth.group",
61
        "pk": 4,
62
        "fields": {
63
            "name": "associate"
64
        }
65
    },
66
    {
67
        "model": "im.GroupKind",
68
        "pk": 1,
69
        "fields": {
70
            "name": "course"
71
        }
72
    },
73
    {
74
        "model": "im.GroupKind",
75
        "pk": 2,
76
        "fields": {
77
            "name": "project"
78
        }
79
    },
80
    {
81
        "model": "im.GroupKind",
82
        "pk": 3,
83
        "fields": {
84
            "name": "laboratory"
85
        }
86
    },
87
    {
88
        "model": "im.GroupKind",
89
        "pk": 4,
90
        "fields": {
91
            "name": "organization"
92
        }
93
    }
94
]
b/snf-astakos-app/astakos/im/management/commands/user_add.py
41 41
from django.core.management.base import BaseCommand, CommandError
42 42
from django.core.validators import validate_email
43 43
from django.core.exceptions import ValidationError
44
from django.contrib.auth.models import Group
45 44

  
46
from astakos.im.models import AstakosUser
45
from astakos.im.models import AstakosUser, AstakosGroup
47 46
from astakos.im.util import reserved_email
48 47

  
49 48
from ._common import add_user_permission
......
121 120
            groupname = options.get('add-group')
122 121
            if groupname is not None:
123 122
                try:
124
                    group = Group.objects.get(name=groupname)
125
                    user.groups.add(group)
123
                    group = AstakosGroup.objects.get(name=groupname)
124
                    user.astakos_groups.add(group)
126 125
                    self.stdout.write('Group: %s added successfully\n' % groupname)
127
                except Group.DoesNotExist, e:
126
                except AstakosGroup.DoesNotExist, e:
128 127
                    self.stdout.write('Group named %s does not exist\n' % groupname)
129 128
            
130 129
            pname = options.get('add-permission')
b/snf-astakos-app/astakos/im/management/commands/user_list.py
71 71
        elif options['pending_send_mail']:
72 72
            users = users.filter(is_active=False, activation_sent=None)
73 73
        
74
        labels = ('id', 'email', 'real name', 'active', 'admin', 'provider', 'groups')
74
        labels = ('id', 'email', 'real name', 'active', 'admin', 'provider')
75 75
        columns = (3, 24, 24, 6, 5, 12, 24)
76 76
        
77 77
        if not options['csv']:
......
84 84
            id = str(user.id)
85 85
            active = format_bool(user.is_active)
86 86
            admin = format_bool(user.is_superuser)
87
            fields = (id, user.email, user.realname, active, admin, user.provider,
88
                      ','.join([g.name for g in user.groups.all()]))
87
            fields = (id, user.email, user.realname, active, admin, user.provider)
89 88
            
90 89
            if options['csv']:
91 90
                line = '|'.join(fields)
b/snf-astakos-app/astakos/im/management/commands/user_show.py
74 74
                'provider': user.provider,
75 75
                'verified': format_bool(user.is_verified),
76 76
                'has_credits': format_bool(user.has_credits),
77
                'groups': [elem.name for elem in user.groups.all()],
77
                'groups': [elem.name for elem in user.astakos_groups.all()],
78 78
                'permissions': [elem.codename for elem in user.user_permissions.all()],
79 79
                'group_permissions': user.get_group_permissions(),
80 80
                'third_party_identifier': user.third_party_identifier,
81 81
                'email_verified': format_bool(user.email_verified),
82 82
                'username': user.username,
83
                'activation_sent_date': format_date(user.activation_sent)
83
                'activation_sent_date': format_date(user.activation_sent),
84
                'resources' : user.quota
84 85
            }
85 86
            if get_latest_terms():
86 87
                has_signed_terms = user.signed_terms()
b/snf-astakos-app/astakos/im/management/commands/user_update.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.core.management.base import BaseCommand, CommandError
37
from django.contrib.auth.models import Group, Permission
38
from django.contrib.auth.models import Permission
38 39
from django.contrib.contenttypes.models import ContentType
39 40
from django.core.exceptions import ValidationError
41
from django.db.utils import IntegrityError
40 42

  
41
from astakos.im.models import AstakosUser
43
from astakos.im.models import AstakosUser, AstakosGroup, Membership
42 44
from ._common import remove_user_permission, add_user_permission
43 45

  
44 46
class Command(BaseCommand):
......
135 137
        groupname = options.get('add-group')
136 138
        if groupname is not None:
137 139
            try:
138
                group = Group.objects.get(name=groupname)
139
                user.groups.add(group)
140
            except Group.DoesNotExist, e:
140
                group = AstakosGroup.objects.get(name=groupname)
141
                m = Membership(person=user, group=group, date_joined=datetime.now())
142
                m.save()
143
            except AstakosGroup.DoesNotExist, e:
141 144
                self.stdout.write("Group named %s does not exist\n" % groupname)
145
            except IntegrityError, e:
146
                self.stdout.write("User is already member of %s\n" % groupname)
142 147
        
143 148
        groupname = options.get('delete-group')
144 149
        if groupname is not None:
145 150
            try:
146
                group = Group.objects.get(name=groupname)
147
                user.groups.remove(group)
148
            except Group.DoesNotExist, e:
151
                group = AstakosGroup.objects.get(name=groupname)
152
                m = Membership.objects.get(person=user, group=group)
153
                m.delete()
154
            except AstakosGroup.DoesNotExist, e:
149 155
                self.stdout.write("Group named %s does not exist\n" % groupname)
156
            except Membership.DoesNotExist, e:
157
                self.stdout.write("User is not a member of %s\n" % groupname)
150 158
        
151 159
        pname = options.get('add-permission')
152 160
        if pname is not None:
b/snf-astakos-app/astakos/im/migrations/0016_populate_group_data.py
1
# encoding: utf-8
2
import datetime
3
from south.db import db
4
from south.v2 import DataMigration
5
from django.db import models
6
from django.db.models import Count
7

  
8
class Migration(DataMigration):
9
    def forwards(self, orm):
10
        
11
        def _create_groupkind(name):
12
            try:
13
                orm.GroupKind(name=name).save()
14
            except:
15
                pass
16
                                        
17
        t = ('default', 'course', 'project', 'laboratory', 'organization')
18
        map(_create_groupkind, t)
19
        
20
        default = orm.GroupKind.objects.get(name='default')
21
        
22
        groups = {}
23
        def _create_astakogroup(name):
24
            try:
25
                groups[name] = orm.AstakosGroup.objects.get(name=name)
26
            except orm.AstakosGroup.DoesNotExist:
27
                try:
28
                    g = orm['auth.Group'].objects.get(name=name)
29
                    groups[name] = extended = orm.AstakosGroup(group_ptr_id=g.pk)
30
                    extended.__dict__.update(g.__dict__)
31
                    extended.kind = default
32
                    extended.approval_date = datetime.datetime.now()
33
                    extended.issue_date = datetime.datetime.now()
34
                    extended.moderation_enabled = False
35
                    extended.save()
36
                    map(lambda u:orm.Membership(    group=extended,
37
                                                    person=orm.AstakosUser.objects.get(id=u.id),
38
                                                    date_joined=datetime.datetime.now()
39
                                                ).save(),
40
                        g.user_set.all())
41
                except orm['auth.Group'].DoesNotExist:
42
                    groups[name] = orm.AstakosGroup(    name=name,
43
                                                        kind=default,
44
                                                        approval_date=datetime.datetime.now(),
45
                                                        issue_date=datetime.datetime.now(),
46
                                                        moderation_enabled=False
47
                                                    )
48
                    groups[name].save()
49
        
50
        # catch integrate 
51
        t = ('default', 'shibboleth', 'helpdesk', 'faculty', 'ugrad', 'grad', 'researcher', 'associate')
52
        map(_create_astakogroup, t)
53
        
54
        orphans = orm.AstakosUser.objects.annotate(num_groups=Count('astakos_groups')).filter(num_groups = 0)
55
        map ( lambda u: orm.Membership(group=groups['default'], person=u, date_joined=datetime.datetime.now()).save(), orphans )
56
        
57
    def backwards(self, orm):
58
        def _delete_groupkind(name):
59
            try:
60
                orm.GroupKind.objects.get(name=name).delete()
61
            except orm.GroupKind.DoesNotExist:
62
                pass
63
        
64
        def _delete_astakosgroup(name):
65
            try:
66
                orm.AstakosGroup.objects.get(name=name).delete()
67
            except orm.AstakosGroup.DoesNotExist:
68
                pass
69
        
70
        t = ('default', 'shibboleth', 'helpdesk', 'faculty', 'ugrad', 'grad', 'researcher', 'associate')
71
        map(_delete_astakosgroup, t)
72
        
73
        t = ('default', 'course', 'project', 'laboratory', 'organization')
74
        map(_delete_groupkind, t)
75

  
76
    models = {
77
        'auth.group': {
78
            'Meta': {'object_name': 'Group'},
79
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
81
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
82
        },
83
        'auth.permission': {
84
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
85
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
86
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
87
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
88
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
89
        },
90
        'auth.user': {
91
            'Meta': {'object_name': 'User'},
92
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
93
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
94
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
95
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
96
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
97
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
98
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
99
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
100
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
101
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
102
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
103
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
104
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
105
        },
106
        'contenttypes.contenttype': {
107
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
108
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
109
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
110
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
111
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
112
        },
113
        'im.additionalmail': {
114
            'Meta': {'object_name': 'AdditionalMail'},
115
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
116
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
117
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
118
        },
119
        'im.approvalterms': {
120
            'Meta': {'object_name': 'ApprovalTerms'},
121
            'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 8, 12, 40, 8, 181485)', 'db_index': 'True'}),
122
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
123
            'location': ('django.db.models.fields.CharField', [], {'max_length': '255'})
124
        },
125
        'im.astakosgroup': {
126
            'Meta': {'object_name': 'AstakosGroup', '_ormbases': ['auth.Group']},
127
            'approval_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
128
            'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 8, 12, 40, 8, 175548)'}),
129
            'desc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
130
            'estimated_participants': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
131
            'expiration_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
132
            'group_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.Group']", 'unique': 'True', 'primary_key': 'True'}),
133
            'issue_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
134
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.GroupKind']"}),
135
            'moderation_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
136
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosGroupQuota']", 'blank': 'True'})
137
        },
138
        'im.astakosgroupquota': {
139
            'Meta': {'unique_together': "(('resource', 'group'),)", 'object_name': 'AstakosGroupQuota'},
140
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']", 'blank': 'True'}),
141
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
142
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {}),
143
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"})
144
        },
145
        'im.astakosuser': {
146
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'AstakosUser', '_ormbases': ['auth.User']},
147
            'activation_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
148
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
149
            'astakos_groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.AstakosGroup']", 'symmetrical': 'False', 'through': "orm['im.Membership']", 'blank': 'True'}),
150
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
151
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
152
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
153
            'date_signed_terms': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
154
            'email_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
155
            'has_credits': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
156
            'has_signed_terms': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
157
            'invitations': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
158
            'is_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
159
            'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
160
            'owner': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'owner'", 'null': 'True', 'to': "orm['im.AstakosGroup']"}),
161
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosUserQuota']", 'symmetrical': 'False'}),
162
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
163
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
164
            'updated': ('django.db.models.fields.DateTimeField', [], {}),
165
            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'})
166
        },
167
        'im.astakosuserquota': {
168
            'Meta': {'unique_together': "(('resource', 'user'),)", 'object_name': 'AstakosUserQuota'},
169
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
170
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {}),
171
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
172
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
173
        },
174
        'im.emailchange': {
175
            'Meta': {'object_name': 'EmailChange'},
176
            'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
177
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
178
            'new_email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
179
            'requested_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 8, 12, 40, 8, 183025)'}),
180
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emailchange_user'", 'unique': 'True', 'to': "orm['im.AstakosUser']"})
181
        },
182
        'im.groupkind': {
183
            'Meta': {'object_name': 'GroupKind'},
184
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
185
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'})
186
        },
187
        'im.invitation': {
188
            'Meta': {'object_name': 'Invitation'},
189
            'code': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
190
            'consumed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
191
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
192
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
193
            'inviter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'invitations_sent'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
194
            'is_consumed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
195
            'realname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
196
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
197
        },
198
        'im.membership': {
199
            'Meta': {'unique_together': "(('person', 'group'),)", 'object_name': 'Membership'},
200
            'date_joined': ('django.db.models.fields.DateField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
201
            'date_requested': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 8, 8, 12, 40, 8, 179349)', 'blank': 'True'}),
202
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']"}),
203
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
204
            'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
205
        },
206
        'im.resource': {
207
            'Meta': {'object_name': 'Resource'},
208
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
209
            'meta': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.ResourceMetadata']", 'symmetrical': 'False'}),
210
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
211
            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Service']"})
212
        },
213
        'im.resourcemetadata': {
214
            'Meta': {'object_name': 'ResourceMetadata'},
215
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
216
            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
217
            'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
218
        },
219
        'im.service': {
220
            'Meta': {'object_name': 'Service'},
221
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
222
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
223
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
224
            'icon': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
225
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
226
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
227
            'url': ('django.db.models.fields.FilePathField', [], {'max_length': '100'})
228
        }
229
    }
230

  
231
    complete_apps = ['im']
b/snf-astakos-app/astakos/im/migrations/0017_populate_resource_data.py
1
# encoding: utf-8
2
import datetime
3
import sys
4

  
5
from south.db import db
6
from south.v2 import DataMigration
7
from django.db import models
8
from django.db.utils import IntegrityError
9
from collections import defaultdict
10
from django.db.models import Q
11

  
12
d = {
13
        'cyclades' : { 'vm' : 2 },
14
        'pithos+': {'diskspace' : 10  } 
15
    }
16
class Migration(DataMigration):
17

  
18
    def forwards(self, orm):
19
        "Write your forwards methods here."
20
        
21
        try:
22
            default = orm.AstakosGroup.objects.get(name='default')
23
        except orm.AstakosGroup.DoesNotExist:
24
            return
25
        
26
        def create_policies(sn, policy):
27
            s, created = orm.Service.objects.get_or_create(name = sn)
28
            if created:
29
                s.save()
30
            
31
            for rn, l in policy.iteritems():
32
                r, created = orm.Resource.objects.get_or_create (    
33
                                                                    service = s,
34
                                                                    name = rn
35
                                                                )
36
                if created:
37
                    r.save()
38
                
39
                q, created = orm.AstakosGroupQuota.objects.get_or_create(   
40
                                                                            group = default,
41
                                                                            resource = r,
42
                                                                            limit = l   
43
                                                                        )
44
                if created:
45
                    q.save()
46
                
47
        map(lambda i: create_policies(i[0], i[1]), d.iteritems())
48
            
49
    def backwards(self, orm):
50
        try:
51
            default = orm.AstakosGroup.objects.get(name='default')
52
        except orm.AstakosGroup.DoesNotExist:
53
            return
54
        
55
        def destroy_policies(sn, policy):
56
            for rn, l in policy.iteritems():
57
                try:
58
                    q = orm.AstakosGroupQuota.objects.get(group=default, resource__name=rn)
59
                    if q.limit == l:
60
                        q.delete()
61
                except orm.AstakosGroupQuota.DoesNotExist:
62
                    return
63
                
64
        map(lambda i: destroy_policies(i[0], i[1]), d.iteritems())
65
    
66
    models = {
67
        'auth.group': {
68
            'Meta': {'object_name': 'Group'},
69
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
70
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
71
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
72
        },
73
        'auth.permission': {
74
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
75
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
76
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
77
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
78
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
79
        },
80
        'auth.user': {
81
            'Meta': {'object_name': 'User'},
82
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
83
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
84
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
85
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
86
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
87
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
88
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
89
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
90
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
91
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
92
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
93
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
94
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
95
        },
96
        'contenttypes.contenttype': {
97
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
98
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
99
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
100
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
101
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
102
        },
103
        'im.additionalmail': {
104
            'Meta': {'object_name': 'AdditionalMail'},
105
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
106
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
107
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
108
        },
109
        'im.approvalterms': {
110
            'Meta': {'object_name': 'ApprovalTerms'},
111
            'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 9, 11, 14, 9, 289091)', 'db_index': 'True'}),
112
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
113
            'location': ('django.db.models.fields.CharField', [], {'max_length': '255'})
114
        },
115
        'im.astakosgroup': {
116
            'Meta': {'object_name': 'AstakosGroup', '_ormbases': ['auth.Group']},
117
            'approval_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
118
            'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 9, 11, 14, 9, 283154)'}),
119
            'desc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
120
            'estimated_participants': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
121
            'expiration_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
122
            'group_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.Group']", 'unique': 'True', 'primary_key': 'True'}),
123
            'issue_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
124
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.GroupKind']"}),
125
            'moderation_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
126
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosGroupQuota']", 'blank': 'True'})
127
        },
128
        'im.astakosgroupquota': {
129
            'Meta': {'unique_together': "(('resource', 'group'),)", 'object_name': 'AstakosGroupQuota'},
130
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']", 'blank': 'True'}),
131
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
132
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {}),
133
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"})
134
        },
135
        'im.astakosuser': {
136
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'AstakosUser', '_ormbases': ['auth.User']},
137
            'activation_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
138
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
139
            'astakos_groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.AstakosGroup']", 'symmetrical': 'False', 'through': "orm['im.Membership']", 'blank': 'True'}),
140
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
141
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
142
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
143
            'date_signed_terms': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
144
            'email_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
145
            'has_credits': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
146
            'has_signed_terms': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
147
            'invitations': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
148
            'is_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
149
            'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
150
            'owner': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'owner'", 'null': 'True', 'to': "orm['im.AstakosGroup']"}),
151
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosUserQuota']", 'symmetrical': 'False'}),
152
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
153
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
154
            'updated': ('django.db.models.fields.DateTimeField', [], {}),
155
            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'})
156
        },
157
        'im.astakosuserquota': {
158
            'Meta': {'unique_together': "(('resource', 'user'),)", 'object_name': 'AstakosUserQuota'},
159
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
160
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {}),
161
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
162
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
163
        },
164
        'im.emailchange': {
165
            'Meta': {'object_name': 'EmailChange'},
166
            'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
167
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
168
            'new_email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
169
            'requested_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 9, 11, 14, 9, 290713)'}),
170
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emailchange_user'", 'unique': 'True', 'to': "orm['im.AstakosUser']"})
171
        },
172
        'im.groupkind': {
173
            'Meta': {'object_name': 'GroupKind'},
174
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
175
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'})
176
        },
177
        'im.invitation': {
178
            'Meta': {'object_name': 'Invitation'},
179
            'code': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
180
            'consumed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
181
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
182
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
183
            'inviter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'invitations_sent'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
184
            'is_consumed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
185
            'realname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
186
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
187
        },
188
        'im.membership': {
189
            'Meta': {'unique_together': "(('person', 'group'),)", 'object_name': 'Membership'},
190
            'date_joined': ('django.db.models.fields.DateField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
191
            'date_requested': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 8, 9, 11, 14, 9, 286925)', 'blank': 'True'}),
192
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']"}),
193
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
194
            'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
195
        },
196
        'im.resource': {
197
            'Meta': {'object_name': 'Resource'},
198
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
199
            'meta': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.ResourceMetadata']", 'symmetrical': 'False'}),
200
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
201
            'service': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Service']"})
202
        },
203
        'im.resourcemetadata': {
204
            'Meta': {'object_name': 'ResourceMetadata'},
205
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
206
            'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
207
            'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
208
        },
209
        'im.service': {
210
            'Meta': {'object_name': 'Service'},
211
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
212
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
213
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
214
            'icon': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
215
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
216
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
217
            'url': ('django.db.models.fields.FilePathField', [], {'max_length': '100'})
218
        }
219
    }
220

  
221
    complete_apps = ['im']
b/snf-astakos-app/astakos/im/models.py
42 42
from urlparse import urlparse, urlunparse
43 43
from random import randint
44 44
from collections import defaultdict
45
from south.signals import post_migrate
45 46

  
46 47
from django.db import models, IntegrityError
47 48
from django.contrib.auth.models import User, UserManager, Group
......
51 52
from django.core.mail import send_mail
52 53
from django.db import transaction
53 54
from django.db.models.signals import post_save, post_syncdb
54
from django.db.models import Q
55
from django.db.models import Q, Count
55 56

  
56 57
from astakos.im.settings import DEFAULT_USER_LEVEL, INVITATIONS_PER_LEVEL, \
57 58
    AUTH_TOKEN_DURATION, BILLING_FIELDS, QUEUE_CONNECTION, SITENAME, \
......
236 237
        super(AstakosUser, self).__init__(*args, **kwargs)
237 238
        self.__has_signed_terms = self.has_signed_terms
238 239
        if self.id:
239
            self.__groupnames = [g.name for g in self.groups.all()]
240
            self.__groupnames = [g.name for g in self.astakos_groups.all()]
240 241
        else:
241 242
            self.is_active = False
242 243
    
......
305 306
        groupname = 'shibboleth' if self.provider == 'shibboleth' else 'default'
306 307
        if groupname not in self.__groupnames:
307 308
            try:
308
                group = Group.objects.get(name = groupname)
309
                self.groups.add(group)
310
            except Group.DoesNotExist, e:
309
                group = AstakosGroup.objects.get(name = groupname)
310
                Membership(group=group, person=self, date_joined=datetime.now()).save()
311
            except AstakosGroup.DoesNotExist, e:
311 312
                logger.exception(e)
312 313
    
313 314
    def renew_token(self):
b/snf-astakos-app/astakos/im/templates/im/astakosgroup_list.html
36 36
		</ul>
37 37
        
38 38
    {% endif %}
39
    {% if object_list %}
39 40
      {% with object_list|filter_groups:user as d %}
40 41
      	{% with d|lookup:'mine' as mine %}
41 42
	      	{% if mine %}	
......
138 139
			{% endif %}
139 140
      	{% endwith %}
140 141
      {% endwith %}
141
      {% if not object_list %}
142
      	<h2>No groups found!</h2>
143
	  {% endif %}
142
      {% else %}
143
            {% if is_search %}
144
                <h2>No groups found!</h2>
145
            {% endif %}
146
        {% endif %}
144 147
    </div>
145 148
</div>
146 149
{% endblock %}
b/snf-astakos-app/astakos/im/views.py
269 269
            except ValueError, ve:
270 270
                messages.success(request, ve)
271 271
    elif request.method == "GET":
272
        request.user.is_verified = True
273
        request.user.save()
272
        if not request.user.is_verified:
273
            request.user.is_verified = True
274
            request.user.save()
274 275
    return render_response(template_name,
275 276
                           reset_cookie = reset_cookie,
276 277
                           profile_form = form,
......
640 641

  
641 642
@signed_terms_required
642 643
@login_required
643
def group_search(request, queryset=EmptyQuerySet(), extra_context={}, **kwargs):
644
def group_search(request, extra_context={}, **kwargs):
644 645
    join_forms = {}
645 646
    if request.method == 'GET':
646 647
        form = AstakosGroupSearchForm()
......
655 656
                join_forms[g.name] = f(dict(group=g,
656 657
                                            person=request.user,
657 658
                                            date_requested=datetime.now().strftime("%d/%m/%Y")))
658
    return object_list(request,
659
                        queryset,
660
                        template_name='im/astakosgroup_list.html',
661
                        extra_context=dict(form=form, is_search=True, join_forms=join_forms))
659
            return object_list(request,
660
                                queryset,
661
                                template_name='im/astakosgroup_list.html',
662
                                extra_context=dict(form=form, is_search=True, join_forms=join_forms))
663
    return render_response(template='im/astakosgroup_list.html',
664
                            form = form,
665
                            context_instance=get_context(request))
662 666

  
663 667
@signed_terms_required
664 668
@login_required

Also available in: Unified diff