1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-24 17:49:44 +00:00
seahub/base/decorators.py
2013-04-02 19:56:44 +08:00

74 lines
2.6 KiB
Python

from django.http import Http404
from django.shortcuts import render_to_response
from django.template import RequestContext
from seaserv import get_repo, is_passwd_set
from seahub.utils import check_and_get_org_by_repo, check_and_get_org_by_group
def sys_staff_required(func):
"""
Decorator for views that checks the user is system staff.
"""
def _decorated(request, *args, **kwargs):
if request.user.is_staff:
return func(request, *args, **kwargs)
raise Http404
return _decorated
# def ctx_switch_required(func):
# """
# Decorator for views to change navigation bar automatically that render
# same template when both in org context and personal context.
# """
# def _decorated(request, *args, **kwargs):
# if not request.cloud_mode:
# # no need to switch context when `CLOUD_MODE` is false
# request.user.org = None
# request.base_template = 'myhome_base.html'
# return func(request, *args, **kwargs)
# repo_id = kwargs.get('repo_id', '')
# group_id = kwargs.get('group_id', '')
# if repo_id and group_id:
# return func(request, *args, **kwargs)
# if not repo_id and not group_id:
# return func(request, *args, **kwargs)
# user = request.user.username
# if repo_id:
# org, base_template = check_and_get_org_by_repo(repo_id, user)
# if group_id:
# org, base_template = check_and_get_org_by_group(int(group_id), user)
# if org:
# request.user.org = org._dict
# else:
# request.user.org = None
# request.base_template = base_template
# return func(request, *args, **kwargs)
# return _decorated
def repo_passwd_set_required(func):
"""
Decorator for views to redirect user to repo decryption page if repo is
encrypt and password is not set by user.
"""
def _decorated(request, *args, **kwargs):
repo_id = kwargs.get('repo_id', None)
if not repo_id:
raise Exception, 'Repo id is not found in url.'
repo = get_repo(repo_id)
if not repo:
raise Http404
username = request.user.username
if repo.encrypted and not is_passwd_set(repo_id, username):
# Redirect uesr to decrypt repo page.
return render_to_response('decrypt_repo_form.html', {
'repo': repo,
'next': request.get_full_path(),
}, context_instance=RequestContext(request))
return func(request, *args, **kwargs)
return _decorated