diff --git a/requirements.txt b/requirements.txt
index 630e8435ba..09784c4619 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,3 +6,4 @@ Django>=1.5.8,<1.6
Djblets==0.6.14
django-compressor==1.4
django-statici18n==1.1.2
+django-constance[database]
diff --git a/seahub/settings.py b/seahub/settings.py
index c13879d67c..23dd364d60 100644
--- a/seahub/settings.py
+++ b/seahub/settings.py
@@ -7,7 +7,7 @@ import re
import random
import string
-from seaserv import FILE_SERVER_ROOT, FILE_SERVER_PORT
+from seaserv import FILE_SERVER_ROOT, FILE_SERVER_PORT, SERVICE_URL
PROJECT_ROOT = os.path.join(os.path.dirname(__file__), os.pardir)
@@ -192,6 +192,8 @@ INSTALLED_APPS = (
'captcha',
'compressor',
'statici18n',
+ 'constance',
+ 'constance.backends.database',
'seahub.api2',
'seahub.avatar',
@@ -209,6 +211,8 @@ INSTALLED_APPS = (
'seahub.password_session',
)
+CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
+CONSTANCE_DATABASE_CACHE_BACKEND = 'default'
AUTHENTICATION_BACKENDS = (
'seahub.base.accounts.AuthBackend',
@@ -603,3 +607,12 @@ if 'win32' in sys.platform:
LOGIN_URL = SITE_ROOT + 'accounts/login'
INNER_FILE_SERVER_ROOT = 'http://127.0.0.1:' + FILE_SERVER_PORT
+
+CONSTANCE_CONFIG = {
+ 'SERVICE_URL': (SERVICE_URL, gettext_noop(
+ "This is outside URL for Seahub(Seafile Web).The domain part (i.e., "
+ "www.example.com) will be used in generating share links and "
+ "download/upload file via web. Note: Outside URL means if you use "
+ "Nginx, it should be the Nginx's address")),
+ 'FILE_SERVER_ROOT': (FILE_SERVER_ROOT, gettext_noop('URL for seafile fileserver')),
+}
diff --git a/seahub/templates/sysadmin/base.html b/seahub/templates/sysadmin/base.html
index 14c3dfd245..df1117f183 100644
--- a/seahub/templates/sysadmin/base.html
+++ b/seahub/templates/sysadmin/base.html
@@ -8,6 +8,9 @@
{% trans "Info" %}
+
+ {% trans "Settings" %}
+
{% trans "Libraries" %}
diff --git a/seahub/templates/sysadmin/settings.html b/seahub/templates/sysadmin/settings.html
new file mode 100644
index 0000000000..71be1f6ab1
--- /dev/null
+++ b/seahub/templates/sysadmin/settings.html
@@ -0,0 +1,21 @@
+{% extends "sysadmin/base.html" %}
+{% load seahub_tags i18n %}
+
+{% block cur_settings %}tab-cur{% endblock %}
+
+{% block right_panel %}
+{% trans "Settings" %}
+
+
+
+{% endblock %}
+
diff --git a/seahub/urls.py b/seahub/urls.py
index bd945463f3..2a5268fb37 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -205,6 +205,7 @@ urlpatterns = patterns(
### system admin ###
url(r'^sys/info/$', sys_info, name='sys_info'),
+ url(r'^sys/settings/$', sys_settings, name='sys_settings'),
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/__init__.py b/seahub/utils/__init__.py
index ae800190f2..6e19b1c574 100644
--- a/seahub/utils/__init__.py
+++ b/seahub/utils/__init__.py
@@ -11,13 +11,12 @@ import locale
import ConfigParser
import mimetypes
import contextlib
-
from datetime import datetime
from urlparse import urlparse, urljoin
-
import json
import ccnet
+from constance import config
from django.core.urlresolvers import reverse
from django.core.mail import EmailMessage
@@ -36,7 +35,7 @@ from seaserv import seafile_api, send_message, seafserv_rpc, \
CCNET_SERVER_ADDR, CCNET_SERVER_PORT, get_org_by_id, is_org_staff, \
get_org_id_by_group, get_personal_groups_by_user, \
list_personal_repos_by_owner, get_group_repos, \
- list_inner_pub_repos, CCNET_CONF_PATH, SERVICE_URL
+ list_inner_pub_repos, CCNET_CONF_PATH
import seahub.settings
from seahub.settings import SITE_NAME, MEDIA_URL, LOGO_PATH, \
USER_PASSWORD_STRENGTH_LEVEL, USER_PASSWORD_MIN_LENGTH
@@ -167,12 +166,7 @@ def get_fileserver_root():
Returns:
Constructed fileserver root.
"""
-
- from seahub.settings import FILE_SERVER_ROOT
-
- assert FILE_SERVER_ROOT is not None, "SERVICE_URL is not set in ccnet.conf."
-
- return FILE_SERVER_ROOT
+ return config.FILE_SERVER_ROOT
def get_inner_fileserver_root():
"""Construct inner seafile fileserver address and port.
@@ -725,7 +719,7 @@ def calc_file_path_hash(path, bits=12):
def get_service_url():
"""Get service url from seaserv.
"""
- return SERVICE_URL
+ return config.SERVICE_URL
def get_server_id():
"""Get server id from seaserv.
diff --git a/seahub/views/sysadmin.py b/seahub/views/sysadmin.py
index 54bb8d3d44..55c8ba1a11 100644
--- a/seahub/views/sysadmin.py
+++ b/seahub/views/sysadmin.py
@@ -1656,3 +1656,36 @@ def sys_sudo_mode(request):
'enable_shib_login': enable_shib_login,
},
context_instance=RequestContext(request))
+
+@login_required
+@sys_staff_required
+def sys_settings(request):
+ """List and change seahub settings in admin panel.
+
+ Arguments:
+ - `request`:
+ """
+ from constance import config
+ from seahub.settings import CONSTANCE_CONFIG
+
+ if request.method == "POST":
+ for k in request.POST.keys():
+ if k == 'csrfmiddlewaretoken':
+ continue
+ try:
+ setattr(config, k, request.POST.get(k))
+ except AttributeError:
+ continue
+
+ messages.success(request, _('Success'))
+ return HttpResponseRedirect(reverse('sys_settings'))
+
+ config_dict = {}
+ for k in dir(config):
+ val = getattr(config, k)
+ help_text = _(CONSTANCE_CONFIG[k][1])
+ config_dict[k] = (val, help_text)
+
+ return render_to_response('sysadmin/settings.html', {
+ 'config_dict': config_dict,
+ }, context_instance=RequestContext(request))