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
import urllib
import simplejson
+from auth import user_search
+
class HttpResponseServiceUnavailable(HttpResponse):
status_code = 503
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>/
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');
+ }
+}
{%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 */
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) {
});
</script>
{%endblock%}
-{%endif%}