diff options
author | Magnus Hagander | 2014-07-19 13:04:53 +0000 |
---|---|---|
committer | Magnus Hagander | 2014-07-19 13:04:53 +0000 |
commit | 97040264f92881ac3afd31b87bb62d53237eb8ea (patch) | |
tree | df0da003d65fbad06e3d44b0cfdbebd43566212d | |
parent | 3cd75adbf319981972abca99b6c0753e6e69bfdb (diff) |
Add functionality to import upstream users
-rw-r--r-- | pgcommitfest/commitfest/ajax.py | 30 | ||||
-rw-r--r-- | pgcommitfest/commitfest/static/commitfest/js/commitfest.js | 61 | ||||
-rw-r--r-- | pgcommitfest/commitfest/templates/base_form.html | 44 |
3 files changed, 133 insertions, 2 deletions
diff --git a/pgcommitfest/commitfest/ajax.py b/pgcommitfest/commitfest/ajax.py index 06f6691..d1d8bcb 100644 --- a/pgcommitfest/commitfest/ajax.py +++ b/pgcommitfest/commitfest/ajax.py @@ -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>/ diff --git a/pgcommitfest/commitfest/static/commitfest/js/commitfest.js b/pgcommitfest/commitfest/static/commitfest/js/commitfest.js index 972dd67..1ac3bc2 100644 --- a/pgcommitfest/commitfest/static/commitfest/js/commitfest.js +++ b/pgcommitfest/commitfest/static/commitfest/js/commitfest.js @@ -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'); + } +} diff --git a/pgcommitfest/commitfest/templates/base_form.html b/pgcommitfest/commitfest/templates/base_form.html index ac42f43..c6cf605 100644 --- a/pgcommitfest/commitfest/templates/base_form.html +++ b/pgcommitfest/commitfest/templates/base_form.html @@ -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">×</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%} |