diff --git a/seahub/templates/shared_file_view.html b/seahub/templates/shared_file_view.html index 178c541fca..4d5f5c71bf 100644 --- a/seahub/templates/shared_file_view.html +++ b/seahub/templates/shared_file_view.html @@ -32,7 +32,9 @@ {% endif %} {% endif %} + {% if not traffic_over_limit %} {% trans "Download" %} ({{file_size|filesizeformat}}) + {% endif %} {% include 'snippets/file_content_html.html' %} @@ -60,6 +62,11 @@ $(function() { var dld_btn = $('.obv-btn').clone(); dld_btn.html("{% trans "Download" %}").attr('class', 'big-obv-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('
' + tip + '
').removeClass('hide'); + {% endif %} }); var all_repos = []; {% for a_repo in accessible_repos %} diff --git a/seahub/templates/view_shared_dir.html b/seahub/templates/view_shared_dir.html index 8c077dc566..992d02d13c 100644 --- a/seahub/templates/view_shared_dir.html +++ b/seahub/templates/view_shared_dir.html @@ -19,7 +19,9 @@ {% endif %} {% endfor %} + {% if not traffic_over_limit %} {% trans "ZIP"%} + {% endif %}+ {% if not traffic_over_limit %} {% trans 'Download' %} + {% endif %} | {{ dirent.file_size|filesizeformat }} | + {% if not traffic_over_limit %} {% trans "Download"%} + {% endif %} | {% endfor %} @@ -60,3 +66,14 @@ {% endblock %} + +{% block extra_script %} + +{% endblock %} diff --git a/seahub/utils/__init__.py b/seahub/utils/__init__.py index 0b4236d59e..9bde55ffee 100644 --- a/seahub/utils/__init__.py +++ b/seahub/utils/__init__.py @@ -887,8 +887,31 @@ if EVENTS_CONFIG_FILE and hasattr(seafevents, 'get_user_traffic_stat'): finally: session.close() 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: def get_user_traffic_stat(username): pass def get_user_traffic_list(): pass + def user_traffic_over_limit(request): + return False diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index b3be14aa10..a5e03e1f4b 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -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_upload_url, check_and_get_org_by_repo, \ 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.star import get_dir_starred_files from seahub.views.modules import MOD_PERSONAL_WIKI, \ @@ -1324,6 +1325,9 @@ def repo_del_file(request, repo_id): return HttpResponseRedirect(url) def repo_access_file(request, repo_id, obj_id): + """Delete or download file. + TODO: need to be rewrite. + """ repo = get_repo(repo_id) if not repo: raise Http404 @@ -1357,6 +1361,12 @@ def repo_access_file(request, repo_id, obj_id): else: 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 path = request.GET.get('p', '') if check_repo_access_permission(repo_id, request.user) or \ @@ -1750,7 +1760,9 @@ def view_shared_dir(request, token): fileshare = FileShare.objects.get(token=token) fileshare.view_cnt = F('view_cnt') + 1 fileshare.save() - + + traffic_over_limit = user_traffic_over_limit(fileshare.username) + return render_to_response('view_shared_dir.html', { 'repo': repo, 'token': token, @@ -1760,6 +1772,7 @@ def view_shared_dir(request, token): 'file_list': file_list, 'dir_list': dir_list, 'zipped': zipped, + 'traffic_over_limit': traffic_over_limit, }, context_instance=RequestContext(request)) 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( 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: dir_id = seafserv_threaded_rpc.get_dirid_by_path (repo.id, repo.head_cmmt_id, diff --git a/seahub/views/file.py b/seahub/views/file.py index afdf9c716d..8a699c9102 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -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_ccnetapplet_root, render_permission_error, \ 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, \ TEXT, SF, OPENDOCUMENT) from seahub.utils.star import is_file_starred @@ -631,7 +632,7 @@ def view_shared_file(request, token): 'filetype': filetype} exceeds_limit, err_msg = file_size_exceeds_preview_limit(file_size, filetype) if exceeds_limit: - err = err_msg + ret_dict['err'] = err_msg else: """Choose different approach when dealing with different type of file.""" @@ -661,7 +662,8 @@ def view_shared_file(request, token): accessible_repos = get_unencry_rw_repos_by_user(request.user.username) 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', { 'repo': repo, 'obj_id': obj_id, @@ -683,6 +685,7 @@ def view_shared_file(request, token): 'use_pdfjs':USE_PDFJS, 'accessible_repos': accessible_repos, 'save_to_link': save_to_link, + 'traffic_over_limit': traffic_over_limit, }, context_instance=RequestContext(request)) def view_file_via_shared_dir(request, token): @@ -768,7 +771,9 @@ def view_file_via_shared_dir(request, token): (repo.id, shared_by, obj_id, file_size)) except SearpcError, 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', { 'repo': repo, 'obj_id': obj_id, @@ -792,6 +797,7 @@ def view_file_via_shared_dir(request, token): 'zipped': zipped, 'img_prev': img_prev, 'img_next': img_next, + 'traffic_over_limit': traffic_over_limit, }, context_instance=RequestContext(request)) def file_edit_submit(request, repo_id):