Revision e1a80257

b/.gitignore
7 7
.pydevproject
8 8
snf-astakos-app/astakos/version.py
9 9
snf-astakos-app/distribute-0.6.10-py2.6.egg
10
snf-astakos-app/distribute-0.6.10.tar.gz
10
snf-astakos-app/distribute-0.6.10.tar.gz
11
snf-astakos-app/build/lib/astakos/__init__.py
12
snf-astakos-app/build/lib/astakos/im/__init__.py
13
snf-astakos-app/build/lib/astakos/im/activation_backends.py
14
snf-astakos-app/build/lib/astakos/im/api/__init__.py
15
snf-astakos-app/build/lib/astakos/im/api/admin.py
16
snf-astakos-app/build/lib/astakos/im/api/backends/__init__.py
17
snf-astakos-app/build/lib/astakos/im/api/backends/base.py
18
snf-astakos-app/build/lib/astakos/im/api/backends/errors.py
19
snf-astakos-app/build/lib/astakos/im/api/backends/lib/__init__.py
20
snf-astakos-app/build/lib/astakos/im/api/backends/lib/django/__init__.py
21
snf-astakos-app/build/lib/astakos/im/api/backends/notifications.py
22
snf-astakos-app/build/lib/astakos/im/api/callpoint.py
23
snf-astakos-app/build/lib/astakos/im/api/client.py
24
snf-astakos-app/build/lib/astakos/im/api/faults.py
25
snf-astakos-app/build/lib/astakos/im/api/service.py
26
snf-astakos-app/build/lib/astakos/im/api/spec.py
27
snf-astakos-app/build/lib/astakos/im/auth_backends.py
28
snf-astakos-app/build/lib/astakos/im/context_processors.py
29
snf-astakos-app/build/lib/astakos/im/cookie.py
30
snf-astakos-app/build/lib/astakos/im/endpoints/__init__.py
31
snf-astakos-app/build/lib/astakos/im/endpoints/aquarium/__init__.py
32
snf-astakos-app/build/lib/astakos/im/endpoints/aquarium/client.py
33
snf-astakos-app/build/lib/astakos/im/endpoints/aquarium/consumer.py
34
snf-astakos-app/build/lib/astakos/im/endpoints/aquarium/producer.py
35
snf-astakos-app/build/lib/astakos/im/endpoints/qh.py
36
snf-astakos-app/build/lib/astakos/im/forms.py
37
snf-astakos-app/build/lib/astakos/im/functions.py
38
snf-astakos-app/build/lib/astakos/im/management/__init__.py
39
snf-astakos-app/build/lib/astakos/im/management/commands/__init__.py
40
snf-astakos-app/build/lib/astakos/im/management/commands/_common.py
41
snf-astakos-app/build/lib/astakos/im/management/commands/full-cleanup.py
42
snf-astakos-app/build/lib/astakos/im/management/commands/group-add.py
43
snf-astakos-app/build/lib/astakos/im/management/commands/group-list.py
44
snf-astakos-app/build/lib/astakos/im/management/commands/group-permissions-add.py
45
snf-astakos-app/build/lib/astakos/im/management/commands/group-permissions-remove.py~HEAD
46
snf-astakos-app/build/lib/astakos/im/management/commands/group-permissions-remove.py~future
47
snf-astakos-app/build/lib/astakos/im/management/commands/group-update.py
48
snf-astakos-app/build/lib/astakos/im/management/commands/invitation-details.py
49
snf-astakos-app/build/lib/astakos/im/management/commands/invitation-list.py
50
snf-astakos-app/build/lib/astakos/im/management/commands/quotaholder-sync.py
51
snf-astakos-app/build/lib/astakos/im/management/commands/resource-add.py
52
snf-astakos-app/build/lib/astakos/im/management/commands/resource-list.py
53
snf-astakos-app/build/lib/astakos/im/management/commands/resource-remove.py
54
snf-astakos-app/build/lib/astakos/im/management/commands/service-add.py
55
snf-astakos-app/build/lib/astakos/im/management/commands/service-list.py
56
snf-astakos-app/build/lib/astakos/im/management/commands/service-remove.py
57
snf-astakos-app/build/lib/astakos/im/management/commands/service-token-renew.py
58
snf-astakos-app/build/lib/astakos/im/management/commands/term-add.py
59
snf-astakos-app/build/lib/astakos/im/management/commands/user-activation-send.py
60
snf-astakos-app/build/lib/astakos/im/management/commands/user-add.py
61
snf-astakos-app/build/lib/astakos/im/management/commands/user-details.py
62
snf-astakos-app/build/lib/astakos/im/management/commands/user-invite.py
63
snf-astakos-app/build/lib/astakos/im/management/commands/user-list.py
64
snf-astakos-app/build/lib/astakos/im/management/commands/user-update.py
65
snf-astakos-app/build/lib/astakos/im/messages.py
66
snf-astakos-app/build/lib/astakos/im/middleware.py
67
snf-astakos-app/build/lib/astakos/im/migrations/0001_initial.py
68
snf-astakos-app/build/lib/astakos/im/migrations/0002_auto__add_field_astakosuser_third_party_identifier.py
69
snf-astakos-app/build/lib/astakos/im/migrations/0003_auto__add_unique_invitation_username.py
70
snf-astakos-app/build/lib/astakos/im/migrations/0004_auto__add_field_astakosuser_email_verified.py
71
snf-astakos-app/build/lib/astakos/im/migrations/0005_auto__add_field_astakosuser_has_credits.py
72
snf-astakos-app/build/lib/astakos/im/migrations/0006_auto__add_approvalterms__add_field_astakosuser_has_signed_terms__add_f.py
73
snf-astakos-app/build/lib/astakos/im/migrations/0007_auto__chg_field_astakosuser_email_verified__chg_field_astakosuser_has_.py
74
snf-astakos-app/build/lib/astakos/im/migrations/0007_auto__del_field_invitation_accepted__del_field_invitation_is_accepted.py
75
snf-astakos-app/build/lib/astakos/im/migrations/0008_auto__add_emailchange.py
76
snf-astakos-app/build/lib/astakos/im/migrations/0009_auto__add_service.py
77
snf-astakos-app/build/lib/astakos/im/migrations/0010_auto__add_field_astakosuser_activation_sent__chg_field_service_url.py
78
snf-astakos-app/build/lib/astakos/im/migrations/0011_set_old_activation_sent.py
79
snf-astakos-app/build/lib/astakos/im/migrations/0012_auto__add_additionalmail.py
80
snf-astakos-app/build/lib/astakos/im/migrations/0013_auto__del_unique_additionalmail_email.py
81
snf-astakos-app/build/lib/astakos/im/migrations/0014_auto__add_unique_astakosuser_third_party_identifier_provider.py
82
snf-astakos-app/build/lib/astakos/im/migrations/0015_auto__add_groupkind__add_astakosgroup__add_resourcemetadata__add_astak.py
83
snf-astakos-app/build/lib/astakos/im/migrations/0015_auto__add_pendingthirdpartyuser__add_unique_pendingthirdpartyuser_prov.py
84
snf-astakos-app/build/lib/astakos/im/migrations/0016_auto__add_sessioncatalog.py
85
snf-astakos-app/build/lib/astakos/im/migrations/0017_populate_resource_data.py
86
snf-astakos-app/build/lib/astakos/im/migrations/0018_auto__add_field_astakosgroup_homepage.py
87
snf-astakos-app/build/lib/astakos/im/migrations/0020_auto__chg_field_astakosgroup_homepage.py
88
snf-astakos-app/build/lib/astakos/im/migrations/0021_auto__add_field_astakosgroupquota_uplimit__add_field_astakosuserquota_.py
89
snf-astakos-app/build/lib/astakos/im/migrations/0022_copy_limit_to_uplimit.py
90
snf-astakos-app/build/lib/astakos/im/migrations/0024_auto__chg_field_astakosgroupquota_lim.py
91
snf-astakos-app/build/lib/astakos/im/migrations/0025_case_insensitive_emails.py
92
snf-astakos-app/build/lib/astakos/im/migrations/0026_auto__add_field_resource_desc__add_field_resource_unit.py
93
snf-astakos-app/build/lib/astakos/im/migrations/0027_auto__add_field_resource_group.py
94
snf-astakos-app/build/lib/astakos/im/migrations/0028_auto__add_field_astakosuser_disturbed_quota.py
95
snf-astakos-app/build/lib/astakos/im/migrations/0029_auto__add_field_astakosgroup_max_participants.py
96
snf-astakos-app/build/lib/astakos/im/migrations/0030_populate_resource_data.py
97
snf-astakos-app/build/lib/astakos/im/migrations/0031_populate_group_data.py
98
snf-astakos-app/build/lib/astakos/im/migrations/__init__.py
99
snf-astakos-app/build/lib/astakos/im/models.py
100
snf-astakos-app/build/lib/astakos/im/settings.py
101
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/README.rst
102
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/cloudbar.css
103
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/cloudbar.js
104
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/cloudbar.less
105
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/home-icon.png
106
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/service_cloud.css
107
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/service_cyclades.css
108
snf-astakos-app/build/lib/astakos/im/static/im/cloudbar/service_pithos.css
109
snf-astakos-app/build/lib/astakos/im/static/im/css/boxsizing.htc
110
snf-astakos-app/build/lib/astakos/im/static/im/css/browser-fixes.css
111
snf-astakos-app/build/lib/astakos/im/static/im/css/colorbox.css
112
snf-astakos-app/build/lib/astakos/im/static/im/css/custom.css
113
snf-astakos-app/build/lib/astakos/im/static/im/css/dropkick.css
114
snf-astakos-app/build/lib/astakos/im/static/im/css/formating.css
115
snf-astakos-app/build/lib/astakos/im/static/im/css/forms.css
116
snf-astakos-app/build/lib/astakos/im/static/im/css/global.css
117
snf-astakos-app/build/lib/astakos/im/static/im/css/ie7.css
118
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_flat_0_aaaaaa_40x100.png
119
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_glass_55_fbf9ee_1x400.png
120
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_glass_65_ffffff_1x400.png
121
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_glass_75_dadada_1x400.png
122
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_glass_75_e6e6e6_1x400.png
123
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_glass_75_ffffff_1x400.png
124
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png
125
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png
126
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-icons_222222_256x240.png
127
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-icons_2e83ff_256x240.png
128
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-icons_454545_256x240.png
129
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-icons_888888_256x240.png
130
snf-astakos-app/build/lib/astakos/im/static/im/css/images/ui-icons_cd0a0a_256x240.png
131
snf-astakos-app/build/lib/astakos/im/static/im/css/jquery-ui-1.8.21.custom.css
132
snf-astakos-app/build/lib/astakos/im/static/im/css/max480.css
133
snf-astakos-app/build/lib/astakos/im/static/im/css/max768.css
134
snf-astakos-app/build/lib/astakos/im/static/im/css/max960.css
135
snf-astakos-app/build/lib/astakos/im/static/im/css/modules.css
136
snf-astakos-app/build/lib/astakos/im/static/im/css/print.css
137
snf-astakos-app/build/lib/astakos/im/static/im/css/uniform.default.css
138
snf-astakos-app/build/lib/astakos/im/static/im/images/_double-dots.jpg
139
snf-astakos-app/build/lib/astakos/im/static/im/images/accounts-logo.png
140
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down.png
141
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down_black.png
142
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down_blue.png
143
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down_grey.png
144
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-lt.png
145
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-up.png
146
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-up_blue.png
147
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-white-reverse.png
148
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-white.png
149
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow_01.jpg
150
snf-astakos-app/build/lib/astakos/im/static/im/images/bandwidth-stats.png
151
snf-astakos-app/build/lib/astakos/im/static/im/images/banner.png
152
snf-astakos-app/build/lib/astakos/im/static/im/images/black-line.jpg
153
snf-astakos-app/build/lib/astakos/im/static/im/images/checkbox.png
154
snf-astakos-app/build/lib/astakos/im/static/im/images/cpu-stats.png
155
snf-astakos-app/build/lib/astakos/im/static/im/images/create-compute.png
156
snf-astakos-app/build/lib/astakos/im/static/im/images/create-network.png
157
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-cpu.png
158
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-disk.png
159
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-network.png
160
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-ram.png
161
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-storage.png
162
snf-astakos-app/build/lib/astakos/im/static/im/images/create-resource-vm.png
163
snf-astakos-app/build/lib/astakos/im/static/im/images/create-storage.png
164
snf-astakos-app/build/lib/astakos/im/static/im/images/create.png
165
snf-astakos-app/build/lib/astakos/im/static/im/images/dashed_border.png
166
snf-astakos-app/build/lib/astakos/im/static/im/images/disk-stats.png
167
snf-astakos-app/build/lib/astakos/im/static/im/images/dots.jpg
168
snf-astakos-app/build/lib/astakos/im/static/im/images/double-dots-unequal.jpg
169
snf-astakos-app/build/lib/astakos/im/static/im/images/join.png
170
snf-astakos-app/build/lib/astakos/im/static/im/images/local.png
171
snf-astakos-app/build/lib/astakos/im/static/im/images/network-stats.png
172
snf-astakos-app/build/lib/astakos/im/static/im/images/openid.png
173
snf-astakos-app/build/lib/astakos/im/static/im/images/pictures/accounts_3.png
174
snf-astakos-app/build/lib/astakos/im/static/im/images/pictures/login_pic.png
175
snf-astakos-app/build/lib/astakos/im/static/im/images/pictures/ring_bell_beige.gif
176
snf-astakos-app/build/lib/astakos/im/static/im/images/pictures/signup_pic.png
177
snf-astakos-app/build/lib/astakos/im/static/im/images/plus-minus-hover.png
178
snf-astakos-app/build/lib/astakos/im/static/im/images/plus-minus.png
179
snf-astakos-app/build/lib/astakos/im/static/im/images/porta.png
180
snf-astakos-app/build/lib/astakos/im/static/im/images/question-mark.jpg
181
snf-astakos-app/build/lib/astakos/im/static/im/images/quota-related-bg.png
182
snf-astakos-app/build/lib/astakos/im/static/im/images/ram-stats.png
183
snf-astakos-app/build/lib/astakos/im/static/im/images/red-stats-vm.png
184
snf-astakos-app/build/lib/astakos/im/static/im/images/refresh_g.png
185
snf-astakos-app/build/lib/astakos/im/static/im/images/refresh_lg.png
186
snf-astakos-app/build/lib/astakos/im/static/im/images/service_okeanos_logo.png
187
snf-astakos-app/build/lib/astakos/im/static/im/images/service_pithos_logo.png
188
snf-astakos-app/build/lib/astakos/im/static/im/images/shibboleth.png
189
snf-astakos-app/build/lib/astakos/im/static/im/images/sound_g.png
190
snf-astakos-app/build/lib/astakos/im/static/im/images/sound_lg.png
191
snf-astakos-app/build/lib/astakos/im/static/im/images/sprite.png
192
snf-astakos-app/build/lib/astakos/im/static/im/images/statistics_icons.png
193
snf-astakos-app/build/lib/astakos/im/static/im/images/stats-line.jpg
194
snf-astakos-app/build/lib/astakos/im/static/im/images/storage-stats.png
195
snf-astakos-app/build/lib/astakos/im/static/im/images/symbols.png
196
snf-astakos-app/build/lib/astakos/im/static/im/images/symbols2.png
197
snf-astakos-app/build/lib/astakos/im/static/im/images/twitter.png
198
snf-astakos-app/build/lib/astakos/im/static/im/images/vm-stats.png
199
snf-astakos-app/build/lib/astakos/im/static/im/js/common.js
200
snf-astakos-app/build/lib/astakos/im/static/im/js/forms.js
201
snf-astakos-app/build/lib/astakos/im/static/im/js/html5.js
202
snf-astakos-app/build/lib/astakos/im/static/im/js/html5shiv-printshiv.js
203
snf-astakos-app/build/lib/astakos/im/static/im/js/jqModal.js
204
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery-1.7.1.min.js
205
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery-ui-1.8.21.custom.min.js
206
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.alerts.js
207
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.colorbox.js
208
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.dropkick-1.0.0.js
209
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.infieldlabel.js
210
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.js
211
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.labelify.js
212
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.tablesorter.js
213
snf-astakos-app/build/lib/astakos/im/static/im/js/jquery.uniform.js
214
snf-astakos-app/build/lib/astakos/im/static/im/js/main.js
215
snf-astakos-app/build/lib/astakos/im/static/im/js/modernizr-2.0.6.js
216
snf-astakos-app/build/lib/astakos/im/static/im/js/os.js
217
snf-astakos-app/build/lib/astakos/im/static/im/js/quotas.js
218
snf-astakos-app/build/lib/astakos/im/static/im/js/resources_list.js
219
snf-astakos-app/build/lib/astakos/im/static/im/js/underscore.js
220
snf-astakos-app/build/lib/astakos/im/static/im/less/bootstrap.less
221
snf-astakos-app/build/lib/astakos/im/static/im/less/django_forms.less
222
snf-astakos-app/build/lib/astakos/im/static/im/less/forms.less
223
snf-astakos-app/build/lib/astakos/im/static/im/less/mixins.less
224
snf-astakos-app/build/lib/astakos/im/static/im/less/patterns.less
225
snf-astakos-app/build/lib/astakos/im/static/im/less/reset.less
226
snf-astakos-app/build/lib/astakos/im/static/im/less/scaffolding.less
227
snf-astakos-app/build/lib/astakos/im/static/im/less/tables.less
228
snf-astakos-app/build/lib/astakos/im/static/im/less/type.less
229
snf-astakos-app/build/lib/astakos/im/static/im/less/variables.less
230
snf-astakos-app/build/lib/astakos/im/static/im/less/xtra.less
231
snf-astakos-app/build/lib/astakos/im/synnefo_settings.py
232
snf-astakos-app/build/lib/astakos/im/target/__init__.py
233
snf-astakos-app/build/lib/astakos/im/target/local.py
234
snf-astakos-app/build/lib/astakos/im/target/redirect.py
235
snf-astakos-app/build/lib/astakos/im/target/shibboleth.py
236
snf-astakos-app/build/lib/astakos/im/tasks.py
237
snf-astakos-app/build/lib/astakos/im/templates/im/account_base.html
238
snf-astakos-app/build/lib/astakos/im/templates/im/account_notification.txt
239
snf-astakos-app/build/lib/astakos/im/templates/im/activation_email.txt
240
snf-astakos-app/build/lib/astakos/im/templates/im/approval_terms.html
241
snf-astakos-app/build/lib/astakos/im/templates/im/astakosgroup_create_list.html
242
snf-astakos-app/build/lib/astakos/im/templates/im/astakosgroup_detail.html
243
snf-astakos-app/build/lib/astakos/im/templates/im/astakosgroup_form.html
244
snf-astakos-app/build/lib/astakos/im/templates/im/astakosgroup_form_summary.html
245
snf-astakos-app/build/lib/astakos/im/templates/im/astakosgroup_list.html
246
snf-astakos-app/build/lib/astakos/im/templates/im/astakosuserquota_list.html
247
snf-astakos-app/build/lib/astakos/im/templates/im/base.html
248
snf-astakos-app/build/lib/astakos/im/templates/im/base_two_cols.html
249
snf-astakos-app/build/lib/astakos/im/templates/im/billing.html
250
snf-astakos-app/build/lib/astakos/im/templates/im/captcha.html
251
snf-astakos-app/build/lib/astakos/im/templates/im/email.txt
252
snf-astakos-app/build/lib/astakos/im/templates/im/feedback.html
253
snf-astakos-app/build/lib/astakos/im/templates/im/feedback_mail.txt
254
snf-astakos-app/build/lib/astakos/im/templates/im/footer.html
255
snf-astakos-app/build/lib/astakos/im/templates/im/form_render.html
256
snf-astakos-app/build/lib/astakos/im/templates/im/group_creation_notification.txt
257
snf-astakos-app/build/lib/astakos/im/templates/im/helpdesk_notification.txt
258
snf-astakos-app/build/lib/astakos/im/templates/im/invitation.txt
259
snf-astakos-app/build/lib/astakos/im/templates/im/invitations.html
260
snf-astakos-app/build/lib/astakos/im/templates/im/login.html
261
snf-astakos-app/build/lib/astakos/im/templates/im/login_base.html
262
snf-astakos-app/build/lib/astakos/im/templates/im/one_col_base.html
263
snf-astakos-app/build/lib/astakos/im/templates/im/profile.html
264
snf-astakos-app/build/lib/astakos/im/templates/im/projects/list_types.html
265
snf-astakos-app/build/lib/astakos/im/templates/im/register.html
266
snf-astakos-app/build/lib/astakos/im/templates/im/resource_list.html
267
snf-astakos-app/build/lib/astakos/im/templates/im/services_description.html
268
snf-astakos-app/build/lib/astakos/im/templates/im/signup.html
269
snf-astakos-app/build/lib/astakos/im/templates/im/signup_complete.html
270
snf-astakos-app/build/lib/astakos/im/templates/im/switch_accounts_email.txt
271
snf-astakos-app/build/lib/astakos/im/templates/im/third_party_check_local.html
272
snf-astakos-app/build/lib/astakos/im/templates/im/third_party_registration.html
273
snf-astakos-app/build/lib/astakos/im/templates/im/timeline.html
274
snf-astakos-app/build/lib/astakos/im/templates/im/welcome_email.txt
275
snf-astakos-app/build/lib/astakos/im/templates/registration/email_change_confirm.html
276
snf-astakos-app/build/lib/astakos/im/templates/registration/email_change_done.html
277
snf-astakos-app/build/lib/astakos/im/templates/registration/email_change_email.txt
278
snf-astakos-app/build/lib/astakos/im/templates/registration/email_change_form.html
279
snf-astakos-app/build/lib/astakos/im/templates/registration/logged_out.html
280
snf-astakos-app/build/lib/astakos/im/templates/registration/password_change_form.html
281
snf-astakos-app/build/lib/astakos/im/templates/registration/password_email.txt
282
snf-astakos-app/build/lib/astakos/im/templates/registration/password_reset_complete.html
283
snf-astakos-app/build/lib/astakos/im/templates/registration/password_reset_confirm.html
284
snf-astakos-app/build/lib/astakos/im/templates/registration/password_reset_done.html
285
snf-astakos-app/build/lib/astakos/im/templates/registration/password_reset_form.html
286
snf-astakos-app/build/lib/astakos/im/templatetags/__init__.py
287
snf-astakos-app/build/lib/astakos/im/templatetags/astakos_tags.py
288
snf-astakos-app/build/lib/astakos/im/templatetags/filters.py
289
snf-astakos-app/build/lib/astakos/im/templatetags/formatters.py
290
snf-astakos-app/build/lib/astakos/im/urls.py
291
snf-astakos-app/build/lib/astakos/im/util.py
292
snf-astakos-app/build/lib/astakos/im/views.py
293
snf-astakos-app/build/lib/astakos/im/widgets.py
294
snf-astakos-app/build/lib/astakos/urls.py
295
snf-astakos-app/build/lib/astakos/version.py
296
snf-astakos-app/dist/snf_astakos_app-0.7.6_279_gc0b2660-py2.6.egg
297
snf-astakos-app/build/lib/astakos/im/auth_providers.py
298
snf-astakos-app/build/lib/astakos/im/management/commands/astakos-qh-sync.py
299
snf-astakos-app/build/lib/astakos/im/management/commands/group-details.py
300
snf-astakos-app/build/lib/astakos/im/management/commands/group-permissions-remove.py
301
snf-astakos-app/build/lib/astakos/im/management/commands/user-remove.py
302
snf-astakos-app/build/lib/astakos/im/migrations/0016_populate_group_data.py
303
snf-astakos-app/build/lib/astakos/im/migrations/0031_auto__add_sessioncatalog__add_pendingthirdpartyuser__add_unique_pendin.py
304
snf-astakos-app/build/lib/astakos/im/migrations/0032_auto__add_astakosuserauthprovider__add_unique_astakosuserauthprovider_.py
305
snf-astakos-app/build/lib/astakos/im/migrations/0033_multiple_auth_providers.py
306
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down_green.png
307
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-down_yellow.png
308
snf-astakos-app/build/lib/astakos/im/static/im/images/arrow-up_green.png
309
snf-astakos-app/build/lib/astakos/im/static/im/images/how_it_works.png
310
snf-astakos-app/build/lib/astakos/im/templates/im/account_creation_notification.txt
311
snf-astakos-app/build/lib/astakos/im/templates/im/auth/local_login_form.html
312
snf-astakos-app/build/lib/astakos/im/templates/im/auth/local_login_prompt.html
313
snf-astakos-app/build/lib/astakos/im/templates/im/auth/local_signup_prompt.html
314
snf-astakos-app/build/lib/astakos/im/templates/im/auth/shibboleth_login.html
315
snf-astakos-app/build/lib/astakos/im/templates/im/auth/shibboleth_login_prompt.html
316
snf-astakos-app/build/lib/astakos/im/templates/im/auth/shibboleth_quick_login.html
317
snf-astakos-app/build/lib/astakos/im/templates/im/how_it_works.html
318
snf-astakos-app/build/lib/astakos/im/templates/im/profile_bak.html
319
snf-astakos-app/build/lib/astakos/im/templates/im/resource_usage.html
320
snf-astakos-app/build/lib/astakos/im/tests.py
321
snf-astakos-app/dist/snf_astakos_app-0.7.6_343_g666c749-py2.6.egg
b/snf-astakos-app/astakos/im/api/backends/lib/django/__init__.py
33 33

  
34 34
from django.db import IntegrityError, transaction
35 35
from django.core.exceptions import ObjectDoesNotExist
36
from django.conf import settings
36 37

  
37 38
from functools import wraps
38 39
from smtplib import SMTPException
39 40

  
40 41
from astakos.im.models import (
41
    AstakosUser, AstakosGroup, GroupKind, Resource, Service, RESOURCE_SEPARATOR
42
    AstakosUser, AstakosGroup, GroupKind, Resource, Service, RESOURCE_SEPARATOR,
43
    Project, ProjectApplication, ProjectMembership, filter_queryset_by_property
42 44
)
43 45
from astakos.im.api.backends.base import BaseBackend, SuccessResult, FailureResult
44 46
from astakos.im.api.backends.errors import (
45 47
    ItemNotExists, ItemExists, MissingIdentifier, MultipleItemsExist
46 48
)
49
# from astakos.im.api.backends.lib.notifications import EmailNotification
50

  
47 51
from astakos.im.util import reserved_email, model_to_dict
48
from astakos.im.endpoints.qh import get_quota
52
from astakos.im.endpoints.qh import get_quota, send_quota
53
from astakos.im.settings import SITENAME
54
try:
55
    from astakos.im.messages import astakos_messages
56
except:
57
    pass
49 58

  
50 59
import logging
51 60

  
......
56 65

  
57 66
def safe(func):
58 67
    """Decorator function for views that implement an API method."""
59
    @transaction.commit_manually
60 68
    @wraps(func)
61 69
    def wrapper(self, *args, **kwargs):
62 70
        logger.debug('%s %s %s' % (func, args, kwargs))
......
64 72
            data = func(self, *args, **kwargs) or ()
65 73
        except Exception, e:
66 74
            logger.exception(e)
67
            transaction.rollback()
68 75
            return FailureResult(e)
69 76
        else:
70
            transaction.commit()
71 77
            return SuccessResult(data)
72 78
    return wrapper
73 79

  
......
107 113
        q = model.objects.all()
108 114
        if filter:
109 115
            q = q.filter(id__in=filter)
110
        return map(lambda o: model_to_dict(o, exclude=[]), q)
116
        return map(lambda o: self._details(o), q)
117

  
118
    def _details(self, obj):
119
        return model_to_dict(obj, exclude=[])
111 120

  
112 121
    def _create_object(self, model, **kwargs):
113 122
        o = model.objects.create(**kwargs)
......
136 145
        permissions = kwargs.pop('permissions', ())
137 146
        groups = kwargs.pop('groups', ())
138 147
        password = kwargs.pop('password', None)
148
        provider = kwargs.pop('provider', 'local')
139 149

  
140 150
        u = self._create_object(AstakosUser, **kwargs)
141 151

  
......
145 155
        u.policies = policies
146 156
        u.extended_groups = groups
147 157

  
148
        if not u.has_auth_provider('local'):
149
            u.add_auth_provider('local')
158
        if not u.has_auth_provider(provider):
159
            u.add_auth_provider(provider)
150 160

  
151
        return self._list(AstakosUser, filter=(u.id,))
161
        return self._details(u)
152 162

  
153 163
    @safe
154 164
    def add_policies(self, user_id, update=False, policies=()):
......
180 190
            except ObjectDoesNotExist, e:
181 191
                append((service, resource, e))
182 192
        return rejected
193
    
183 194
    @safe
184 195
    def add_permissions(self, user_id, permissions=()):
185 196
        user = self._lookup_user(user_id)
......
252 263
        resources = kwargs.pop('resources', ())
253 264
        s = self._create_object(Service, **kwargs)
254 265
        s.resources = resources
255
        return self._list(Service, filter=(s.id,))
266
        return self._details(s)
256 267

  
257 268
    @safe
258 269
    def remove_services(self, ids=()):
......
308 319
        g.policies = policies
309 320
#        g.members = members
310 321
        g.owners = owners
311
        return self._list(AstakosGroup, filter=(g.id,))
322
        return self._details(g)
323
    
324
    
325
    @safe
326
    def submit_application(self, **kwargs):
327
        app = self._create_object(ProjectApplication, **kwargs)
328
        notification = build_notification(
329
            settings.SERVER_EMAIL,
330
            [settings.ADMINS],
331
            _(GROUP_CREATION_SUBJECT) % {'group':app.definition.name},
332
            _('An new project application identified by %(serial)s has been submitted.') % app.serial
333
        )
334
        notification.send()
335
    
336
    @safe
337
    def list_applications(self):
338
        return self._list(ProjectAppication)
339
    
340
    @safe
341
    def approve_application(self, serial):
342
        app = self._lookup_object(ProjectAppication, serial=serial)
343
        notify = False
344
        if not app.precursor_application:
345
            kwargs = {
346
                'application':app,
347
                'creation_date':datetime.now(),
348
                'last_approval_date':datetime.now(),
349
            }
350
            project = self._create_object(Project, **kwargs)
351
        else:
352
            project = app.precursor_application.project
353
            last_approval_date = project.last_approval_date
354
            if project.is_valid:
355
                project.application = app
356
                project.last_approval_date = datetime.now()
357
                project.save()
358
            else:
359
                raise Exception(_(astakos_messages.INVALID_PROJECT) % project.__dict__)
360
        
361
        r = _synchonize_project(project.serial)
362
        if not r.is_success:
363
            # revert to precursor
364
            project.appication = app.precursor_application
365
            if project.application:
366
                project.last_approval_date = last_approval_date
367
            project.save()
368
            r = synchonize_project(project.serial)
369
            if not r.is_success:
370
                raise Exception(_(astakos_messages.QH_SYNC_ERROR))
371
        else:
372
            project.last_application_synced = app
373
            project.save()
374
            sender, recipients, subject, message
375
            notification = build_notification(
376
                settings.SERVER_EMAIL,
377
                [project.owner.email],
378
                _('Project application has been approved on %s alpha2 testing' % SITENAME),
379
                _('Your application request %(serial)s has been apporved.')
380
            )
381
            notification.send()
382
    
383
    
384
    @safe
385
    def list_projects(self, filter_property=None):
386
        if filter_property:
387
            q = filter_queryset_by_property(
388
                Project.objects.all(),
389
                filter_property
390
            )
391
            return map(lambda o: self._details(o), q)
392
        return self._list(Project)
393
        
394

  
395
    
396
    @safe
397
    def add_project_member(self, serial, user_id, request_user):
398
        project = self._lookup_object(Project, serial=serial)
399
        user = self.lookup_user(user_id)
400
        if not project.owner == request_user:
401
            raise Exception(_(astakos_messages.NOT_PROJECT_OWNER))
402
        
403
        if not project.is_alive:
404
            raise Exception(_(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
405
        if len(project.members) + 1 > project.limit_on_members_number:
406
            raise Exception(_(astakos_messages.MEMBER_NUMBER_LIMIT_REACHED))
407
        m = self._lookup_object(ProjectMembership, person=user, project=project)
408
        if m.is_accepted:
409
            return
410
        m.is_accepted = True
411
        m.decision_date = datetime.now()
412
        m.save()
413
        notification = build_notification(
414
            settings.SERVER_EMAIL,
415
            [user.email],
416
            _('Your membership on project %(name)s has been accepted.') % project.definition.__dict__, 
417
            _('Your membership on project %(name)s has been accepted.') % project.definition.__dict__,
418
        )
419
        notification.send()
420
    
421
    @safe
422
    def remove_project_member(self, serial, user_id, request_user):
423
        project = self._lookup_object(Project, serial=serial)
424
        if not project.is_alive:
425
            raise Exception(_(astakos_messages.NOT_ALIVE_PROJECT) % project.__dict__)
426
        if not project.owner == request_user:
427
            raise Exception(_(astakos_messages.NOT_PROJECT_OWNER))
428
        user = self.lookup_user(user_id)
429
        m = self._lookup_object(ProjectMembership, person=user, project=project)
430
        if not m.is_accepted:
431
            return
432
        m.is_accepted = False
433
        m.decision_date = datetime.now()
434
        m.save()
435
        notification = build_notification(
436
            settings.SERVER_EMAIL,
437
            [user.email],
438
            _('Your membership on project %(name)s has been removed.') % project.definition.__dict__, 
439
            _('Your membership on project %(name)s has been removed.') % project.definition.__dict__,
440
        )
441
        notification.send()    
442
    
443
    @safe
444
    def suspend_project(self, serial):
445
        project = self._lookup_object(Project, serial=serial)
446
        project.suspend()
447
        notification = build_notification(
448
            settings.SERVER_EMAIL,
449
            [project.owner.email],
450
            _('Project %(name)s has been suspended on %s alpha2 testing' % SITENAME),
451
            _('Project %(name)s has been suspended on %s alpha2 testing' % SITENAME)
452
        )
453
        notification.send()
454
    
455
    @safe
456
    def terminate_project(self, serial):
457
        project = self._lookup_object(Project, serial=serial)
458
        project.termination()
459
        notification = build_notification(
460
            settings.SERVER_EMAIL,
461
            [project.owner.email],
462
            _('Project %(name)s has been terminated on %s alpha2 testing' % SITENAME),
463
            _('Project %(name)s has been terminated on %s alpha2 testing' % SITENAME)
464
        )
465
        notification.send()
466
    
467
    @safe
468
    def synchonize_project(self, serial):
469
        project = self._lookup_object(Project, serial=serial)
470
        project.sync()
/dev/null
1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
import logging
35
import socket
36

  
37
from smtplib import SMTPException
38

  
39
from django.conf import settings
40
from django.core.mail import send_mail
41
from django.template.loader import render_to_string
42

  
43
import astakos.im.messages as astakos_messages
44

  
45
from astakos.im.settings import LOGGING_LEVEL
46

  
47
logger = logging.getLogger(__name__)
48

  
49
def _send_admin_notification(template_name,
50
                             dictionary=None,
51
                             subject='alpha2 testing notification',):
52
    """
53
    Send notification email to settings.ADMINS.
54

  
55
    Raises SendNotificationError
56
    """
57
    if not settings.ADMINS:
58
        return
59
    dictionary = dictionary or {}
60
    message = render_to_string(template_name, dictionary)
61
    sender = settings.SERVER_EMAIL
62
    try:
63
        send_mail(subject,
64
                  message, sender, [i[1] for i in settings.ADMINS])
65
    except (SMTPException, socket.error) as e:
66
        logger.exception(e)
67
        raise SendNotificationError()
68
    else:
69
        msg = 'Sent admin notification for user %s' % dictionary
70
        logger.log(LOGGING_LEVEL, msg)
71

  
72
class EmailNotification(Notification):
73
    def send(self):
74
        send_mail(
75
            subject,
76
            message,
77
            sender,
78
            recipients
79
        )
80

  
81
class Notification(object):
82
    def __init__(self, sender, recipients, subject, message):
83
        self.sender = sender
84
        self.recipients = recipients
85
        self.subject = subject
86
        self.message = message
87
    
88
    def send(self):
89
        pass
90

  
91
class SendMailError(Exception):
92
    pass
93

  
94
class SendNotificationError(SendMailError):
95
    def __init__(self):
96
        self.message = _(astakos_messages.NOTIFICATION_SEND_ERR)
97
        super(SendNotificationError, self).__init__()
b/snf-astakos-app/astakos/im/fixtures/member_accept_policies
1
[
2
    {
3
        "model": "im.memberacceptpolicy",
4
        "pk": 1,
5
        "fields": {
6
            "policy": "auto_accept",
7
            "description": "new join requests are automatically accepted by the system"
8
        }
9
    },
10
    {
11
        "model": "im.memberacceptpolicy",
12
        "pk": 2,
13
        "fields": {
14
            "policy": "owner_accepts",
15
            "description": "new join requests must be accepted by the owner of the project"
16
        }
17
    },
18
    {
19
        "model": "im.memberacceptpolicy",
20
        "pk": 3,
21
        "fields": {
22
            "policy": "closed",
23
            "description": "no new members can join the project, even if old ones leave"
24
        }
25
    }
26
]
b/snf-astakos-app/astakos/im/forms.py
35 35

  
36 36
from django import forms
37 37
from django.utils.translation import ugettext as _
38
from django.contrib.auth.forms import (UserCreationForm, AuthenticationForm,
39
                                       PasswordResetForm, PasswordChangeForm,
40
                                       SetPasswordForm)
38
from django.contrib.auth.forms import (
39
    UserCreationForm, AuthenticationForm,
40
    PasswordResetForm, PasswordChangeForm,
41
    SetPasswordForm
42
)
41 43
from django.core.mail import send_mail
42 44
from django.contrib.auth.tokens import default_token_generator
43 45
from django.template import Context, loader
......
50 52
from django.db import transaction
51 53
from django.utils.encoding import smart_unicode
52 54
from django.core import validators
55
from django.contrib.auth.models import AnonymousUser
53 56

  
54 57
from astakos.im.models import (
55 58
    AstakosUser, EmailChange, AstakosGroup, Invitation, GroupKind,
56
    Resource, PendingThirdPartyUser, get_latest_terms, RESOURCE_SEPARATOR
59
    Resource, PendingThirdPartyUser, get_latest_terms, RESOURCE_SEPARATOR,
60
    ProjectDefinition, ProjectApplication, create_application
57 61
)
58 62
from astakos.im.settings import (
59 63
    INVITATIONS_PER_LEVEL, BASEURL, SITENAME, RECAPTCHA_PRIVATE_KEY,
......
902 906
        except BaseException, e:
903 907
            logger.exception(e)
904 908
        return super(ExtendedSetPasswordForm, self).save(commit=commit)
909

  
910

  
911
class ProjectApplicationForm(forms.ModelForm):
912
    name = forms.CharField(
913
        validators=[validators.RegexValidator(
914
            DOMAIN_VALUE_REGEX,
915
            _(astakos_messages.DOMAIN_VALUE_ERR),
916
            'invalid'
917
        )],
918
        widget=forms.TextInput(attrs={'placeholder': 'eg. foo.ece.ntua.gr'}),
919
        help_text="Name should be in the form of dns"
920
    )
921
    comments = forms.CharField(widget=forms.Textarea, required=False)
922
    
923
    class Meta:
924
        model = ProjectDefinition
925
        exclude = ('resource_grants')
926
    
927
    def __init__(self, *args, **kwargs):
928
        #update QueryDict
929
        args = list(args)
930
        qd = args.pop(0).copy()
931
        members_unlimited = qd.pop('members_unlimited', False)
932
        members_uplimit = qd.pop('members_uplimit', None)
933

  
934
        #substitue QueryDict
935
        args.insert(0, qd)
936

  
937
        super(AstakosGroupCreationForm, self).__init__(*args, **kwargs)
938
        
939
        self.fields.keyOrder = ['kind', 'name', 'homepage', 'desc',
940
                                'issue_date', 'expiration_date',
941
                                'moderation_enabled', 'max_participants']
942
        def add_fields((k, v)):
943
            k = k.partition('_proxy')[0]
944
            self.fields[k] = forms.IntegerField(
945
                required=False,
946
                widget=forms.HiddenInput(),
947
                min_value=1
948
            )
949
        map(add_fields,
950
            ((k, v) for k,v in qd.iteritems() if k.endswith('_uplimit'))
951
        )
952

  
953
        def add_fields((k, v)):
954
            self.fields[k] = forms.BooleanField(
955
                required=False,
956
                #widget=forms.HiddenInput()
957
            )
958
        map(add_fields,
959
            ((k, v) for k,v in qd.iteritems() if k.startswith('is_selected_'))
960
        )
961

  
962
    def clean(self):
963
        userid = self.data.get('user', None)[0]
964
        self.user = None
965
        if userid:
966
            try:
967
                self.user = AstakosUser.objects.get(id=userid)
968
            except AstakosUser.DoesNotExist:
969
                pass
970
        if not self.user:
971
            raise forms.ValidationError(_(astakos_messages.NO_APPLICANT))
972
        super(ProjectApplicationForm, self).clean()
973
        return self.cleaned_data
974
    
975
    def resource_policies(self, clean=True):
976
        if clean:
977
            self.clean()
978
        policies = []
979
        append = policies.append
980
        for name, uplimit in self.cleaned_data.iteritems():
981
            subs = name.split('_uplimit')
982
            if len(subs) == 2:
983
                prefix, suffix = subs
984
                s, sep, r = prefix.partition(RESOURCE_SEPARATOR)
985
                resource = Resource.objects.get(service__name=s, name=r)
986

  
987
                # keep only resource limits for selected resource groups
988
                if self.cleaned_data.get(
989
                    'is_selected_%s' % resource.group, False
990
                ):
991
                    append(dict(service=s, resource=r, uplimit=uplimit))
992
        return policies
993

  
994
    def save(self, commit=True):
995
        definition = super(ProjectApplicationForm, self).save(commit=commit)
996
        definition.resource_policies=self.resource_policies(clean=False)
997
        applicant = self.user
998
        comments = self.cleaned_data.pop('comments', None)
999
        try:
1000
            precursor_application = self.instance.projectapplication
1001
        except:
1002
            precursor_application = None
1003
        return create_application(
1004
            definition,
1005
            applicant,
1006
            comments,
1007
            precursor_application,
1008
            commit
1009
        )
b/snf-astakos-app/astakos/im/management/commands/astakos-qh-sync.py
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
from django.core.management.base import NoArgsCommand, CommandError
35

  
36
from astakos.im.models import AstakosUser, Resource
37
from astakos.im.endpoints.qh import register_users, register_resources
38

  
39
import logging
40
logger = logging.getLogger(__name__)
41

  
42

  
43
class Command(NoArgsCommand):
44
    help = "Send user information and resource quota in the Quotaholder"
45

  
46
    def handle_noargs(self, **options):
47
        try:
48
            register_resources(Resource.objects.all())
49
            register_users(AstakosUser.objects.all())
50
        except BaseException, e:
51
            logger.exception(e)
52
            raise CommandError("Syncing failed.")
b/snf-astakos-app/astakos/im/management/commands/group-details.py
39 39
from astakos.im.models import AstakosGroup
40 40

  
41 41
class Command(BaseCommand):
42
    args = "<group name>"
42
    args = "<group id or name>"
43 43
    help = "Show group info"
44 44

  
45 45
    def handle(self, *args, **options):
46 46
        if len(args) != 1:
47
            raise CommandError("Please provide a group name")
47
            raise CommandError("Please provide a group id or name")
48 48

  
49 49
        group = AstakosGroup.objects
50 50
        name_or_id = args[0].decode('utf8')
b/snf-astakos-app/astakos/im/management/commands/invitation-list.py
33 33

  
34 34
from optparse import make_option
35 35

  
36
from django.core.management.base import BaseCommand, CommandError
36
from django.core.management.base import NoArgsCommand, CommandError
37 37

  
38 38
from astakos.im.models import Invitation
39 39

  
40 40
from ._common import format_bool
41 41

  
42 42

  
43
class Command(BaseCommand):
43
class Command(NoArgsCommand):
44 44
    help = "List invitations"
45 45

  
46
    option_list = BaseCommand.option_list + (
46
    option_list = NoArgsCommand.option_list + (
47 47
        make_option('-c',
48 48
                    action='store_true',
49 49
                    dest='csv',
......
51 51
                    help="Use pipes to separate values"),
52 52
    )
53 53

  
54
    def handle(self, *args, **options):
55
        if args:
56
            raise CommandError("Command doesn't accept any arguments")
57
        
54
    def handle_noargs(self, **options):
58 55
        invitations = Invitation.objects.all().order_by('id')
59 56
        
60 57
        labels = ('id', 'inviter', 'email', 'real name', 'code', 'consumed')
/dev/null
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
from django.core.management.base import BaseCommand, CommandError
35

  
36
from astakos.im.models import AstakosUser, Resource
37
from astakos.im.endpoints.qh import register_users, register_resources
38

  
39
import logging
40
logger = logging.getLogger(__name__)
41

  
42

  
43
class Command(BaseCommand):
44
    help = "Send user information and resource quota in the Quotaholder"
45

  
46
    def handle(self, *args, **options):
47
        try:
48
            register_resources(Resource.objects.all())
49
            register_users(AstakosUser.objects.all())
50
        except BaseException, e:
51
            logger.exception(e)
52
            raise CommandError("Syncing failed.")
b/snf-astakos-app/astakos/im/management/commands/resource-list.py
33 33

  
34 34
from optparse import make_option
35 35

  
36
from django.core.management.base import BaseCommand
36
from django.core.management.base import NoArgsCommand
37 37

  
38 38
from astakos.im.models import Resource
39 39

  
40 40

  
41
class Command(BaseCommand):
41
class Command(NoArgsCommand):
42 42
    help = "List resources"
43 43

  
44
    option_list = BaseCommand.option_list + (
44
    option_list = NoArgsCommand.option_list + (
45 45
        make_option('-c',
46 46
                    action='store_true',
47 47
                    dest='csv',
......
49 49
                    help="Use pipes to separate values"),
50 50
    )
51 51

  
52
    def handle(self, *args, **options):
52
    def handle_noargs(self, **options):
53 53
        resources = Resource.objects.select_related().all()
54 54

  
55 55
        labels = ('id', 'service', 'name')
b/snf-astakos-app/astakos/im/management/commands/user-update.py
58 58
                    dest='password',
59 59
                    metavar='PASSWORD',
60 60
                    help="Set user's password"),
61
        make_option('--provider',
62
                    dest='provider',
63
                    metavar='PROVIDER',
64
                    help="Set user's provider"),
65 61
        make_option('--renew-token',
66 62
                    action='store_true',
67 63
                    dest='renew_token',
......
189 185
        if password is not None:
190 186
            user.set_password(password)
191 187

  
192
        provider = options.get('provider')
193
        if provider is not None:
194
            user.provider = provider
195

  
196 188
        password = None
197 189
        if options['renew_password']:
198 190
            password = AstakosUser.objects.make_random_password()
b/snf-astakos-app/astakos/im/messages.py
113 113
INVITATION_SENT                         =   'Invitation sent to %(email)s.'
114 114
VERIFICATION_SENT                       =   'Verification sent.'
115 115
SWITCH_ACCOUNT_LINK_SENT                =   'This email is already associated with another local account. \
116
                                               To change this account to a shibboleth one follow the link in the verification email sent to %(email)s. \
117
                                               Otherwise just ignore it.'
116
                                             To change this account to a shibboleth one follow the link in the verification email sent to %(email)s. \
117
                                             Otherwise just ignore it.'
118 118
NOTIFICATION_SENT                       =   'Your request for an account was successfully received and is now pending approval. \
119
                                               You will be notified by email in the next few days. \
120
                                               Thanks for your interest in ~okeanos! The GRNET team.'
119
                                             You will be notified by email in the next few days. \
120
                                             Thanks for your interest in ~okeanos! The GRNET team.'
121 121
ACTIVATION_SENT                         =   'Activation sent.'
122 122

  
123 123
REGISTRATION_COMPLETED                  =   'Registration completed. You can now login.'
......
126 126
NOT_ALLOWED_NEXT_PARAM                  =   'Not allowed next parameter.'
127 127
MISSING_KEY_PARAMETER                   =   'Missing key parameter.'
128 128
INVALID_KEY_PARAMETER                   =   'Invalid key.'
129
DOMAIN_VALUE_ERR                        =   'Enter a valid domain.'
129
DOMAIN_VALUE_ERR                        =   'Enter a valid domain.'
130
QH_SYNC_ERROR                           =   'Failed to get synchronized with quotaholder.'
131
UNIQUE_PROJECT_NAME_CONSTRAIN_ERR       =   'The project name (as specified in its application\'s definition) must be unique among all active projects.'
132
INVALID_PROJECT                         =   'Project %(serial)s is invalid.'
133
NOT_ALIVE_PROJECT                       =   'Project %(serial)s is not alive.'
134
NOT_PROJECT_OWNER                       =   'Only project owner can perform this action.'
135
MEMBER_NUMBER_LIMIT_REACHED             =   'Maximum participant number has been reached.'
136
NO_APPLICANT                            =   'Project application requires an applicant. None found.'
b/snf-astakos-app/astakos/im/migrations/0017_populate_resource_data.py
9 9
logger = logging.getLogger(__name__)
10 10

  
11 11
class Migration(DataMigration):
12

  
12
    "Obsolete migration."
13
        
13 14
    def forwards(self, orm):
14
        "Write your forwards methods here."
15

  
16
        try:
17
            default = orm.AstakosGroup.objects.get(name='default')
18
        except orm.AstakosGroup.DoesNotExist:
19
            return
20

  
21
        def create_policies(args):
22
            sn, dict = args
23
            url = dict.get('url')
24
            resources = dict.get('resources') or ()
25
            s, created = orm.Service.objects.get_or_create(
26
                name=sn,
27
                defaults={'url': url}
28
            )
29
            
30
            for r in resources:
31
                try:
32
                    rn = r.pop('name', '')
33
                    uplimit = r.pop('uplimit', None)
34
                    r, created = orm.Resource.objects.get_or_create(
35
                        service=s,
36
                        name=rn,
37
                        defaults=r)
38
                except Exception, e:
39
                    print "Cannot create resource ", rn
40
                    continue
41
                else:
42
                    q, created = orm.AstakosGroupQuota.objects.get_or_create(
43
                        group=default,
44
                        resource=r,
45
                        defaults={
46
                            'uplimit':uplimit,
47
                        }
48
                    )
49
        map(create_policies, SERVICES.iteritems())
15
        pass
50 16

  
51 17
    def backwards(self, orm):
52
        try:
53
            default = orm.AstakosGroup.objects.get(name='default')
54
        except orm.AstakosGroup.DoesNotExist:
55
            return
56

  
57
        def destroy_policies(args):
58
            sn, dict = args
59
            url = dict.get('url')
60
            resources = dict.get('resources') or ()
61
            for r in resources:
62
                rn = r.get('name', '')
63
                try:
64
                    q = orm.AstakosGroupQuota.objects.get(
65
                        group=default,
66
                        resource__name=rn)
67
                    q.delete()
68
                    q = orm.Resource.objects.get(service__name=sn, name=rn)
69
                    q.delete()
70
                except Exception, e:
71
                    print "Cannot create resource ", rn
72
                    continue
73

  
74
        map(destroy_policies, SERVICES.iteritems())
75

  
18
        pass
19
    
76 20
    models = {
77 21
        'auth.group': {
78 22
            'Meta': {'object_name': 'Group'},
b/snf-astakos-app/astakos/im/migrations/0024_auto__chg_field_astakosgroupquota_lim.py
16 16

  
17 17

  
18 18
    def backwards(self, orm):
19
        
20
        # Changing field 'AstakosGroupQuota.limit'
21
        db.alter_column('im_astakosgroupquota', 'limit', self.gf('django.db.models.fields.PositiveIntegerField')(default=None))
22

  
23
        # Changing field 'AstakosUserQuota.limit'
24
        db.alter_column('im_astakosuserquota', 'limit', self.gf('django.db.models.fields.PositiveIntegerField')(default=None))
25

  
19
        pass
26 20

  
27 21
    models = {
28 22
        'auth.group': {
b/snf-astakos-app/astakos/im/migrations/0034_auto__add_projectapplication__add_project__add_projectmembership__add_.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
        # Adding model 'ProjectApplication'
12
        db.create_table('im_projectapplication', (
13
            ('serial', self.gf('django.db.models.fields.CharField')(default='a3e0784bfd924d4ba9a1181332d5e9', unique=True, max_length=30, primary_key=True)),
14
            ('applicant', self.gf('django.db.models.fields.related.ForeignKey')(related_name='my_project_applications', to=orm['im.AstakosUser'])),
15
            ('owner', self.gf('django.db.models.fields.related.ForeignKey')(related_name='own_project_applications', to=orm['im.AstakosUser'])),
16
            ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
17
            ('definition', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['im.ProjectDefinition'], unique=True)),
18
            ('issue_date', self.gf('django.db.models.fields.DateTimeField')()),
19
            ('precursor_application', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['im.ProjectApplication'], unique=True, null=True, blank=True)),
20
        ))
21
        db.send_create_signal('im', ['ProjectApplication'])
22

  
23
        # Adding model 'Project'
24
        db.create_table('im_project', (
25
            ('serial', self.gf('django.db.models.fields.CharField')(default='ab6c5646977c4e678daff27ff3c7cb', unique=True, max_length=30, primary_key=True)),
26
            ('application', self.gf('django.db.models.fields.related.OneToOneField')(related_name='project', unique=True, to=orm['im.ProjectApplication'])),
27
            ('creation_date', self.gf('django.db.models.fields.DateTimeField')()),
28
            ('last_approval_date', self.gf('django.db.models.fields.DateTimeField')()),
29
            ('termination_date', self.gf('django.db.models.fields.DateTimeField')()),
30
            ('last_synced_application', self.gf('django.db.models.fields.related.OneToOneField')(blank=True, related_name='last_project', unique=True, null=True, to=orm['im.ProjectApplication'])),
31
        ))
32
        db.send_create_signal('im', ['Project'])
33

  
34
        # Adding model 'ProjectMembership'
35
        db.create_table('im_projectmembership', (
36
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
37
            ('person', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.AstakosUser'])),
38
            ('project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.Project'])),
39
            ('issue_date', self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2012, 12, 6, 10, 11, 33, 387204))),
40
            ('decision_date', self.gf('django.db.models.fields.DateField')(null=True, db_index=True)),
41
            ('is_accepted', self.gf('django.db.models.fields.BooleanField')(default=False)),
42
        ))
43
        db.send_create_signal('im', ['ProjectMembership'])
44

  
45
        # Adding unique constraint on 'ProjectMembership', fields ['person', 'project']
46
        db.create_unique('im_projectmembership', ['person_id', 'project_id'])
47

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

  
56
        # Adding model 'ProjectDefinition'
57
        db.create_table('im_projectdefinition', (
58
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
59
            ('name', self.gf('django.db.models.fields.CharField')(max_length=80)),
60
            ('homepage', self.gf('django.db.models.fields.URLField')(max_length=255, null=True, blank=True)),
61
            ('description', self.gf('django.db.models.fields.TextField')(null=True)),
62
            ('start_date', self.gf('django.db.models.fields.DateTimeField')()),
63
            ('end_date', self.gf('django.db.models.fields.DateTimeField')()),
64
            ('member_accept_policy', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.MemberAcceptPolicy'])),
65
            ('limit_on_members_number', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True)),
66
        ))
67
        db.send_create_signal('im', ['ProjectDefinition'])
68

  
69
        # Adding model 'ProjectResourceGrant'
70
        db.create_table('im_projectresourcegrant', (
71
            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
72
            ('member_limit', self.gf('django.db.models.fields.BigIntegerField')(null=True)),
73
            ('project_limit', self.gf('django.db.models.fields.BigIntegerField')(null=True)),
74
            ('resource', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.Resource'])),
75
            ('project_definition', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['im.ProjectDefinition'], blank=True)),
76
        ))
77
        db.send_create_signal('im', ['ProjectResourceGrant'])
78

  
79
        # Adding unique constraint on 'ProjectResourceGrant', fields ['resource', 'project_definition']
80
        db.create_unique('im_projectresourcegrant', ['resource_id', 'project_definition_id'])
81

  
82

  
83
    def backwards(self, orm):
84
        
85
        # Removing unique constraint on 'ProjectResourceGrant', fields ['resource', 'project_definition']
86
        db.delete_unique('im_projectresourcegrant', ['resource_id', 'project_definition_id'])
87

  
88
        # Removing unique constraint on 'ProjectMembership', fields ['person', 'project']
89
        db.delete_unique('im_projectmembership', ['person_id', 'project_id'])
90

  
91
        # Deleting model 'ProjectApplication'
92
        db.delete_table('im_projectapplication')
93

  
94
        # Deleting model 'Project'
95
        db.delete_table('im_project')
96

  
97
        # Deleting model 'ProjectMembership'
98
        db.delete_table('im_projectmembership')
99

  
100
        # Deleting model 'MemberAcceptPolicy'
101
        db.delete_table('im_memberacceptpolicy')
102

  
103
        # Deleting model 'ProjectDefinition'
104
        db.delete_table('im_projectdefinition')
105

  
106
        # Deleting model 'ProjectResourceGrant'
107
        db.delete_table('im_projectresourcegrant')
108

  
109

  
110
    models = {
111
        'auth.group': {
112
            'Meta': {'object_name': 'Group'},
113
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
114
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
115
            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
116
        },
117
        'auth.permission': {
118
            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
119
            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
120
            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
121
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
122
            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
123
        },
124
        'auth.user': {
125
            'Meta': {'object_name': 'User'},
126
            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
127
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
128
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
129
            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
130
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
131
            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
132
            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
133
            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
134
            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
135
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
136
            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
137
            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
138
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
139
        },
140
        'contenttypes.contenttype': {
141
            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
142
            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
143
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
144
            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
145
            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
146
        },
147
        'im.additionalmail': {
148
            'Meta': {'object_name': 'AdditionalMail'},
149
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
150
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
151
            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
152
        },
153
        'im.approvalterms': {
154
            'Meta': {'object_name': 'ApprovalTerms'},
155
            'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 12, 6, 10, 11, 33, 376205)', 'db_index': 'True'}),
156
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
157
            'location': ('django.db.models.fields.CharField', [], {'max_length': '255'})
158
        },
159
        'im.astakosgroup': {
160
            'Meta': {'object_name': 'AstakosGroup', '_ormbases': ['auth.Group']},
161
            'approval_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
162
            'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 12, 6, 10, 11, 33, 368608)'}),
163
            'desc': ('django.db.models.fields.TextField', [], {'null': 'True'}),
164
            'estimated_participants': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
165
            'expiration_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
166
            'group_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.Group']", 'unique': 'True', 'primary_key': 'True'}),
167
            'homepage': ('django.db.models.fields.URLField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
168
            'issue_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
169
            'kind': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.GroupKind']"}),
170
            'max_participants': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
171
            'moderation_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
172
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosGroupQuota']", 'blank': 'True'})
173
        },
174
        'im.astakosgroupquota': {
175
            'Meta': {'unique_together': "(('resource', 'group'),)", 'object_name': 'AstakosGroupQuota'},
176
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']", 'blank': 'True'}),
177
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
178
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
179
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
180
            'uplimit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'})
181
        },
182
        'im.astakosuser': {
183
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'AstakosUser', '_ormbases': ['auth.User']},
184
            'activation_sent': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
185
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
186
            'astakos_groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.AstakosGroup']", 'symmetrical': 'False', 'through': "orm['im.Membership']", 'blank': 'True'}),
187
            'auth_token': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
188
            'auth_token_created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
189
            'auth_token_expires': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
190
            'date_signed_terms': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
191
            'disturbed_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
192
            'email_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
193
            'has_credits': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
194
            'has_signed_terms': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
195
            'invitations': ('django.db.models.fields.IntegerField', [], {'default': '100'}),
196
            'is_verified': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
197
            'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
198
            'owner': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'owner'", 'null': 'True', 'to': "orm['im.AstakosGroup']"}),
199
            'policy': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['im.Resource']", 'null': 'True', 'through': "orm['im.AstakosUserQuota']", 'symmetrical': 'False'}),
200
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
201
            'third_party_identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
202
            'updated': ('django.db.models.fields.DateTimeField', [], {}),
203
            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'})
204
        },
205
        'im.astakosuserauthprovider': {
206
            'Meta': {'unique_together': "(('identifier', 'module', 'user'),)", 'object_name': 'AstakosUserAuthProvider'},
207
            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
208
            'affiliation': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True', 'blank': 'True'}),
209
            'auth_backend': ('django.db.models.fields.CharField', [], {'default': "'astakos'", 'max_length': '255'}),
210
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
211
            'identifier': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
212
            'module': ('django.db.models.fields.CharField', [], {'default': "'local'", 'max_length': '255'}),
213
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'auth_providers'", 'to': "orm['im.AstakosUser']"})
214
        },
215
        'im.astakosuserquota': {
216
            'Meta': {'unique_together': "(('resource', 'user'),)", 'object_name': 'AstakosUserQuota'},
217
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
218
            'limit': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
219
            'resource': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.Resource']"}),
220
            'uplimit': ('django.db.models.fields.BigIntegerField', [], {'null': 'True'}),
221
            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
222
        },
223
        'im.emailchange': {
224
            'Meta': {'object_name': 'EmailChange'},
225
            'activation_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40', 'db_index': 'True'}),
226
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
227
            'new_email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
228
            'requested_at': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 12, 6, 10, 11, 33, 378081)'}),
229
            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emailchange_user'", 'unique': 'True', 'to': "orm['im.AstakosUser']"})
230
        },
231
        'im.groupkind': {
232
            'Meta': {'object_name': 'GroupKind'},
233
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
234
            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'})
235
        },
236
        'im.invitation': {
237
            'Meta': {'object_name': 'Invitation'},
238
            'code': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
239
            'consumed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
240
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
241
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
242
            'inviter': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'invitations_sent'", 'null': 'True', 'to': "orm['im.AstakosUser']"}),
243
            'is_consumed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
244
            'realname': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
245
            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
246
        },
247
        'im.memberacceptpolicy': {
248
            'Meta': {'object_name': 'MemberAcceptPolicy'},
249
            'description': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
250
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
251
            'policy': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'})
252
        },
253
        'im.membership': {
254
            'Meta': {'unique_together': "(('person', 'group'),)", 'object_name': 'Membership'},
255
            'date_joined': ('django.db.models.fields.DateField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
256
            'date_requested': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 12, 6, 10, 11, 33, 373957)', 'blank': 'True'}),
257
            'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosGroup']"}),
258
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
259
            'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['im.AstakosUser']"})
260
        },
261
        'im.pendingthirdpartyuser': {
262
            'Meta': {'unique_together': "(('provider', 'third_party_identifier'),)", 'object_name': 'PendingThirdPartyUser'},
263
            'affiliation': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
264
            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
265
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
266
            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
267
            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
268
            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
269
            'provider': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff