Add functionality to import upstream users
authorMagnus Hagander <magnus@hagander.net>
Sat, 19 Jul 2014 13:04:53 +0000 (15:04 +0200)
committerMagnus Hagander <magnus@hagander.net>
Sat, 19 Jul 2014 13:04:53 +0000 (15:04 +0200)
pgcommitfest/commitfest/ajax.py
pgcommitfest/commitfest/static/commitfest/js/commitfest.js
pgcommitfest/commitfest/templates/base_form.html

index 06f6691cd4da44d777e31c4bd653c6be3da7c4ed..d1d8bcbd147c28d1a8cc530ad4802c2b9ddb0a83 100644 (file)
@@ -3,6 +3,7 @@ from django.http import HttpResponse, Http404
 from django.conf import settings
 from django.views.decorators.csrf import csrf_exempt
 from django.contrib.auth.decorators import login_required
+from django.contrib.auth.models import User
 from django.db import transaction
 
 import httplib
@@ -10,6 +11,8 @@ import socket
 import urllib
 import simplejson
 
+from auth import user_search
+
 class HttpResponseServiceUnavailable(HttpResponse): 
        status_code = 503
 
@@ -148,11 +151,38 @@ def detachThread(request):
 
        return 'OK'
 
+def searchUsers(request):
+       if request.GET.has_key('s') and request.GET['s']:
+               return user_search(request.GET['s'])
+       else:
+               return []
+
+def importUser(request):
+       if request.GET.has_key('u') and request.GET['u']:
+               u = user_search(userid=request.GET['u'])
+               if len (u) != 1:
+                       return "Internal error, duplicate user found"
+
+               u = u[0]
+
+               if User.objects.filter(username=u['u']).exists():
+                       return "User already exists"
+               User(username=u['u'],
+                        first_name=u['f'],
+                        last_name=u['l'],
+                        email=u['e'],
+                        password='setbypluginnotsha1',
+                        ).save()
+               return 'OK'
+       else:
+               raise Http404()
 
 _ajax_map={
        'getThreads': getThreads,
        'attachThread': attachThread,
        'detachThread': detachThread,
+       'searchUsers': searchUsers,
+       'importUser': importUser,
 }
 
 # Main entrypoint for /ajax/<command>/
index 972dd67677c6e2e402fdff8cf386b983a15ba0c4..1ac3bc29a13f526e58f414ab5286daad3dd9d125 100644 (file)
@@ -143,3 +143,64 @@ function togglePatchFilterButton(buttonId, collapseId) {
 
    toggleButtonCollapse(buttonId, collapseId);
 }
+
+
+/*
+ * Upstream user search dialog
+ */
+function search_and_store_user() {
+    $('#doSelectUserButton').unbind('click');
+    $('#doSelectUserButton').click(function() {
+       if (!$('#searchUserList').val()) { return false; }
+
+       /* Create this user locally */
+       $.get('/ajax/importUser/', {
+           'u': $('#searchUserList').val(),
+       }).success(function(data) {
+           if (data == 'OK') {
+               alert('User imported!');
+               $('#searchUserModal').modal('hide');
+           } else {
+               alert('Failed to import user: ' + data);
+           }
+       }).fail(function(data, statustxt) {
+           alert('Failed to import user: ' + statustxt);
+       });
+
+       return false;
+    });
+
+    $('#searchUserModal').modal();
+}
+
+function findUsers() {
+    if (!$('#searchUserSearchField').val()) {
+       alert('No search term specified');
+       return false;
+    }
+    $('#searchUserListWrap').addClass('loading');
+    $('#searchUserSearchButton').addClass('disabled');
+    $.get('/ajax/searchUsers/', {
+      's': $('#searchUserSearchField').val(),
+    }).success(function(data) {
+        sel = $('#searchUserList');
+        sel.find('option').remove();
+        $.each(data, function(i,u) {
+           sel.append('<option value="' + u.u + '">' + u.u + ' (' + u.f + ' ' + u.l + ')</option>');
+        });
+    }).always(function() {
+       $('#searchUserListWrap').removeClass('loading');
+       $('#searchUserSearchButton').removeClass('disabled');
+       searchUserListChanged();
+    });
+   return false;
+}
+
+function searchUserListChanged() {
+   if ($('#searchUserList').val()) {
+       $('#doSelectUserButton').removeClass('disabled');
+   }
+   else {
+       $('#doSelectUserButton').addClass('disabled');
+   }
+}
index ac42f43faa12ec1a5fcc72e9441a6b52fc413a99..c6cf605c325f295818aa9292c794d1535f458109 100644 (file)
@@ -79,9 +79,35 @@ div.form-group div.controls input.threadpick-input {
 {%if threadbrowse %}
 {%include "thread_attach.inc" %}
 {%endif%}
+
+<div class="modal fade" id="searchUserModal" role="dialog">
+  <div class="modal-dialog modal-lg">
+    <div class="modal-content">
+      <div class="modal-header">
+       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+       <h3>Search user</h3>
+      </div>
+      <div class="modal-body">
+       <form class="form-inline" style="margin-bottom: 5px;">
+         <div class="input-append">
+           <input id="searchUserSearchField" type="text" class="span2 search-query" autocomplete="off">
+           <button id="searchUserSearchButton" onclick="return findUsers()" class="btn btn-default">Search</button>
+         </div>
+       </form>
+       <div>Search for users above and then pick one in the list below:</div>
+       <div id="searchUserListWrap">
+         <select id="searchUserList" size="6" style="width:100%;" onchange="searchUserListChanged()"></select>
+       </div>
+      </div>
+      <div class="modal-footer">
+       <a href="#" class="btn btn-default" data-dismiss="modal">Close</a>
+       <a href="#" id="doSelectUserButton" class="btn btn-default btn-primary disabled">Add user to system</a>
+      </div>
+    </div>
+  </div>
+</div>
 {%endblock%}
 
-{%if threadbrowse %}
 {%block morescript%}
 <script>
 /* Set up djselectable to use bootstrap buttons */
@@ -100,6 +126,21 @@ $.ui.djselectable.prototype._removeButtonTemplate = function (item) {
     return $("<a>").append(icon).addClass("btn btn-default btn-xs selectable-deck-remove");
 };
 
+/* Set up userid selectables to be searchable */
+$('input[data-selectable-url="/selectable/commitfest-userlookup/"]').each(function() {
+   $(this).after(
+         $('<a href="#" class="btn btn-default btn-sm">Import user not listed</a>').click(function () {
+         search_and_store_user();
+
+         return false;
+       })
+   );
+});
+
+$('#searchUserModal').on('shown.bs.modal', function() {
+         $('#searchUserSearchField').focus();
+});
+
 /* Build our button callbacks */
 $(document).ready(function() {
    $('button.attachThreadButton').each(function (i,o) {
@@ -116,4 +157,3 @@ $(document).ready(function() {
 });
 </script>
 {%endblock%}
-{%endif%}