From ab87f4fcd59fe82ed82a6e872ce4546cc797b06c Mon Sep 17 00:00:00 2001
From: Bach Dániel <bd@ik.bme.hu>
Date: Tue, 9 Sep 2014 16:48:31 +0200
Subject: [PATCH] dashboard: autocomplete for group members

---
 circle/dashboard/forms.py                              |  9 +++++++++
 circle/dashboard/static/dashboard/dashboard.css        |  6 +++++-
 circle/dashboard/templates/dashboard/group-detail.html |  5 ++---
 circle/dashboard/views.py                              | 20 +++++++++-----------
 4 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/circle/dashboard/forms.py b/circle/dashboard/forms.py
index 3918b9c..fdc1fbb 100644
--- a/circle/dashboard/forms.py
+++ b/circle/dashboard/forms.py
@@ -1063,6 +1063,15 @@ class AclUserOrGroupAddForm(forms.Form):
 
 
 
+class AddGroupMemberForm(forms.Form):
+    new_member = forms.CharField(
+        widget=autocomplete_light.TextWidget(
+            'AclUserAutocomplete',
+            autocomplete_js_attributes={"placeholder": _("Name of user")},
+            attrs={'class': 'form-control'}),
+        label=_("E-mail address or identifier of user"))
+
+
 class UserKeyForm(forms.ModelForm):
     name = forms.CharField(required=True, label=_('Name'))
     key = forms.CharField(
diff --git a/circle/dashboard/static/dashboard/dashboard.css b/circle/dashboard/static/dashboard/dashboard.css
index f25159f..be9f243 100644
--- a/circle/dashboard/static/dashboard/dashboard.css
+++ b/circle/dashboard/static/dashboard/dashboard.css
@@ -591,11 +591,15 @@ footer a, footer a:hover, footer a:visited {
   width: 100px;
 }
 
+#group-detail-user-table tr:last-child td:nth-child(2) {
+  text-align: left;
+}
+
 #group-detail-perm-header {
   margin-top: 25px;
 }
 
-textarea[name="list-new-namelist"] {
+textarea[name="new_members"] {
   max-width: 500px;
   min-height: 80px;
   margin-bottom: 10px;
diff --git a/circle/dashboard/templates/dashboard/group-detail.html b/circle/dashboard/templates/dashboard/group-detail.html
index 794691c..f683ad8 100644
--- a/circle/dashboard/templates/dashboard/group-detail.html
+++ b/circle/dashboard/templates/dashboard/group-detail.html
@@ -89,13 +89,12 @@
         <tr>
           <td><i class="fa fa-plus"></i></td>
           <td colspan="2">
-            <input type="text" class="form-control" name="list-new-name"
-            placeholder="{% trans "Name of user" %}">
+            {{addmemberform.new_member}}
           </td>
         </tr>
   </tbody>
   </table>
-  <textarea name="list-new-namelist" class="form-control"
+  <textarea name="new_members" class="form-control"
     placeholder="{% trans "Add multiple users at once (one identifier per line)." %}"></textarea>
   <div class="form-actions">
     <button type="submit" class="btn btn-success">{% trans "Save" %}</button>
diff --git a/circle/dashboard/views.py b/circle/dashboard/views.py
index 6712617..85c646d 100644
--- a/circle/dashboard/views.py
+++ b/circle/dashboard/views.py
@@ -72,7 +72,8 @@ from .forms import (
     CirclePasswordChangeForm, VmCreateDiskForm, VmDownloadDiskForm,
     TraitsForm, RawDataForm, GroupPermissionForm, AclUserOrGroupAddForm,
     VmResourcesForm, VmAddInterfaceForm, VmListSearchForm,
-    TemplateListSearchForm, ConnectCommandForm
+    TemplateListSearchForm, ConnectCommandForm,
+    TransferOwnershipForm, AddGroupMemberForm
 )
 
 from .tables import (
@@ -1283,6 +1284,7 @@ class GroupDetailView(CheckedDetailView):
             self.object.profile, self.request.user,
             'dashboard.views.group-acl')
         context['aclform'] = AclUserOrGroupAddForm()
+        context['addmemberform'] = AddGroupMemberForm()
         context['group_profile_form'] = GroupProfileUpdate.get_form_object(
             self.request, self.object.profile)
 
@@ -1299,17 +1301,15 @@ class GroupDetailView(CheckedDetailView):
 
         if request.POST.get('new_name'):
             return self.__set_name(request)
-        if request.POST.get('list-new-name'):
+        if request.POST.get('new_member'):
             return self.__add_user(request)
-        if request.POST.get('list-new-namelist'):
+        if request.POST.get('new_members'):
             return self.__add_list(request)
-        if (request.POST.get('list-new-name') is not None) and \
-                (request.POST.get('list-new-namelist') is not None):
-            return redirect(reverse_lazy("dashboard.views.group-detail",
-                                         kwargs={'pk': self.get_object().pk}))
+        return redirect(reverse_lazy("dashboard.views.group-detail",
+                                     kwargs={'pk': self.get_object().pk}))
 
     def __add_user(self, request):
-        name = request.POST['list-new-name']
+        name = request.POST['new_member']
         self.__add_username(request, name)
         return redirect(reverse_lazy("dashboard.views.group-detail",
                                      kwargs={'pk': self.object.pk}))
@@ -1328,9 +1328,7 @@ class GroupDetailView(CheckedDetailView):
                 messages.warning(request, _('User "%s" not found.') % name)
 
     def __add_list(self, request):
-        if not self.get_has_level()(request.user, 'operator'):
-            raise PermissionDenied()
-        userlist = request.POST.get('list-new-namelist').split('\r\n')
+        userlist = request.POST.get('new_members').split('\r\n')
         for line in userlist:
             self.__add_username(request, line)
         return redirect(reverse_lazy("dashboard.views.group-detail",
--
libgit2 0.26.0