|
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 |
|
|
23 |
from cm.security import has_global_perm |
|
|
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 |
|
|
52 |
if 'apply' in request.POST: |
|
|
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 |
|
38
|
205 |
fields = ('allow_contact', 'preferred_language', 'is_suspended', 'tags') |
|
0
|
206 |
|
|
|
207 |
class MyUserProfileForm(ModelForm): |
|
|
208 |
class Meta: |
|
|
209 |
model = UserProfile |
|
|
210 |
fields = ('allow_contact', 'preferred_language') |
|
|
211 |
|
|
|
212 |
class UserProfileAddForm(ModelForm): |
|
|
213 |
class Meta: |
|
|
214 |
model = UserProfile |
|
38
|
215 |
fields = ('preferred_language', 'tags') |
|
0
|
216 |
|
|
|
217 |
class UserAddForm(forms.Form): |
|
|
218 |
note = forms.CharField(label=ugettext_lazy(u'Note'), |
|
|
219 |
help_text=ugettext_lazy(u'Optional text to add to invitation email'), |
|
|
220 |
widget=forms.Textarea, |
|
|
221 |
required=False) |
|
|
222 |
|
|
|
223 |
|
|
|
224 |
SEPARATORS_RE = re.compile('[;,\n]+') |
|
|
225 |
|
|
|
226 |
@has_global_perm('can_manage_workspace') |
|
|
227 |
def user_mass_add(request, key=None): |
|
|
228 |
return user_add(request, key=key, mass=True) |
|
|
229 |
|
|
|
230 |
@has_global_perm('can_manage_workspace') |
|
|
231 |
def user_add(request, key=None, mass=False): |
|
|
232 |
text = get_text_by_keys_or_404(key) if key else None |
|
|
233 |
if request.method == 'POST': |
|
|
234 |
userform = UserForm(request.POST) if not mass else MassUserForm(request.POST) |
|
|
235 |
userroleform = UserRoleForm(request.POST) |
|
|
236 |
noteform = UserAddForm(request.POST) |
|
|
237 |
userprofileform = UserProfileAddForm(request.POST) |
|
|
238 |
localroleform = UserRoleTextForm(request.POST, prefix="local") if key else None |
|
|
239 |
if userform.is_valid() and userroleform.is_valid() and noteform.is_valid() and userprofileform.is_valid() and (not localroleform or localroleform.is_valid()): |
|
|
240 |
data = userform.cleaned_data |
|
|
241 |
data.update(userprofileform.cleaned_data) |
|
|
242 |
data.update(noteform.cleaned_data) |
|
|
243 |
emails = data['email'] |
|
|
244 |
del data['email'] |
|
|
245 |
email_created = set() |
|
|
246 |
for email in [s.strip() for s in SEPARATORS_RE.split(emails)]: |
|
|
247 |
if email and not User.objects.filter(email__iexact=email) and email not in email_created: |
|
|
248 |
user = UserProfile.objects.create_inactive_user(email, True, **data) |
|
|
249 |
userrole = UserRole.objects.create(user=user, role=userroleform.cleaned_data['role'], text=None) |
|
|
250 |
if key: |
|
|
251 |
localuserrole = UserRole.objects.create(user=user, role=localroleform.cleaned_data['role'], text=text) |
|
|
252 |
email_created.add(email) |
|
|
253 |
register_activity(request, "user_created", user=user) |
|
|
254 |
display_message(request, ungettext(u'%(nb_users)d user added', u'%(nb_users)d users added', len(email_created)) % {'nb_users': len(email_created)}) |
|
|
255 |
if key: |
|
|
256 |
return HttpResponseRedirect(reverse('text-share', args=[text.key])) |
|
|
257 |
else: |
|
|
258 |
return HttpResponseRedirect(reverse('user')) |
|
|
259 |
else: |
|
|
260 |
userform = UserForm() if not mass else MassUserForm() |
|
|
261 |
userroleform = UserRoleForm() |
|
|
262 |
userprofileform = UserProfileAddForm() |
|
|
263 |
noteform = UserAddForm() |
|
|
264 |
localroleform = UserRoleTextForm(prefix="local") if key else None |
|
|
265 |
|
|
|
266 |
if key: |
|
|
267 |
template = 'site/user_mass_add_text.html' if mass else 'site/user_add_text.html' |
|
|
268 |
else: |
|
|
269 |
template = 'site/user_mass_add.html' if mass else 'site/user_add.html' |
|
|
270 |
|
|
|
271 |
return render_to_response(template, {'forms' : [userform, userprofileform , userroleform, noteform, localroleform], |
|
|
272 |
'save_name' : ungettext(u'Save user', u'Save users', 2 if mass else 1), |
|
|
273 |
'mass' : mass, |
|
|
274 |
'text' : text, |
|
|
275 |
}, context_instance=RequestContext(request)) |
|
|
276 |
|
|
|
277 |
class UserValidateForm(ModelForm): |
|
|
278 |
email = forms.EmailField(label=ugettext_lazy(u'Email'), required=True) |
|
|
279 |
|
|
|
280 |
class Meta: |
|
|
281 |
model = User |
|
|
282 |
fields = ('email', 'username', 'first_name', 'last_name') |
|
|
283 |
|
|
|
284 |
def clean_username(self): |
|
|
285 |
""" |
|
|
286 |
Validates that the supplied username is unique for the site. |
|
|
287 |
""" |
|
|
288 |
if 'username' in self.cleaned_data: |
|
|
289 |
username = self.cleaned_data['username'] |
|
|
290 |
try: |
|
|
291 |
user = User.objects.get(username__exact=username) |
|
|
292 |
except User.DoesNotExist: |
|
|
293 |
return username |
|
|
294 |
raise forms.ValidationError(_(u'This username is already in use. Please supply a different username.')) |
|
|
295 |
|
|
|
296 |
from django.contrib.auth.forms import SetPasswordForm |
|
|
297 |
|
|
|
298 |
def user_activate(request, key): |
|
|
299 |
try: |
|
|
300 |
profile = UserProfile.objects.get(adminkey=key) |
|
|
301 |
user = profile.user |
|
|
302 |
if not user.is_active: |
|
|
303 |
if request.method == 'POST': |
|
|
304 |
userform = UserValidateForm(request.POST, instance=user) |
|
|
305 |
pwform = SetPasswordForm(profile.user, request.POST) |
|
|
306 |
if userform.is_valid() and pwform.is_valid(): |
|
|
307 |
userform.save() |
|
|
308 |
pwform.save() |
|
|
309 |
user.is_active = True |
|
|
310 |
user.save() |
|
|
311 |
# login |
|
|
312 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
|
313 |
django_login(request, user) |
|
|
314 |
register_activity(request, "user_activated", user=user) |
|
|
315 |
display_message(request, _(u"Your account has been activated. You're now logged-in.")) |
|
|
316 |
|
|
|
317 |
return HttpResponseRedirect(reverse('index')) |
|
|
318 |
else: |
|
|
319 |
user.username = '' |
|
|
320 |
userform = UserValidateForm(instance=user) |
|
|
321 |
pwform = SetPasswordForm(user) |
|
|
322 |
|
|
|
323 |
return render_to_response('site/activate.html', { |
|
|
324 |
'forms' : [userform, pwform], |
|
|
325 |
'title': _(u'Activate your account'), |
|
|
326 |
'save_name' : _(u'activate account'), |
|
|
327 |
}, context_instance=RequestContext(request)) |
|
|
328 |
else: |
|
|
329 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
|
330 |
django_login(request, user) |
|
|
331 |
display_message(request, _(u"Your account has been activated. You're now logged-in.")) |
|
|
332 |
|
|
|
333 |
return HttpResponseRedirect(reverse('index')) |
|
|
334 |
|
|
|
335 |
except UserProfile.DoesNotExist: |
|
|
336 |
raise UnauthorizedException('No profile') |
|
|
337 |
|
|
|
338 |
#@has_global_perm('can_manage_workspace') |
|
|
339 |
#def user_delete(request, key): |
|
|
340 |
# try: |
|
|
341 |
# if request.method == 'POST': |
|
|
342 |
# profile = UserProfile.objects.get(key=key) |
|
|
343 |
# profile.delete() |
|
|
344 |
# display_message(request, "User %s has been deleted." %(profile.simple_print())) |
|
|
345 |
# return HttpResponse('') # no redirect because this is called by js |
|
|
346 |
# except UserProfile.DoesNotExist: |
|
|
347 |
# raise UnauthorizedException('No profile') |
|
|
348 |
|
|
|
349 |
@has_global_perm('can_manage_workspace') |
|
|
350 |
def user_suspend(request, key): |
|
|
351 |
if request.method == 'POST': |
|
|
352 |
profile = get_object_or_404(UserProfile, key=key) |
|
|
353 |
profile = UserProfile.objects.get(key=key) |
|
|
354 |
profile.is_suspended = True |
|
|
355 |
profile.save() |
|
|
356 |
if profile.user.is_active: |
|
|
357 |
display_message(request, _(u"User's access %(prof)s has been suspended.") % {'prof':profile.simple_print()}) |
|
|
358 |
register_activity(request, "user_suspended", user=profile.user) |
|
|
359 |
else: |
|
|
360 |
# make use active but disabled |
|
|
361 |
profile.user.is_active = True |
|
|
362 |
profile.user.save() |
|
|
363 |
display_message(request, _(u"User's access %(prof)s has been refused.") % {'prof':profile.simple_print()}) |
|
|
364 |
register_activity(request, "user_refused", user=profile.user) |
|
|
365 |
return HttpResponse('') # no redirect because this is called by js |
|
|
366 |
raise UnauthorizedException('') |
|
|
367 |
|
|
|
368 |
@has_global_perm('can_manage_workspace') |
|
|
369 |
def user_enable(request, key): |
|
|
370 |
if request.method == 'POST': |
|
|
371 |
profile = get_object_or_404(UserProfile, key=key) |
|
|
372 |
profile = UserProfile.objects.get(key=key) |
|
|
373 |
profile.is_suspended = False |
|
|
374 |
profile.save() |
|
|
375 |
if profile.user.is_active: |
|
|
376 |
display_message(request, _(u"User's access %(prof)s has been restored.") % {'prof':profile.simple_print()}) |
|
|
377 |
register_activity(request, "user_enabled", user=profile.user) |
|
|
378 |
else: # new member approval |
|
|
379 |
profile.send_activation_email() |
|
|
380 |
display_message(request, _(u"User's access %(prof)s has been approved.") % {'prof':profile.simple_print()}) |
|
|
381 |
register_activity(request, "user_approved", user=profile.user) |
|
|
382 |
return HttpResponse('') # no redirect because this is called by js |
|
|
383 |
raise UnauthorizedException('') |
|
|
384 |
|
|
|
385 |
def user_send_invitation(request, key): |
|
|
386 |
if request.method == 'POST': |
|
|
387 |
profile = get_object_or_404(UserProfile, key=key) |
|
|
388 |
profile.send_invitation_email() |
|
|
389 |
|
|
|
390 |
display_message(request, _(u"A new invitation has been sent to user %(prof)s.") % {'prof':profile.simple_print()}) |
|
|
391 |
return HttpResponse('') # no redirect because this is called by js |
|
|
392 |
raise UnauthorizedException('') |
|
|
393 |
|
|
|
394 |
@login_required() |
|
|
395 |
def profile(request): |
|
|
396 |
user = request.user |
|
|
397 |
profile = user.get_profile() |
|
|
398 |
if request.method == 'POST': |
|
|
399 |
userform = UserForm(request.POST, instance=user) |
|
|
400 |
userprofileform = MyUserProfileForm(request.POST, instance=profile) |
|
|
401 |
if userform.is_valid() and userprofileform.is_valid(): |
|
|
402 |
userform.save() |
|
|
403 |
userprofileform.save() |
|
|
404 |
display_message(request, _(u'Profile updated')) |
|
|
405 |
return HttpResponseRedirect(reverse('index')) |
|
|
406 |
else: |
|
|
407 |
userform = UserForm(instance=user) |
|
|
408 |
userprofileform = MyUserProfileForm(instance=profile) |
|
|
409 |
|
|
|
410 |
return render_to_response('site/profile.html', {'forms' : [userform, userprofileform], |
|
|
411 |
'title' : 'Profile', |
|
|
412 |
}, context_instance=RequestContext(request)) |
|
|
413 |
|
|
|
414 |
class AnonUserRoleForm(UserRoleForm): |
|
|
415 |
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, |
|
|
416 |
initial=None, error_class=ErrorList, label_suffix=':', |
|
|
417 |
empty_permitted=False, instance=None): |
|
|
418 |
ModelForm.__init__(self, data, files, auto_id, prefix, initial, error_class, label_suffix, empty_permitted, instance) |
|
|
419 |
|
|
|
420 |
# override manually |
|
|
421 |
role_field = self.fields['role'] |
|
|
422 |
role_field.required = False |
|
|
423 |
role_field.choices = [(u'', u'---------')] + [(r.id, str(r)) for r in Role.objects.filter(anon=True)] # limit anon choices |
|
|
424 |
for c in role_field.choices: |
|
|
425 |
print c |
|
|
426 |
|
|
|
427 |
self.fields['role'] = role_field |
|
|
428 |
|
|
|
429 |
@has_global_perm('can_manage_workspace') |
|
|
430 |
def user_anon_edit(request): |
|
|
431 |
userrole, created = UserRole.objects.get_or_create(user=None, text=None) |
|
|
432 |
if request.method == 'POST': |
|
|
433 |
userroleform = AnonUserRoleForm(request.POST, instance=userrole) |
|
|
434 |
if userroleform.is_valid(): |
|
|
435 |
userroleform.save() |
|
|
436 |
display_message(request, _(u'Anonymous user role modified.')) |
|
|
437 |
return HttpResponseRedirect(reverse('user')) |
|
|
438 |
else: |
|
|
439 |
userroleform = AnonUserRoleForm(instance=userrole) |
|
|
440 |
|
|
|
441 |
return render_to_response('site/user_edit.html', {'form' : userroleform, |
|
|
442 |
'title' : 'Edit anonymous user', |
|
|
443 |
}, context_instance=RequestContext(request)) |
|
|
444 |
|
|
|
445 |
@has_global_perm('can_manage_workspace') |
|
|
446 |
def user_edit(request, key): |
|
|
447 |
profile = UserProfile.objects.get(key=key) |
|
|
448 |
user = profile.user |
|
|
449 |
userrole = profile.global_userrole() |
|
|
450 |
if request.method == 'POST': |
|
|
451 |
userform = UserForm(request.POST, instance=user) |
|
|
452 |
userprofileform = UserProfileForm(request.POST, instance=profile) |
|
|
453 |
userroleform = UserRoleForm(request.POST, instance=userrole) |
|
|
454 |
if userform.is_valid() and userroleform.is_valid() and userprofileform.is_valid(): |
|
|
455 |
userform.save() |
|
|
456 |
userroleform.save() |
|
|
457 |
userprofileform.save() |
|
|
458 |
display_message(request, _(u'User modified')) |
|
|
459 |
return HttpResponseRedirect(reverse('user')) |
|
|
460 |
else: |
|
|
461 |
userform = UserForm(instance=user) |
|
|
462 |
userprofileform = UserProfileForm(instance=profile) |
|
|
463 |
userroleform = UserRoleForm(instance=userrole) |
|
|
464 |
|
|
|
465 |
return render_to_response('site/user_edit.html', {'forms' : [userform , userprofileform, userroleform], |
|
|
466 |
'title' : 'Edit user', |
|
|
467 |
'user_edit' : user, |
|
|
468 |
}, context_instance=RequestContext(request)) |
|
|
469 |
|
|
|
470 |
# user contact form (for logged-in users only |
|
|
471 |
|
|
|
472 |
class UserContactForm(forms.Form): |
|
|
473 |
subject = forms.CharField(label=ugettext_lazy(u'Subject'), |
|
|
474 |
help_text=ugettext_lazy(u'Subject of the email'), |
|
|
475 |
required=True) |
|
|
476 |
|
|
|
477 |
body = forms.CharField(label=ugettext_lazy(u'Body'), |
|
|
478 |
help_text=ugettext_lazy(u'Body of the email'), |
|
|
479 |
widget=forms.Textarea, |
|
|
480 |
required=True) |
|
|
481 |
|
|
|
482 |
@login_required |
|
|
483 |
def user_contact(request, key): |
|
|
484 |
recipient_profile = UserProfile.objects.get(key=key) |
|
|
485 |
|
|
|
486 |
if request.method == 'POST': |
|
|
487 |
contact_form = UserContactForm(request.POST) |
|
|
488 |
if contact_form.is_valid(): |
|
|
489 |
data = contact_form.cleaned_data |
|
|
490 |
message = render_to_string('email/user_contact_email.txt', |
|
|
491 |
{ |
|
|
492 |
'body' : data['body'], |
|
|
493 |
'CONF': ApplicationConfiguration |
|
|
494 |
}) |
|
|
495 |
|
|
|
496 |
send_mail(data['subject'], message, request.user.email, [recipient_profile.user.email]) |
|
|
497 |
|
|
|
498 |
display_message(request, _(u'Email sent.')) |
|
|
499 |
return HttpResponseRedirect(reverse('index')) |
|
|
500 |
else: |
|
|
501 |
contact_form = UserContactForm() |
|
|
502 |
|
|
|
503 |
return render_to_response('site/user_contact.html', {'form' : contact_form, |
|
|
504 |
'save_name' : 'send', |
|
|
505 |
}, context_instance=RequestContext(request)) |
|
|
506 |
|
|
|
507 |
|
|
|
508 |
from django.contrib.auth.forms import AuthenticationForm |
|
|
509 |
|
|
|
510 |
def cm_login(request, user): |
|
|
511 |
# make sure user has a profile |
|
|
512 |
try: |
|
|
513 |
user.get_profile() |
|
|
514 |
except UserProfile.DoesNotExist : |
|
|
515 |
UserProfile.objects.create(user=user) |
|
|
516 |
|
|
|
517 |
if user.get_profile().is_suspended: |
|
|
518 |
display_message(request, _(u"This account is suspended, contact the workspace administrator.")) |
|
|
519 |
return HttpResponseRedirect(reverse('index')) |
|
|
520 |
|
|
|
521 |
user.backend = 'django.contrib.auth.backends.ModelBackend' |
|
|
522 |
django_login(request, user) |
|
|
523 |
|
|
|
524 |
display_message(request, _(u"You're logged in!")) |
|
|
525 |
next = request.POST.get('next', None) |
|
|
526 |
if next and next.startswith('/'): |
|
|
527 |
return HttpResponseRedirect(next) |
|
|
528 |
else: |
|
|
529 |
return HttpResponseRedirect(reverse('index')) |
|
|
530 |
|
|
|
531 |
def login(request): |
|
|
532 |
request.session.set_test_cookie() |
|
|
533 |
|
|
|
534 |
if request.method == 'POST': |
|
|
535 |
form = AuthenticationForm(request, request.POST) |
|
|
536 |
if form.is_valid(): |
|
|
537 |
user = form.get_user() |
|
|
538 |
|
|
|
539 |
return cm_login(request, user) |
|
|
540 |
else: |
|
|
541 |
form = AuthenticationForm() |
|
|
542 |
|
|
|
543 |
return render_to_response('site/login.html', {'form':form}, context_instance=RequestContext(request)) |
|
|
544 |
|
|
|
545 |
from django.contrib.auth import logout as django_logout |
|
|
546 |
|
|
|
547 |
def logout(request): |
|
|
548 |
django_logout(request) |
|
|
549 |
display_message(request, _(u"You've been logged out.")) |
|
|
550 |
return HttpResponseRedirect(reverse('index')) |
|
|
551 |
|
|
|
552 |
def register(request): |
|
|
553 |
if request.method == 'POST': |
|
|
554 |
userform = UserForm(request.POST) |
|
|
555 |
userprofileaddform = UserProfileAddForm(request.POST) |
|
|
556 |
|
|
|
557 |
if userform.is_valid() and userprofileaddform.is_valid(): |
|
|
558 |
data = userform.cleaned_data |
|
|
559 |
data.update(userprofileaddform.cleaned_data) |
|
|
560 |
user = UserProfile.objects.create_inactive_user(userform.cleaned_data['email'], False, **userprofileaddform.cleaned_data) |
|
|
561 |
profile = user.get_profile() |
|
|
562 |
if ApplicationConfiguration.get_key('workspace_registration_moderation', False): # need moderation |
|
|
563 |
profile.is_suspended = True |
|
|
564 |
profile.save() |
|
|
565 |
display_message(request, _(u"You've been registered, you will receive a confirmation mail once a moderator has approved your membership.")) |
|
|
566 |
else: |
|
|
567 |
profile.send_activation_email() |
|
|
568 |
display_message(request, _(u"You've been registered, please check your email for the confirm message.")) |
|
|
569 |
return HttpResponseRedirect(reverse('index')) |
|
|
570 |
else: |
|
|
571 |
userform = UserForm() |
|
|
572 |
userprofileaddform = UserProfileAddForm() |
|
|
573 |
|
|
|
574 |
return render_to_response('site/register.html', {'forms':[userform, userprofileaddform]}, context_instance=RequestContext(request)) |