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'}), |
Also available in: Unified diff