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:
@@ -46,16 +46,6 @@ def base(request):
|
||||
org = request.user.org
|
||||
except AttributeError:
|
||||
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
|
||||
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,
|
||||
'cloud_mode': request.cloud_mode,
|
||||
'org': org,
|
||||
'base_template': base_template,
|
||||
'site_name': SITE_NAME,
|
||||
'enable_signup': config.ENABLE_SIGNUP,
|
||||
'max_file_name': MAX_FILE_NAME,
|
||||
@@ -87,7 +76,6 @@ def base(request):
|
||||
'events_enabled': EVENTS_ENABLED,
|
||||
'traffic_stats_enabled': TRAFFIC_STATS_ENABLED,
|
||||
'sysadmin_extra_enabled': ENABLE_SYSADMIN_EXTRA,
|
||||
'grps': grps,
|
||||
'multi_tenancy': MULTI_TENANCY,
|
||||
'multi_institution': getattr(dj_settings, 'MULTI_INSTITUTION', False),
|
||||
'search_repo_id': search_repo_id,
|
||||
|
@@ -37,14 +37,6 @@ class BaseMiddleware(object):
|
||||
else:
|
||||
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
|
||||
|
||||
def process_response(self, request, response):
|
||||
|
@@ -2,8 +2,7 @@ from django.conf.urls import patterns, url
|
||||
|
||||
from views import group_wiki, group_wiki_create, \
|
||||
group_wiki_page_new, group_wiki_page_edit, group_wiki_pages, \
|
||||
group_wiki_page_delete, group_wiki_use_lib, group_remove, \
|
||||
group_add
|
||||
group_wiki_page_delete, group_wiki_use_lib, group_remove
|
||||
|
||||
urlpatterns = patterns('',
|
||||
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_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'^add/$', group_add, name='group_add'),
|
||||
)
|
||||
|
@@ -3,66 +3,42 @@ import logging
|
||||
import os
|
||||
import json
|
||||
import urllib2
|
||||
import csv
|
||||
import chardet
|
||||
import StringIO
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.paginator import EmptyPage, InvalidPage
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponse, HttpResponseRedirect, Http404, \
|
||||
HttpResponseBadRequest
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.http import urlquote
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import ungettext
|
||||
|
||||
from seahub.auth.decorators import login_required, login_required_ajax
|
||||
import seaserv
|
||||
from seaserv import ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
||||
seafile_api, get_repo, get_group_repos, get_commits, \
|
||||
is_group_user, get_group, get_group_members, create_repo, \
|
||||
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 seaserv import ccnet_threaded_rpc, seafile_api, \
|
||||
get_group_repos, is_group_user, get_group, create_repo, \
|
||||
remove_repo, get_file_id_by_path, post_empty_file, del_file
|
||||
from pysearpc import SearpcError
|
||||
|
||||
from decorators import group_staff_required
|
||||
from models import GroupMessage, MessageReply, MessageAttachment, PublicGroup
|
||||
from forms import MessageForm, MessageReplyForm, GroupRecommendForm, \
|
||||
GroupAddForm, GroupJoinMsgForm, WikiCreateForm, BatchAddMembersForm
|
||||
from signals import group_join_request
|
||||
from models import PublicGroup
|
||||
from forms import MessageForm, GroupAddForm, WikiCreateForm
|
||||
from seahub.auth import REDIRECT_FIELD_NAME
|
||||
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, \
|
||||
ConflictGroupNameError
|
||||
from seahub.notifications.models import UserNotification
|
||||
from seahub.wiki import get_group_wiki_repo, get_group_wiki_page, convert_wiki_link,\
|
||||
from seahub.wiki import get_group_wiki_repo, get_group_wiki_page, \
|
||||
get_wiki_pages
|
||||
from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing, GroupWiki
|
||||
from seahub.wiki.utils import clean_page_name, page_name_to_file_name
|
||||
from seahub.settings import SITE_ROOT, SITE_NAME
|
||||
from seahub.shortcuts import get_first_object_or_none
|
||||
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.utils import render_error, send_html_email, is_org_context
|
||||
from seahub.views import is_registered_user, check_folder_permission
|
||||
from seahub.views.modules import get_enabled_mods_by_group, MOD_GROUP_WIKI, \
|
||||
enable_mod_for_group, disable_mod_for_group, get_available_mods_by_group, \
|
||||
get_wiki_enabled_group_list
|
||||
from seahub.views.modules import get_enabled_mods_by_group, \
|
||||
get_available_mods_by_group
|
||||
|
||||
from seahub.forms import SharedRepoCreateForm
|
||||
|
||||
from constance import config
|
||||
|
||||
# Get an instance of a logger
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -151,68 +127,6 @@ def group_check(func):
|
||||
return _decorated
|
||||
|
||||
########## 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
|
||||
@sys_staff_required
|
||||
@require_POST
|
||||
|
@@ -216,7 +216,7 @@ app["pageOptions"] = {
|
||||
csrfToken: "{{ csrf_token }}",
|
||||
groups: (function () {
|
||||
var groups = [];
|
||||
{% for group in request.user.joined_groups %}
|
||||
{% for group in joined_groups %}
|
||||
groups.push({'name': '{{group.group_name}}', 'id': '{{group.id}}'});
|
||||
{% endfor %}
|
||||
return groups;
|
||||
|
@@ -453,16 +453,6 @@ def string2list(string):
|
||||
s.add(e)
|
||||
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):
|
||||
"""An organization context is a virtual private Seafile instance on cloud
|
||||
service.
|
||||
|
@@ -4,19 +4,16 @@ import os
|
||||
import stat
|
||||
import json
|
||||
import mimetypes
|
||||
import urllib2
|
||||
import logging
|
||||
from math import ceil
|
||||
import posixpath
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponse, HttpResponseBadRequest, Http404, \
|
||||
from django.http import HttpResponse, Http404, \
|
||||
HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response, redirect
|
||||
from django.template import RequestContext
|
||||
from django.utils import timezone
|
||||
from django.utils.http import urlquote
|
||||
from django.utils.html import escape
|
||||
from django.utils.translation import ugettext as _
|
||||
@@ -24,44 +21,34 @@ from django.views.decorators.http import condition
|
||||
|
||||
import seaserv
|
||||
from seaserv import get_repo, get_commits, is_valid_filename, \
|
||||
seafserv_threaded_rpc, seafserv_rpc, is_repo_owner, check_permission, \
|
||||
is_passwd_set, get_file_size, get_group, get_session_info, get_commit, \
|
||||
MAX_DOWNLOAD_DIR_SIZE, send_message, ccnet_threaded_rpc, \
|
||||
get_personal_groups_by_user, seafile_api
|
||||
seafserv_threaded_rpc, seafserv_rpc, is_repo_owner, \
|
||||
get_file_size, MAX_DOWNLOAD_DIR_SIZE, \
|
||||
seafile_api
|
||||
from pysearpc import SearpcError
|
||||
|
||||
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 get_backends
|
||||
from seahub.base.accounts import User
|
||||
from seahub.base.decorators import user_mods_check, require_POST
|
||||
from seahub.base.models import UserStarredFiles, ClientLoginToken
|
||||
from seahub.contacts.models import Contact
|
||||
from seahub.base.models import ClientLoginToken
|
||||
from seahub.options.models import UserOptions, CryptoOptionNotSetError
|
||||
from seahub.profile.models import Profile
|
||||
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, \
|
||||
gen_dir_share_link, gen_file_share_link, get_repo_last_modify, \
|
||||
calculate_repos_last_modify, get_file_type_and_ext, get_user_repos, \
|
||||
EMPTY_SHA1, normalize_file_path, gen_file_upload_url, \
|
||||
get_file_revision_id_size, get_ccnet_server_addr_port, \
|
||||
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, \
|
||||
gen_dir_share_link, gen_file_share_link, get_file_type_and_ext, \
|
||||
get_user_repos, EMPTY_SHA1, gen_file_get_url, \
|
||||
new_merge_with_no_conflict, get_max_upload_file_size, \
|
||||
is_pro_version, FILE_AUDIT_ENABLED, \
|
||||
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.timeutils import utc_to_local
|
||||
from seahub.views.modules import MOD_PERSONAL_WIKI, enable_mod_for_user, \
|
||||
disable_mod_for_user
|
||||
import seahub.settings as settings
|
||||
from seahub.settings import FILE_PREVIEW_MAX_SIZE, INIT_PASSWD, USE_PDFJS, \
|
||||
FILE_ENCODING_LIST, FILE_ENCODING_TRY_LIST, AVATAR_FILE_STORAGE, \
|
||||
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER, SEND_EMAIL_ON_RESETTING_USER_PASSWD, \
|
||||
from seahub.settings import AVATAR_FILE_STORAGE, \
|
||||
ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM
|
||||
|
||||
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
|
||||
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', {
|
||||
"allow_public_share": allow_public_share,
|
||||
"guide_enabled": guide_enabled,
|
||||
@@ -823,6 +816,7 @@ def libraries(request):
|
||||
'is_pro': True if is_pro_version() else False,
|
||||
'file_audit_enabled': FILE_AUDIT_ENABLED,
|
||||
'can_add_pub_repo': can_add_pub_repo,
|
||||
'joined_groups': joined_groups,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
|
@@ -516,11 +516,6 @@ def _file_view(request, repo_id, path):
|
||||
else:
|
||||
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
|
||||
try:
|
||||
# get real path for sub repo
|
||||
|
@@ -46,6 +46,13 @@ logger = logging.getLogger(__name__)
|
||||
@user_mods_check
|
||||
def personal_wiki(request, page_name="home"):
|
||||
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
|
||||
try:
|
||||
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", {
|
||||
"wiki_exists": wiki_exists,
|
||||
"owned_repos": owned_repos,
|
||||
"grps": joined_groups,
|
||||
}, context_instance=RequestContext(request))
|
||||
except WikiPageMissing:
|
||||
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 HttpResponseRedirect(reverse('personal_wiki', args=[page_name]))
|
||||
else:
|
||||
url_prefix = reverse('personal_wiki', args=[])
|
||||
|
||||
# fetch file modified time and modifier
|
||||
path = '/' + dirent.obj_name
|
||||
try:
|
||||
@@ -98,6 +104,7 @@ def personal_wiki(request, page_name="home"):
|
||||
"search_wiki": True,
|
||||
"wiki_index_exists": wiki_index_exists,
|
||||
"index_content": index_content,
|
||||
"grps": joined_groups,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
|
@@ -1,49 +1,7 @@
|
||||
import json
|
||||
|
||||
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 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):
|
||||
def setUp(self):
|
||||
|
@@ -1,3 +1,5 @@
|
||||
import json
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from constance import config
|
||||
@@ -65,3 +67,12 @@ class LibrariesTest(BaseTestCase):
|
||||
resp = self.client.get(self.url)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
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
|
||||
|
Reference in New Issue
Block a user