mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-26 15:26:19 +00:00
Merge branch 'traffic'
This commit is contained in:
@@ -32,7 +32,9 @@
|
|||||||
<button data="{{save_to_link}}" id="save">{% trans "Save to..."%}</button>
|
<button data="{{save_to_link}}" id="save">{% trans "Save to..."%}</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if not traffic_over_limit %}
|
||||||
<a href="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ file_name|urlencode }}&op=download&t={{ shared_token }}&p={{path|urlencode}}" class="obv-btn">{% trans "Download" %} ({{file_size|filesizeformat}})</a>
|
<a href="{{ SITE_ROOT }}repo/{{ repo.id }}/{{ obj_id }}/?file_name={{ file_name|urlencode }}&op=download&t={{ shared_token }}&p={{path|urlencode}}" class="obv-btn">{% trans "Download" %} ({{file_size|filesizeformat}})</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% include 'snippets/file_content_html.html' %}
|
{% include 'snippets/file_content_html.html' %}
|
||||||
</div>
|
</div>
|
||||||
@@ -60,6 +62,11 @@ $(function() {
|
|||||||
var dld_btn = $('.obv-btn').clone();
|
var dld_btn = $('.obv-btn').clone();
|
||||||
dld_btn.html("{% trans "Download" %}").attr('class', 'big-obv-btn');
|
dld_btn.html("{% trans "Download" %}").attr('class', 'big-obv-btn');
|
||||||
$('#file-view-tip').append(dld_btn);
|
$('#file-view-tip').append(dld_btn);
|
||||||
|
|
||||||
|
{% if traffic_over_limit %}
|
||||||
|
var tip = "{% trans "File download is disabled: the share link traffic of owner is used up." %}";
|
||||||
|
$('#title-panel').html('<p class="alc" style="background:#fddaa4;color:#1f0600;padding:3px 0;margin:0 0 15px;">' + tip + '</p>').removeClass('hide');
|
||||||
|
{% endif %}
|
||||||
});
|
});
|
||||||
var all_repos = [];
|
var all_repos = [];
|
||||||
{% for a_repo in accessible_repos %}
|
{% for a_repo in accessible_repos %}
|
||||||
|
@@ -19,7 +19,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</p>
|
</p>
|
||||||
|
{% if not traffic_over_limit %}
|
||||||
<a href="{% url 'repo_download_dir' repo.id %}?p={{ path|urlencode }}&t={{ token }}" class="obv-btn fright">{% trans "ZIP"%}</a>
|
<a href="{% url 'repo_download_dir' repo.id %}?p={{ path|urlencode }}&t={{ token }}" class="obv-btn fright">{% trans "ZIP"%}</a>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<table class="repo-file-list">
|
<table class="repo-file-list">
|
||||||
<tr>
|
<tr>
|
||||||
@@ -38,7 +40,9 @@
|
|||||||
|
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>
|
<td>
|
||||||
|
{% if not traffic_over_limit %}
|
||||||
<a class="op vh" href="{% url 'repo_download_dir' repo.id %}?p={{ path|urlencode }}{{ dirent.obj_name|urlencode }}&t={{token}}">{% trans 'Download' %}</a>
|
<a class="op vh" href="{% url 'repo_download_dir' repo.id %}?p={{ path|urlencode }}{{ dirent.obj_name|urlencode }}&t={{token}}">{% trans 'Download' %}</a>
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -52,7 +56,9 @@
|
|||||||
|
|
||||||
<td>{{ dirent.file_size|filesizeformat }}</td>
|
<td>{{ dirent.file_size|filesizeformat }}</td>
|
||||||
<td>
|
<td>
|
||||||
|
{% if not traffic_over_limit %}
|
||||||
<a class="op vh" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download&t={{token}}">{% trans "Download"%}</a>
|
<a class="op vh" href="{{ SITE_ROOT }}repo/{{ repo.props.id }}/{{ dirent.props.obj_id }}/?file_name={{ dirent.props.obj_name }}&op=download&t={{token}}">{% trans "Download"%}</a>
|
||||||
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
@@ -60,3 +66,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_script %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function() {
|
||||||
|
{% if traffic_over_limit %}
|
||||||
|
var tip = "{% trans "File download is disabled: the share link traffic of owner is used up." %}";
|
||||||
|
$('#title-panel').html('<p class="alc" style="background:#fddaa4;color:#1f0600;padding:3px 0;margin:0 0 15px;">' + tip + '</p>').removeClass('hide');
|
||||||
|
{% endif %}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
@@ -887,8 +887,31 @@ if EVENTS_CONFIG_FILE and hasattr(seafevents, 'get_user_traffic_stat'):
|
|||||||
finally:
|
finally:
|
||||||
session.close()
|
session.close()
|
||||||
return stat
|
return stat
|
||||||
|
|
||||||
|
def user_traffic_over_limit(username):
|
||||||
|
"""Return ``True`` if user traffic over the limit, otherwise ``False``.
|
||||||
|
"""
|
||||||
|
from seahub_extra.plan.models import UserPlan
|
||||||
|
from seahub_extra.plan.settings import PLAN
|
||||||
|
up = UserPlan.objects.get_valid_plan_by_user(username)
|
||||||
|
plan = 'Free' if up is None else up.plan_type
|
||||||
|
traffic_limit = int(PLAN[plan]['share_link_traffic']) * 1024 * 1024 * 1024
|
||||||
|
|
||||||
|
try:
|
||||||
|
stat = get_user_traffic_stat(username)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
stat = None
|
||||||
|
|
||||||
|
if stat is None:
|
||||||
|
return True
|
||||||
|
|
||||||
|
month_traffic = stat['file_view'] + stat['file_download'] + stat['dir_download']
|
||||||
|
return True if month_traffic >= traffic_limit else False
|
||||||
else:
|
else:
|
||||||
def get_user_traffic_stat(username):
|
def get_user_traffic_stat(username):
|
||||||
pass
|
pass
|
||||||
def get_user_traffic_list():
|
def get_user_traffic_list():
|
||||||
pass
|
pass
|
||||||
|
def user_traffic_over_limit(request):
|
||||||
|
return False
|
||||||
|
@@ -85,7 +85,8 @@ from seahub.utils import render_permission_error, render_error, list_to_string,
|
|||||||
gen_file_get_url, string2list, MAX_INT, IS_EMAIL_CONFIGURED, \
|
gen_file_get_url, string2list, MAX_INT, IS_EMAIL_CONFIGURED, \
|
||||||
gen_file_upload_url, check_and_get_org_by_repo, \
|
gen_file_upload_url, check_and_get_org_by_repo, \
|
||||||
EVENTS_ENABLED, get_user_events, get_org_user_events, show_delete_days, \
|
EVENTS_ENABLED, get_user_events, get_org_user_events, show_delete_days, \
|
||||||
TRAFFIC_STATS_ENABLED, get_user_traffic_stat, new_merge_with_no_conflict
|
TRAFFIC_STATS_ENABLED, get_user_traffic_stat, new_merge_with_no_conflict, \
|
||||||
|
user_traffic_over_limit
|
||||||
from seahub.utils.paginator import get_page_range
|
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.views.modules import MOD_PERSONAL_WIKI, \
|
from seahub.views.modules import MOD_PERSONAL_WIKI, \
|
||||||
@@ -1324,6 +1325,9 @@ def repo_del_file(request, repo_id):
|
|||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
def repo_access_file(request, repo_id, obj_id):
|
def repo_access_file(request, repo_id, obj_id):
|
||||||
|
"""Delete or download file.
|
||||||
|
TODO: need to be rewrite.
|
||||||
|
"""
|
||||||
repo = get_repo(repo_id)
|
repo = get_repo(repo_id)
|
||||||
if not repo:
|
if not repo:
|
||||||
raise Http404
|
raise Http404
|
||||||
@@ -1357,6 +1361,12 @@ def repo_access_file(request, repo_id, obj_id):
|
|||||||
else:
|
else:
|
||||||
from_shared_link = False
|
from_shared_link = False
|
||||||
|
|
||||||
|
if from_shared_link:
|
||||||
|
# check whether owner's traffic over the limit
|
||||||
|
if user_traffic_over_limit(fileshare.username):
|
||||||
|
return render_permission_error(request,
|
||||||
|
_(u'Unable to access file: share link traffic is used up.'))
|
||||||
|
|
||||||
username = request.user.username
|
username = request.user.username
|
||||||
path = request.GET.get('p', '')
|
path = request.GET.get('p', '')
|
||||||
if check_repo_access_permission(repo_id, request.user) or \
|
if check_repo_access_permission(repo_id, request.user) or \
|
||||||
@@ -1751,6 +1761,8 @@ def view_shared_dir(request, token):
|
|||||||
fileshare.view_cnt = F('view_cnt') + 1
|
fileshare.view_cnt = F('view_cnt') + 1
|
||||||
fileshare.save()
|
fileshare.save()
|
||||||
|
|
||||||
|
traffic_over_limit = user_traffic_over_limit(fileshare.username)
|
||||||
|
|
||||||
return render_to_response('view_shared_dir.html', {
|
return render_to_response('view_shared_dir.html', {
|
||||||
'repo': repo,
|
'repo': repo,
|
||||||
'token': token,
|
'token': token,
|
||||||
@@ -1760,6 +1772,7 @@ def view_shared_dir(request, token):
|
|||||||
'file_list': file_list,
|
'file_list': file_list,
|
||||||
'dir_list': dir_list,
|
'dir_list': dir_list,
|
||||||
'zipped': zipped,
|
'zipped': zipped,
|
||||||
|
'traffic_over_limit': traffic_over_limit,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
def view_shared_upload_link(request, token):
|
def view_shared_upload_link(request, token):
|
||||||
@@ -1957,6 +1970,12 @@ def repo_download_dir(request, repo_id):
|
|||||||
allow_download = True if check_repo_access_permission(
|
allow_download = True if check_repo_access_permission(
|
||||||
repo_id, request.user) else False
|
repo_id, request.user) else False
|
||||||
|
|
||||||
|
if from_shared_link:
|
||||||
|
# check whether owner's traffic over the limit
|
||||||
|
if user_traffic_over_limit(fileshare.username):
|
||||||
|
return render_permission_error(request,
|
||||||
|
_(u'Unable to access file: share link traffic is used up.'))
|
||||||
|
|
||||||
if allow_download:
|
if allow_download:
|
||||||
dir_id = seafserv_threaded_rpc.get_dirid_by_path (repo.id,
|
dir_id = seafserv_threaded_rpc.get_dirid_by_path (repo.id,
|
||||||
repo.head_cmmt_id,
|
repo.head_cmmt_id,
|
||||||
|
@@ -48,7 +48,8 @@ from seahub.utils import show_delete_days, render_error, \
|
|||||||
get_file_type_and_ext, gen_file_get_url, gen_file_share_link, \
|
get_file_type_and_ext, gen_file_get_url, gen_file_share_link, \
|
||||||
get_ccnetapplet_root, render_permission_error, \
|
get_ccnetapplet_root, render_permission_error, \
|
||||||
is_textual_file, show_delete_days, mkstemp, EMPTY_SHA1, HtmlDiff, \
|
is_textual_file, show_delete_days, mkstemp, EMPTY_SHA1, HtmlDiff, \
|
||||||
check_filename_with_rename, gen_inner_file_get_url, normalize_file_path
|
check_filename_with_rename, gen_inner_file_get_url, normalize_file_path, \
|
||||||
|
user_traffic_over_limit
|
||||||
from seahub.utils.file_types import (IMAGE, PDF, IMAGE, DOCUMENT, SPREADSHEET, MARKDOWN, \
|
from seahub.utils.file_types import (IMAGE, PDF, IMAGE, DOCUMENT, SPREADSHEET, MARKDOWN, \
|
||||||
TEXT, SF, OPENDOCUMENT)
|
TEXT, SF, OPENDOCUMENT)
|
||||||
from seahub.utils.star import is_file_starred
|
from seahub.utils.star import is_file_starred
|
||||||
@@ -631,7 +632,7 @@ def view_shared_file(request, token):
|
|||||||
'filetype': filetype}
|
'filetype': filetype}
|
||||||
exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size, filetype)
|
exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size, filetype)
|
||||||
if exceeds_limit:
|
if exceeds_limit:
|
||||||
err = err_msg
|
ret_dict['err'] = err_msg
|
||||||
else:
|
else:
|
||||||
"""Choose different approach when dealing with different type of file."""
|
"""Choose different approach when dealing with different type of file."""
|
||||||
|
|
||||||
@@ -661,6 +662,7 @@ def view_shared_file(request, token):
|
|||||||
|
|
||||||
accessible_repos = get_unencry_rw_repos_by_user(request.user.username)
|
accessible_repos = get_unencry_rw_repos_by_user(request.user.username)
|
||||||
save_to_link = reverse('save_shared_link') + '?t=' + token
|
save_to_link = reverse('save_shared_link') + '?t=' + token
|
||||||
|
traffic_over_limit = user_traffic_over_limit(shared_by)
|
||||||
|
|
||||||
return render_to_response('shared_file_view.html', {
|
return render_to_response('shared_file_view.html', {
|
||||||
'repo': repo,
|
'repo': repo,
|
||||||
@@ -683,6 +685,7 @@ def view_shared_file(request, token):
|
|||||||
'use_pdfjs':USE_PDFJS,
|
'use_pdfjs':USE_PDFJS,
|
||||||
'accessible_repos': accessible_repos,
|
'accessible_repos': accessible_repos,
|
||||||
'save_to_link': save_to_link,
|
'save_to_link': save_to_link,
|
||||||
|
'traffic_over_limit': traffic_over_limit,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
def view_file_via_shared_dir(request, token):
|
def view_file_via_shared_dir(request, token):
|
||||||
@@ -769,6 +772,8 @@ def view_file_via_shared_dir(request, token):
|
|||||||
except SearpcError, e:
|
except SearpcError, e:
|
||||||
logger.error('Error when sending file-view message: %s' % str(e))
|
logger.error('Error when sending file-view message: %s' % str(e))
|
||||||
|
|
||||||
|
traffic_over_limit = user_traffic_over_limit(shared_by)
|
||||||
|
|
||||||
return render_to_response('shared_file_view.html', {
|
return render_to_response('shared_file_view.html', {
|
||||||
'repo': repo,
|
'repo': repo,
|
||||||
'obj_id': obj_id,
|
'obj_id': obj_id,
|
||||||
@@ -792,6 +797,7 @@ def view_file_via_shared_dir(request, token):
|
|||||||
'zipped': zipped,
|
'zipped': zipped,
|
||||||
'img_prev': img_prev,
|
'img_prev': img_prev,
|
||||||
'img_next': img_next,
|
'img_next': img_next,
|
||||||
|
'traffic_over_limit': traffic_over_limit,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
def file_edit_submit(request, repo_id):
|
def file_edit_submit(request, repo_id):
|
||||||
|
Reference in New Issue
Block a user