diff --git a/seahub/templates/sysadmin/sys_useradmin.html b/seahub/templates/sysadmin/sys_useradmin.html index c5bafce2e9..ea04356cdb 100644 --- a/seahub/templates/sysadmin/sys_useradmin.html +++ b/seahub/templates/sysadmin/sys_useradmin.html @@ -81,10 +81,38 @@ $(function(){ if (data['need_update']) { var tip = "{% trans "A new server version %(v)s is available." %}"; tip = tip.replace('%(v)s', data['new_version']); - $('#title-panel').html('

' + tip + '

').removeClass('hide'); + $('#title-panel').html('

' + tip + '

').removeClass('hide'); } } }); + + {% if is_pro %} + // check if seafile license expired + $.ajax({ + url: "{% url 'sys_check_license' %}", + dataType: 'json', + cache: false, + success: function(data) { + var tip, $title_panel = $('#title-panel'); + + if (data['already_expired']) { + tip = "Your license is already expired in %(v)s.", + tip = tip.replace('%(v)s', data['expiration']); + } else if (data['to_be_expired']) { + tip = "Your license will be expired in %(v)s.", + tip = tip.replace('%(v)s', data['expiration']); + } + + if (typeof(tip) != 'undefined') { + if ($title_panel.find('p').length) { + $title_panel.find('p').append('
' + tip + ''); + } else { + $title_panel.html('

' + tip + '

').removeClass('hide'); + } + } + } + }); + {% endif %} }); $('#add-user-btn').click(function() { diff --git a/seahub/urls.py b/seahub/urls.py index 862dcac2f8..b095b8c30f 100644 --- a/seahub/urls.py +++ b/seahub/urls.py @@ -238,6 +238,7 @@ urlpatterns = patterns( url(r'^sys/uploadlink/remove/$', sys_upload_link_remove, name='sys_upload_link_remove'), url(r'^sys/notificationadmin/', notification_list, name='notification_list'), url(r'^sys/sudo/', sys_sudo_mode, name='sys_sudo_mode'), + url(r'^sys/check-license/', sys_check_license, name='sys_check_license'), url(r'^useradmin/add/$', user_add, name="user_add"), url(r'^useradmin/remove/(?P[^/]+)/$', user_remove, name="user_remove"), url(r'^useradmin/removetrial/(?P[^/]+)/$', remove_trial, name="remove_trial"), diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py index 4d085cad07..b2f1c29c65 100644 --- a/seahub/views/sysadmin.py +++ b/seahub/views/sysadmin.py @@ -8,6 +8,7 @@ import re import datetime import stat import csv, chardet, StringIO +import time from constance import config from django.core.urlresolvers import reverse @@ -2030,3 +2031,38 @@ def sys_settings(request): return render_to_response('sysadmin/settings.html', { 'config_dict': config_dict, }, context_instance=RequestContext(request)) + +@login_required_ajax +@sys_staff_required +def sys_check_license(request): + """Check seafile license expiration. + """ + if not is_pro_version(): + raise Http404 + + content_type = 'application/json; charset=utf-8' + result = {} + + license_file = os.path.join(settings.PROJECT_ROOT, '../../seafile-license.txt') + license_dict = parse_license(license_file) + if license_dict: + try: + expiration = license_dict['Expiration'] + except KeyError as e: + logger.error(e) + result['error'] = str(e) + return HttpResponse(json.dumps(result), status=500, content_type=content_type) + + struct_time = datetime.datetime.strptime(expiration, "%Y-%m-%d") + expiration_timestamp = time.mktime(struct_time.timetuple()) + + if time.time() > expiration_timestamp: + # already expired + result['already_expired'] = True + elif time.time() + 30 * 24 * 60 * 60 > expiration_timestamp: + # will be expired in 30 days + result['to_be_expired'] = True + + result['expiration'] = expiration + + return HttpResponse(json.dumps(result), content_type=content_type)