1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-25 14:50:29 +00:00

rm joined groups from middleware (#1287)

* rm joined groups from middleware

* rm "base_template" code from context_processors.py

* clean unused group add code
This commit is contained in:
lian
2016-07-18 18:30:50 +08:00
committed by Daniel Pan
parent 59ac32c652
commit efdc55ffd3
11 changed files with 50 additions and 203 deletions

View File

@@ -46,16 +46,6 @@ def base(request):
org = request.user.org org = request.user.org
except AttributeError: except AttributeError:
org = None org = None
try:
base_template = request.base_template
except AttributeError:
base_template = 'base.html'
try:
grps = request.user.joined_groups
grps.sort(lambda x, y: cmp(x.group_name.lower(), y.group_name.lower()))
except AttributeError: # anonymous user
grps = None
# extra repo id from request path, use in search # extra repo id from request path, use in search
repo_id_patt = r".*/([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12})/.*" repo_id_patt = r".*/([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12})/.*"
@@ -75,7 +65,6 @@ def base(request):
'seacloud_mode': SEACLOUD_MODE, 'seacloud_mode': SEACLOUD_MODE,
'cloud_mode': request.cloud_mode, 'cloud_mode': request.cloud_mode,
'org': org, 'org': org,
'base_template': base_template,
'site_name': SITE_NAME, 'site_name': SITE_NAME,
'enable_signup': config.ENABLE_SIGNUP, 'enable_signup': config.ENABLE_SIGNUP,
'max_file_name': MAX_FILE_NAME, 'max_file_name': MAX_FILE_NAME,
@@ -87,7 +76,6 @@ def base(request):
'events_enabled': EVENTS_ENABLED, 'events_enabled': EVENTS_ENABLED,
'traffic_stats_enabled': TRAFFIC_STATS_ENABLED, 'traffic_stats_enabled': TRAFFIC_STATS_ENABLED,
'sysadmin_extra_enabled': ENABLE_SYSADMIN_EXTRA, 'sysadmin_extra_enabled': ENABLE_SYSADMIN_EXTRA,
'grps': grps,
'multi_tenancy': MULTI_TENANCY, 'multi_tenancy': MULTI_TENANCY,
'multi_institution': getattr(dj_settings, 'MULTI_INSTITUTION', False), 'multi_institution': getattr(dj_settings, 'MULTI_INSTITUTION', False),
'search_repo_id': search_repo_id, 'search_repo_id': search_repo_id,

View File

@@ -37,14 +37,6 @@ class BaseMiddleware(object):
else: else:
request.cloud_mode = False request.cloud_mode = False
if CLOUD_MODE and request.user.org is not None:
org_id = request.user.org.org_id
request.user.joined_groups = seaserv.get_org_groups_by_user(
org_id, username)
else:
request.user.joined_groups = seaserv.get_personal_groups_by_user(
username)
return None return None
def process_response(self, request, response): def process_response(self, request, response):

View File

@@ -2,8 +2,7 @@ from django.conf.urls import patterns, url
from views import group_wiki, group_wiki_create, \ from views import group_wiki, group_wiki_create, \
group_wiki_page_new, group_wiki_page_edit, group_wiki_pages, \ group_wiki_page_new, group_wiki_page_edit, group_wiki_pages, \
group_wiki_page_delete, group_wiki_use_lib, group_remove, \ group_wiki_page_delete, group_wiki_use_lib, group_remove
group_add
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^(?P<group_id>\d+)/wiki/$', group_wiki, name='group_wiki'), url(r'^(?P<group_id>\d+)/wiki/$', group_wiki, name='group_wiki'),
@@ -15,5 +14,4 @@ urlpatterns = patterns('',
url(r'^(?P<group_id>\d+)/wiki_page_edit/(?P<page_name>[^/]+)$', group_wiki_page_edit, name='group_wiki_page_edit'), url(r'^(?P<group_id>\d+)/wiki_page_edit/(?P<page_name>[^/]+)$', group_wiki_page_edit, name='group_wiki_page_edit'),
url(r'^(?P<group_id>\d+)/wiki_page_delete/(?P<page_name>[^/]+)$', group_wiki_page_delete, name='group_wiki_page_delete'), url(r'^(?P<group_id>\d+)/wiki_page_delete/(?P<page_name>[^/]+)$', group_wiki_page_delete, name='group_wiki_page_delete'),
url(r'^(?P<group_id>\d+)/remove/$', group_remove, name='group_remove'), url(r'^(?P<group_id>\d+)/remove/$', group_remove, name='group_remove'),
url(r'^add/$', group_add, name='group_add'),
) )

View File

@@ -3,66 +3,42 @@ import logging
import os import os
import json import json
import urllib2 import urllib2
import csv
import chardet
import StringIO
from django.conf import settings from django.conf import settings
from django.core.paginator import EmptyPage, InvalidPage
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponse, HttpResponseRedirect, Http404, \ from django.http import HttpResponse, HttpResponseRedirect, Http404, \
HttpResponseBadRequest HttpResponseBadRequest
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
from django.template.loader import render_to_string
from django.utils.http import urlquote from django.utils.http import urlquote
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils.translation import ungettext
from seahub.auth.decorators import login_required, login_required_ajax from seahub.auth.decorators import login_required, login_required_ajax
import seaserv import seaserv
from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \ from seaserv import ccnet_threaded_rpc, seafile_api, \
seafile_api, get_repo, get_group_repos, get_commits, \ get_group_repos, is_group_user, get_group, create_repo, \
is_group_user, get_group, get_group_members, create_repo, \ remove_repo, get_file_id_by_path, post_empty_file, del_file
get_org_group_repos, check_permission, is_passwd_set, remove_repo, \
unshare_group_repo, get_file_id_by_path, post_empty_file, del_file
from pysearpc import SearpcError from pysearpc import SearpcError
from decorators import group_staff_required from models import PublicGroup
from models import GroupMessage, MessageReply, MessageAttachment, PublicGroup from forms import MessageForm, GroupAddForm, WikiCreateForm
from forms import MessageForm, MessageReplyForm, GroupRecommendForm, \
GroupAddForm, GroupJoinMsgForm, WikiCreateForm, BatchAddMembersForm
from signals import group_join_request
from seahub.auth import REDIRECT_FIELD_NAME from seahub.auth import REDIRECT_FIELD_NAME
from seahub.base.decorators import sys_staff_required, require_POST from seahub.base.decorators import sys_staff_required, require_POST
from seahub.base.models import FileDiscuss
from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
from seahub.group.signals import add_user_to_group
from seahub.group.utils import validate_group_name, BadGroupNameError, \ from seahub.group.utils import validate_group_name, BadGroupNameError, \
ConflictGroupNameError ConflictGroupNameError
from seahub.notifications.models import UserNotification from seahub.wiki import get_group_wiki_repo, get_group_wiki_page, \
from seahub.wiki import get_group_wiki_repo, get_group_wiki_page, convert_wiki_link,\
get_wiki_pages get_wiki_pages
from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing, GroupWiki from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing, GroupWiki
from seahub.wiki.utils import clean_page_name, page_name_to_file_name from seahub.wiki.utils import clean_page_name, page_name_to_file_name
from seahub.settings import SITE_ROOT, SITE_NAME from seahub.settings import SITE_ROOT, SITE_NAME
from seahub.shortcuts import get_first_object_or_none from seahub.utils import render_error, send_html_email, is_org_context
from seahub.utils import render_error, render_permission_error, string2list, \
gen_file_get_url, get_file_type_and_ext, \
calc_file_path_hash, is_valid_username, send_html_email, is_org_context
from seahub.utils.file_types import IMAGE
from seahub.utils.paginator import Paginator
from seahub.views import is_registered_user, check_folder_permission from seahub.views import is_registered_user, check_folder_permission
from seahub.views.modules import get_enabled_mods_by_group, MOD_GROUP_WIKI, \ from seahub.views.modules import get_enabled_mods_by_group, \
enable_mod_for_group, disable_mod_for_group, get_available_mods_by_group, \ get_available_mods_by_group
get_wiki_enabled_group_list
from seahub.forms import SharedRepoCreateForm from seahub.forms import SharedRepoCreateForm
from constance import config
# Get an instance of a logger # Get an instance of a logger
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -151,68 +127,6 @@ def group_check(func):
return _decorated return _decorated
########## views ########## views
@login_required_ajax
def group_add(request):
"""Add a new group"""
if request.method != 'POST':
raise Http404
username = request.user.username
result = {}
content_type = 'application/json; charset=utf-8'
user_can_add_group = request.user.permissions.can_add_group()
if not user_can_add_group:
result['error'] = _(u'You do not have permission to create group.')
return HttpResponse(json.dumps(result), status=403,
content_type=content_type)
# check plan
num_of_groups = getattr(request.user, 'num_of_groups', -1)
if num_of_groups > 0:
current_groups = len(request.user.joined_groups)
if current_groups > num_of_groups:
result['error'] = _(u'You can only create %d groups.<a href="http://seafile.com/">Upgrade account.</a>') % num_of_groups
return HttpResponse(json.dumps(result), status=403,
content_type=content_type)
form = GroupAddForm(request.POST)
if form.is_valid():
group_name = form.cleaned_data['group_name']
# Check whether group name is duplicated.
org_id = -1
if is_org_context(request):
org_id = request.user.org.org_id
checked_groups = seaserv.get_org_groups_by_user(org_id, username)
else:
if request.cloud_mode:
checked_groups = seaserv.get_personal_groups_by_user(username)
else:
checked_groups = get_all_groups(-1, -1)
for g in checked_groups:
if g.group_name == group_name:
result['error'] = _(u'There is already a group with that name.')
return HttpResponse(json.dumps(result), status=400,
content_type=content_type)
# Group name is valid, create that group.
try:
if org_id > 0:
create_org_group(org_id, group_name, username)
else:
create_group(group_name, username)
return HttpResponse(json.dumps({'success': True}),
content_type=content_type)
except SearpcError, e:
result['error'] = _(e.msg)
return HttpResponse(json.dumps(result), status=500,
content_type=content_type)
else:
return HttpResponseBadRequest(json.dumps(form.errors),
content_type=content_type)
@login_required @login_required
@sys_staff_required @sys_staff_required
@require_POST @require_POST

View File

@@ -216,7 +216,7 @@ app["pageOptions"] = {
csrfToken: "{{ csrf_token }}", csrfToken: "{{ csrf_token }}",
groups: (function () { groups: (function () {
var groups = []; var groups = [];
{% for group in request.user.joined_groups %} {% for group in joined_groups %}
groups.push({'name': '{{group.group_name}}', 'id': '{{group.id}}'}); groups.push({'name': '{{group.group_name}}', 'id': '{{group.id}}'});
{% endfor %} {% endfor %}
return groups; return groups;

View File

@@ -453,16 +453,6 @@ def string2list(string):
s.add(e) s.add(e)
return [ x for x in s ] return [ x for x in s ]
# def get_cur_ctx(request):
# ctx_dict = request.session.get('current_context', {
# 'base_template': 'myhome_base.html',
# 'org_dict': None})
# return ctx_dict
# def set_cur_ctx(request, ctx_dict):
# request.session['current_context'] = ctx_dict
# request.user.org = ctx_dict.get('org_dict', None)
def is_org_context(request): def is_org_context(request):
"""An organization context is a virtual private Seafile instance on cloud """An organization context is a virtual private Seafile instance on cloud
service. service.

View File

@@ -4,19 +4,16 @@ import os
import stat import stat
import json import json
import mimetypes import mimetypes
import urllib2
import logging import logging
from math import ceil
import posixpath import posixpath
from django.core.cache import cache from django.core.cache import cache
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponse, HttpResponseBadRequest, Http404, \ from django.http import HttpResponse, Http404, \
HttpResponseRedirect HttpResponseRedirect
from django.shortcuts import render_to_response, redirect from django.shortcuts import render_to_response, redirect
from django.template import RequestContext from django.template import RequestContext
from django.utils import timezone
from django.utils.http import urlquote from django.utils.http import urlquote
from django.utils.html import escape from django.utils.html import escape
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@@ -24,44 +21,34 @@ from django.views.decorators.http import condition
import seaserv import seaserv
from seaserv import get_repo, get_commits, is_valid_filename, \ from seaserv import get_repo, get_commits, is_valid_filename, \
seafserv_threaded_rpc, seafserv_rpc, is_repo_owner, check_permission, \ seafserv_threaded_rpc, seafserv_rpc, is_repo_owner, \
is_passwd_set, get_file_size, get_group, get_session_info, get_commit, \ get_file_size, MAX_DOWNLOAD_DIR_SIZE, \
MAX_DOWNLOAD_DIR_SIZE, send_message, ccnet_threaded_rpc, \ seafile_api
get_personal_groups_by_user, seafile_api
from pysearpc import SearpcError from pysearpc import SearpcError
from seahub.avatar.util import get_avatar_file_storage from seahub.avatar.util import get_avatar_file_storage
from seahub.auth.decorators import login_required, login_required_ajax from seahub.auth.decorators import login_required
from seahub.auth import login as auth_login from seahub.auth import login as auth_login
from seahub.auth import get_backends from seahub.auth import get_backends
from seahub.base.accounts import User from seahub.base.accounts import User
from seahub.base.decorators import user_mods_check, require_POST from seahub.base.decorators import user_mods_check, require_POST
from seahub.base.models import UserStarredFiles, ClientLoginToken from seahub.base.models import ClientLoginToken
from seahub.contacts.models import Contact
from seahub.options.models import UserOptions, CryptoOptionNotSetError from seahub.options.models import UserOptions, CryptoOptionNotSetError
from seahub.profile.models import Profile from seahub.profile.models import Profile
from seahub.share.models import FileShare, UploadLinkShare from seahub.share.models import FileShare, UploadLinkShare
from seahub.utils import render_permission_error, render_error, list_to_string, \ from seahub.utils import render_permission_error, render_error, \
get_fileserver_root, gen_shared_upload_link, is_org_context, \ get_fileserver_root, gen_shared_upload_link, is_org_context, \
gen_dir_share_link, gen_file_share_link, get_repo_last_modify, \ gen_dir_share_link, gen_file_share_link, get_file_type_and_ext, \
calculate_repos_last_modify, get_file_type_and_ext, get_user_repos, \ get_user_repos, EMPTY_SHA1, gen_file_get_url, \
EMPTY_SHA1, normalize_file_path, gen_file_upload_url, \ new_merge_with_no_conflict, get_max_upload_file_size, \
get_file_revision_id_size, get_ccnet_server_addr_port, \ is_pro_version, FILE_AUDIT_ENABLED, \
gen_file_get_url, string2list, MAX_INT, IS_EMAIL_CONFIGURED, \
EVENTS_ENABLED, get_user_events, get_org_user_events, show_delete_days, \
TRAFFIC_STATS_ENABLED, get_user_traffic_stat, new_merge_with_no_conflict, \
user_traffic_over_limit, send_perm_audit_msg, get_origin_repo_info, \
get_max_upload_file_size, is_pro_version, FILE_AUDIT_ENABLED, \
is_org_repo_creation_allowed is_org_repo_creation_allowed
from seahub.utils.paginator import get_page_range
from seahub.utils.star import get_dir_starred_files from seahub.utils.star import get_dir_starred_files
from seahub.utils.timeutils import utc_to_local from seahub.utils.timeutils import utc_to_local
from seahub.views.modules import MOD_PERSONAL_WIKI, enable_mod_for_user, \ from seahub.views.modules import MOD_PERSONAL_WIKI, enable_mod_for_user, \
disable_mod_for_user disable_mod_for_user
import seahub.settings as settings import seahub.settings as settings
from seahub.settings import FILE_PREVIEW_MAX_SIZE, INIT_PASSWD, USE_PDFJS, \ from seahub.settings import AVATAR_FILE_STORAGE, \
FILE_ENCODING_LIST, FILE_ENCODING_TRY_LIST, AVATAR_FILE_STORAGE, \
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD, \
ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM
from constance import config from constance import config
@@ -807,6 +794,12 @@ def libraries(request):
folder_perm_enabled = True if is_pro_version() and ENABLE_FOLDER_PERM else False folder_perm_enabled = True if is_pro_version() and ENABLE_FOLDER_PERM else False
can_add_pub_repo = True if is_org_repo_creation_allowed(request) else False can_add_pub_repo = True if is_org_repo_creation_allowed(request) else False
if request.cloud_mode and request.user.org is not None:
org_id = request.user.org.org_id
joined_groups = seaserv.get_org_groups_by_user(org_id, username)
else:
joined_groups = seaserv.get_personal_groups_by_user(username)
return render_to_response('libraries.html', { return render_to_response('libraries.html', {
"allow_public_share": allow_public_share, "allow_public_share": allow_public_share,
"guide_enabled": guide_enabled, "guide_enabled": guide_enabled,
@@ -823,6 +816,7 @@ def libraries(request):
'is_pro': True if is_pro_version() else False, 'is_pro': True if is_pro_version() else False,
'file_audit_enabled': FILE_AUDIT_ENABLED, 'file_audit_enabled': FILE_AUDIT_ENABLED,
'can_add_pub_repo': can_add_pub_repo, 'can_add_pub_repo': can_add_pub_repo,
'joined_groups': joined_groups,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required

View File

@@ -516,11 +516,6 @@ def _file_view(request, repo_id, path):
else: else:
file_shared_link = '' file_shared_link = ''
for g in request.user.joined_groups:
g.avatar = grp_avatar(g.id, 20)
file_path_hash = hashlib.md5(urllib2.quote(path.encode('utf-8'))).hexdigest()[:12]
# fetch file contributors and latest contributor # fetch file contributors and latest contributor
try: try:
# get real path for sub repo # get real path for sub repo

View File

@@ -46,6 +46,13 @@ logger = logging.getLogger(__name__)
@user_mods_check @user_mods_check
def personal_wiki(request, page_name="home"): def personal_wiki(request, page_name="home"):
username = request.user.username username = request.user.username
if request.cloud_mode and request.user.org is not None:
org_id = request.user.org.org_id
joined_groups = seaserv.get_org_groups_by_user(org_id, username)
else:
joined_groups = seaserv.get_personal_groups_by_user(username)
wiki_exists = True wiki_exists = True
try: try:
content, repo, dirent = get_personal_wiki_page(username, page_name) content, repo, dirent = get_personal_wiki_page(username, page_name)
@@ -56,6 +63,7 @@ def personal_wiki(request, page_name="home"):
return render_to_response("wiki/personal_wiki.html", { return render_to_response("wiki/personal_wiki.html", {
"wiki_exists": wiki_exists, "wiki_exists": wiki_exists,
"owned_repos": owned_repos, "owned_repos": owned_repos,
"grps": joined_groups,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
except WikiPageMissing: except WikiPageMissing:
repo = get_personal_wiki_repo(username) repo = get_personal_wiki_repo(username)
@@ -64,8 +72,6 @@ def personal_wiki(request, page_name="home"):
return render_error(request, _("Failed to create wiki page. Please retry later.")) return render_error(request, _("Failed to create wiki page. Please retry later."))
return HttpResponseRedirect(reverse('personal_wiki', args=[page_name])) return HttpResponseRedirect(reverse('personal_wiki', args=[page_name]))
else: else:
url_prefix = reverse('personal_wiki', args=[])
# fetch file modified time and modifier # fetch file modified time and modifier
path = '/' + dirent.obj_name path = '/' + dirent.obj_name
try: try:
@@ -98,6 +104,7 @@ def personal_wiki(request, page_name="home"):
"search_wiki": True, "search_wiki": True,
"wiki_index_exists": wiki_index_exists, "wiki_index_exists": wiki_index_exists,
"index_content": index_content, "index_content": index_content,
"grps": joined_groups,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required

View File

@@ -1,49 +1,7 @@
import json
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
import requests
from seahub.group.models import PublicGroup
from seahub.share.models import FileShare
from seahub.test_utils import BaseTestCase from seahub.test_utils import BaseTestCase
from tests.common.utils import randstring
class GroupAddTest(BaseTestCase):
def setUp(self):
self.login_as(self.user)
def test_can_add(self):
resp = self.client.post(reverse('group_add'), {
'group_name': 'test_group_%s' % randstring(6)
}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
assert json.loads(resp.content)['success'] is True
def test_can_add_with_blank(self):
resp = self.client.post(reverse('group_add'), {
'group_name': 'test group %s' % randstring(6)
}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
assert json.loads(resp.content)['success'] is True
def test_can_add_with_hyphen(self):
resp = self.client.post(reverse('group_add'), {
'group_name': 'test-group-%s' % randstring(6)
}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
assert json.loads(resp.content)['success'] is True
def test_can_add_with_blank_and_hyphen(self):
resp = self.client.post(reverse('group_add'), {
'group_name': 'test-group %s' % randstring(6)
}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
assert json.loads(resp.content)['success'] is True
def test_can_not_add_with_invalid_name(self):
resp = self.client.post(reverse('group_add'), {
'group_name': 'test*group(name)'
}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(400, resp.status_code)
class GroupDiscussTest(BaseTestCase): class GroupDiscussTest(BaseTestCase):
def setUp(self): def setUp(self):

View File

@@ -1,3 +1,5 @@
import json
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from constance import config from constance import config
@@ -65,3 +67,12 @@ class LibrariesTest(BaseTestCase):
resp = self.client.get(self.url) resp = self.client.get(self.url)
self.assertEqual(200, resp.status_code) self.assertEqual(200, resp.status_code)
assert resp.context['can_add_pub_repo'] is True assert resp.context['can_add_pub_repo'] is True
def test_get_user_joined_groups(self):
self.login_as(self.user)
resp = self.client.get(self.url)
self.assertEqual(200, resp.status_code)
self.assertTemplateUsed(resp, 'libraries.html')
assert len(resp.context['joined_groups']) > 0