Add UI for handling the case when an enterprise has reached its maximum seat count
This commit is contained in:
parent
22cc7a85d4
commit
205362bc7b
7 changed files with 47 additions and 4 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -7,3 +7,6 @@ grunt/node_modules
|
||||||
dist
|
dist
|
||||||
dest
|
dest
|
||||||
node_modules
|
node_modules
|
||||||
|
static/ldn
|
||||||
|
static/fonts
|
||||||
|
stack_local
|
||||||
|
|
|
@ -66,6 +66,10 @@ class Unauthorized(ApiException):
|
||||||
ApiException.__init__(self, 'insufficient_scope', 403, 'Unauthorized', payload)
|
ApiException.__init__(self, 'insufficient_scope', 403, 'Unauthorized', payload)
|
||||||
|
|
||||||
|
|
||||||
|
class ExceedsLicenseException(ApiException):
|
||||||
|
def __init__(self, payload=None):
|
||||||
|
ApiException.__init__(self, None, 402, 'Payment Required', payload)
|
||||||
|
|
||||||
|
|
||||||
class NotFound(ApiException):
|
class NotFound(ApiException):
|
||||||
def __init__(self, payload=None):
|
def __init__(self, payload=None):
|
||||||
|
@ -275,6 +279,10 @@ def request_error(exception=None, **kwargs):
|
||||||
raise InvalidRequest(message, data)
|
raise InvalidRequest(message, data)
|
||||||
|
|
||||||
|
|
||||||
|
def license_error(exception=None):
|
||||||
|
raise ExceedsLicenseException()
|
||||||
|
|
||||||
|
|
||||||
def log_action(kind, user_or_orgname, metadata=None, repo=None):
|
def log_action(kind, user_or_orgname, metadata=None, repo=None):
|
||||||
if not metadata:
|
if not metadata:
|
||||||
metadata = {}
|
metadata = {}
|
||||||
|
|
|
@ -8,7 +8,7 @@ from flask.ext.principal import identity_changed, AnonymousIdentity
|
||||||
from app import app, billing as stripe, authentication
|
from app import app, billing as stripe, authentication
|
||||||
from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error,
|
from endpoints.api import (ApiResource, nickname, resource, validate_json_request, request_error,
|
||||||
log_action, internal_only, NotFound, require_user_admin,
|
log_action, internal_only, NotFound, require_user_admin,
|
||||||
InvalidToken, require_scope, format_date, hide_if, show_if)
|
InvalidToken, require_scope, format_date, hide_if, show_if, license_error)
|
||||||
from endpoints.api.subscribe import subscribe
|
from endpoints.api.subscribe import subscribe
|
||||||
from endpoints.common import common_login
|
from endpoints.common import common_login
|
||||||
from data import model
|
from data import model
|
||||||
|
@ -193,6 +193,8 @@ class User(ApiResource):
|
||||||
code = model.create_confirm_email_code(new_user)
|
code = model.create_confirm_email_code(new_user)
|
||||||
send_confirmation_email(new_user.username, new_user.email, code.code)
|
send_confirmation_email(new_user.username, new_user.email, code.code)
|
||||||
return 'Created', 201
|
return 'Created', 201
|
||||||
|
except model.TooManyUsersException as ex:
|
||||||
|
raise license_error(exception=ex)
|
||||||
except model.DataModelException as ex:
|
except model.DataModelException as ex:
|
||||||
raise request_error(exception=ex)
|
raise request_error(exception=ex)
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,7 @@ def render_page_template(name, **kwargs):
|
||||||
is_debug=str(app.config.get('DEBUGGING', False)).lower(),
|
is_debug=str(app.config.get('DEBUGGING', False)).lower(),
|
||||||
show_chat=features.OLARK_CHAT,
|
show_chat=features.OLARK_CHAT,
|
||||||
cache_buster=cache_buster,
|
cache_buster=cache_buster,
|
||||||
|
has_billing=features.BILLING,
|
||||||
**kwargs))
|
**kwargs))
|
||||||
|
|
||||||
resp.headers['X-FRAME-OPTIONS'] = 'DENY'
|
resp.headers['X-FRAME-OPTIONS'] = 'DENY'
|
||||||
|
|
|
@ -112,7 +112,12 @@ def create_user():
|
||||||
else:
|
else:
|
||||||
# New user case
|
# New user case
|
||||||
profile.debug('Creating user')
|
profile.debug('Creating user')
|
||||||
new_user = model.create_user(username, password, user_data['email'])
|
new_user = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
new_user = model.create_user(username, password, user_data['email'])
|
||||||
|
except model.TooManyUsersException as ex:
|
||||||
|
abort(402, 'Seat limit has been reached for this license', issue='seat-limit')
|
||||||
|
|
||||||
profile.debug('Creating email code for user')
|
profile.debug('Creating email code for user')
|
||||||
code = model.create_confirm_email_code(new_user)
|
code = model.create_confirm_email_code(new_user)
|
||||||
|
|
|
@ -4749,8 +4749,8 @@ quayApp.directive('ngVisible', function () {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanService', '$http', '$timeout', 'CookieService',
|
quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanService', '$http', '$timeout', 'CookieService', 'Features',
|
||||||
function($location, $rootScope, Restangular, UserService, PlanService, $http, $timeout, CookieService) {
|
function($location, $rootScope, Restangular, UserService, PlanService, $http, $timeout, CookieService, Features) {
|
||||||
|
|
||||||
// Handle session security.
|
// Handle session security.
|
||||||
Restangular.setDefaultRequestParams(['post', 'put', 'remove', 'delete'], {'_csrf_token': window.__token || ''});
|
Restangular.setDefaultRequestParams(['post', 'put', 'remove', 'delete'], {'_csrf_token': window.__token || ''});
|
||||||
|
@ -4764,6 +4764,11 @@ quayApp.run(['$location', '$rootScope', 'Restangular', 'UserService', 'PlanServi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Features.BILLING && response.status == 402) {
|
||||||
|
$('#overlicenseModal').modal({});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (response.status == 500) {
|
if (response.status == 500) {
|
||||||
document.location = '/500';
|
document.location = '/500';
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -35,4 +35,23 @@
|
||||||
</div><!-- /.modal-dialog -->
|
</div><!-- /.modal-dialog -->
|
||||||
</div><!-- /.modal -->
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
{% if not has_billing %}
|
||||||
|
<!-- Modal message dialog -->
|
||||||
|
<div class="modal fade" id="overlicenseModal" data-backdrop="static">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h4 class="modal-title">Cannot create user</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
A new user cannot be created as this organization has reached its licensed seat count. Please contact your administrator.
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a href="javascript:void(0)" class="btn btn-primary" data-dismiss="modal" onclick="location = '/signin'">Sign In</a>
|
||||||
|
</div>
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
Reference in a new issue