1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-20 10:58:33 +00:00

Seperate personal quota and share quota.

This commit is contained in:
zhengxie
2014-12-24 17:35:15 +08:00
parent 55ef7712ba
commit ce397dd419
7 changed files with 112 additions and 149 deletions

View File

@@ -89,9 +89,7 @@ from seaserv import seafserv_rpc, seafserv_threaded_rpc, server_repo_size, \
list_personal_repos_by_owner, check_quota, \
list_share_repos, get_group_repos_by_owner, get_group_repoids, \
list_inner_pub_repos_by_owner, \
remove_share, unshare_group_repo, \
unset_inner_pub_repo, get_user_quota, \
get_user_share_usage, get_user_quota_usage, CALC_SHARE_USAGE, get_group, \
remove_share, unshare_group_repo, unset_inner_pub_repo, get_group, \
get_commit, get_file_id_by_path, MAX_DOWNLOAD_DIR_SIZE, edit_repo, \
ccnet_threaded_rpc, get_personal_groups, seafile_api, check_group_staff
@@ -223,14 +221,8 @@ class Account(APIView):
info['is_staff'] = user.is_staff
info['is_active'] = user.is_active
info['create_time'] = user.ctime
info['total'] = get_user_quota(email)
if CALC_SHARE_USAGE:
my_usage = get_user_quota_usage(email)
share_usage = get_user_share_usage(email)
info['usage'] = my_usage + share_usage
else:
info['usage'] = get_user_quota_usage(email)
info['total'] = seafile_api.get_user_quota(email)
info['usage'] = seafile_api.get_user_quota_usage(email)
return Response(info)
@@ -307,15 +299,9 @@ class AccountInfo(APIView):
info = {}
email = request.user.username
info['email'] = email
info['total'] = get_user_quota(email)
info['nickname'] = email2nickname(email)
if CALC_SHARE_USAGE:
my_usage = get_user_quota_usage(email)
share_usage = get_user_share_usage(email)
info['usage'] = my_usage + share_usage
else:
info['usage'] = get_user_quota_usage(email)
info['total'] = seafile_api.get_user_quota(email)
info['usage'] = seafile_api.get_user_quota_usage(email)
return Response(info)

View File

@@ -172,7 +172,8 @@ def share_to_user(request, repo, to_user, permission):
messages.success(request, msg)
def check_user_share_quota(username, repo, users=[], groups=[]):
"""Check whether user has enough quota when share repo to users/groups.
"""Check whether user has enough share quota when share repo to
users/groups. Only used for cloud service.
"""
if not users and not groups:
return True
@@ -181,8 +182,7 @@ def check_user_share_quota(username, repo, users=[], groups=[]):
return True
check_pass = False
quota = seafile_api.get_user_quota(username)
self_usage = seafile_api.get_user_self_usage(username)
share_quota = seafile_api.get_user_share_quota(username)
current_share_usage = seafile_api.get_user_share_usage(username)
share_usage = 0
@@ -192,10 +192,10 @@ def check_user_share_quota(username, repo, users=[], groups=[]):
if groups:
grp_members = []
for group in groups:
grp_members += [ e.user_name for e in seaserv.get_group_members(group.id)]
grp_members += [e.user_name for e in seaserv.get_group_members(group.id)]
grp_members = set(grp_members)
share_usage += seafile_api.get_repo_size(repo.id) * (len(grp_members) -1)
if share_usage + self_usage + current_share_usage < quota:
share_usage += seafile_api.get_repo_size(repo.id) * (len(grp_members) - 1)
if share_usage + current_share_usage < share_quota:
check_pass = True
return check_pass

View File

@@ -1,20 +1,23 @@
{% load i18n %}
{% if CALC_SHARE_USAGE %}
<div class="item">
<p>{% trans "Used:" %} {{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
{% if quota > 0 %}
<a href="http://www.seafile.com/{% if LANGUAGE_CODE != 'zh-cn' %}en/{% endif %}help/quota/" target="_blank" id="quota-bar"><span id="my-usage" title="{% trans "Self" %}" class="usage" style="width:{{rates.my_usage}};"></span><span id="share-usage" title="{% trans "Sharing" %}" class="usage" style="width:{{rates.share_usage}};"></span></a>
<p>{% trans "Self:" %} {{ space_usage|filesizeformat }} {% if space_quota > 0 %}/ {{ space_quota|filesizeformat }} {% endif %}</p>
{% if not org %}
<p>{% trans "Sharing:" %} {{ share_usage|filesizeformat }} {% if share_quota > 0 %}/ {{ share_quota|filesizeformat }} {% endif %}</p>
{% endif %}
<p id="usage-details">{% trans "Self" %} {{ my_usage|filesizeformat }}, {% trans "Sharing" %} {{ share_usage|filesizeformat }}</p>
</div>
{% else %}
<div class="item">
<p>{% trans "Used:" %} {{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
{% if quota > 0 %}
<div id="quota-bar"><span id="quota-usage" class="usage" style="width:{{rates.quota_usage}};"></span></div>
{% if space_quota > 0 or share_quota > 0 %}
<div id="quota-bar">
{% if show_quota_help %}
<a href="http://www.seafile.com/{% if LANGUAGE_CODE != 'zh-cn' %}en/{% endif %}help/quota/" target="_blank">
{% endif %}
<span id="quota-usage" class="usage" style="width:{{rates.space_usage}};"></span><span id="share-usage" class="usage" style="width:{{rates.share_usage}};"></span>
{% if show_quota_help %}
</a>
{% endif %}
</div>
{% endif %}
</div>
{% endif %}
{% if TRAFFIC_STATS_ENABLED %}
<a class="item" href="http://www.seafile.com/{% if LANGUAGE_CODE != 'zh-cn' %}en/{% endif %}help/traffic/" target="_blank" id="traffic-stat">{% trans "Traffic this month:" %} {{ traffic_stat|filesizeformat }}</a>

View File

@@ -3,10 +3,10 @@
<tr>
<th width="25%">{% trans "Email" %}</th>
<th width="12%">{% trans "Status" %}</th>
<th width="11%">{% trans "Role" %}</th>
<th width="15%">{% trans "Space Used" %}</th>
<th width="9%">{% trans "Role" %}</th>
<th width="18%">{% trans "Space/Share Used" %}</th>
<th width="22%">{% trans "Create At / Last Login" %}</th>
<th width="15%">{% trans "Operations" %}</th>
<th width="14%">{% trans "Operations" %}</th>
</tr>
{% for user in users %}
@@ -53,11 +53,10 @@
{% endif %}
</td>
<td>
{% if CALC_SHARE_USAGE %}
{{ user.self_usage|filesizeformat }} + {{ user.share_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %}
{% else %}
{{ user.self_usage|filesizeformat }} {% if user.quota > 0 %} / {{ user.quota|filesizeformat }} {% endif %}
<td style="font-size:11px;">
<p> {{ user.space_usage|filesizeformat }} {% if user.space_quota > 0 %} / {{ user.space_quota|filesizeformat }} {% endif %} </p>
{% if not user.org %}
<p> {{ user.share_usage|filesizeformat }} {% if user.share_quota > 0 %} / {{ user.share_quota|filesizeformat }} {% endif %} </p>
{% endif %}
</td>
<td>

View File

@@ -40,13 +40,9 @@
</dl>
<h3 class="hd">{% trans "Space Used" %}</h3>
{% if CALC_SHARE_USAGE %}
<p>{% trans "Total" %}: {{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
<p>{% trans "Used" %}: {{ my_usage|filesizeformat }}</p>
<p>{% trans "Sharing" %}: {{ share_usage|filesizeformat }}</p>
{% else %}
<p>{{ quota_usage|filesizeformat }} {% if quota > 0 %}/ {{ quota|filesizeformat }} {% endif %}</p>
{% endif %}
<p>{% trans "Self" %}: {{ space_usage|filesizeformat }} {% if space_quota > 0 %} / {{ space_quota|filesizeformat }} {% endif %}</p>
<p>{% trans "Sharing" %}: {{ share_usage|filesizeformat }} {% if share_quota > 0 %} / {{ share_quota|filesizeformat }} {% endif %}</p>
<a href="#" id="set-quota">{% trans "Set Quota" %}</a>
</div>
<form id="set-quota-form" method="post" class="hide">{% csrf_token %}

View File

@@ -1380,33 +1380,39 @@ def repo_remove(request, repo_id):
@login_required_ajax
def space_and_traffic(request):
content_type = 'application/json; charset=utf-8'
username = request.user.username
# space & quota calculation
org = ccnet_threaded_rpc.get_orgs_by_user(username)
if not org:
quota = seafserv_threaded_rpc.get_user_quota(username)
my_usage = get_user_quota_usage(username)
space_quota = seafile_api.get_user_quota(username)
space_usage = seafile_api.get_user_self_usage(username)
share_quota = seafile_api.get_user_share_quota(username)
share_usage = seafile_api.get_user_share_usage(username)
else:
org_id = org[0].org_id
quota = seafserv_threaded_rpc.get_org_user_quota(org_id,
username)
my_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id,
username)
space_quota = seafserv_threaded_rpc.get_org_user_quota(org_id,
username)
space_usage = seafserv_threaded_rpc.get_org_user_quota_usage(
org_id, username)
share_quota = 0 # no share quota/usage for org account
share_usage = 0
rates = {}
if CALC_SHARE_USAGE:
share_usage = get_user_share_usage(username)
quota_usage = my_usage + share_usage
if quota > 0:
rates['my_usage'] = str(float(my_usage)/quota * 100) + '%'
rates['share_usage'] = str(float(share_usage)/quota * 100) + '%'
else:
quota_usage = my_usage
share_usage = 0
if quota > 0:
rates['quota_usage'] = str(float(my_usage)/quota * 100) + '%'
rates['space_quota'] = space_quota
rates['share_quota'] = share_quota
total_quota = space_quota + share_quota
if space_quota > 0:
rates['space_usage'] = str(float(space_usage) / total_quota * 100) + '%'
else: # no space quota set in config
rates['space_usage'] = '0%'
if share_quota > 0:
rates['share_usage'] = str(float(share_usage) / total_quota * 100) + '%'
else: # no share quota set in config
rates['share_usage'] = '0%'
# traffic calculation
traffic_stat = 0
if TRAFFIC_STATS_ENABLED:
# User's network traffic stat in this month
@@ -1419,6 +1425,7 @@ def space_and_traffic(request):
if stat:
traffic_stat = stat['file_view'] + stat['file_download'] + stat['dir_download']
# payment url, TODO: need to remove from here.
payment_url = ''
ENABLE_PAYMENT = getattr(settings, 'ENABLE_PAYMENT', False)
if ENABLE_PAYMENT:
@@ -1432,13 +1439,14 @@ def space_and_traffic(request):
else:
# payment for personal account
payment_url = reverse('plan')
ctx = {
"CALC_SHARE_USAGE": CALC_SHARE_USAGE,
"quota": quota,
"quota_usage": quota_usage,
"org": org,
"space_quota": space_quota,
"space_usage": space_usage,
"share_quota": share_quota,
"share_usage": share_usage,
"my_usage": my_usage,
"show_quota_help": not CALC_SHARE_USAGE,
"rates": rates,
"TRAFFIC_STATS_ENABLED": TRAFFIC_STATS_ENABLED,
"traffic_stat": traffic_stat,

View File

@@ -149,7 +149,30 @@ def sys_repo_search(request):
'name': repo_name,
'owner': owner,
}, context_instance=RequestContext(request))
def _populate_user_quota_usage(user):
"""Populate space/share quota to user.
Arguments:
- `user`:
"""
orgs = ccnet_threaded_rpc.get_orgs_by_user(user.email)
try:
if orgs:
user.org = orgs[0]
org_id = user.org.org_id
user.space_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id, user.email)
user.space_quota = seafserv_threaded_rpc.get_org_user_quota(org_id, user.email)
user.share_usage = user.share_quota = 0
else:
user.space_usage = seafile_api.get_user_self_usage(user.email)
user.share_usage = seafile_api.get_user_share_usage(user.email)
user.space_quota = seafile_api.get_user_quota(user.email)
user.share_quota = seafile_api.get_user_share_quota(user.email)
except SearpcError as e:
logger.error(e)
user.space_usage = user.space_quota = user.share_usage = user.share_quota = -1
@login_required
@sys_staff_required
def sys_user_admin(request):
@@ -174,22 +197,7 @@ def sys_user_admin(request):
if user.props.id == request.user.id:
user.is_self = True
org = ccnet_threaded_rpc.get_orgs_by_user(user.email)
try:
if not org:
user.self_usage = seafile_api.get_user_self_usage(user.email)
user.share_usage = seafile_api.get_user_share_usage(user.email)
user.quota = seafile_api.get_user_quota(user.email)
else:
user.org = org[0]
org_id = user.org.org_id
user.self_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id, user.email)
user.share_usage = 0 #seafile_api.get_user_share_usage(user.email)
user.quota = seafserv_threaded_rpc.get_org_user_quota(org_id, user.email)
except:
user.self_usage = -1
user.share_usage = -1
user.quota = -1
_populate_user_quota_usage(user)
# check user's role
if user.role == GUEST_USER:
@@ -247,14 +255,8 @@ def sys_user_admin_ldap(request):
for user in users:
if user.props.id == request.user.id:
user.is_self = True
try:
user.self_usage = seafile_api.get_user_self_usage(user.email)
user.share_usage = seafile_api.get_user_share_usage(user.email)
user.quota = seafile_api.get_user_quota(user.email)
except:
user.self_usage = -1
user.share_usage = -1
user.quota = -1
_populate_user_quota_usage(user)
# populate user last login time
user.last_login = None
@@ -294,14 +296,9 @@ def sys_user_admin_admins(request):
for user in admin_users:
if user.props.id == request.user.id:
user.is_self = True
try:
user.self_usage = seafile_api.get_user_self_usage(user.email)
user.share_usage = seafile_api.get_user_share_usage(user.email)
user.quota = seafile_api.get_user_quota(user.email)
except:
user.self_usage = -1
user.share_usage = -1
user.quota = -1
_populate_user_quota_usage(user)
# check user's role
if user.role == GUEST_USER:
user.is_guest = True
@@ -323,7 +320,7 @@ def sys_user_admin_admins(request):
'have_ldap': have_ldap,
'default_user': DEFAULT_USER,
'guest_user': GUEST_USER,
}, context_instance=RequestContext(request))
}, context_instance=RequestContext(request))
@login_required
@sys_staff_required
@@ -333,26 +330,17 @@ def user_info(request, email):
org = ccnet_threaded_rpc.get_orgs_by_user(email)
org_name = None
if not org:
my_usage = seafile_api.get_user_self_usage(email)
quota = seafile_api.get_user_quota(email)
space_usage = seafile_api.get_user_self_usage(email)
space_quota = seafile_api.get_user_quota(email)
share_usage = seafile_api.get_user_share_usage(email)
share_quota = seafile_api.get_user_share_quota(email)
else:
org_id = org[0].org_id
my_usage =seafserv_threaded_rpc. \
get_org_user_quota_usage(org_id, email)
quota = seafserv_threaded_rpc. \
get_org_user_quota(org_id, email)
org_name = org[0].org_name
if CALC_SHARE_USAGE:
try:
share_usage = seafile_api.get_user_share_usage(email)
except SearpcError, e:
logger.error(e)
share_usage = 0
quota_usage = my_usage + share_usage
else:
share_usage = 0
quota_usage = my_usage
space_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id,
email)
space_quota = seafserv_threaded_rpc.get_org_user_quota(org_id, email)
share_usage = share_quota = 0
# Repos that are share to user
in_repos = seafile_api.get_share_in_repo_list(email, -1, -1)
@@ -421,18 +409,17 @@ def user_info(request, email):
return render_to_response(
'sysadmin/userinfo.html', {
'owned_repos': owned_repos,
'quota': quota,
'quota_usage': quota_usage,
'CALC_SHARE_USAGE': CALC_SHARE_USAGE,
'space_quota': space_quota,
'space_usage': space_usage,
'share_quota': share_quota,
'share_usage': share_usage,
'my_usage': my_usage,
'in_repos': in_repos,
'email': email,
'profile': profile,
'd_profile': d_profile,
'org_name': org_name,
"user_shared_links": user_shared_links,
}, context_instance=RequestContext(request))
}, context_instance=RequestContext(request))
@login_required_ajax
@sys_staff_required
@@ -1054,23 +1041,7 @@ def user_search(request):
users = ccnet_threaded_rpc.search_emailusers(email, -1, -1)
last_logins = UserLastLogin.objects.filter(username__in=[x.email for x in users])
for user in users:
org = ccnet_threaded_rpc.get_orgs_by_user(user.email)
try:
if not org:
user.self_usage = seafile_api.get_user_self_usage(user.email)
user.share_usage = seafile_api.get_user_share_usage(user.email)
user.quota = seafile_api.get_user_quota(user.email)
else:
user.org = org[0]
org_id = user.org.org_id
user.self_usage = seafserv_threaded_rpc.get_org_user_quota_usage(org_id, user.email)
user.share_usage = 0
user.quota = seafserv_threaded_rpc.get_org_user_quota(org_id, user.email)
except SearpcError as e:
logger.error(e)
user.self_usage = -1
user.share_usage = -1
user.quota = -1
_populate_user_quota_usage(user)
# check user's role
if user.role == GUEST_USER:
@@ -1091,7 +1062,7 @@ def user_search(request):
'guest_user': GUEST_USER,
'enable_guest': ENABLE_GUEST,
}, context_instance=RequestContext(request))
@login_required
@sys_staff_required
def sys_repo_transfer(request):