mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-21 11:27:18 +00:00
update admin default repo view page & rm unused code
This commit is contained in:
@@ -146,9 +146,6 @@ class RepoPassowrdForm(forms.Form):
|
||||
except SearpcError, e:
|
||||
if e.msg == 'Bad arguments':
|
||||
raise forms.ValidationError(_(u'Bad url format'))
|
||||
# elif e.msg == 'Repo is not encrypted':
|
||||
# return HttpResponseRedirect(reverse('repo',
|
||||
# args=[self.repo_id]))
|
||||
elif e.msg == 'Incorrect password':
|
||||
raise forms.ValidationError(_(u'Wrong password'))
|
||||
elif e.msg == 'Internal server error':
|
||||
|
@@ -124,7 +124,7 @@ class Command(BaseCommand):
|
||||
if repo is None:
|
||||
notice.delete()
|
||||
|
||||
notice.repo_url = reverse('repo', args=[repo.id])
|
||||
notice.repo_url = reverse("view_common_lib_dir", args=[repo_id, '/'])
|
||||
notice.notice_from = escape(email2nickname(d['share_from']))
|
||||
notice.repo_name = repo.name
|
||||
notice.avatar_src = self.get_avatar_src(d['share_from'])
|
||||
@@ -138,7 +138,7 @@ class Command(BaseCommand):
|
||||
uploaded_to = d['uploaded_to'].rstrip('/')
|
||||
file_path = uploaded_to + '/' + file_name
|
||||
file_link = reverse('view_lib_file', args=[repo_id, urlquote(file_path)])
|
||||
folder_link = reverse('repo', args=[repo_id]) + '?p=' + urlquote(uploaded_to)
|
||||
folder_link = reverse('view_common_lib_dir', args=[repo_id, urlquote(uploaded_to).strip('/')])
|
||||
folder_name = os.path.basename(uploaded_to)
|
||||
|
||||
notice.file_link = file_link
|
||||
|
@@ -717,88 +717,6 @@ def share_permission_admin(request):
|
||||
return HttpResponse(json.dumps({'success': False}), status=400,
|
||||
content_type=content_type)
|
||||
|
||||
# 2 views for anonymous share:
|
||||
# - anonymous_share records share infomation to db and sends the mail
|
||||
# - anonymous_share_confirm checks the link use clicked and
|
||||
# adds token to client COOKIE, then redirect client to repo page
|
||||
|
||||
# def anonymous_share(request, email_template_name='repo/anonymous_share_email.html', **kwargs):
|
||||
# repo_id = kwargs['repo_id']
|
||||
# repo_owner = kwargs['repo_owner']
|
||||
# anon_email = kwargs['anon_email']
|
||||
# is_encrypted = kwargs['is_encrypted']
|
||||
|
||||
# # Encrypt repo can not be shared to unregistered user.
|
||||
# if is_encrypted:
|
||||
# msg = _(u'Failed to share to %s, as encrypted libraries cannot be shared to emails outside the site.') % anon_email
|
||||
# messages.error(request, msg)
|
||||
# return
|
||||
|
||||
# token = anon_share_token_generator.make_token()
|
||||
|
||||
# anon_share = AnonymousShare()
|
||||
# anon_share.repo_owner = repo_owner
|
||||
# anon_share.repo_id = repo_id
|
||||
# anon_share.anonymous_email = anon_email
|
||||
# anon_share.token = token
|
||||
|
||||
# try:
|
||||
# anon_share.save()
|
||||
# except:
|
||||
# msg = _(u'Failed to share to %s.') % anon_email
|
||||
# messages.add_message(request, messages.ERROR, msg)
|
||||
# else:
|
||||
# # send mail
|
||||
# use_https = request.is_secure()
|
||||
# site_name = domain = RequestSite(request).domain
|
||||
|
||||
# t = loader.get_template(email_template_name)
|
||||
# c = {
|
||||
# 'email': repo_owner,
|
||||
# 'anon_email': anon_email,
|
||||
# 'domain': domain,
|
||||
# 'site_name': site_name,
|
||||
# 'token': token,
|
||||
# 'protocol': use_https and 'https' or 'http',
|
||||
# }
|
||||
|
||||
# try:
|
||||
# send_mail(_(u'You are shared with a library in Seafile'), t.render(Context(c)), None,
|
||||
# [anon_email], fail_silently=False)
|
||||
# except:
|
||||
# AnonymousShare.objects.filter(token=token).delete()
|
||||
# msg = _(u'Failed to share to %s.') % anon_email
|
||||
# messages.add_message(request, messages.ERROR, msg)
|
||||
# else:
|
||||
# msg = _(u'Shared to %(email)s successfully, go check it at <a href="%(share)s">Share</a>.') % \
|
||||
# {'email':anon_email, 'share':reverse('share_admin')}
|
||||
# messages.add_message(request, messages.INFO, msg)
|
||||
|
||||
# def anonymous_share_confirm(request, token=None):
|
||||
# assert token is not None # checked by URLconf
|
||||
|
||||
# # Check whether token in db
|
||||
# try:
|
||||
# anon_share = AnonymousShare.objects.get(token=token)
|
||||
# except AnonymousShare.DoesNotExist:
|
||||
# raise Http404
|
||||
# else:
|
||||
# res = HttpResponseRedirect(reverse('repo', args=[anon_share.repo_id]))
|
||||
# res.set_cookie("anontoken", token,
|
||||
# max_age=ANONYMOUS_SHARE_COOKIE_TIMEOUT)
|
||||
# return res
|
||||
|
||||
# def remove_anonymous_share(request, token):
|
||||
# AnonymousShare.objects.filter(token=token).delete()
|
||||
|
||||
# next = request.META.get('HTTP_REFERER', None)
|
||||
# if not next:
|
||||
# next = reverse('share_admin')
|
||||
|
||||
# messages.add_message(request, messages.INFO, _(u'Deleted successfully.'))
|
||||
|
||||
# return HttpResponseRedirect(next)
|
||||
|
||||
########## share link
|
||||
@login_required_ajax
|
||||
@require_POST
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -25,8 +25,16 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</p>
|
||||
<div id="repo-latest-commit" class="clear">
|
||||
{% if is_default_repo %}
|
||||
<div class="repo-op fright">
|
||||
<div id="upload-file" class="op-btn upload-file-btn">
|
||||
<span class="icon-upload-alt"></span><span>{% trans "Upload"%}</span>
|
||||
<input type="file" name="file" multiple />
|
||||
</div>
|
||||
<button id="add-new-dir" class="op-btn"><span class="icon-plus-sign-alt"></span>{% trans "New Directory"%}</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div id="repo-latest-commit" class="clear"></div>
|
||||
</div>
|
||||
|
||||
<table class="repo-file-list">
|
||||
@@ -49,6 +57,15 @@
|
||||
{{ dirent.last_modified|translate_seahub_time }}
|
||||
</td>
|
||||
<td class="dirent-op">
|
||||
{% if is_default_repo %}
|
||||
<div class="repo-file-op vh">
|
||||
<div class="displayed-op">
|
||||
<a href="#" class="op dirent-del" data-url="{% url 'delete_dir' repo.id %}?parent_dir={{path|urlencode}}&name={{ dirent.obj_name|urlencode }}" title="{% trans "Delete" %}">
|
||||
<img src="{{MEDIA_URL}}img/rm.png" alt="" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
@@ -67,6 +84,11 @@
|
||||
<td class="dirent-op">
|
||||
<div class="repo-file-op vh">
|
||||
<div class="displayed-op">
|
||||
{% if is_default_repo %}
|
||||
<a href="#" class="op dirent-del" data-url="{% url 'delete_file' repo.id %}?parent_dir={{path|urlencode}}&name={{ dirent.obj_name|urlencode }}" title="{% trans "Delete" %}">
|
||||
<img src="{{MEDIA_URL}}img/rm.png" alt="" />
|
||||
</a>
|
||||
{% endif %}
|
||||
<a class="op file-download" href="{% url 'sys_admin_repo_download_file' repo.id %}?p={{path|urlencode}}{{ dirent.obj_name|urlencode }}" title="{% trans "Download"%}">
|
||||
<img src="{{MEDIA_URL}}img/download.png" alt="" />
|
||||
</a>
|
||||
@@ -78,9 +100,41 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% if is_default_repo %}
|
||||
<form id="add-new-dir-form" action="" method="post" class="hide">{% csrf_token %}
|
||||
<h3>{% trans "New Directory" %}</h3>
|
||||
<label>{% trans "Directory Name" %}</label><br /><!-- <br/> for ie 7 -->
|
||||
<input type="text" name="name" value="" class="input" maxlength="{{max_file_name}}"/><br />
|
||||
<p class="error hide"></p>
|
||||
<input type="submit" value="{% trans "Submit" %}" class="submit" />
|
||||
<button class="simplemodal-close">{% trans "Cancel" %}</button>
|
||||
</form>
|
||||
|
||||
<div id="upload-file-dialog" class="hide">
|
||||
<h3 class="hd"><span class="status">{% trans "File Upload" %}</span> <span class="total-progress hide"></span></h3>
|
||||
<div class="ops">
|
||||
<img src="{{MEDIA_URL}}img/minus.png" alt="" class="fold-switch cspt" />
|
||||
<img src="{{MEDIA_URL}}img/close.png" alt="close" title="{% trans "close" %}" class="close cspt hide" />
|
||||
</div>
|
||||
<div class="con">
|
||||
<div class="row fileupload-buttonbar">
|
||||
<button type="button" class="cancel cspt fright">{% trans "Cancel All" %}</button>
|
||||
</div>
|
||||
<p class="saving-tip alc clear hide">
|
||||
<span class="loading-icon vam"></span>
|
||||
<span class="vam">{% trans "Saving..." %}</span>
|
||||
</p>
|
||||
<table class="table table-striped"><tbody class="files" data-toggle="modal-gallery" data-target="#modal-gallery"></tbody></table>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_script %}
|
||||
{% if is_default_repo %}
|
||||
{% upload_js %}
|
||||
{% endif %}
|
||||
<script type="text/javascript">
|
||||
$('.dir-item, .file-item').unbind().hover( // remove previously binded hover handler at first
|
||||
function() {
|
||||
@@ -90,5 +144,217 @@ $('.dir-item, .file-item').unbind().hover( // remove previously binded hover han
|
||||
$(this).removeClass('hl').find('.repo-file-op').addClass('vh');
|
||||
}
|
||||
);
|
||||
|
||||
{% if is_default_repo %}
|
||||
var cur_path = "{{path|escapejs}}";
|
||||
$(function() {
|
||||
$.getScript('{{ MEDIA_URL }}js/jquery.fileupload.min.js', function () {
|
||||
var popup = $('#upload-file-dialog').addClass('fixed-upload-file-dialog');;
|
||||
var popup_height = '200px';
|
||||
popup.css({'height': popup_height}).data('height', popup_height);
|
||||
|
||||
var fu_status = $('.status', popup),
|
||||
total_progress = $('.total-progress', popup),
|
||||
cancel_all_btn = $('.fileupload-buttonbar .cancel', popup),
|
||||
close_icon = $('.close', popup),
|
||||
saving_tip = $('.saving-tip', popup);
|
||||
|
||||
var fu_status_ = {
|
||||
'uploading': "{% trans "File Uploading..." %}",
|
||||
'complete': "{% trans "File Upload complete" %}",
|
||||
'canceled': "{% trans "File Upload canceled" %}",
|
||||
'failed': "{% trans "File Upload failed" %}"
|
||||
};
|
||||
|
||||
popup.fileupload({
|
||||
formData: {'parent_dir': cur_path},
|
||||
fileInput: $('#upload-file input'),
|
||||
paramName: 'file',
|
||||
// customize it for 'done'
|
||||
getFilesFromResponse: function (data) {
|
||||
if (data.result) {
|
||||
return data.result;
|
||||
}
|
||||
},
|
||||
autoUpload:true,
|
||||
{% if max_upload_file_size %}
|
||||
maxFileSize: {{ max_upload_file_size }}, // in bytes
|
||||
{% endif %}
|
||||
maxNumberOfFiles: 500,
|
||||
sequentialUploads: true
|
||||
})
|
||||
.bind('fileuploadadd', function(e, data) {
|
||||
popup.removeClass('hide');
|
||||
cancel_all_btn.removeClass('hide');
|
||||
close_icon.addClass('hide');
|
||||
})
|
||||
.bind('fileuploadstart', function() {
|
||||
fu_status.html(fu_status_.uploading);
|
||||
})
|
||||
.bind('fileuploadsubmit', function(e, data) {
|
||||
if (data.files.length == 0) {
|
||||
return false;
|
||||
}
|
||||
var file = data.files[0];
|
||||
// get url(token) for every file
|
||||
if (!file.error) {
|
||||
$.ajax({
|
||||
url: '{% url 'get_file_op_url' repo.id %}',
|
||||
cache: false,
|
||||
data: {
|
||||
'op_type': 'upload',
|
||||
'path': cur_path
|
||||
},
|
||||
dataType: 'json',
|
||||
success: function(ret) {
|
||||
data.url = ret['url'];
|
||||
data.jqXHR = popup.fileupload('send', data);
|
||||
},
|
||||
error: function() {
|
||||
file.error = "{% trans "Failed to get upload url" %}";
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}
|
||||
})
|
||||
.bind('fileuploadprogressall', function (e, data) {
|
||||
total_progress.html(parseInt(data.loaded / data.total * 100, 10) + '% ' + '<span style="font-size:14px;color:#555;">(' + $(this).data('blueimp-fileupload')._formatBitrate(data.bitrate) + ')</span>').removeClass('hide');
|
||||
if (data.loaded > 0 && data.loaded == data.total) {
|
||||
saving_tip.show();
|
||||
}
|
||||
})
|
||||
.bind('fileuploadstop', function() {
|
||||
location.reload(true);
|
||||
})
|
||||
// after tpl has rendered
|
||||
.bind('fileuploadcompleted', function() { // 'done'
|
||||
if ($('.files .cancel', popup).length == 0) {
|
||||
location.reload(true);
|
||||
}
|
||||
})
|
||||
.bind('fileuploadfailed', function(e, data) { // 'fail'
|
||||
if ($('.files .cancel', popup).length == 0) {
|
||||
cancel_all_btn.addClass('hide');
|
||||
close_icon.removeClass('hide');
|
||||
total_progress.addClass('hide');
|
||||
saving_tip.hide();
|
||||
if (data.errorThrown == 'abort') { // 'cancel'
|
||||
fu_status.html(fu_status_.canceled);
|
||||
} else { // 'error'
|
||||
fu_status.html(fu_status_.failed);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Enable iframe cross-domain access via redirect option:
|
||||
popup.fileupload(
|
||||
'option',
|
||||
'redirect',
|
||||
window.location.href.replace(/\/repo\/[-a-z0-9]{36}\/.*/, '{{ MEDIA_URL }}cors/result.html?%s')
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
// fold/unfold the dialog
|
||||
$('#upload-file-dialog .fold-switch').click(function() {
|
||||
var popup = $('#upload-file-dialog');
|
||||
var full_ht = parseInt(popup.data('height'));
|
||||
var main_con = $('.fileupload-buttonbar, .table', popup);
|
||||
if (popup.height() == full_ht) {
|
||||
popup.height($('.hd', popup).outerHeight(true));
|
||||
main_con.addClass('hide');
|
||||
} else {
|
||||
popup.height(full_ht);
|
||||
main_con.removeClass('hide');
|
||||
}
|
||||
});
|
||||
|
||||
$('#upload-file-dialog .close').click(function() {
|
||||
$('#upload-file-dialog').addClass('hide');
|
||||
$('#upload-file-dialog .files').empty();
|
||||
});
|
||||
|
||||
window.locale = {
|
||||
"fileupload": {
|
||||
"errors": {
|
||||
"maxFileSize": "{% trans "File is too big" %}",
|
||||
"minFileSize": "{% trans "File is too small" %}",
|
||||
"acceptFileTypes": "{% trans "Filetype not allowed" %}",
|
||||
"maxNumberOfFiles": "{% trans "Max number of files exceeded" %}",
|
||||
"uploadedBytes": "{% trans "Uploaded bytes exceed file size" %}",
|
||||
"emptyResult": "{% trans "Empty file upload result" %}"
|
||||
},
|
||||
"error": "{% trans "Error" %}",
|
||||
"uploaded": "{% trans "uploaded" %}",
|
||||
"canceled": "{% trans "canceled" %}",
|
||||
"start": "{% trans "Start" %}",
|
||||
"cancel": "{% trans "Cancel" %}",
|
||||
"destroy": "{% trans "Delete" %}"
|
||||
}
|
||||
};
|
||||
|
||||
$('#add-new-dir').click(function () {
|
||||
$('#add-new-dir-form').modal({appendTo:'#main'});
|
||||
$('#simplemodal-container').css({'height':'auto'});
|
||||
});
|
||||
|
||||
$('#add-new-dir-form').submit(function() {
|
||||
var form = $(this),
|
||||
form_id = form.attr('id'),
|
||||
dirent_name = $.trim(form.find('input[name="name"]').val()),
|
||||
submit_btn = form.children('input[type="submit"]'),
|
||||
post_data = {'dirent_name': dirent_name},
|
||||
path = '{{path}}';
|
||||
|
||||
if (!dirent_name) {
|
||||
apply_form_error(form_id, "{% trans "It is required." %}");
|
||||
return false;
|
||||
}
|
||||
|
||||
disable(submit_btn);
|
||||
|
||||
$.ajax({
|
||||
url: '{% url 'new_dir' repo.id %}?parent_dir=' + e(path),
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
beforeSend: prepareCSRFToken,
|
||||
data: post_data,
|
||||
success: function(data) {
|
||||
location.reload(true);
|
||||
},
|
||||
error: function(xhr, textStatus, errorThrown) {
|
||||
var err;
|
||||
if (xhr.responseText) {
|
||||
err = $.parseJSON(xhr.responseText).error;
|
||||
} else {
|
||||
err = "{% trans "Failed. Please check the network." %}";
|
||||
}
|
||||
apply_form_error(form_id, err);
|
||||
enable(submit_btn);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.dirent-del').click(function() {
|
||||
var dirent = $(this).parents('tr'),
|
||||
url = $(this).attr('data-url');
|
||||
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
beforeSend: prepareCSRFToken,
|
||||
success: function(data) {
|
||||
if (data['success']) {
|
||||
dirent.remove();
|
||||
feedback("{% trans "Delete succeeded." %}", 'success');
|
||||
}
|
||||
},
|
||||
error: ajaxErrorHandler
|
||||
});
|
||||
return false;
|
||||
});
|
||||
{% endif %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -15,9 +15,7 @@
|
||||
<td>{{ repo.props.name }}</td>
|
||||
{% else %}
|
||||
<td><img src="{{MEDIA_URL}}img/sync-folder-20.png?t=1387267140" title="{% trans "Read-Write"%}" alt="{% trans "directory icon" %}" /></td>
|
||||
{% if repo.is_default_repo %}
|
||||
<td><a href="{% url 'repo' repo.id %}">{{ repo.props.name }}</a></td>
|
||||
{% elif enable_sys_admin_view_repo and is_pro_version %}
|
||||
{% if enable_sys_admin_view_repo and is_pro_version %}
|
||||
<td><a href="{% url 'sys_admin_repo' repo.id %}">{{ repo.props.name }}</a></td>
|
||||
{% else %}
|
||||
<td>{{ repo.props.name }}</td>
|
||||
|
@@ -26,7 +26,7 @@
|
||||
</tr>
|
||||
{% for repo in repos %}
|
||||
<tr>
|
||||
<td><a href="{% url 'repo' repo.id %}">{{ repo.props.name }}</a></td>
|
||||
<td><a href="{% url 'sys_admin_repo' repo.id %}">{{ repo.props.name }}</a></td>
|
||||
<td style="font-size:11px;">{{ repo.id }}</td>
|
||||
<td>{{ repo.props.desc }}</td>
|
||||
</tr>
|
||||
|
@@ -8,7 +8,7 @@ from seahub.views.file import view_repo_file, view_history_file, view_trash_file
|
||||
view_snapshot_file, file_edit, view_shared_file, view_file_via_shared_dir,\
|
||||
text_diff, view_priv_shared_file, view_raw_file, view_raw_shared_file, \
|
||||
download_file, view_lib_file, file_access
|
||||
from seahub.views.repo import repo, repo_history_view, view_shared_dir, \
|
||||
from seahub.views.repo import repo_history_view, view_shared_dir, \
|
||||
view_shared_upload_link
|
||||
from notifications.views import notification_list
|
||||
from message.views import user_msg_list, user_msg_remove, user_received_msg_remove
|
||||
@@ -72,7 +72,6 @@ urlpatterns = patterns(
|
||||
url(r'^repo/file_revisions/(?P<repo_id>[-0-9a-f]{36})/$', file_revisions, name='file_revisions'),
|
||||
url(r'^repo/file-access/(?P<repo_id>[-0-9a-f]{36})/$', file_access, name='file_access'),
|
||||
url(r'^repo/text_diff/(?P<repo_id>[-0-9a-f]{36})/$', text_diff, name='text_diff'),
|
||||
url(r'^repo/(?P<repo_id>[-0-9a-f]{36})/$', repo, name='repo'),
|
||||
url(r'^repo/history/(?P<repo_id>[-0-9a-f]{36})/$', repo_history, name='repo_history'),
|
||||
url(r'^repo/history/view/(?P<repo_id>[-0-9a-f]{36})/$', repo_history_view, name='repo_history_view'),
|
||||
url(r'^repo/recycle/(?P<repo_id>[-0-9a-f]{36})/$', repo_recycle_view, name='repo_recycle_view'),
|
||||
@@ -127,14 +126,11 @@ urlpatterns = patterns(
|
||||
url(r'^choose_register/$', TemplateView.as_view(template_name="choose_register.html"), name="choose_register"),
|
||||
|
||||
### Ajax ###
|
||||
url(r'^ajax/repo/create/$', repo_create, name="repo_create"),
|
||||
(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/remove/$', repo_remove),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/delete/$', delete_dirents, name='delete_dirents'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/move/$', mv_dirents, name='mv_dirents'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dirents/copy/$', cp_dirents, name='cp_dirents'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dir/$', list_dir, name='repo_dir_data'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dir/more/$', list_dir_more, name='list_dir_more'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dir/new/$', new_dir, name='new_dir'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dir/rename/$', rename_dirent, name='rename_dir'),
|
||||
url(r'^ajax/repo/(?P<repo_id>[-0-9a-f]{36})/dir/delete/$', delete_dirent, name='delete_dir'),
|
||||
|
@@ -226,93 +226,6 @@ def get_file_download_link(repo_id, obj_id, path):
|
||||
return reverse('download_file', args=[repo_id, obj_id]) + '?p=' + \
|
||||
urlquote(path)
|
||||
|
||||
def get_repo_dirents_with_perm(request, repo, commit, path, offset=-1, limit=-1):
|
||||
"""List repo dirents with perm based on commit id and path.
|
||||
Use ``offset`` and ``limit`` to do paginating.
|
||||
|
||||
Returns: A tupple of (file_list, dir_list, dirent_more)
|
||||
|
||||
TODO: Some unrelated parts(file sharing, stars, modified info, etc) need
|
||||
to be pulled out to multiple functions.
|
||||
"""
|
||||
|
||||
if get_system_default_repo_id() == repo.id:
|
||||
return get_repo_dirents(request, repo, commit, path, offset, limit)
|
||||
|
||||
dir_list = []
|
||||
file_list = []
|
||||
dirent_more = False
|
||||
username = request.user.username
|
||||
if commit.root_id == EMPTY_SHA1:
|
||||
return ([], [], False) if limit == -1 else ([], [], False)
|
||||
else:
|
||||
try:
|
||||
dir_id = seafile_api.get_dir_id_by_path(repo.id, path)
|
||||
if not dir_id:
|
||||
return ([], [], False)
|
||||
dirs = seafserv_threaded_rpc.list_dir_with_perm(repo.id, path,
|
||||
dir_id, username,
|
||||
offset, limit)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
return ([], [], False)
|
||||
|
||||
if limit != -1 and limit == len(dirs):
|
||||
dirent_more = True
|
||||
|
||||
starred_files = get_dir_starred_files(username, repo.id, path)
|
||||
fileshares = FileShare.objects.filter(repo_id=repo.id).filter(username=username)
|
||||
uploadlinks = UploadLinkShare.objects.filter(repo_id=repo.id).filter(username=username)
|
||||
|
||||
view_dir_base = reverse('repo', args=[repo.id])
|
||||
dl_dir_base = reverse('repo_download_dir', args=[repo.id])
|
||||
view_file_base = reverse('repo_view_file', args=[repo.id])
|
||||
file_history_base = reverse('file_revisions', args=[repo.id])
|
||||
for dirent in dirs:
|
||||
dirent.last_modified = dirent.mtime
|
||||
dirent.sharelink = ''
|
||||
dirent.uploadlink = ''
|
||||
if stat.S_ISDIR(dirent.props.mode):
|
||||
dpath = posixpath.join(path, dirent.obj_name)
|
||||
if dpath[-1] != '/':
|
||||
dpath += '/'
|
||||
for share in fileshares:
|
||||
if dpath == share.path:
|
||||
dirent.sharelink = gen_dir_share_link(share.token)
|
||||
dirent.sharetoken = share.token
|
||||
break
|
||||
for link in uploadlinks:
|
||||
if dpath == link.path:
|
||||
dirent.uploadlink = gen_shared_upload_link(link.token)
|
||||
dirent.uploadtoken = link.token
|
||||
break
|
||||
p_dpath = posixpath.join(path, dirent.obj_name)
|
||||
dirent.view_link = view_dir_base + '?p=' + urlquote(p_dpath)
|
||||
dirent.dl_link = dl_dir_base + '?p=' + urlquote(p_dpath)
|
||||
dir_list.append(dirent)
|
||||
else:
|
||||
file_list.append(dirent)
|
||||
if repo.version == 0:
|
||||
dirent.file_size = get_file_size(repo.store_id, repo.version, dirent.obj_id)
|
||||
else:
|
||||
dirent.file_size = dirent.size
|
||||
dirent.starred = False
|
||||
fpath = posixpath.join(path, dirent.obj_name)
|
||||
p_fpath = posixpath.join(path, dirent.obj_name)
|
||||
dirent.view_link = view_file_base + '?p=' + urlquote(p_fpath)
|
||||
dirent.dl_link = get_file_download_link(repo.id, dirent.obj_id,
|
||||
p_fpath)
|
||||
dirent.history_link = file_history_base + '?p=' + urlquote(p_fpath)
|
||||
if fpath in starred_files:
|
||||
dirent.starred = True
|
||||
for share in fileshares:
|
||||
if fpath == share.path:
|
||||
dirent.sharelink = gen_file_share_link(share.token)
|
||||
dirent.sharetoken = share.token
|
||||
break
|
||||
|
||||
return (file_list, dir_list, dirent_more)
|
||||
|
||||
def get_repo_dirents(request, repo, commit, path, offset=-1, limit=-1):
|
||||
"""List repo dirents based on commit id and path. Use ``offset`` and
|
||||
``limit`` to do paginating.
|
||||
@@ -347,7 +260,8 @@ def get_repo_dirents(request, repo, commit, path, offset=-1, limit=-1):
|
||||
fileshares = FileShare.objects.filter(repo_id=repo.id).filter(username=username)
|
||||
uploadlinks = UploadLinkShare.objects.filter(repo_id=repo.id).filter(username=username)
|
||||
|
||||
view_dir_base = reverse('repo', args=[repo.id])
|
||||
|
||||
view_dir_base = reverse("view_common_lib_dir", args=[repo.id, '/'])
|
||||
dl_dir_base = reverse('repo_download_dir', args=[repo.id])
|
||||
file_history_base = reverse('file_revisions', args=[repo.id])
|
||||
for dirent in dirs:
|
||||
@@ -922,7 +836,7 @@ def repo_folder_perm(request, repo_id):
|
||||
|
||||
for folder_perm in user_folder_perms:
|
||||
folder_path = folder_perm.path
|
||||
folder_perm.folder_link = reverse('repo', args=[repo_id]) + '?p=' + urlquote(folder_path)
|
||||
folder_perm.folder_link = reverse("view_common_lib_dir", args=[repo_id, urlquote(folder_path).strip('/')])
|
||||
if folder_path == '/':
|
||||
folder_perm.folder_name = _(u'Root Directory')
|
||||
else:
|
||||
@@ -936,7 +850,7 @@ def repo_folder_perm(request, repo_id):
|
||||
|
||||
for folder_perm in group_folder_perms:
|
||||
folder_path = folder_perm.path
|
||||
folder_perm.folder_link = reverse('repo', args=[repo_id]) + '?p=' + urlquote(folder_path)
|
||||
folder_perm.folder_link = reverse("view_common_lib_dir", args=[repo_id, urlquote(folder_path).strip('/')])
|
||||
if folder_path == '/':
|
||||
folder_perm.folder_name = _(u'Root Directory')
|
||||
else:
|
||||
@@ -1054,7 +968,7 @@ def repo_history(request, repo_id):
|
||||
return render_error(request, e.msg)
|
||||
|
||||
if not password_set:
|
||||
return HttpResponseRedirect(reverse('repo', args=[repo_id]))
|
||||
return HttpResponseRedirect(reverse("view_common_lib_dir", args=[repo_id, '/']))
|
||||
|
||||
try:
|
||||
current_page = int(request.GET.get('page', '1'))
|
||||
@@ -1124,7 +1038,7 @@ def repo_revert_history(request, repo_id):
|
||||
return render_error(request, e.msg)
|
||||
|
||||
if not password_set:
|
||||
return HttpResponseRedirect(reverse('repo', args=[repo_id]))
|
||||
return HttpResponseRedirect(reverse("view_common_lib_dir", args=[repo_id, '/']))
|
||||
|
||||
commit_id = request.GET.get('commit_id', '')
|
||||
if not commit_id:
|
||||
@@ -1416,7 +1330,7 @@ def repo_set_access_property(request, repo_id):
|
||||
ap = request.GET.get('ap', '')
|
||||
seafserv_threaded_rpc.repo_set_access_property(repo_id, ap)
|
||||
|
||||
return HttpResponseRedirect(reverse('repo', args=[repo_id]))
|
||||
return HttpResponseRedirect(reverse("view_common_lib_dir", args=[repo_id, '/']))
|
||||
|
||||
@login_required
|
||||
def file_upload_progress_page(request):
|
||||
|
@@ -16,11 +16,10 @@ from django.contrib import messages
|
||||
from django.template.defaultfilters import filesizeformat
|
||||
|
||||
import seaserv
|
||||
from seaserv import seafile_api, seafserv_rpc, is_passwd_set, \
|
||||
from seaserv import seafile_api, is_passwd_set, \
|
||||
get_related_users_by_repo, get_related_users_by_org_repo, \
|
||||
CALC_SHARE_USAGE, seafserv_threaded_rpc, ccnet_threaded_rpc, \
|
||||
get_user_quota_usage, get_user_share_usage, edit_repo, \
|
||||
set_repo_history_limit
|
||||
edit_repo, set_repo_history_limit
|
||||
from pysearpc import SearpcError
|
||||
|
||||
from seahub.auth.decorators import login_required_ajax
|
||||
@@ -35,13 +34,9 @@ from seahub.message.models import UserMessage
|
||||
from seahub.share.models import UploadLinkShare
|
||||
from seahub.group.models import PublicGroup
|
||||
from seahub.signals import upload_file_successful, repo_created, repo_deleted
|
||||
from seahub.views import get_repo_dirents_with_perm, validate_owner, \
|
||||
check_repo_access_permission, get_unencry_rw_repos_by_user, \
|
||||
get_system_default_repo_id, get_diff, group_events_data, \
|
||||
get_owned_repo_list, check_folder_permission, is_registered_user, \
|
||||
check_file_lock
|
||||
from seahub.views.repo import get_nav_path, get_fileshare, get_dir_share_link, \
|
||||
get_uploadlink, get_dir_shared_upload_link
|
||||
from seahub.views import validate_owner, check_repo_access_permission, \
|
||||
get_unencry_rw_repos_by_user, get_system_default_repo_id, get_diff, group_events_data, \
|
||||
get_owned_repo_list, check_folder_permission, is_registered_user
|
||||
from seahub.views.modules import get_enabled_mods_by_group, \
|
||||
get_available_mods_by_group, enable_mod_for_group, \
|
||||
disable_mod_for_group, MOD_GROUP_WIKI, MOD_PERSONAL_WIKI, \
|
||||
@@ -49,7 +44,7 @@ from seahub.views.modules import get_enabled_mods_by_group, \
|
||||
from seahub.group.views import is_group_staff
|
||||
import seahub.settings as settings
|
||||
from seahub.settings import ENABLE_THUMBNAIL, THUMBNAIL_ROOT, \
|
||||
THUMBNAIL_DEFAULT_SIZE, ENABLE_SUB_LIBRARY, ENABLE_REPO_HISTORY_SETTING, \
|
||||
THUMBNAIL_DEFAULT_SIZE, ENABLE_SUB_LIBRARY, \
|
||||
ENABLE_FOLDER_PERM, SHOW_TRAFFIC, MEDIA_URL
|
||||
from constance import config
|
||||
from seahub.utils import check_filename_with_rename, EMPTY_SHA1, \
|
||||
@@ -59,7 +54,7 @@ from seahub.utils import check_filename_with_rename, EMPTY_SHA1, \
|
||||
get_org_user_events, get_user_events, get_file_type_and_ext, \
|
||||
is_valid_username, send_perm_audit_msg, get_origin_repo_info, is_pro_version
|
||||
from seahub.utils.repo import get_sub_repo_abbrev_origin_path
|
||||
from seahub.utils.star import star_file, unstar_file
|
||||
from seahub.utils.star import star_file, unstar_file, get_dir_starred_files
|
||||
from seahub.base.accounts import User
|
||||
from seahub.thumbnail.utils import get_thumbnail_src
|
||||
from seahub.utils.file_types import IMAGE
|
||||
@@ -238,165 +233,6 @@ def unenc_rw_repos(request):
|
||||
repo_list.sort(lambda x, y: cmp(x['name'].lower(), y['name'].lower()))
|
||||
return HttpResponse(json.dumps(repo_list), content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
def list_dir(request, repo_id):
|
||||
"""
|
||||
List directory entries in AJAX.
|
||||
"""
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
repo = get_repo(repo_id)
|
||||
if not repo:
|
||||
err_msg = _(u'Library does not exist.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=400, content_type=content_type)
|
||||
|
||||
username = request.user.username
|
||||
user_perm = check_repo_access_permission(repo.id, request.user)
|
||||
if user_perm is None:
|
||||
err_msg = _(u'Permission denied.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=403, content_type=content_type)
|
||||
|
||||
sub_lib_enabled = UserOptions.objects.is_sub_lib_enabled(username)
|
||||
|
||||
try:
|
||||
server_crypto = UserOptions.objects.is_server_crypto(username)
|
||||
except CryptoOptionNotSetError:
|
||||
# Assume server_crypto is ``False`` if this option is not set.
|
||||
server_crypto = False
|
||||
|
||||
if repo.encrypted and \
|
||||
(repo.enc_version == 1 or (repo.enc_version == 2 and server_crypto)) \
|
||||
and not seafile_api.is_password_set(repo.id, username):
|
||||
err_msg = _(u'Library is encrypted.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=403, content_type=content_type)
|
||||
|
||||
head_commit = get_commit(repo.id, repo.version, repo.head_cmmt_id)
|
||||
if not head_commit:
|
||||
err_msg = _(u'Error: no head commit id')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=500, content_type=content_type)
|
||||
|
||||
if new_merge_with_no_conflict(head_commit):
|
||||
info_commit = get_commit_before_new_merge(head_commit)
|
||||
else:
|
||||
info_commit = head_commit
|
||||
|
||||
path = request.GET.get('p', '/')
|
||||
if path[-1] != '/':
|
||||
path = path + '/'
|
||||
|
||||
more_start = None
|
||||
file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo,
|
||||
head_commit, path,
|
||||
offset=0, limit=100)
|
||||
if dirent_more:
|
||||
more_start = 100
|
||||
zipped = get_nav_path(path, repo.name)
|
||||
fileshare = get_fileshare(repo.id, username, path)
|
||||
dir_shared_link = get_dir_share_link(fileshare)
|
||||
uploadlink = get_uploadlink(repo.id, username, path)
|
||||
dir_shared_upload_link = get_dir_shared_upload_link(uploadlink)
|
||||
|
||||
ctx = {
|
||||
'repo': repo,
|
||||
'zipped': zipped,
|
||||
'user_perm': user_perm,
|
||||
'path': path,
|
||||
'server_crypto': server_crypto,
|
||||
'fileshare': fileshare,
|
||||
'dir_shared_link': dir_shared_link,
|
||||
'uploadlink': uploadlink,
|
||||
'dir_shared_upload_link': dir_shared_upload_link,
|
||||
'dir_list': dir_list,
|
||||
'file_list': file_list,
|
||||
'dirent_more': dirent_more,
|
||||
'more_start': more_start,
|
||||
'ENABLE_SUB_LIBRARY': ENABLE_SUB_LIBRARY,
|
||||
'sub_lib_enabled': sub_lib_enabled,
|
||||
'enable_upload_folder': settings.ENABLE_UPLOAD_FOLDER,
|
||||
'current_commit': head_commit,
|
||||
'info_commit': info_commit,
|
||||
}
|
||||
html = render_to_string('snippets/repo_dir_data.html', ctx,
|
||||
context_instance=RequestContext(request))
|
||||
return HttpResponse(json.dumps({'html': html, 'path': path}),
|
||||
content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
def list_dir_more(request, repo_id):
|
||||
"""
|
||||
List 'more' entries in a directory with AJAX.
|
||||
"""
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
repo = get_repo(repo_id)
|
||||
if not repo:
|
||||
err_msg = _(u'Library does not exist.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=400, content_type=content_type)
|
||||
|
||||
username = request.user.username
|
||||
user_perm = check_repo_access_permission(repo.id, request.user)
|
||||
if user_perm is None:
|
||||
err_msg = _(u'Permission denied.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=403, content_type=content_type)
|
||||
|
||||
sub_lib_enabled = UserOptions.objects.is_sub_lib_enabled(username)
|
||||
|
||||
try:
|
||||
server_crypto = UserOptions.objects.is_server_crypto(username)
|
||||
except CryptoOptionNotSetError:
|
||||
# Assume server_crypto is ``False`` if this option is not set.
|
||||
server_crypto = False
|
||||
|
||||
if repo.encrypted and \
|
||||
(repo.enc_version == 1 or (repo.enc_version == 2 and server_crypto)) \
|
||||
and not seafile_api.is_password_set(repo.id, username):
|
||||
err_msg = _(u'Library is encrypted.')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=403, content_type=content_type)
|
||||
|
||||
head_commit = get_commit(repo.id, repo.version, repo.head_cmmt_id)
|
||||
if not head_commit:
|
||||
err_msg = _(u'Error: no head commit id')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=500, content_type=content_type)
|
||||
|
||||
path = request.GET.get('p', '/')
|
||||
if path[-1] != '/':
|
||||
path = path + '/'
|
||||
|
||||
offset = int(request.GET.get('start'))
|
||||
if not offset:
|
||||
err_msg = _(u'Argument missing')
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=400, content_type=content_type)
|
||||
more_start = None
|
||||
file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo,
|
||||
head_commit, path,
|
||||
offset, limit=100)
|
||||
if dirent_more:
|
||||
more_start = offset + 100
|
||||
|
||||
ctx = {
|
||||
'repo': repo,
|
||||
'user_perm': user_perm,
|
||||
'path': path,
|
||||
'server_crypto': server_crypto,
|
||||
'dir_list': dir_list,
|
||||
'file_list': file_list,
|
||||
'ENABLE_SUB_LIBRARY': ENABLE_SUB_LIBRARY,
|
||||
'sub_lib_enabled': sub_lib_enabled,
|
||||
}
|
||||
html = render_to_string('snippets/repo_dirents.html', ctx,
|
||||
context_instance=RequestContext(request))
|
||||
return HttpResponse(json.dumps({'html': html, 'dirent_more': dirent_more, 'more_start': more_start}),
|
||||
content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
def list_lib_dir(request, repo_id):
|
||||
'''
|
||||
@@ -436,9 +272,51 @@ def list_lib_dir(request, repo_id):
|
||||
status=500, content_type=content_type)
|
||||
|
||||
offset = int(request.GET.get('start', 0))
|
||||
file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo, head_commit, path, offset, limit=100)
|
||||
limit = 100
|
||||
dir_list = []
|
||||
file_list = []
|
||||
dirent_more = False
|
||||
|
||||
try:
|
||||
dir_id = seafile_api.get_dir_id_by_path(repo.id, path)
|
||||
except SearpcError as e:
|
||||
logger.error(e)
|
||||
err_msg = 'Internal Server Error'
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=500, content_type=content_type)
|
||||
|
||||
if not dir_id:
|
||||
err_msg = 'Folder not found.'
|
||||
return HttpResponse(json.dumps({'error': err_msg}),
|
||||
status=404, content_type=content_type)
|
||||
|
||||
dirs = seafserv_threaded_rpc.list_dir_with_perm(repo_id, path, dir_id, username, offset, limit)
|
||||
starred_files = get_dir_starred_files(username, repo_id, path)
|
||||
|
||||
for dirent in dirs:
|
||||
dirent.last_modified = dirent.mtime
|
||||
if stat.S_ISDIR(dirent.mode):
|
||||
dpath = posixpath.join(path, dirent.obj_name)
|
||||
if dpath[-1] != '/':
|
||||
dpath += '/'
|
||||
dir_list.append(dirent)
|
||||
else:
|
||||
if repo.version == 0:
|
||||
file_size = seafile_api.get_file_size(repo.store_id, repo.version, dirent.obj_id)
|
||||
else:
|
||||
file_size = dirent.size
|
||||
dirent.file_size = file_size if file_size else 0
|
||||
|
||||
dirent.starred = False
|
||||
fpath = posixpath.join(path, dirent.obj_name)
|
||||
if fpath in starred_files:
|
||||
dirent.starred = True
|
||||
|
||||
file_list.append(dirent)
|
||||
|
||||
more_start = None
|
||||
if dirent_more:
|
||||
if limit == len(dirs):
|
||||
dirent_more = True
|
||||
more_start = offset + 100
|
||||
|
||||
if is_org_context(request):
|
||||
@@ -462,8 +340,7 @@ def list_lib_dir(request, repo_id):
|
||||
d_['obj_name'] = d.obj_name
|
||||
d_['last_modified'] = d.last_modified
|
||||
d_['last_update'] = translate_seahub_time(d.last_modified)
|
||||
p_dpath = posixpath.join(path, d.obj_name)
|
||||
d_['p_dpath'] = p_dpath # for 'view_link' & 'dl_link'
|
||||
d_['p_dpath'] = posixpath.join(path, d.obj_name)
|
||||
d_['perm'] = d.permission # perm for sub dir in current dir
|
||||
dirent_list.append(d_)
|
||||
|
||||
@@ -1072,7 +949,7 @@ def mv_dirents(request, src_repo_id, src_path, dst_repo_id, dst_path,
|
||||
success.append(obj_name)
|
||||
|
||||
if len(success) > 0:
|
||||
url = reverse('repo', args=[dst_repo_id]) + '?p=' + urlquote(dst_path)
|
||||
url = reverse("view_common_lib_dir", args=[dst_repo_id, urlquote(dst_path).strip('/')])
|
||||
|
||||
result = {'success': success, 'failed': failed, 'url': url}
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
@@ -1115,7 +992,7 @@ def cp_dirents(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_file_n
|
||||
success.append(obj_name)
|
||||
|
||||
if len(success) > 0:
|
||||
url = reverse('repo', args=[dst_repo_id]) + '?p=' + urlquote(dst_path)
|
||||
url = reverse("view_common_lib_dir", args=[dst_repo_id, urlquote(dst_path).strip('/')])
|
||||
|
||||
result = {'success': success, 'failed': failed, 'url': url}
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
@@ -1956,69 +1833,6 @@ def _create_repo_common(request, repo_name, repo_desc, encryption,
|
||||
|
||||
return repo_id
|
||||
|
||||
@login_required_ajax
|
||||
def repo_create(request):
|
||||
'''
|
||||
Handle ajax post to create a library.
|
||||
|
||||
'''
|
||||
if request.method != 'POST':
|
||||
return Http404
|
||||
|
||||
result = {}
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
if not request.user.permissions.can_add_repo():
|
||||
result['error'] = _(u"You do not have permission to create library")
|
||||
return HttpResponse(json.dumps(result), status=403,
|
||||
content_type=content_type)
|
||||
|
||||
form = RepoCreateForm(request.POST)
|
||||
if not form.is_valid():
|
||||
result['error'] = str(form.errors.values()[0])
|
||||
return HttpResponseBadRequest(json.dumps(result),
|
||||
content_type=content_type)
|
||||
|
||||
repo_name = form.cleaned_data['repo_name']
|
||||
repo_desc = form.cleaned_data['repo_desc']
|
||||
encryption = int(form.cleaned_data['encryption'])
|
||||
|
||||
uuid = form.cleaned_data['uuid']
|
||||
magic_str = form.cleaned_data['magic_str']
|
||||
encrypted_file_key = form.cleaned_data['encrypted_file_key']
|
||||
|
||||
repo_id = _create_repo_common(request, repo_name, repo_desc, encryption,
|
||||
uuid, magic_str, encrypted_file_key)
|
||||
if repo_id is None:
|
||||
result['error'] = _(u"Internal Server Error")
|
||||
return HttpResponse(json.dumps(result), status=500,
|
||||
content_type=content_type)
|
||||
|
||||
username = request.user.username
|
||||
try:
|
||||
default_lib = (int(request.GET.get('default_lib', 0)) == 1)
|
||||
except ValueError:
|
||||
default_lib = False
|
||||
if default_lib:
|
||||
UserOptions.objects.set_default_repo(username, repo_id)
|
||||
|
||||
if is_org_context(request):
|
||||
org_id = request.user.org.org_id
|
||||
else:
|
||||
org_id = -1
|
||||
repo_created.send(sender=None,
|
||||
org_id=org_id,
|
||||
creator=username,
|
||||
repo_id=repo_id,
|
||||
repo_name=repo_name)
|
||||
result = {
|
||||
'repo_id': repo_id,
|
||||
'repo_name': repo_name,
|
||||
'repo_desc': repo_desc,
|
||||
'repo_enc': encryption,
|
||||
}
|
||||
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||
|
||||
@login_required_ajax
|
||||
def public_repo_create(request):
|
||||
'''
|
||||
|
@@ -4,12 +4,10 @@ import posixpath
|
||||
import logging
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.contrib.sites.models import RequestSite
|
||||
from django.db.models import F
|
||||
from django.http import Http404, HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.http import urlquote
|
||||
|
||||
@@ -17,28 +15,21 @@ import seaserv
|
||||
from seaserv import seafile_api
|
||||
|
||||
from seahub.auth.decorators import login_required
|
||||
from seahub.avatar.templatetags.avatar_tags import avatar
|
||||
from seahub.avatar.templatetags.group_avatar_tags import grp_avatar
|
||||
from seahub.contacts.models import Contact
|
||||
from seahub.forms import RepoPassowrdForm
|
||||
from seahub.options.models import UserOptions, CryptoOptionNotSetError
|
||||
from seahub.share.models import FileShare, UploadLinkShare, \
|
||||
check_share_link_common
|
||||
from seahub.views import gen_path_link, get_repo_dirents, \
|
||||
check_repo_access_permission, get_repo_dirents_with_perm, \
|
||||
get_system_default_repo_id
|
||||
check_repo_access_permission
|
||||
|
||||
from seahub.utils import gen_file_upload_url, is_org_context, \
|
||||
get_fileserver_root, gen_dir_share_link, gen_shared_upload_link, \
|
||||
get_max_upload_file_size, new_merge_with_no_conflict, \
|
||||
get_commit_before_new_merge, user_traffic_over_limit, render_error, \
|
||||
from seahub.utils import gen_file_upload_url, gen_dir_share_link, \
|
||||
gen_shared_upload_link, user_traffic_over_limit, render_error, \
|
||||
get_file_type_and_ext
|
||||
from seahub.settings import ENABLE_SUB_LIBRARY, FORCE_SERVER_CRYPTO, \
|
||||
from seahub.settings import FORCE_SERVER_CRYPTO, \
|
||||
ENABLE_UPLOAD_FOLDER, ENABLE_RESUMABLE_FILEUPLOAD, ENABLE_THUMBNAIL, \
|
||||
THUMBNAIL_ROOT, THUMBNAIL_DEFAULT_SIZE, THUMBNAIL_SIZE_FOR_GRID
|
||||
from seahub.utils import gen_file_get_url
|
||||
from seahub.utils.file_types import IMAGE
|
||||
from seahub.thumbnail.utils import get_thumbnail_src, get_share_link_thumbnail_src
|
||||
from seahub.thumbnail.utils import get_share_link_thumbnail_src
|
||||
|
||||
# Get an instance of a logger
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -157,157 +148,6 @@ def get_dir_shared_upload_link(uploadlink):
|
||||
dir_shared_upload_link = ''
|
||||
return dir_shared_upload_link
|
||||
|
||||
def render_repo(request, repo):
|
||||
"""Steps to show repo page:
|
||||
If user has permission to view repo
|
||||
If repo is encrypt and password is not set on server
|
||||
return decrypt repo page
|
||||
If repo is not encrypt or password is set on server
|
||||
Show repo direntries based on requested path
|
||||
If user does not have permission to view repo
|
||||
return permission deny page
|
||||
"""
|
||||
username = request.user.username
|
||||
path = get_path_from_request(request)
|
||||
user_perm = check_repo_access_permission(repo.id, request.user)
|
||||
if user_perm is None:
|
||||
return render_error(request, _(u'Permission denied'))
|
||||
|
||||
sub_lib_enabled = UserOptions.objects.is_sub_lib_enabled(username)
|
||||
|
||||
server_crypto = False
|
||||
if repo.encrypted:
|
||||
try:
|
||||
server_crypto = UserOptions.objects.is_server_crypto(username)
|
||||
except CryptoOptionNotSetError:
|
||||
return render_to_response('options/set_user_options.html', {
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
if (repo.enc_version == 1 or (repo.enc_version == 2 and server_crypto)) \
|
||||
and not is_password_set(repo.id, username):
|
||||
return render_to_response('decrypt_repo_form.html', {
|
||||
'repo': repo,
|
||||
'next': get_next_url_from_request(request) or reverse('repo', args=[repo.id]),
|
||||
'force_server_crypto': FORCE_SERVER_CRYPTO,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
# query context args
|
||||
fileserver_root = get_fileserver_root()
|
||||
max_upload_file_size = get_max_upload_file_size()
|
||||
|
||||
protocol = request.is_secure() and 'https' or 'http'
|
||||
domain = RequestSite(request).domain
|
||||
|
||||
for g in request.user.joined_groups:
|
||||
g.avatar = grp_avatar(g.id, 20)
|
||||
|
||||
head_commit = get_commit(repo.id, repo.version, repo.head_cmmt_id)
|
||||
if not head_commit:
|
||||
raise Http404
|
||||
|
||||
if new_merge_with_no_conflict(head_commit):
|
||||
info_commit = get_commit_before_new_merge(head_commit)
|
||||
else:
|
||||
info_commit = head_commit
|
||||
|
||||
repo_size = get_repo_size(repo.id)
|
||||
no_quota = is_no_quota(repo.id)
|
||||
if is_org_context(request):
|
||||
repo_owner = seafile_api.get_org_repo_owner(repo.id)
|
||||
else:
|
||||
repo_owner = seafile_api.get_repo_owner(repo.id)
|
||||
is_repo_owner = True if repo_owner == username else False
|
||||
if is_repo_owner and not repo.is_virtual:
|
||||
show_repo_settings = True
|
||||
else:
|
||||
show_repo_settings = False
|
||||
|
||||
file_list, dir_list, dirent_more = get_repo_dirents_with_perm(
|
||||
request, repo, head_commit, path, offset=0, limit=100)
|
||||
more_start = None
|
||||
if dirent_more:
|
||||
more_start = 100
|
||||
zipped = get_nav_path(path, repo.name)
|
||||
repo_groups = get_shared_groups_by_repo_and_user(repo.id, username)
|
||||
if len(repo_groups) > 1:
|
||||
repo_group_str = render_to_string("snippets/repo_group_list.html",
|
||||
{'groups': repo_groups})
|
||||
else:
|
||||
repo_group_str = ''
|
||||
|
||||
fileshare = get_fileshare(repo.id, username, path)
|
||||
dir_shared_link = get_dir_share_link(fileshare)
|
||||
uploadlink = get_uploadlink(repo.id, username, path)
|
||||
dir_shared_upload_link = get_dir_shared_upload_link(uploadlink)
|
||||
|
||||
for f in file_list:
|
||||
file_type, file_ext = get_file_type_and_ext(f.obj_name)
|
||||
if file_type == IMAGE:
|
||||
f.is_img = True
|
||||
file_path = posixpath.join(path, f.obj_name)
|
||||
if os.path.exists(os.path.join(THUMBNAIL_ROOT, str(THUMBNAIL_DEFAULT_SIZE), f.obj_id)):
|
||||
src = get_thumbnail_src(repo.id, THUMBNAIL_DEFAULT_SIZE, file_path)
|
||||
f.encoded_thumbnail_src = urlquote(src)
|
||||
|
||||
return render_to_response('repo.html', {
|
||||
'repo': repo,
|
||||
'user_perm': user_perm,
|
||||
'repo_owner': repo_owner,
|
||||
'is_repo_owner': is_repo_owner,
|
||||
'show_repo_settings': show_repo_settings,
|
||||
'current_commit': head_commit,
|
||||
'info_commit': info_commit,
|
||||
'password_set': True,
|
||||
'repo_size': repo_size,
|
||||
'dir_list': dir_list,
|
||||
'file_list': file_list,
|
||||
'dirent_more': dirent_more,
|
||||
'more_start': more_start,
|
||||
'path': path,
|
||||
'zipped': zipped,
|
||||
'groups': repo_groups,
|
||||
'repo_group_str': repo_group_str,
|
||||
'no_quota': no_quota,
|
||||
'max_upload_file_size': max_upload_file_size,
|
||||
'fileserver_root': fileserver_root,
|
||||
'protocol': protocol,
|
||||
'domain': domain,
|
||||
'fileshare': fileshare,
|
||||
'dir_shared_link': dir_shared_link,
|
||||
'uploadlink': uploadlink,
|
||||
'dir_shared_upload_link': dir_shared_upload_link,
|
||||
'ENABLE_SUB_LIBRARY': ENABLE_SUB_LIBRARY,
|
||||
'server_crypto': server_crypto,
|
||||
'sub_lib_enabled': sub_lib_enabled,
|
||||
'enable_upload_folder': ENABLE_UPLOAD_FOLDER,
|
||||
'ENABLE_THUMBNAIL': ENABLE_THUMBNAIL,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
def repo(request, repo_id):
|
||||
"""Show repo page and handle POST request to decrypt repo.
|
||||
"""
|
||||
repo = get_repo(repo_id)
|
||||
|
||||
if not repo:
|
||||
raise Http404
|
||||
|
||||
if request.method == 'GET':
|
||||
return render_repo(request, repo)
|
||||
elif request.method == 'POST':
|
||||
form = RepoPassowrdForm(request.POST)
|
||||
next = get_next_url_from_request(request) or reverse('repo',
|
||||
args=[repo_id])
|
||||
if form.is_valid():
|
||||
return HttpResponseRedirect(next)
|
||||
else:
|
||||
return render_to_response('decrypt_repo_form.html', {
|
||||
'repo': repo,
|
||||
'form': form,
|
||||
'next': next,
|
||||
'force_server_crypto': FORCE_SERVER_CRYPTO,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
def repo_history_view(request, repo_id):
|
||||
"""View repo in history.
|
||||
@@ -333,13 +173,13 @@ def repo_history_view(request, repo_id):
|
||||
and not is_password_set(repo.id, username):
|
||||
return render_to_response('decrypt_repo_form.html', {
|
||||
'repo': repo,
|
||||
'next': get_next_url_from_request(request) or reverse('repo', args=[repo.id]),
|
||||
'next': get_next_url_from_request(request) or reverse("view_common_lib_dir", args=[repo_id, '/']),
|
||||
'force_server_crypto': FORCE_SERVER_CRYPTO,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
commit_id = request.GET.get('commit_id', None)
|
||||
if commit_id is None:
|
||||
return HttpResponseRedirect(reverse('repo', args=[repo.id]))
|
||||
return HttpResponseRedirect(reverse("view_common_lib_dir", args=[repo_id, '/']))
|
||||
current_commit = get_commit(repo.id, repo.version, commit_id)
|
||||
if not current_commit:
|
||||
current_commit = get_commit(repo.id, repo.version, repo.head_cmmt_id)
|
||||
|
@@ -163,9 +163,7 @@ def sys_repo_admin(request):
|
||||
page_next = False
|
||||
|
||||
repos = filter(lambda r: not r.is_virtual, repos)
|
||||
default_repo_id = get_system_default_repo_id()
|
||||
for repo in repos:
|
||||
repo.is_default_repo = True if repo.id == default_repo_id else False
|
||||
try:
|
||||
repo.owner = seafile_api.get_repo_owner(repo.id)
|
||||
except:
|
||||
@@ -272,6 +270,8 @@ def sys_admin_repo(request, repo_id):
|
||||
file_list.append(dirent)
|
||||
|
||||
zipped = gen_path_link(path, repo.name)
|
||||
default_repo_id = get_system_default_repo_id()
|
||||
is_default_repo = True if repo_id == default_repo_id else False
|
||||
|
||||
return render_to_response('sysadmin/admin_repo_view.html', {
|
||||
'repo': repo,
|
||||
@@ -280,6 +280,8 @@ def sys_admin_repo(request, repo_id):
|
||||
'file_list': file_list,
|
||||
'path': path,
|
||||
'zipped': zipped,
|
||||
'is_default_repo': is_default_repo,
|
||||
'max_upload_file_size': seaserv.MAX_UPLOAD_FILE_SIZE,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@login_required
|
||||
|
24
tests/seahub/views/test_list_lib_dir.py
Normal file
24
tests/seahub/views/test_list_lib_dir.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import json
|
||||
import os
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from seahub.test_utils import BaseTestCase
|
||||
|
||||
class ListLibDirTest(BaseTestCase):
|
||||
def setUp(self):
|
||||
self.login_as(self.user)
|
||||
self.endpoint = reverse('list_lib_dir', args=[self.repo.id])
|
||||
self.folder_name = os.path.basename(self.folder)
|
||||
|
||||
def tearDown(self):
|
||||
self.remove_repo()
|
||||
|
||||
def test_can_list(self):
|
||||
resp = self.client.get(self.endpoint, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
|
||||
self.assertEqual(200, resp.status_code)
|
||||
|
||||
json_resp = json.loads(resp.content)
|
||||
assert len(json_resp) == 8
|
||||
assert self.folder_name == json_resp['dirent_list'][0]['obj_name']
|
||||
assert self.repo.name == json_resp['repo_name']
|
Reference in New Issue
Block a user