diff --git a/seahub/templates/sysadmin/base.html b/seahub/templates/sysadmin/base.html
index 050784b867..cee898f63d 100644
--- a/seahub/templates/sysadmin/base.html
+++ b/seahub/templates/sysadmin/base.html
@@ -5,6 +5,9 @@
{% trans "System Admin" %}
+ -
+ {% trans "Info" %}
+
-
{% trans "Libraries" %}
diff --git a/seahub/templates/sysadmin/sys_info.html b/seahub/templates/sysadmin/sys_info.html
new file mode 100644
index 0000000000..8f33949f8c
--- /dev/null
+++ b/seahub/templates/sysadmin/sys_info.html
@@ -0,0 +1,35 @@
+{% extends "sysadmin/base.html" %}
+{% load seahub_tags i18n %}
+
+{% block cur_info %}tab-cur{% endblock %}
+
+{% block right_panel %}
+{% trans "Info" %}
+
+
+ - {% trans "System Info" %}
+ - {% if is_pro %}
+ {% trans "Professional Edition" %} {% if license_dict %} {% trans "expires on" %} {{ license_dict.Expiration}}{% endif %}
+ {% else %}
+ {% trans "Community Edition" %}
+ {% trans "Upgrade to Pro Edition" %}
+ {% endif %}
+
+
+ - {% trans "Libraries" %}
+ - {{repos_count}}
+
+ - {% trans "Users" %}
+ - {{users_count}} {% if license_dict %}/ {{license_dict.MaxUsers}}{% endif %}
+
+ - {% trans "Groups" %}
+ - {{groups_count}}
+
+ {% if multi_tenancy %}
+ - {% trans "Organizations" %}
+ - {{org_count}}
+ {% endif %}
+
+
+{% endblock %}
+
diff --git a/seahub/urls.py b/seahub/urls.py
index 8c6f3f8c15..09c9baa4af 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -203,6 +203,7 @@ urlpatterns = patterns('',
(r'^thumbnail/', include('seahub.thumbnail.urls')),
### system admin ###
+ url(r'^sys/info/$', sys_info, name='sys_info'),
url(r'^sys/seafadmin/$', sys_repo_admin, name='sys_repo_admin'),
url(r'^sys/seafadmin/system/$', sys_list_system, name='sys_list_system'),
url(r'^sys/seafadmin/repo-trash/$', sys_repo_trash, name='sys_repo_trash'),
diff --git a/seahub/utils/licenseparse.py b/seahub/utils/licenseparse.py
new file mode 100644
index 0000000000..558e87a354
--- /dev/null
+++ b/seahub/utils/licenseparse.py
@@ -0,0 +1,37 @@
+import logging
+logger = logging.getLogger(__name__)
+
+def parse_license(file_path):
+ """Parse license file and return dict.
+
+ Arguments:
+ - `file_path`:
+
+ Returns:
+ e.g.
+
+ {'Hash': 'fdasfjl',
+ 'Name': 'seafile official',
+ 'Licencetype': 'User',
+ 'LicenceKEY': '123',
+ 'Expiration': '2016-3-2',
+ 'MaxUsers': '1000000',
+ 'ProductID': 'Seafile server for Windows'
+ }
+
+ """
+ ret = {}
+ lines = []
+ try:
+ with open(file_path) as f:
+ lines = f.readlines()
+ except Exception as e:
+ logger.warn(e)
+ return {}
+
+ for line in lines:
+ if len(line.split('=')) == 2:
+ k, v = line.split('=')
+ ret[k.strip()] = v.strip().strip('"')
+
+ return ret
diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py
index 24067ab365..c25bc18e35 100644
--- a/seahub/views/sysadmin.py
+++ b/seahub/views/sysadmin.py
@@ -29,6 +29,7 @@ from seahub.constants import GUEST_USER, DEFAULT_USER
from seahub.utils import IS_EMAIL_CONFIGURED, string2list, is_valid_username, \
is_pro_version
from seahub.utils.rpc import mute_seafile_api
+from seahub.utils.licenseparse import parse_license
from seahub.views import get_system_default_repo_id
from seahub.forms import SetUserQuotaForm, AddUserForm, BatchAddUserForm
from seahub.profile.models import Profile, DetailedProfile
@@ -46,9 +47,44 @@ except:
ENABLE_TRIAL_ACCOUNT = False
if ENABLE_TRIAL_ACCOUNT:
from seahub_extra.trialaccount.models import TrialAccount
+try:
+ from seahub.settings import MULTI_TENANCY
+except ImportError:
+ MULTI_TENANCY = False
logger = logging.getLogger(__name__)
+
+@login_required
+@sys_staff_required
+def sys_info(request):
+ """System info(members, pro, ..) page.
+
+ Arguments:
+ - `request`:
+ """
+ users_count = ccnet_threaded_rpc.count_emailusers('DB')
+ repos_count = len(seafile_api.get_repo_list(-1, -1))
+ groups_count = len(ccnet_threaded_rpc.get_all_groups(-1, -1))
+ if MULTI_TENANCY:
+ org_count = ccnet_threaded_rpc.count_orgs()
+ else:
+ org_count = -1
+
+ is_pro = is_pro_version()
+ if is_pro:
+ license_dict = parse_license('../../../../seafile-license.txt')
+ else:
+ license_dict = {}
+ return render_to_response('sysadmin/sys_info.html', {
+ 'users_count': users_count,
+ 'repos_count': repos_count,
+ 'groups_count': groups_count,
+ 'org_count': org_count,
+ 'is_pro': is_pro,
+ 'license_dict': license_dict,
+ }, context_instance=RequestContext(request))
+
@login_required
@sys_staff_required
def sys_repo_admin(request):