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" %}

    + +
    {% csrf_token %} + {% for k,v in config_dict.items %} + + + *{{v.1}} +
    + {% endfor %} + + +
    + +{% 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))