model = AstakosGroup
fields = ('homepage', 'desc')
+class AddGroupMembersForm(forms.Form):
+ q = forms.CharField(max_length=800, widget=forms.Textarea, label=_('Search users'),
+ help_text=_('Add comma separated user emails'),
+ required=True)
+
+ def clean(self):
+ q = self.cleaned_data.get('q') or ''
+ users = q.split(',')
+ users = list(u.strip() for u in users if u)
+ db_entries = AstakosUser.objects.filter(email__in=users)
+ unknown = list(set(users) - set(u.email for u in db_entries))
+ if unknown:
+ raise forms.ValidationError(
+ _('Unknown users: %s' % unknown))
+ self.valid_users = db_entries
+ return self.cleaned_data
+
+ def get_valid_users(self):
+ """Should be called after form cleaning"""
+ try:
+ return self.valid_users
+ except:
+ return ()
+
+
class AstakosGroupSearchForm(forms.Form):
q = forms.CharField(max_length=200, label='Search group')
url(r'^profile/?$',
'edit_profile', {}, name='edit_profile'),
url(r'^feedback/?$', 'feedback', {}, name='feedback'),
- url(
- r'^signup/?$', 'signup', {'on_success': 'im/login.html',
- 'extra_context': {'login_form': LoginForm()}}, name='signup'),
- url(
- r'^logout/?$', 'logout', {'template': 'im/login.html',
- 'extra_context': {'login_form': LoginForm()}}, name='logout'),
+ url(r'^signup/?$', 'signup',
+ {'on_success': 'im/login.html',
+ 'extra_context': {'login_form': LoginForm()}},
+ name='signup'),
+ url(r'^logout/?$', 'logout',
+ {'template': 'im/login.html',
+ 'extra_context': {'login_form': LoginForm()}},
+ name='logout'),
url(r'^activate/?$', 'activate', {}, name='activate'),
url(r'^approval_terms/?$',
'approval_terms', {}, name='latest_terms'),
'group_add', {}, name='group_add'),
url(r'^group/list/?$',
'group_list', {}, name='group_list'),
- url(r'^group/(?P<group_id>\d+)/?$', 'group_detail', {},
- name='group_detail'),
+ url(r'^group/(?P<group_id>\d+)/?$', 'group_detail',
+ {}, name='group_detail'),
url(r'^group/update/(?P<group_id>\d+)/?$',
'group_update', {}, name='group_update'),
url(r'^group/search/?$',
'group_search', {}, name='group_search'),
url(r'^group/all/?$',
'group_all', {}, name='group_all'),
- url(r'^group/(?P<group_id>\d+)/join/?$', 'group_join', {
- },name='group_join'),
- url(
- r'^group/(?P<group_id>\d+)/leave/?$', 'group_leave', {},
- name='group_leave'),
- url(
- r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/approve/?$',
- 'approve_member', {}, name='approve_member'),
- url(
- r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/disapprove/?$',
- 'disapprove_member', {}, name='disapprove_member'),
+ url(r'^group/(?P<group_id>\d+)/join/?$', 'group_join',
+ {}, name='group_join'),
+ url(r'^group/(?P<group_id>\d+)/leave/?$', 'group_leave',
+ {}, name='group_leave'),
+ url(r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/approve/?$',
+ 'approve_member', {}, name='approve_member'),
+ url(r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/disapprove/?$',
+ 'disapprove_member', {}, name='disapprove_member'),
+ url(r'^group/(?P<group_id>\d+)/add/?$',
+ 'add_members', {}, name='add_members'),
url(r'^group/create/?$', 'group_create_list', {},
name='group_create_list'),
)
FeedbackForm, SignApprovalTermsForm,
ExtendedPasswordChangeForm, EmailChangeForm,
AstakosGroupCreationForm, AstakosGroupSearchForm,
- AstakosGroupUpdateForm)
+ AstakosGroupUpdateForm, AddGroupMembersForm)
from astakos.im.functions import (send_feedback, SendMailError,
invite as invite_func, logout as auth_logout,
activate as activate_func,
except AstakosGroup.DoesNotExist:
return HttpResponseBadRequest(_('Invalid group.'))
form = AstakosGroupUpdateForm(instance=group)
+ search_form = AddGroupMembersForm()
return object_detail(request,
AstakosGroup.objects.all(),
object_id=group_id,
extra_context={'quota': group.quota,
- 'form': form}
+ 'form': form,
+ 'search_form': search_form}
)
form = AstakosGroupUpdateForm(request.POST, instance=group)
if form.is_valid():
form.save()
+ search_form = AddGroupMembersForm()
return object_detail(request,
AstakosGroup.objects.all(),
object_id=group_id,
extra_context={'quota': group.quota,
- 'form': form})
+ 'form': form,
+ 'search_form': search_form})
@signed_terms_required
@login_required
messages.error(request, msg)
+
+
+@signed_terms_required
+@login_required
+def add_members(request, group_id):
+ if request.method != 'POST':
+ return HttpResponseBadRequest(_('Bad method'))
+ try:
+ group = AstakosGroup.objects.select_related().get(id=group_id)
+ except AstakosGroup.DoesNotExist:
+ return HttpResponseBadRequest(_('Invalid group.'))
+ search_form = AddGroupMembersForm(request.POST)
+ if search_form.is_valid():
+ users = search_form.get_valid_users()
+ map(group.approve_member, users)
+ search_form = AddGroupMembersForm()
+ form = AstakosGroupUpdateForm(instance=group)
+ return object_detail(request,
+ AstakosGroup.objects.all(),
+ object_id=group_id,
+ extra_context={'quota': group.quota,
+ 'form': form,
+ 'search_form' : search_form}
+ )
+
+
@signed_terms_required
@login_required
def resource_list(request):