| author | gibus |
| Thu, 20 Feb 2014 10:07:49 +0100 | |
| changeset 580 | f634a302c45e |
| parent 544 | 18ac07f35974 |
| child 605 | 830993bdf983 |
| permissions | -rw-r--r-- |
| 0 | 1 |
from django.forms.models import inlineformset_factory |
2 |
from cm.models import * |
|
3 |
from cm.message import * |
|
4 |
from django.contrib.auth import authenticate |
|
5 |
from django.contrib.auth import login as django_login |
|
6 |
from django.forms import ModelForm |
|
7 |
from django.contrib.auth.models import User |
|
8 |
from django.forms.formsets import formset_factory |
|
9 |
from django.shortcuts import render_to_response |
|
10 |
from django.template import RequestContext |
|
11 |
from django.utils.translation import ugettext as _, ugettext_lazy, ungettext |
|
12 |
from django.http import HttpResponse, HttpResponseRedirect, Http404 |
|
13 |
from django.forms.util import ErrorList |
|
14 |
from django.shortcuts import get_object_or_404 |
|
15 |
from cm.activity import register_activity |
|
16 |
from cm.views import get_text_by_keys_or_404 |
|
17 |
from cm.message import display_message |
|
18 |
from cm.utils import get_among, get_int |
|
19 |
from cm.models import ApplicationConfiguration |
|
20 |
from django.views.generic.list_detail import object_list |
|
21 |
from django.contrib.auth.decorators import login_required |
|
22 |
from cm.views import get_keys_from_dict |
|
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
23 |
from cm.security import has_global_perm, has_global_perm_or_perm_on_text |
| 0 | 24 |
from cm.exception import UnauthorizedException |
| 44 | 25 |
from cm.cm_settings import SHOW_EMAILS_IN_ADMIN |
| 38 | 26 |
from tagging.models import Tag |
| 0 | 27 |
import sys |
28 |
import re |
|
29 |
||
30 |
USER_PAGINATION = 10 |
|
31 |
||
32 |
@has_global_perm('can_manage_workspace') |
|
33 |
def user_list(request): |
|
34 |
display_suspended_users = get_int(request.GET, 'display', 0) |
|
| 38 | 35 |
tag_selected = request.GET.get('tag_selected', 0) |
| 0 | 36 |
paginate_by = get_int(request.GET, 'paginate', USER_PAGINATION) |
37 |
order_by = get_among(request.GET, 'order', ('user__username', |
|
38 |
'user__email', |
|
39 |
'-user__username', |
|
40 |
'-user__email', |
|
41 |
'role__name', |
|
42 |
'-role__name', |
|
43 |
'user__date_joined', |
|
44 |
'-user__date_joined', |
|
45 |
), |
|
46 |
'user__username') |
|
47 |
||
48 |
UserRole.objects.create_userroles_text(None) |
|
49 |
||
50 |
if request.method == 'POST': |
|
51 |
# bulk apply |
|
| 48 | 52 |
if 'apply' in request.POST and not 'save' in request.POST: |
| 0 | 53 |
action = request.POST.get('action', None) |
54 |
user_profile_keys = get_keys_from_dict(request.POST, 'check-').keys() |
|
55 |
if action == 'disable': |
|
56 |
for user_profile_key in user_profile_keys: |
|
57 |
profile = UserProfile.objects.get(key=user_profile_key) |
|
58 |
if profile != request.user.get_profile(): |
|
59 |
profile.is_suspended = True |
|
60 |
profile.save() |
|
61 |
display_message(request, _(u"%(count)i User's access suspended") % {'count':len(user_profile_keys)}) |
|
62 |
||
63 |
if action == 'enable': |
|
64 |
for user_profile_key in user_profile_keys: |
|
65 |
profile = UserProfile.objects.get(key=user_profile_key) |
|
66 |
profile.is_suspended = False |
|
67 |
profile.save() |
|
68 |
display_message(request, _(u"%(count)i User's access enabled") % {'count':len(user_profile_keys)}) |
|
69 |
||
70 |
ROLE_RE = re.compile('role_(\d*)') |
|
71 |
match = ROLE_RE.match(action) |
|
72 |
||
73 |
if match: |
|
74 |
role_id = match.group(1) |
|
75 |
for user_profile_key in user_profile_keys: |
|
76 |
user_role = UserRole.objects.get(user__userprofile__key=user_profile_key, text=None) |
|
77 |
user_role.role_id = role_id |
|
78 |
user_role.save() |
|
79 |
display_message(request, _(u"%(count)i user(s) role modified") % {'count':len(user_profile_keys)}) |
|
80 |
||
81 |
return HttpResponseRedirect(reverse('user')) |
|
82 |
||
83 |
if 'save' in request.POST: |
|
84 |
user_profile_keys_roles = get_keys_from_dict(request.POST, 'user-role-') |
|
85 |
count = 0 |
|
86 |
for user_profile_key in user_profile_keys_roles: |
|
87 |
role_id = user_profile_keys_roles[user_profile_key] |
|
88 |
if not user_profile_key: |
|
89 |
user_role = UserRole.objects.get(user=None, text=None) |
|
90 |
else: |
|
91 |
user_role = UserRole.objects.get(user__userprofile__key=user_profile_key, text=None) |
|
92 |
if (role_id != u'' or user_role.role_id != None) and role_id != unicode(user_role.role_id): |
|
93 |
if role_id: |
|
94 |
user_role.role_id = int(role_id) |
|
95 |
else: |
|
96 |
user_role.role_id = None |
|
97 |
user_role.save() |
|
98 |
count += 1 |
|
99 |
display_message(request, _(u"%(count)i user(s) role modified") % {'count':count}) |
|
100 |
return HttpResponseRedirect(reverse('user')) |
|
101 |
try: |
|
102 |
anon_role = UserRole.objects.get(user=None, text=None).role |
|
103 |
except UserRole.DoesNotExist: |
|
104 |
anon_role = None |
|
105 |
||
106 |
context = { |
|
107 |
'anon_role' : anon_role, |
|
108 |
'all_roles' : Role.objects.all(), |
|
109 |
'anon_roles' : Role.objects.filter(anon=True), |
|
110 |
'display_suspended_users' : display_suspended_users, |
|
| 38 | 111 |
'tag_list' : Tag.objects.usage_for_model(UserProfile), |
112 |
'tag_selected': tag_selected, |
|
| 44 | 113 |
'SHOW_EMAILS_IN_ADMIN': SHOW_EMAILS_IN_ADMIN, |
| 0 | 114 |
} |
115 |
||
| 38 | 116 |
query = UserRole.objects.select_related().filter(text=None).filter(~Q(user=None)).order_by(order_by) |
| 0 | 117 |
if not display_suspended_users: |
118 |
query = query.exclude(Q(user__userprofile__is_suspended=True) & Q(user__is_active=True)) |
|
| 42 | 119 |
else: |
120 |
# trick to include userprofile table anyway (to filter by tags) |
|
121 |
query = query.filter(Q(user__userprofile__is_suspended=True) | Q(user__userprofile__is_suspended=False)) |
|
| 38 | 122 |
|
123 |
if tag_selected: |
|
124 |
tag_ids = Tag.objects.filter(name=tag_selected) |
|
125 |
if tag_ids: |
|
126 |
content_type_id = ContentType.objects.get_for_model(UserProfile).pk |
|
127 |
query = query.extra(where=['tagging_taggeditem.object_id = cm_userprofile.id', |
|
128 |
'tagging_taggeditem.content_type_id = %i' %content_type_id, |
|
129 |
'tagging_taggeditem.tag_id = %i' %tag_ids[0].id], |
|
| 42 | 130 |
tables=['tagging_taggeditem'], |
| 38 | 131 |
) |
132 |
||
| 0 | 133 |
return object_list(request, query, |
134 |
template_name='site/user_list.html', |
|
135 |
paginate_by=paginate_by, |
|
136 |
extra_context=context, |
|
137 |
) |
|
138 |
||
139 |
class UserForm(ModelForm): |
|
140 |
email = forms.EmailField(label=ugettext_lazy(u'E-mail address'), required=True) |
|
141 |
||
142 |
class Meta: |
|
143 |
model = User |
|
144 |
fields = ('email', 'first_name', 'last_name') |
|
145 |
||
146 |
||
147 |
def clean_email(self): |
|
148 |
""" |
|
149 |
Validates that the supplied email is new to the site |
|
150 |
""" |
|
151 |
if 'email' in self.cleaned_data: |
|
152 |
email = self.cleaned_data['email'] |
|
153 |
try: |
|
154 |
if self.instance: |
|
155 |
user = User.objects.exclude(email__iexact=self.instance.email).get(email__iexact=email) |
|
156 |
else: |
|
157 |
user = User.objects.get(email__iexact=email) |
|
158 |
except User.DoesNotExist: |
|
159 |
return email |
|
160 |
raise forms.ValidationError(_(u'This user is already a member.')) |
|
161 |
||
162 |
class MassUserForm(forms.Form): |
|
163 |
email = forms.CharField(label=ugettext_lazy(u'Emails'), |
|
164 |
help_text=ugettext_lazy(u'Add multiples emails one per line (or separated by "," or ";")'), |
|
165 |
widget=forms.Textarea, |
|
166 |
required=True) |
|
167 |
||
168 |
class UserRoleForm(ModelForm): |
|
169 |
class Meta: |
|
170 |
model = UserRole |
|
171 |
fields = ('role',) |
|
172 |
||
173 |
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, |
|
174 |
initial=None, error_class=ErrorList, label_suffix=':', |
|
175 |
empty_permitted=False, instance=None): |
|
176 |
ModelForm.__init__(self, data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance) |
|
177 |
||
178 |
# override manually |
|
179 |
role_field = self.fields['role'] |
|
180 |
#role_field.required = True |
|
181 |
role_field.label = _(u'Workspace level role') |
|
182 |
role_field.help_text = _(u'This role will apply to every text in the workspace. To share only a (few) texts with this user, you can leave this blank and delegate roles on texts once the user is created.') |
|
183 |
self.fields['role'] = role_field |
|
184 |
||
185 |
class UserRoleTextForm(ModelForm): |
|
186 |
class Meta: |
|
187 |
model = UserRole |
|
188 |
fields = ('role',) |
|
189 |
||
190 |
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, |
|
191 |
initial=None, error_class=ErrorList, label_suffix=':', |
|
192 |
empty_permitted=False, instance=None): |
|
193 |
ModelForm.__init__(self, data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance) |
|
194 |
||
195 |
# override manually |
|
196 |
role_field = self.fields['role'] |
|
197 |
#role_field.required = True |
|
198 |
role_field.label = _(u'Text level role') |
|
199 |
role_field.help_text = _(u'This role will apply only to this text.') |
|
200 |
self.fields['role'] = role_field |
|
201 |
||
202 |
class UserProfileForm(ModelForm): |
|
203 |
class Meta: |
|
204 |
model = UserProfile |
|
|
544
18ac07f35974
Get rid of 'allow_contact' field for UserProfile since it is unused.
gibus
parents:
543
diff
changeset
|
205 |
fields = ('is_suspended', 'tags') |
| 0 | 206 |
|
207 |
class MyUserProfileForm(ModelForm): |
|
208 |
class Meta: |
|
209 |
model = UserProfile |
|
|
544
18ac07f35974
Get rid of 'allow_contact' field for UserProfile since it is unused.
gibus
parents:
543
diff
changeset
|
210 |
fields = ('tags',) |
| 0 | 211 |
|
212 |
class UserProfileAddForm(ModelForm): |
|
213 |
class Meta: |
|
214 |
model = UserProfile |
|
|
543
471c3ae269da
Get rid of 'preferred_language' field for UserProfile since it is unused.
gibus
parents:
540
diff
changeset
|
215 |
fields = ('tags',) |
| 131 | 216 |
|
217 |
class UserProfileRegisterForm(ModelForm): |
|
218 |
class Meta: |
|
219 |
model = UserProfile |
|
| 580 | 220 |
fields = () |
| 0 | 221 |
|
222 |
class UserAddForm(forms.Form): |
|
223 |
note = forms.CharField(label=ugettext_lazy(u'Note'), |
|
224 |
help_text=ugettext_lazy(u'Optional text to add to invitation email'), |
|
225 |
widget=forms.Textarea, |
|
226 |
required=False) |
|
227 |
||
228 |
||
229 |
SEPARATORS_RE = re.compile('[;,\n]+') |
|
230 |
||
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
231 |
@has_global_perm_or_perm_on_text('can_manage_workspace', 'can_manage_text') |
| 0 | 232 |
def user_mass_add(request, key=None): |
233 |
return user_add(request, key=key, mass=True) |
|
234 |
||
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
235 |
@has_global_perm_or_perm_on_text('can_manage_workspace', 'can_manage_text') |
| 0 | 236 |
def user_add(request, key=None, mass=False): |
237 |
text = get_text_by_keys_or_404(key) if key else None |
|
238 |
if request.method == 'POST': |
|
239 |
userform = UserForm(request.POST) if not mass else MassUserForm(request.POST) |
|
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
240 |
userroleform = UserRoleForm(request.POST) if not(key) else None |
| 0 | 241 |
noteform = UserAddForm(request.POST) |
242 |
userprofileform = UserProfileAddForm(request.POST) |
|
243 |
localroleform = UserRoleTextForm(request.POST, prefix="local") if key else None |
|
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
244 |
if userform.is_valid() and (not userroleform or userroleform.is_valid()) and noteform.is_valid() and userprofileform.is_valid() and (not localroleform or localroleform.is_valid()): |
| 0 | 245 |
data = userform.cleaned_data |
246 |
data.update(userprofileform.cleaned_data) |
|
247 |
data.update(noteform.cleaned_data) |
|
248 |
emails = data['email'] |
|
249 |
del data['email'] |
|
250 |
email_created = set() |
|
251 |
for email in [s.strip() for s in SEPARATORS_RE.split(emails)]: |
|
252 |
if email and not User.objects.filter(email__iexact=email) and email not in email_created: |
|
253 |
user = UserProfile.objects.create_inactive_user(email, True, **data) |
|
254 |
if key: |
|
255 |
localuserrole = UserRole.objects.create(user=user, role=localroleform.cleaned_data['role'], text=text) |
|
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
256 |
else: |
|
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
257 |
userrole = UserRole.objects.create(user=user, role=userroleform.cleaned_data['role'], text=None) |
| 0 | 258 |
email_created.add(email) |
|
311
459e30951aa2
fix: register user_created activity only if users where really added
raph
parents:
285
diff
changeset
|
259 |
register_activity(request, "user_created", user=user) |
| 0 | 260 |
display_message(request, ungettext(u'%(nb_users)d user added', u'%(nb_users)d users added', len(email_created)) % {'nb_users': len(email_created)}) |
261 |
if key: |
|
262 |
return HttpResponseRedirect(reverse('text-share', args=[text.key])) |
|
263 |
else: |
|
264 |
return HttpResponseRedirect(reverse('user')) |
|
265 |
else: |
|
266 |
userform = UserForm() if not mass else MassUserForm() |
|
|
540
dce127afac9d
Allow text manager to add users on this text with no global role.
gibus
parents:
311
diff
changeset
|
267 |
userroleform = UserRoleForm() if not(key) else None |
|
543
471c3ae269da
Get rid of 'preferred_language' field for UserProfile since it is unused.
gibus
parents:
540
diff
changeset
|
268 |
userprofileform = UserProfileAddForm() |
| 0 | 269 |
noteform = UserAddForm() |
270 |
localroleform = UserRoleTextForm(prefix="local") if key else None |
|
271 |
||
272 |
if key: |
|
273 |
template = 'site/user_mass_add_text.html' if mass else 'site/user_add_text.html' |
|
274 |
else: |
|
275 |
template = 'site/user_mass_add.html' if mass else 'site/user_add.html' |
|
276 |
||
277 |
return render_to_response(template, {'forms' : [userform, userprofileform , userroleform, noteform, localroleform], |
|
| 248 | 278 |
'save_name' : ungettext(u'Add user', u'Add users', 2 if mass else 1), |
| 0 | 279 |
'mass' : mass, |
280 |
'text' : text, |
|
281 |
}, context_instance=RequestContext(request)) |
|
282 |
||
283 |
class UserValidateForm(ModelForm): |
|
284 |
email = forms.EmailField(label=ugettext_lazy(u'Email'), required=True) |
|
285 |
||
286 |
class Meta: |
|
287 |
model = User |
|
288 |
fields = ('email', 'username', 'first_name', 'last_name') |
|
289 |
||
290 |
def clean_username(self): |
|
291 |
""" |
|
292 |
Validates that the supplied username is unique for the site. |
|
293 |
""" |
|
294 |
if 'username' in self.cleaned_data: |
|
295 |
username = self.cleaned_data['username'] |
|
296 |
try: |
|
297 |
user = User.objects.get(username__exact=username) |
|
298 |
except User.DoesNotExist: |
|
299 |
return username |
|
300 |
raise forms.ValidationError(_(u'This username is already in use. Please supply a different username.')) |
|
301 |
||
302 |
from django.contrib.auth.forms import SetPasswordForm |
|
303 |
||
304 |
def user_activate(request, key): |
|
305 |
try: |
|
306 |
profile = UserProfile.objects.get(adminkey=key) |
|
307 |
user = profile.user |
|
308 |
if not user.is_active: |
|
309 |
if request.method == 'POST': |
|
310 |
userform = UserValidateForm(request.POST, instance=user) |
|
311 |
pwform = SetPasswordForm(profile.user, request.POST) |
|
312 |
if userform.is_valid() and pwform.is_valid(): |
|
313 |
userform.save() |
|
314 |
pwform.save() |
|
315 |
user.is_active = True |
|
316 |
user.save() |
|
317 |
# login |
|
318 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
319 |
django_login(request, user) |
|
320 |
register_activity(request, "user_activated", user=user) |
|
321 |
display_message(request, _(u"Your account has been activated. You're now logged-in.")) |
|
322 |
||
323 |
return HttpResponseRedirect(reverse('index')) |
|
324 |
else: |
|
325 |
user.username = '' |
|
326 |
userform = UserValidateForm(instance=user) |
|
327 |
pwform = SetPasswordForm(user) |
|
328 |
||
329 |
return render_to_response('site/activate.html', { |
|
330 |
'forms' : [userform, pwform], |
|
331 |
'title': _(u'Activate your account'), |
|
332 |
'save_name' : _(u'activate account'), |
|
333 |
}, context_instance=RequestContext(request)) |
|
334 |
else: |
|
335 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
336 |
django_login(request, user) |
|
337 |
display_message(request, _(u"Your account has been activated. You're now logged-in.")) |
|
338 |
||
339 |
return HttpResponseRedirect(reverse('index')) |
|
340 |
||
341 |
except UserProfile.DoesNotExist: |
|
342 |
raise UnauthorizedException('No profile') |
|
343 |
||
344 |
#@has_global_perm('can_manage_workspace') |
|
345 |
#def user_delete(request, key): |
|
346 |
# try: |
|
347 |
# if request.method == 'POST': |
|
348 |
# profile = UserProfile.objects.get(key=key) |
|
349 |
# profile.delete() |
|
350 |
# display_message(request, "User %s has been deleted." %(profile.simple_print())) |
|
351 |
# return HttpResponse('') # no redirect because this is called by js |
|
352 |
# except UserProfile.DoesNotExist: |
|
353 |
# raise UnauthorizedException('No profile') |
|
354 |
||
355 |
@has_global_perm('can_manage_workspace') |
|
356 |
def user_suspend(request, key): |
|
357 |
if request.method == 'POST': |
|
358 |
profile = get_object_or_404(UserProfile, key=key) |
|
359 |
profile.is_suspended = True |
|
360 |
profile.save() |
|
361 |
if profile.user.is_active: |
|
362 |
display_message(request, _(u"User's access %(prof)s has been suspended.") % {'prof':profile.simple_print()}) |
|
363 |
register_activity(request, "user_suspended", user=profile.user) |
|
364 |
else: |
|
365 |
# make use active but disabled |
|
366 |
profile.user.is_active = True |
|
367 |
profile.user.save() |
|
368 |
display_message(request, _(u"User's access %(prof)s has been refused.") % {'prof':profile.simple_print()}) |
|
369 |
register_activity(request, "user_refused", user=profile.user) |
|
370 |
return HttpResponse('') # no redirect because this is called by js |
|
371 |
raise UnauthorizedException('') |
|
372 |
||
373 |
@has_global_perm('can_manage_workspace') |
|
374 |
def user_enable(request, key): |
|
375 |
if request.method == 'POST': |
|
376 |
profile = get_object_or_404(UserProfile, key=key) |
|
377 |
profile.is_suspended = False |
|
378 |
profile.save() |
|
379 |
if profile.user.is_active: |
|
380 |
display_message(request, _(u"User's access %(prof)s has been restored.") % {'prof':profile.simple_print()}) |
|
381 |
register_activity(request, "user_enabled", user=profile.user) |
|
382 |
else: # new member approval |
|
383 |
profile.send_activation_email() |
|
384 |
display_message(request, _(u"User's access %(prof)s has been approved.") % {'prof':profile.simple_print()}) |
|
385 |
register_activity(request, "user_approved", user=profile.user) |
|
386 |
return HttpResponse('') # no redirect because this is called by js |
|
387 |
raise UnauthorizedException('') |
|
388 |
||
389 |
def user_send_invitation(request, key): |
|
390 |
if request.method == 'POST': |
|
391 |
profile = get_object_or_404(UserProfile, key=key) |
|
392 |
profile.send_invitation_email() |
|
393 |
||
394 |
display_message(request, _(u"A new invitation has been sent to user %(prof)s.") % {'prof':profile.simple_print()}) |
|
395 |
return HttpResponse('') # no redirect because this is called by js |
|
396 |
raise UnauthorizedException('') |
|
397 |
||
|
225
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
398 |
from django.contrib.auth.forms import PasswordChangeForm |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
399 |
|
| 0 | 400 |
@login_required() |
401 |
def profile(request): |
|
402 |
user = request.user |
|
403 |
profile = user.get_profile() |
|
404 |
if request.method == 'POST': |
|
405 |
userform = UserForm(request.POST, instance=user) |
|
406 |
userprofileform = MyUserProfileForm(request.POST, instance=profile) |
|
|
225
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
407 |
|
| 0 | 408 |
if userform.is_valid() and userprofileform.is_valid(): |
409 |
userform.save() |
|
410 |
userprofileform.save() |
|
411 |
display_message(request, _(u'Profile updated')) |
|
412 |
return HttpResponseRedirect(reverse('index')) |
|
413 |
else: |
|
414 |
userform = UserForm(instance=user) |
|
415 |
userprofileform = MyUserProfileForm(instance=profile) |
|
416 |
||
417 |
return render_to_response('site/profile.html', {'forms' : [userform, userprofileform], |
|
418 |
'title' : 'Profile', |
|
419 |
}, context_instance=RequestContext(request)) |
|
420 |
||
|
225
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
421 |
@login_required() |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
422 |
def profile_pw(request): |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
423 |
user = request.user |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
424 |
profile = user.get_profile() |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
425 |
if request.method == 'POST': |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
426 |
pwform = PasswordChangeForm(profile.user, data = request.POST) |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
427 |
if pwform.is_valid(): |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
428 |
pwform.save() |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
429 |
display_message(request, _(u'Password changed')) |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
430 |
return HttpResponseRedirect(reverse('profile')) |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
431 |
else: |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
432 |
pwform = PasswordChangeForm(profile.user) |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
433 |
return render_to_response('site/profile_pw.html', {'forms' : [pwform], |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
434 |
'title' : 'Password', |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
435 |
}, context_instance=RequestContext(request)) |
|
67e1a89d6bca
refactor forgot pw function to use django methods / add password change page in profile / i18n update
raph
parents:
196
diff
changeset
|
436 |
|
| 0 | 437 |
class AnonUserRoleForm(UserRoleForm): |
438 |
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, |
|
439 |
initial=None, error_class=ErrorList, label_suffix=':', |
|
440 |
empty_permitted=False, instance=None): |
|
441 |
ModelForm.__init__(self, data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance) |
|
442 |
||
443 |
# override manually |
|
444 |
role_field = self.fields['role'] |
|
445 |
role_field.required = False |
|
446 |
role_field.choices = [(u'', u'---------')] + [(r.id, str(r)) for r in Role.objects.filter(anon=True)] # limit anon choices |
|
447 |
||
448 |
self.fields['role'] = role_field |
|
449 |
||
450 |
@has_global_perm('can_manage_workspace') |
|
451 |
def user_anon_edit(request): |
|
452 |
userrole, created = UserRole.objects.get_or_create(user=None, text=None) |
|
453 |
if request.method == 'POST': |
|
454 |
userroleform = AnonUserRoleForm(request.POST, instance=userrole) |
|
455 |
if userroleform.is_valid(): |
|
456 |
userroleform.save() |
|
457 |
display_message(request, _(u'Anonymous user role modified.')) |
|
458 |
return HttpResponseRedirect(reverse('user')) |
|
459 |
else: |
|
460 |
userroleform = AnonUserRoleForm(instance=userrole) |
|
461 |
||
462 |
return render_to_response('site/user_edit.html', {'form' : userroleform, |
|
463 |
'title' : 'Edit anonymous user', |
|
464 |
}, context_instance=RequestContext(request)) |
|
465 |
||
466 |
@has_global_perm('can_manage_workspace') |
|
467 |
def user_edit(request, key): |
|
| 83 | 468 |
profile = get_object_or_404(UserProfile, key=key) |
| 0 | 469 |
user = profile.user |
470 |
userrole = profile.global_userrole() |
|
471 |
if request.method == 'POST': |
|
472 |
userform = UserForm(request.POST, instance=user) |
|
473 |
userprofileform = UserProfileForm(request.POST, instance=profile) |
|
474 |
userroleform = UserRoleForm(request.POST, instance=userrole) |
|
475 |
if userform.is_valid() and userroleform.is_valid() and userprofileform.is_valid(): |
|
476 |
userform.save() |
|
477 |
userroleform.save() |
|
478 |
userprofileform.save() |
|
479 |
display_message(request, _(u'User modified')) |
|
480 |
return HttpResponseRedirect(reverse('user')) |
|
481 |
else: |
|
482 |
userform = UserForm(instance=user) |
|
483 |
userprofileform = UserProfileForm(instance=profile) |
|
484 |
userroleform = UserRoleForm(instance=userrole) |
|
485 |
||
486 |
return render_to_response('site/user_edit.html', {'forms' : [userform , userprofileform, userroleform], |
|
487 |
'title' : 'Edit user', |
|
488 |
'user_edit' : user, |
|
489 |
}, context_instance=RequestContext(request)) |
|
490 |
||
491 |
# user contact form (for logged-in users only |
|
492 |
||
493 |
class UserContactForm(forms.Form): |
|
494 |
subject = forms.CharField(label=ugettext_lazy(u'Subject'), |
|
495 |
help_text=ugettext_lazy(u'Subject of the email'), |
|
496 |
required=True) |
|
497 |
||
498 |
body = forms.CharField(label=ugettext_lazy(u'Body'), |
|
499 |
help_text=ugettext_lazy(u'Body of the email'), |
|
500 |
widget=forms.Textarea, |
|
501 |
required=True) |
|
502 |
||
503 |
@login_required |
|
504 |
def user_contact(request, key): |
|
| 83 | 505 |
recipient_profile = get_object_or_404(UserProfile, key=key) |
| 0 | 506 |
|
507 |
if request.method == 'POST': |
|
508 |
contact_form = UserContactForm(request.POST) |
|
509 |
if contact_form.is_valid(): |
|
510 |
data = contact_form.cleaned_data |
|
511 |
message = render_to_string('email/user_contact_email.txt', |
|
512 |
{ |
|
513 |
'body' : data['body'], |
|
514 |
'CONF': ApplicationConfiguration |
|
515 |
}) |
|
516 |
||
517 |
send_mail(data['subject'], message, request.user.email, [recipient_profile.user.email]) |
|
518 |
||
519 |
display_message(request, _(u'Email sent.')) |
|
520 |
return HttpResponseRedirect(reverse('index')) |
|
521 |
else: |
|
522 |
contact_form = UserContactForm() |
|
523 |
||
524 |
return render_to_response('site/user_contact.html', {'form' : contact_form, |
|
525 |
'save_name' : 'send', |
|
| 196 | 526 |
'recipient_profile' : recipient_profile, |
| 0 | 527 |
}, context_instance=RequestContext(request)) |
528 |
||
529 |
||
530 |
from django.contrib.auth.forms import AuthenticationForm |
|
531 |
||
532 |
def cm_login(request, user): |
|
533 |
# make sure user has a profile |
|
534 |
try: |
|
535 |
user.get_profile() |
|
536 |
except UserProfile.DoesNotExist : |
|
537 |
UserProfile.objects.create(user=user) |
|
538 |
||
539 |
if user.get_profile().is_suspended: |
|
540 |
display_message(request, _(u"This account is suspended, contact the workspace administrator.")) |
|
541 |
return HttpResponseRedirect(reverse('index')) |
|
542 |
||
543 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
544 |
django_login(request, user) |
|
545 |
||
546 |
display_message(request, _(u"You're logged in!")) |
|
547 |
next = request.POST.get('next', None) |
|
|
285
1070d52adc11
propagates query string parameters when login in (so that link with direct coment id are properly propagated)
raph
parents:
281
diff
changeset
|
548 |
q = request.POST.get('q', None) |
| 0 | 549 |
if next and next.startswith('/'): |
|
285
1070d52adc11
propagates query string parameters when login in (so that link with direct coment id are properly propagated)
raph
parents:
281
diff
changeset
|
550 |
if q: |
|
1070d52adc11
propagates query string parameters when login in (so that link with direct coment id are properly propagated)
raph
parents:
281
diff
changeset
|
551 |
return HttpResponseRedirect(next + '?' + q) |
|
1070d52adc11
propagates query string parameters when login in (so that link with direct coment id are properly propagated)
raph
parents:
281
diff
changeset
|
552 |
else: |
|
1070d52adc11
propagates query string parameters when login in (so that link with direct coment id are properly propagated)
raph
parents:
281
diff
changeset
|
553 |
return HttpResponseRedirect(next) |
| 0 | 554 |
else: |
555 |
return HttpResponseRedirect(reverse('index')) |
|
556 |
||
557 |
def login(request): |
|
558 |
request.session.set_test_cookie() |
|
559 |
||
560 |
if request.method == 'POST': |
|
561 |
form = AuthenticationForm(request, request.POST) |
|
562 |
if form.is_valid(): |
|
563 |
user = form.get_user() |
|
564 |
||
565 |
return cm_login(request, user) |
|
566 |
else: |
|
567 |
form = AuthenticationForm() |
|
568 |
||
569 |
return render_to_response('site/login.html', {'form':form}, context_instance=RequestContext(request)) |
|
570 |
||
571 |
from django.contrib.auth import logout as django_logout |
|
572 |
||
573 |
def logout(request): |
|
574 |
django_logout(request) |
|
575 |
display_message(request, _(u"You've been logged out.")) |
|
576 |
return HttpResponseRedirect(reverse('index')) |
|
577 |
||
578 |
def register(request): |
|
579 |
if request.method == 'POST': |
|
580 |
userform = UserForm(request.POST) |
|
| 131 | 581 |
userprofileaddform = UserProfileRegisterForm(request.POST) |
| 0 | 582 |
|
583 |
if userform.is_valid() and userprofileaddform.is_valid(): |
|
584 |
data = userform.cleaned_data |
|
585 |
data.update(userprofileaddform.cleaned_data) |
|
586 |
user = UserProfile.objects.create_inactive_user(userform.cleaned_data['email'], False, **userprofileaddform.cleaned_data) |
|
587 |
profile = user.get_profile() |
|
588 |
if ApplicationConfiguration.get_key('workspace_registration_moderation', False): # need moderation |
|
589 |
profile.is_suspended = True |
|
590 |
profile.save() |
|
591 |
display_message(request, _(u"You've been registered, you will receive a confirmation mail once a moderator has approved your membership.")) |
|
592 |
else: |
|
593 |
profile.send_activation_email() |
|
594 |
display_message(request, _(u"You've been registered, please check your email for the confirm message.")) |
|
595 |
return HttpResponseRedirect(reverse('index')) |
|
596 |
else: |
|
597 |
userform = UserForm() |
|
|
543
471c3ae269da
Get rid of 'preferred_language' field for UserProfile since it is unused.
gibus
parents:
540
diff
changeset
|
598 |
userprofileaddform = UserProfileRegisterForm() |
| 0 | 599 |
|
600 |
return render_to_response('site/register.html', {'forms':[userform, userprofileaddform]}, context_instance=RequestContext(request)) |