user upadate: add/revoke project access

Change-Id: I81565801160e91fc10bb68ce92431bdab9383477
diff --git a/userhandler/templates/modal/user_edit.html b/userhandler/templates/modal/user_edit.html
index d3c3d38..caeeb3a 100644
--- a/userhandler/templates/modal/user_edit.html
+++ b/userhandler/templates/modal/user_edit.html
@@ -10,14 +10,15 @@
                   class="form-horizontal"
                   method="post" enctype="multipart/form-data">
                 {% csrf_token %}
+                <input type="hidden"  id="projects_old" name="projects_old" value="asdasd">
                 <div class="modal-body" id="modal_edit_user_body">
-                    <div class="form-group">
+                    {% comment %}<div class="form-group">
                         <label for="username_edit" class="col-sm-3 control-label">Username *</label>
                         <div class="col-sm-6">
                             <input class="form-control" id="username_edit" name="username"
                                    placeholder="Username" required>
                         </div>
-                    </div>
+                    </div>{% endcomment %}
                     <div class="form-group">
                         <label for=projects" class="col-sm-3 control-label">Default project *</label>
                         <div class="col-sm-6">
diff --git a/userhandler/templates/user_list.html b/userhandler/templates/user_list.html
index b83ec32..2a0092f 100644
--- a/userhandler/templates/user_list.html
+++ b/userhandler/templates/user_list.html
@@ -133,8 +133,8 @@
                                 'data-toggle="dropdown" aria-expanded="false">Actions ' +
                                 '<span class="fa fa-caret-down"></span></button> ' +
                                 '<ul class="dropdown-menu">' +
-                                //'<li> <a href="#" onclick="javascript:openModalEditUser({user_id:\'' + row['_id'] + '\', usernarme:\'' + row['username'] + '\', projects: \'' + row['projects'] + '\'})">' +
-                                //'<i class="fa fa-edit"></i> Edit</a></li>' +
+                                '<li> <a href="#" onclick="javascript:openModalEditUser({user_id:\'' + row['_id'] + '\', usernarme:\'' + row['username'] + '\', projects: \'' + row['projects'] + '\'})">' +
+                                '<i class="fa fa-edit"></i> Edit</a></li>' +
                                 '<li> <a href="#" onclick="javascript:deleteUser(\'' + row['_id'] + '\', \'' + row['username'] + '\')"' +
                                 'style="color:red"><i class="fa fa-trash"></i> Delete</a></li> </ul></div>';
                         },
@@ -143,6 +143,57 @@
                 ]
             });
 
+            var select2_groups = $('#projects_edit').select2({
+                placeholder: 'Select Projects',
+                width: '100%',
+                ajax: {
+                    url: '/projects/list',
+                    dataType: 'json',
+                    processResults: function (data) {
+                        projects = [];
+                        if (data['projects']) {
+                            for (d in data['projects']) {
+                                var project = data['projects'][d];
+                                projects.push({
+                                    "id": project['_id'],
+                                    "text": project['name']
+                                });
+
+                            }
+                        }
+
+                        return {
+                            results: projects
+                        };
+                    }
+                }
+            });
+
+            var select2_single = $('#default_project_edit').select2({
+                placeholder: 'Select Default Project',
+                width: '100%',
+                ajax: {
+                    url: '/projects/list',
+                    dataType: 'json',
+                    processResults: function (data) {
+                        projects = [];
+                        if (data['projects']) {
+                            for (d in data['projects']) {
+                                var project = data['projects'][d];
+                                projects.push({
+                                    id: project['_id'],
+                                    text: project['name']
+                                });
+                            }
+                        }
+
+                        return {
+                            results: projects
+                        };
+                    }
+                }
+            });
+
             setInterval(function () {
                 table.ajax.reload();
             }, 10000);
@@ -150,9 +201,9 @@
             $("#formEditUser").submit(function (event) {
                 event.preventDefault(); //prevent default action
                 var post_url = $(this).attr("action"); //get form action url
-                var request_method = $(this).attr("method"); //get form GET/POST method
+                var request_method = $(this).attr("method");
                 var form_data = new FormData(this); //Encode form elements for submission
-                console.log(post_url);
+
                 $.ajax({
                     url: post_url,
                     type: request_method,
@@ -164,10 +215,12 @@
                     processData: false
                 }).done(function (response, textStatus, jqXHR) {
                     $('#modal_edit_user').modal('hide');
+                    table.ajax.reload();
                     bootbox.alert({
                         title: "Result",
-                        message: "User edited successfully."
+                        message: "User modified successfully."
                     });
+
                 }).fail(function (result) {
                     var data = result.responseJSON;
                     var title = "Error " + (data.code ? data.code : 'unknown');
diff --git a/userhandler/urls.py b/userhandler/urls.py
index 9b07f43..2bd735b 100644
--- a/userhandler/urls.py
+++ b/userhandler/urls.py
@@ -18,7 +18,7 @@
 from userhandler import views
 
 urlpatterns = [
-    url(r'^list$', views.list, name='list'),
+    url(r'^list$', views.user_list, name='list'),
     url(r'^create$', views.create, name='create'),
     url(r'^(?P<user_id>[0-9a-zA-Z]+)', views.update, name='update'),
     url(r'^(?P<user_id>[0-9a-zA-Z]+)/delete$', views.delete, name='delete')
diff --git a/userhandler/views.py b/userhandler/views.py
index 05d5925..3aa227a 100644
--- a/userhandler/views.py
+++ b/userhandler/views.py
@@ -11,7 +11,7 @@
 
 
 @login_required
-def list(request):
+def user_list(request):
     user = osmutils.get_user(request)
     client = Client()
     result = client.user_list(user.get_token())
@@ -51,18 +51,29 @@
     user = osmutils.get_user(request)
     try:
         client = Client()
-        user_data = {
-            "projects": request.POST.getlist('projects')
-        }
-        print user_data
-        update_res = client.user_update(user.get_token(), user_id, user_data)
+        projects_old = request.POST.get('projects_old').split(',')
+        projects_new = request.POST.getlist('projects')
+        default_project = request.POST.get('default_project')
+        projects_new.append(default_project)
+        projects_to_add = list(set(projects_new) - set(projects_old))
+        projects_to_remove = list(set(projects_old) - set(projects_new))
+
+        payload = {}
+
+        for p in projects_to_remove:
+            payload["$"+str(p)] = None
+        for p in projects_to_add:
+            if p not in projects_old:
+                payload["$+"+str(p)] = str(p)
+        payload["$" + default_project] = None
+        payload["$+[0]"] = default_project
+
+        update_res = client.user_update(user.get_token(), user_id, {"projects": payload})
     except Exception as e:
         log.exception(e)
     return __response_handler(request, {}, 'users:list', to_redirect=True, )
 
 
-
-
 def __response_handler(request, data_res, url=None, to_redirect=None, *args, **kwargs):
     raw_content_types = request.META.get('HTTP_ACCEPT', '*/*').split(',')
     if 'application/json' in raw_content_types or url is None: