. Attach to instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(c,d){var f,g,e=this;return 0===arguments.length?this.selection.find(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(g=this.data(),c||(c=[]),f=a.map(c,function(a){return e.opts.id(a)}),this.setVal(f),this.updateSelection(c),this.clearSearch(),d&&this.triggerChange(this.buildChangeDetails(g,this.data())),b)}}),a.fn.select2=function(){var d,g,h,i,c=Array.prototype.slice.call(arguments,0),j=["val","destroy","opened","open","close","focus","isFocused","container","onSortStart","onSortEnd","enable","readonly","positionDropdown","data"],k=["val","opened","isFocused","container","data"];return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?i=d.element.prop("multiple"):(i=d.multiple||!1,"tags"in d&&(d.multiple=i=!0)),g=i?new f:new e,g.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(0>m(c[0],j))throw"Unknown method: "+c[0];if(h=b,g=a(this).data("select2"),g===b)return;if(h="container"===c[0]?g.container:g[c[0]].apply(g,c.slice(1)),m(c[0],k)>=0)return!1}}),h===b?this:h},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return C(a.text,c.term,e,d),e.join("")},formatSelection:function(a){return a?a.text:b},sortResults:function(a){return a},formatResultCssClass:function(){return b},formatNoMatches:function(){return"No matches found"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results..."},formatSearching:function(){return"Searching..."},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a.id},matcher:function(a,b){return(""+b).toUpperCase().indexOf((""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:J,escapeMarkup:function(a){var b={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return(a+"").replace(/[&<>"'\/\\]/g,function(a){return b[a]})},blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null}},a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:D,local:E,tags:F},util:{debounce:t,markMatch:C},"class":{"abstract":d,single:e,multi:f}}}}(jQuery);
diff --git a/seahub/api2/serializers.py b/seahub/api2/serializers.py
index 32076c4c6c..1821220a0d 100644
--- a/seahub/api2/serializers.py
+++ b/seahub/api2/serializers.py
@@ -89,8 +89,10 @@ class AuthTokenSerializer(serializers.Serializer):
raise serializers.ValidationError('invalid device id')
elif platform == 'android':
+ # See http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID
# android device id is the 64bit secure id, so it must be 16 chars in hex representation
- if len(device_id) != 16:
+ # but some user reports their device ids are 15 chars
+ if len(device_id) != 16 and len(device_id) != 15:
raise serializers.ValidationError('invalid device id')
elif platform == 'ios':
if len(device_id) != 36:
diff --git a/seahub/api2/utils.py b/seahub/api2/utils.py
index e680f8c8c5..3ff0b8ade8 100644
--- a/seahub/api2/utils.py
+++ b/seahub/api2/utils.py
@@ -311,26 +311,25 @@ def get_timestamp(msgtimestamp):
def group_msg_to_json(msg, get_all_replies):
ret = {
- 'from_email' : msg.from_email,
- 'nickname' : email2nickname(msg.from_email),
- 'timestamp' : get_timestamp(msg.timestamp),
- 'msg' : msg.message,
- 'msgid' : msg.id,
+ 'from_email': msg.from_email,
+ 'nickname': email2nickname(msg.from_email),
+ 'timestamp': get_timestamp(msg.timestamp),
+ 'msg': msg.message,
+ 'msgid': msg.id,
}
- try:
- att = MessageAttachment.objects.get(group_message_id=msg.id)
- except MessageAttachment.DoesNotExist:
- att = None
-
- if att:
+ atts_json = []
+ atts = MessageAttachment.objects.filter(group_message_id=msg.id)
+ for att in atts:
att_json = {
- 'path' : att.path,
- 'repo' : att.repo_id,
- 'type' : att.attach_type,
- 'src' : att.src,
+ 'path': att.path,
+ 'repo': att.repo_id,
+ 'type': att.attach_type,
+ 'src': att.src,
}
- ret['att'] = att_json
+ atts_json.append(att_json)
+ if len(atts_json) > 0:
+ ret['atts'] = atts_json
reply_list = MessageReply.objects.filter(reply_to=msg)
msg.reply_cnt = reply_list.count()
diff --git a/seahub/avatar/templatetags/avatar_tags.py b/seahub/avatar/templatetags/avatar_tags.py
index 241d8def63..b59a6f1eb8 100644
--- a/seahub/avatar/templatetags/avatar_tags.py
+++ b/seahub/avatar/templatetags/avatar_tags.py
@@ -53,18 +53,14 @@ def avatar(user, size=AVATAR_DEFAULT_SIZE):
if not isinstance(user, User):
try:
user = User.objects.get(email=user)
- alt = email2nickname(user.username)
url = avatar_url(user, size)
except User.DoesNotExist:
url = get_default_avatar_non_registered_url()
- alt = _("Default Avatar")
except Exception as e:
# Catch exceptions to avoid 500 errors.
logger.error(e)
url = get_default_avatar_non_registered_url()
- alt = _("Default Avatar")
else:
- alt = email2nickname(user.username)
try:
url = avatar_url(user, size)
except Exception as e:
@@ -72,8 +68,7 @@ def avatar(user, size=AVATAR_DEFAULT_SIZE):
logger.error(e)
url = get_default_avatar_non_registered_url()
- return """ """ % (url, alt,
- size, size)
+ return """ """ % (url, size, size)
@cache_result
@register.simple_tag
@@ -84,15 +79,13 @@ def primary_avatar(user, size=AVATAR_DEFAULT_SIZE):
work for us. If that special view is then cached by a CDN for instance,
we will avoid many db calls.
"""
- alt = unicode(user)
url = reverse('avatar_render_primary', kwargs={'user' : user, 'size' : size})
- return """ """ % (url, alt,
- size, size)
+ return """ """ % (url, size, size)
@cache_result
@register.simple_tag
def render_avatar(avatar, size=AVATAR_DEFAULT_SIZE):
if not avatar.thumbnail_exists(size):
avatar.create_thumbnail(size)
- return """ """ % (
- avatar.avatar_url(size), str(avatar), size, size)
+ return """ """ % (
+ avatar.avatar_url(size), size, size)
diff --git a/seahub/forms.py b/seahub/forms.py
index 9ddba2287b..2e62c3d51d 100644
--- a/seahub/forms.py
+++ b/seahub/forms.py
@@ -174,6 +174,14 @@ class RepoSettingForm(forms.Form):
days = forms.IntegerField(required=False,
error_messages={'invalid': _('Please enter a number')})
+ def clean_repo_name(self):
+ repo_name = self.cleaned_data['repo_name']
+ if not is_valid_filename(repo_name):
+ error_msg = _(u"Name %s is not valid") % repo_name
+ raise forms.ValidationError(error_msg)
+ else:
+ return repo_name
+
class SharedLinkPasswordForm(forms.Form):
"""
Form for user to access shared files/directory.
diff --git a/seahub/notifications/models.py b/seahub/notifications/models.py
index daaef323f6..6ce79fea79 100644
--- a/seahub/notifications/models.py
+++ b/seahub/notifications/models.py
@@ -7,6 +7,7 @@ from django.db import models
from django.db.models.signals import post_save
from django.forms import ModelForm, Textarea
from django.utils.http import urlquote
+from django.utils.html import escape
from django.utils.translation import ugettext as _
import seaserv
@@ -471,7 +472,7 @@ class UserNotification(models.Model):
return None
msg = _(u"%(user)s has shared a library named %(repo_name)s to you.") % {
- 'user': share_from,
+ 'user': escape(share_from),
'href': reverse('repo', args=[repo.id]),
'repo_name': repo.name
}
@@ -489,7 +490,7 @@ class UserNotification(models.Model):
priv_share_token = d['priv_share_token']
msg = _(u"%(user)s has shared a file named %(file_name)s to you.") % {
- 'user': share_from,
+ 'user': escape(share_from),
'href': reverse('view_priv_shared_file', args=[priv_share_token]),
'file_name': file_name
}
@@ -505,7 +506,7 @@ class UserNotification(models.Model):
nickname = email2nickname(msg_from)
msg = _(u"You have received a new message from %(user)s.") % {
- 'user': nickname,
+ 'user': escape(nickname),
'href': reverse('user_msg_list', args=[msg_from]),
}
return msg
@@ -536,7 +537,7 @@ class UserNotification(models.Model):
else:
msg = _(u"%(user)s posted a new discussion in %(group_name)s ") % {
'href': reverse('group_discuss', args=[group.id]),
- 'user': msg_from,
+ 'user': escape(msg_from),
'group_name': group.group_name}
return msg
@@ -561,7 +562,7 @@ class UserNotification(models.Model):
}
else:
msg = _(u"%(user)s replied your group discussion ") % {
- 'user': reply_from,
+ 'user': escape(reply_from),
'href': reverse('msg_reply_new')
}
return msg
@@ -588,7 +589,7 @@ class UserNotification(models.Model):
'username': username,
'href': reverse('group_members', args=[group_id]),
'group_name': group.group_name,
- 'join_request_msg': join_request_msg,
+ 'join_request_msg': escape(join_request_msg),
}
return msg
diff --git a/seahub/profile/forms.py b/seahub/profile/forms.py
index 1f2d19dd2f..a75219f6e2 100644
--- a/seahub/profile/forms.py
+++ b/seahub/profile/forms.py
@@ -1,6 +1,5 @@
# encoding: utf-8
from django import forms
-from django.utils.translation import ugettext_lazy as _
from seahub.profile.models import Profile, DetailedProfile
@@ -12,8 +11,7 @@ class ProfileForm(forms.Form):
nickname = self.cleaned_data['nickname']
intro = self.cleaned_data['intro']
Profile.objects.add_or_update(username, nickname, intro)
-
-
+
class DetailedProfileForm(ProfileForm):
department = forms.CharField(max_length=512, required=False)
telephone = forms.CharField(max_length=100, required=False)
@@ -23,4 +21,3 @@ class DetailedProfileForm(ProfileForm):
department = self.cleaned_data['department']
telephone = self.cleaned_data['telephone']
DetailedProfile.objects.add_or_update(username, department, telephone)
-
diff --git a/seahub/templates/pubrepo.html b/seahub/templates/pubrepo.html
index bbc3751655..11bfdcacd7 100644
--- a/seahub/templates/pubrepo.html
+++ b/seahub/templates/pubrepo.html
@@ -69,7 +69,7 @@ $(".cancel-share").click(function() {
function repoCreateSuccessCallback() {
location.reload();
}
-{% url 'seahub.views.public_repo_create' as repo_create_url %}
+{% url 'public_repo_create' as repo_create_url %}
{% with post_url=repo_create_url %}
{% include "snippets/repo_create_js.html" %}
{% endwith %}
diff --git a/seahub/templates/repo.html b/seahub/templates/repo.html
index 58af6b4240..2aca8728e0 100644
--- a/seahub/templates/repo.html
+++ b/seahub/templates/repo.html
@@ -844,13 +844,15 @@ function setPathWidth() {
}
$(function () { setPathWidth(); });
+{% include "snippets/list_commit_detail.html" %}
+
function dirOP() {
setPathWidth();
$('.path .dir-link').click(dirlinkClick);
-$('.lsch').click(function() {
+$('.lsch').unbind().click(function() {
listCommitDetails($(this).data('url'), $(this).data('time'));
return false;
});
@@ -1971,7 +1973,6 @@ function updateCmt() {
return false;
});
{% endif %}
-{% include "snippets/list_commit_detail.html" %}
{% include "snippets/shared_link_js.html" %}
{% include "snippets/bottom_bar.html" %}
diff --git a/seahub/templates/snippets/events_js.html b/seahub/templates/snippets/events_js.html
index 47fefef4f1..79dce5e360 100644
--- a/seahub/templates/snippets/events_js.html
+++ b/seahub/templates/snippets/events_js.html
@@ -4,7 +4,7 @@
function reqEvents(start) {
$('#events-loading').removeClass('hide');
$.ajax({
- url:'{{SITE_ROOT}}events/?start=' + start,
+ url:'{% url 'events' %}?start=' + start,
dataType: 'json',
cache: false,
success: function(data) {
diff --git a/seahub/templates/snippets/list_commit_detail.html b/seahub/templates/snippets/list_commit_detail.html
index abec959e60..1c355f6d34 100644
--- a/seahub/templates/snippets/list_commit_detail.html
+++ b/seahub/templates/snippets/list_commit_detail.html
@@ -29,7 +29,7 @@ function listCommitDetails(url, t) {
show(data['deldir'], "{% trans "Deleted directories" %}");
if (!con) {
if (data['cmt_desc']) {
- con = '' + data['cmt_desc'] + '
';
+ con = '' + HTMLescape(data['cmt_desc']) + '
';
}
}
$('#ls-ch').css('text-align','left').html(heading + time + con);
diff --git a/seahub/templates/snippets/myhome_extra_script.html b/seahub/templates/snippets/myhome_extra_script.html
index 80f7dc5b95..845f6e159a 100644
--- a/seahub/templates/snippets/myhome_extra_script.html
+++ b/seahub/templates/snippets/myhome_extra_script.html
@@ -102,12 +102,12 @@ function repoCreateSuccessCallback(data) {
$.modal.close();
var new_repo_item = $('#new-repo .repo-item').clone(true);
var tds = $('td', new_repo_item);
- var repo_id = data['repo_id'], repo_name = data['repo_name'];
+ var repo_id = data['repo_id'], repo_name = HTMLescape(data['repo_name']);
if (data['repo_enc']) {
$('img', $(tds[0])).attr('src', '{{MEDIA_URL}}img/sync-folder-encrypt-20.png');
}
$(tds[1]).html('' + repo_name + ' ');
- $(tds[2]).html(data['repo_desc']);
+ $(tds[2]).text(data['repo_desc']);
$(tds[4]).attr('data-id', repo_id).attr('data-name', repo_name);
var my_own_repos = $('#my-own-repos');
diff --git a/seahub/templates/snippets/shared_link_js.html b/seahub/templates/snippets/shared_link_js.html
index 92d66d6c01..ad440d58cd 100644
--- a/seahub/templates/snippets/shared_link_js.html
+++ b/seahub/templates/snippets/shared_link_js.html
@@ -1,12 +1,22 @@
{% load i18n %}
{% load url from future %}
-var share_list = [], contacts = [], contact_email;
-{% for contact in contacts %}
-contact_email = '{{ contact.contact_email }}';
-share_list.push({value: contact_email, label: contact_email});
-contacts.push({value:contact_email, avatar:'{{contact.avatar|safe}}'});
-{% endfor %}
+var share_list = [], contacts = [];
+$(function () {
+ $.ajax({
+ url:'{% url 'get_contacts' %}',
+ cache: false,
+ dataType: 'json',
+ success: function(data) {
+ var contact_list = data['contacts'], contact_email;
+ for (var i = 0, len = contact_list.length; i < len; i++) {
+ contact_email = contact_list[i].email;
+ share_list.push({value: contact_email, label: contact_email});
+ contacts.push({value:contact_email, avatar:contact_list[i].avatar});
+ }
+ }
+ });
+});
function showSharePopup(op, name, aj_urls, type, cur_path) {
var path;
diff --git a/seahub/templates/snippets/xss.html b/seahub/templates/snippets/xss.html
index 9b44838e7c..895e571644 100644
--- a/seahub/templates/snippets/xss.html
+++ b/seahub/templates/snippets/xss.html
@@ -1,5 +1,5 @@
function cleanHtmlForXss(html) {
- var tag_whitelist = /^(<\/?(h1|h2|h3|h4|h5|h6|p|ul|ol|li|dl|dt|dd|pre|blockquote|code|q|table|thead|tbody|tfoot|tr|th|td|em|strong|del|ins|sup|sub|s)>||<\/a>| | |<(br|hr)\s?\/?>)$/i; // is for with alignment in md extra syntax
+ var tag_whitelist = /^(<\/?(h1|h2|h3|h4|h5|h6|p|ul|ol|li|dl|dt|dd|pre|blockquote|code|q|cite|table|thead|tbody|tfoot|tr|th|td|em|strong|del|ins|sup|sub|s|div|span|a)(\s+.*)?>| |<(br|hr)\s?\/?>)$/i;
var str = html.replace(/<[^>]*>?/gim, function(tag){
var s;
diff --git a/seahub/urls.py b/seahub/urls.py
index c8f141a9c1..f50a56ebda 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -57,7 +57,6 @@ urlpatterns = patterns('',
# url(r'^home/public/reply/(?P[\d]+)/$', innerpub_msg_reply, name='innerpub_msg_reply'),
# url(r'^home/owner/(?P[^/]+)/$', ownerhome, name='ownerhome'),
- (r'^repo/create/$', repo_create),
(r'^repo/upload_check/$', validate_filename),
url(r'^repo/unsetinnerpub/(?P[-0-9a-f]{36})/$', unsetinnerpub, name='unsetinnerpub'),
url(r'^repo/set_password/$', repo_set_password, name="repo_set_password"),
@@ -74,7 +73,6 @@ urlpatterns = patterns('',
url(r'^repo/history/view/(?P[-0-9a-f]{36})/$', repo_history_view, name='repo_history_view'),
url(r'^repo/recycle/(?P[-0-9a-f]{36})/$', repo_recycle_view, name='repo_recycle_view'),
url(r'^repo/snapshot/view/(?P[-0-9a-f]{36})/$', repo_view_snapshot, name='repo_view_snapshot'),
- url(r'^repo/history/changes/(?P[-0-9a-f]{36})/$', repo_history_changes, name='repo_history_changes'),
url(r'^repo/(?P[-0-9a-f]{36})/files/$', view_file, name="repo_view_file"),
url(r'^repo/(?P[-0-9a-f]{36})/history/files/$', view_history_file, name="view_history_file"),
url(r'^repo/(?P[-0-9a-f]{36})/trash/files/$', view_trash_file, name="view_trash_file"),
@@ -100,7 +98,6 @@ urlpatterns = patterns('',
(r'^file_upload_progress_page/$', file_upload_progress_page),
url(r'^activities/$', activities, name='activities'),
url(r'^starred/$', starred, name='starred'),
- (r'^events/$', events), # ajax
(r'^pdf_full_view/$', pdf_full_view),
url(r'^i18n/$', i18n, name='i18n'),
url(r'^convert_cmmt_desc_link/$', convert_cmmt_desc_link, name='convert_cmmt_desc_link'),
@@ -112,13 +109,12 @@ 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[-0-9a-f]{36})/remove/$', repo_remove),
-
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/$', get_dirents, name="get_dirents"),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/delete/$', delete_dirents, name='delete_dirents'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/move/$', mv_dirents, name='mv_dirents'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dirents/copy/$', cp_dirents, name='cp_dirents'),
-
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/$', list_dir, name='repo_dir_data'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/more/$', list_dir_more, name='list_dir_more'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/new/$', new_dir, name='new_dir'),
@@ -127,11 +123,9 @@ urlpatterns = patterns('',
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/mv/$', mv_dir, name='mv_dir'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/cp/$', cp_dir, name='cp_dir'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/dir/sub_repo/$', sub_repo, name='sub_repo'),
-
url(r'^ajax/cp_progress/$', get_cp_progress, name='get_cp_progress'),
url(r'^ajax/multi_cp_progress/$', get_multi_cp_progress, name='get_multi_cp_progress'),
url(r'^ajax/cancel_cp/$', cancel_cp, name='cancel_cp'),
-
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/new/$', new_file, name='new_file'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/rename/$', rename_dirent, name='rename_file'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/delete/$', delete_dirent, name='delete_file'),
@@ -139,29 +133,26 @@ urlpatterns = patterns('',
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/cp/$', cp_file, name='cp_file'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/star/$', repo_star_file, name='repo_star_file'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file/unstar/$', repo_unstar_file, name='repo_unstar_file'),
-
url(r'^ajax/repo/(?P[-0-9a-f]{36})/current_commit/$', get_current_commit, name='get_current_commit'),
-
+ url(r'^ajax/repo/(?P[-0-9a-f]{36})/history/changes/$', repo_history_changes, name='repo_history_changes'),
url(r'^ajax/repo/(?P[-0-9a-f]{36})/encrypted_file/(?P[0-9a-f]{40})/download/$', download_enc_file, name='download_enc_file'),
-
url(r'^ajax/repo/(?P[-0-9a-f]{36})/file_op_url/$', get_file_op_url, name='get_file_op_url'),
-
url(r'^ajax/group/(?P\d+)/repos/$', get_unenc_group_repos, name='get_group_repos'),
url(r'^ajax/my-unenc-repos/$', get_my_unenc_repos, name='get_my_unenc_repos'),
url(r'^ajax/unenc-rw-repos/$', unenc_rw_repos, name='unenc_rw_repos'),
-
url(r'^ajax/contacts/$', get_contacts, name='get_contacts'),
url(r'^ajax/upload-file-done/$', upload_file_done, name='upload_file_done'),
url(r'^ajax/unseen-notices-count/$', unseen_notices_count, name='unseen_notices_count'),
url(r'^ajax/space_and_traffic/$', space_and_traffic, name='space_and_traffic'),
url(r'^ajax/my-shared-and-group-repos/$', my_shared_and_group_repos, name='my_shared_and_group_repos'),
+ url(r'^ajax/events/$', events, name="events"),
- ### organizaion ###
+ ### Organizaion ###
url(r'^pubinfo/libraries/$', pubrepo, name='pubrepo'),
- (r'^publicrepo/create/$', public_repo_create),
+ url(r'^ajax/publicrepo/create/$', public_repo_create, name='public_repo_create'),
url(r'^pubinfo/groups/$', pubgrp, name='pubgrp'),
url(r'^pubinfo/users/$', pubuser, name='pubuser'),
-
+
### Apps ###
(r'^api2/', include('seahub.api2.urls')),
(r'^avatar/', include('seahub.avatar.urls')),
diff --git a/seahub/utils/__init__.py b/seahub/utils/__init__.py
index e62539c880..0248b40d28 100644
--- a/seahub/utils/__init__.py
+++ b/seahub/utils/__init__.py
@@ -52,7 +52,12 @@ try:
from seahub.settings import ENABLE_INNER_HTTPSERVER
except ImportError:
ENABLE_INNER_HTTPSERVER = True
-
+
+try:
+ from seahub.settings import CHECK_SHARE_LINK_TRAFFIC
+except ImportError:
+ CHECK_SHARE_LINK_TRAFFIC = False
+
from seahub.utils.file_types import *
from seahub.utils.htmldiff import HtmlDiff
@@ -889,30 +894,32 @@ if EVENTS_CONFIG_FILE and hasattr(seafevents, 'get_user_traffic_stat'):
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):
+
+def user_traffic_over_limit(username):
+ """Return ``True`` if user traffic over the limit, otherwise ``False``.
+ """
+ if not CHECK_SHARE_LINK_TRAFFIC:
return 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
diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py
index a6587f00ea..8021c580e3 100644
--- a/seahub/views/__init__.py
+++ b/seahub/views/__init__.py
@@ -50,8 +50,7 @@ from seahub.notifications.models import UserNotification
from seahub.options.models import UserOptions, CryptoOptionNotSetError
from seahub.profile.models import Profile
from seahub.share.models import FileShare, PrivateFileDirShare, UploadLinkShare
-from seahub.forms import AddUserForm, RepoCreateForm, RepoPassowrdForm, \
- SharedRepoCreateForm, SetUserQuotaForm, RepoSettingForm
+from seahub.forms import RepoPassowrdForm, RepoSettingForm
from seahub.signals import repo_created, repo_deleted
from seahub.utils import render_permission_error, render_error, list_to_string, \
get_httpserver_root, gen_shared_upload_link, \
@@ -404,64 +403,6 @@ def repo_recycle_view(request, repo_id):
else:
return render_recycle_dir(request, repo_id, commit_id)
-@login_required
-def repo_save_settings(request):
- if request.method != 'POST':
- raise Http404
-
- username = request.user.username
- content_type = 'application/json; charset=utf-8'
-
- form = RepoSettingForm(request.POST)
- if form.is_valid():
- repo_id = form.cleaned_data['repo_id']
- repo_name = form.cleaned_data['repo_name']
- repo_desc = form.cleaned_data['repo_desc']
- days = form.cleaned_data['days']
- repo_owner = form.cleaned_data['repo_owner']
-
- 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)
-
- # check permission
- if request.user.org:
- org_repo_owner = seafile_api.get_org_repo_owner(repo_id)
- is_owner = True if org_repo_owner == username else False
- else:
- is_owner = True if is_repo_owner(username, repo_id) else False
- if not is_owner:
- err_msg = _(u'You do not have permission to perform this action.')
- return HttpResponse(json.dumps({'error': err_msg}),
- status=403, content_type=content_type)
-
- # Edit library info (name, descryption).
- if repo.name != repo_name or repo.desc != repo_desc:
- if not edit_repo(repo_id, repo_name, repo_desc, username):
- err_msg = _(u'Failed to edit library information.')
- return HttpResponse(json.dumps({'error': err_msg}),
- status=500, content_type=content_type)
-
- # set library history
- if days != None:
- res = set_repo_history_limit(repo_id, days)
- if res != 0:
- return HttpResponse(json.dumps({'error': _(u'Failed to save settings on server')}),
- status=400, content_type=content_type)
-
- # set library owner
- if repo_owner is not None and repo_owner != username:
- seafile_api.set_repo_owner(repo_id, repo_owner)
-
- messages.success(request, _(u'Settings saved.'))
- return HttpResponse(json.dumps({'success': True}),
- content_type=content_type)
- else:
- return HttpResponse(json.dumps({'error': str(form.errors.values()[0])}),
- status=400, content_type=content_type)
-
@login_required
def repo_settings(request, repo_id):
"""List and change library settings.
@@ -892,53 +833,6 @@ def get_diff(repo_id, arg1, arg2):
return lists
-@login_required
-def repo_history_changes(request, repo_id):
- if not request.is_ajax():
- return Http404
-
- changes = {}
- content_type = 'application/json; charset=utf-8'
-
- if not access_to_repo(request, repo_id, ''):
- return HttpResponse(json.dumps(changes), content_type=content_type)
-
- repo = get_repo(repo_id)
- if not repo:
- return HttpResponse(json.dumps(changes), content_type=content_type)
-
- username = request.user.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 is_passwd_set(repo_id, username):
- return HttpResponse(json.dumps(changes), content_type=content_type)
-
- commit_id = request.GET.get('commit_id', '')
- if not commit_id:
- return HttpResponse(json.dumps(changes), content_type=content_type)
-
- changes = get_diff(repo_id, '', commit_id)
-
- c = get_commit(repo.id, repo.version, commit_id)
- if c.parent_id is None:
- # A commit is a first commit only if it's parent id is None.
- changes['cmt_desc'] = repo.desc
- elif c.second_parent_id is None:
- # Normal commit only has one parent.
- if c.desc.startswith('Changed library'):
- changes['cmt_desc'] = _('Changed library name or description')
- else:
- # A commit is a merge only if it has two parents.
- changes['cmt_desc'] = _('No conflict in the merge.')
-
- return HttpResponse(json.dumps(changes), content_type=content_type)
-
@login_required
def modify_token(request, repo_id):
if not validate_owner(request, repo_id):
@@ -1118,7 +1012,7 @@ def myhome(request):
owned_repos = get_owned_repo_list(request)
calculate_repos_last_modify(owned_repos)
- repo_create_url = reverse(repo_create)
+ repo_create_url = reverse("repo_create")
return render_to_response('myhome.html', {
"owned_repos": owned_repos,
@@ -1274,62 +1168,6 @@ def client_unsync(request):
# return HttpResponse(serialized_data, content_type=content_type)
# else:
# return HttpResponseBadRequest(content_type=content_type)
-
-@login_required
-def public_repo_create(request):
- '''
- Handle ajax post to create public repo.
-
- '''
- if not request.is_ajax() or request.method != 'POST':
- return Http404
-
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- form = SharedRepoCreateForm(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']
- permission = form.cleaned_data['permission']
- 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']
-
- user = request.user.username
-
- try:
- if not encryption:
- repo_id = seafile_api.create_repo(repo_name, repo_desc, user, None)
- else:
- repo_id = seafile_api.create_enc_repo(uuid, repo_name, repo_desc, user, magic_str, encrypted_file_key, enc_version=2)
-
- # set this repo as inner pub
- seafile_api.add_inner_pub_repo(repo_id, permission)
- #seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission)
- except SearpcError as e:
- repo_id = None
- logger.error(e)
-
- if not repo_id:
- result['error'] = _(u'Internal Server Error')
- return HttpResponse(json.dumps(result), status=500,
- content_type=content_type)
- else:
- result['success'] = True
- repo_created.send(sender=None,
- org_id=-1,
- creator=user,
- repo_id=repo_id,
- repo_name=repo_name)
- return HttpResponse(json.dumps(result), content_type=content_type)
-
@login_required
def unsetinnerpub(request, repo_id):
repo = get_repo(repo_id)
@@ -1497,75 +1335,6 @@ def validate_filename(request):
content_type = 'application/json; charset=utf-8'
return HttpResponse(json.dumps(result), content_type=content_type)
-@login_required
-def repo_create(request):
- '''
- Handle ajax post to create a library.
-
- '''
- if not request.is_ajax() or request.method != 'POST':
- return Http404
-
- result = {}
- content_type = 'application/json; charset=utf-8'
-
- 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']
-
- username = request.user.username
- org_id = -1
- try:
- if not encryption:
- if is_org_context(request):
- org_id = request.user.org.org_id
- repo_id = seafile_api.create_org_repo(repo_name, repo_desc,
- username, None, org_id)
- else:
- repo_id = seafile_api.create_repo(repo_name, repo_desc,
- username, None)
- else:
- if is_org_context(request):
- org_id = request.user.org.org_id
- repo_id = seafile_api.create_org_enc_repo(
- uuid, repo_name, repo_desc, username, magic_str,
- encrypted_file_key, enc_version=2, org_id=org_id)
- else:
- repo_id = seafile_api.create_enc_repo(
- uuid, repo_name, repo_desc, username,
- magic_str, encrypted_file_key, enc_version=2)
- except SearpcError, e:
- logger.error(e)
- repo_id = None
-
- if not repo_id:
- result['error'] = _(u"Internal Server Error")
- return HttpResponse(json.dumps(result), status=500,
- content_type=content_type)
- else:
- result = {
- 'repo_id': repo_id,
- 'repo_name': repo_name,
- 'repo_desc': repo_desc,
- 'repo_enc': encryption,
- }
- repo_created.send(sender=None,
- org_id=org_id,
- creator=username,
- repo_id=repo_id,
- repo_name=repo_name)
- return HttpResponse(json.dumps(result), content_type=content_type)
-
def render_file_revisions (request, repo_id):
"""List all history versions of a file."""
path = request.GET.get('p', '/')
@@ -2073,31 +1842,6 @@ def activities(request):
'new_start': start,
}, context_instance=RequestContext(request))
-@login_required
-def events(request):
- if not request.is_ajax():
- raise Http404
-
- events_count = 15
- username = request.user.username
- start = int(request.GET.get('start'))
-
- # if request.cloud_mode:
- # org_id = request.GET.get('org_id')
- # events, start = get_org_user_events(org_id, username, start, events_count)
- # else:
- # events, start = get_user_events(username, start, events_count)
- events, start = get_user_events(username, start, events_count)
- events_more = True if len(events) == events_count else False
-
- event_groups = group_events_data(events)
- ctx = {'event_groups': event_groups}
- html = render_to_string("snippets/events_body.html", ctx)
-
- return HttpResponse(json.dumps({'html':html, 'events_more':events_more,
- 'new_start': start}),
- content_type='application/json; charset=utf-8')
-
def group_events_data(events):
"""
Group events according to the date.
diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py
index 680a41eef7..6f1cd46a78 100644
--- a/seahub/views/ajax.py
+++ b/seahub/views/ajax.py
@@ -5,14 +5,14 @@ import logging
import simplejson as json
from django.core.urlresolvers import reverse
-from django.http import HttpResponse, Http404
+from django.http import HttpResponse, Http404, HttpResponseBadRequest
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 _
import seaserv
-from seaserv import seafile_api, seafserv_rpc, \
+from seaserv import seafile_api, seafserv_rpc, is_passwd_set, \
get_related_users_by_repo, get_related_users_by_org_repo, \
CALC_SHARE_USAGE, seafserv_threaded_rpc, \
get_user_quota_usage, get_user_share_usage
@@ -20,21 +20,22 @@ from pysearpc import SearpcError
from seahub.auth.decorators import login_required
from seahub.contacts.models import Contact
-from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm
+from seahub.forms import RepoNewDirentForm, RepoRenameDirentForm, \
+ RepoCreateForm, SharedRepoCreateForm
from seahub.options.models import UserOptions, CryptoOptionNotSetError
from seahub.notifications.models import UserNotification
-from seahub.signals import upload_file_successful
+from seahub.signals import upload_file_successful, repo_created, repo_deleted
from seahub.views import get_repo_dirents, validate_owner, \
check_repo_access_permission, get_unencry_rw_repos_by_user, \
- get_system_default_repo_id
+ get_system_default_repo_id, access_to_repo, get_diff, group_events_data
from seahub.views.repo import get_nav_path, get_fileshare, get_dir_share_link, \
get_uploadlink, get_dir_shared_upload_link
import seahub.settings as settings
-from seahub.signals import repo_deleted
from seahub.utils import check_filename_with_rename, EMPTY_SHA1, \
gen_block_get_url, TRAFFIC_STATS_ENABLED, get_user_traffic_stat,\
new_merge_with_no_conflict, get_commit_before_new_merge, \
- get_repo_last_modify, gen_file_upload_url, is_org_context
+ get_repo_last_modify, gen_file_upload_url, is_org_context, \
+ get_org_user_events, get_user_events
from seahub.utils.star import star_file, unstar_file
# Get an instance of a logger
@@ -64,8 +65,6 @@ def get_dirents(request, repo_id):
content_type = 'application/json; charset=utf-8'
- username = request.user.username
-
# permission checking
user_perm = check_repo_access_permission(repo_id, request.user)
if user_perm is None:
@@ -1272,7 +1271,7 @@ def repo_remove(request, repo_id):
if get_system_default_repo_id() == repo_id:
result['error'] = _(u'System library can not be deleted.')
- return HttpResponse(json.dumps(result), status=403, content_type=content_type)
+ return HttpResponse(json.dumps(result), status=403, content_type=ct)
repo = get_repo(repo_id)
if not repo:
@@ -1327,7 +1326,6 @@ def space_and_traffic(request):
raise Http404
content_type = 'application/json; charset=utf-8'
- result = {}
username = request.user.username
@@ -1480,3 +1478,195 @@ def get_file_op_url(request, repo_id):
url = gen_file_upload_url(token, op_type + '-aj')
return HttpResponse(json.dumps({"url": url}), content_type=content_type)
+
+@login_required
+def repo_history_changes(request, repo_id):
+ if not request.is_ajax():
+ return Http404
+
+ changes = {}
+ content_type = 'application/json; charset=utf-8'
+
+ if not access_to_repo(request, repo_id, ''):
+ return HttpResponse(json.dumps(changes), content_type=content_type)
+
+ repo = get_repo(repo_id)
+ if not repo:
+ return HttpResponse(json.dumps(changes), content_type=content_type)
+
+ username = request.user.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 is_passwd_set(repo_id, username):
+ return HttpResponse(json.dumps(changes), content_type=content_type)
+
+ commit_id = request.GET.get('commit_id', '')
+ if not commit_id:
+ return HttpResponse(json.dumps(changes), content_type=content_type)
+
+ changes = get_diff(repo_id, '', commit_id)
+
+ c = get_commit(repo.id, repo.version, commit_id)
+ if c.parent_id is None:
+ # A commit is a first commit only if it's parent id is None.
+ changes['cmt_desc'] = repo.desc
+ elif c.second_parent_id is None:
+ # Normal commit only has one parent.
+ if c.desc.startswith('Changed library'):
+ changes['cmt_desc'] = _('Changed library name or description')
+ else:
+ # A commit is a merge only if it has two parents.
+ changes['cmt_desc'] = _('No conflict in the merge.')
+
+ return HttpResponse(json.dumps(changes), content_type=content_type)
+
+@login_required
+def repo_create(request):
+ '''
+ Handle ajax post to create a library.
+
+ '''
+ if not request.is_ajax() or request.method != 'POST':
+ return Http404
+
+ result = {}
+ content_type = 'application/json; charset=utf-8'
+
+ 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']
+
+ username = request.user.username
+
+ try:
+ if not encryption:
+ repo_id = seafile_api.create_repo(repo_name, repo_desc, username,
+ None)
+ else:
+ repo_id = seafile_api.create_enc_repo(
+ uuid, repo_name, repo_desc, username,
+ magic_str, encrypted_file_key, enc_version=2)
+ except SearpcError, e:
+ repo_id = None
+
+ if not repo_id:
+ result['error'] = _(u"Internal Server Error")
+ return HttpResponse(json.dumps(result), status=500,
+ content_type=content_type)
+
+ 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)
+
+ result = {
+ 'repo_id': repo_id,
+ 'repo_name': repo_name,
+ 'repo_desc': repo_desc,
+ 'repo_enc': encryption,
+ }
+ repo_created.send(sender=None,
+ org_id=-1,
+ creator=username,
+ repo_id=repo_id,
+ repo_name=repo_name)
+ return HttpResponse(json.dumps(result), content_type=content_type)
+
+@login_required
+def public_repo_create(request):
+ '''
+ Handle ajax post to create public repo.
+
+ '''
+ if not request.is_ajax() or request.method != 'POST':
+ return Http404
+
+ result = {}
+ content_type = 'application/json; charset=utf-8'
+
+ form = SharedRepoCreateForm(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']
+ permission = form.cleaned_data['permission']
+ 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']
+
+ user = request.user.username
+
+ try:
+ if not encryption:
+ repo_id = seafile_api.create_repo(repo_name, repo_desc, user, None)
+ else:
+ repo_id = seafile_api.create_enc_repo(uuid, repo_name, repo_desc, user, magic_str, encrypted_file_key, enc_version=2)
+
+ # set this repo as inner pub
+ seafile_api.add_inner_pub_repo(repo_id, permission)
+ #seafserv_threaded_rpc.set_inner_pub_repo(repo_id, permission)
+ except SearpcError as e:
+ repo_id = None
+ logger.error(e)
+
+ if not repo_id:
+ result['error'] = _(u'Internal Server Error')
+ return HttpResponse(json.dumps(result), status=500,
+ content_type=content_type)
+
+ result['success'] = True
+ repo_created.send(sender=None,
+ org_id=-1,
+ creator=user,
+ repo_id=repo_id,
+ repo_name=repo_name)
+ return HttpResponse(json.dumps(result), content_type=content_type)
+
+@login_required
+def events(request):
+ if not request.is_ajax():
+ raise Http404
+
+ events_count = 15
+ username = request.user.username
+ start = int(request.GET.get('start'))
+
+ # if request.cloud_mode:
+ # org_id = request.GET.get('org_id')
+ # events, start = get_org_user_events(org_id, username, start, events_count)
+ # else:
+ # events, start = get_user_events(username, start, events_count)
+ events, start = get_user_events(username, start, events_count)
+ events_more = True if len(events) == events_count else False
+
+ event_groups = group_events_data(events)
+ ctx = {'event_groups': event_groups}
+ html = render_to_string("snippets/events_body.html", ctx)
+
+ return HttpResponse(json.dumps({'html': html,
+ 'events_more': events_more,
+ 'new_start': start}),
+ content_type='application/json; charset=utf-8')
diff --git a/seahub/views/file.py b/seahub/views/file.py
index fdc7b8181c..2ce6ef1a2a 100644
--- a/seahub/views/file.py
+++ b/seahub/views/file.py
@@ -282,7 +282,8 @@ def file_size_exceeds_preview_limit(file_size, file_type):
return True, err
else:
return False, ''
-
+
+@login_required
@repo_passwd_set_required
def view_file(request, repo_id):
"""
@@ -367,7 +368,7 @@ def view_file(request, repo_id):
if len(img_list) > 1:
img_list.sort(lambda x, y : cmp(x.lower(), y.lower()))
- cur_img_index = img_list.index(u_filename)
+ cur_img_index = img_list.index(u_filename)
if cur_img_index != 0:
img_prev = posixpath.join(parent_dir, img_list[cur_img_index - 1])
if cur_img_index != len(img_list) - 1:
@@ -389,11 +390,6 @@ def view_file(request, repo_id):
else:
file_shared_link = ''
- # my contacts used in shared link autocomplete
- contacts = Contact.objects.filter(user_email=username)
- for c in contacts:
- c.avatar = avatar(c.contact_email, 16)
-
for g in request.user.joined_groups:
g.avatar = grp_avatar(g.id, 20)
@@ -405,15 +401,15 @@ def view_file(request, repo_id):
else:
repo_shared_groups = get_shared_groups_by_repo(repo_id)
# Filter out groups that user in joined.
- groups = [ x for x in repo_shared_groups if is_group_user(x.id, username)]
+ groups = [x for x in repo_shared_groups if is_group_user(x.id, username)]
if len(groups) > 1:
ctx = {}
ctx['groups'] = groups
repogrp_str = render_to_string("snippets/repo_group_list.html", ctx)
else:
- repogrp_str = ''
-
- file_path_hash = hashlib.md5(urllib2.quote(path.encode('utf-8'))).hexdigest()[:12]
+ repogrp_str = ''
+
+ file_path_hash = hashlib.md5(urllib2.quote(path.encode('utf-8'))).hexdigest()[:12]
# fetch file contributors and latest contributor
contributors, last_modified, last_commit_id = \
@@ -429,7 +425,7 @@ def view_file(request, repo_id):
is_starred = is_file_starred(username, repo.id, path.encode('utf-8'), org_id)
template = 'view_file_%s.html' % ret_dict['filetype'].lower()
-
+
search_repo_id = None
if not repo.encrypted:
search_repo_id = repo.id
@@ -447,17 +443,16 @@ def view_file(request, repo_id):
'protocol': http_or_https,
'domain': domain,
'file_shared_link': file_shared_link,
- 'contacts': contacts,
'err': ret_dict['err'],
'file_content': ret_dict['file_content'],
'file_enc': ret_dict['file_enc'],
'encoding': ret_dict['encoding'],
- 'file_encoding_list':ret_dict['file_encoding_list'],
+ 'file_encoding_list': ret_dict['file_encoding_list'],
'html_exists': ret_dict['html_exists'],
'html_detail': ret_dict.get('html_detail', {}),
'filetype': ret_dict['filetype'],
'groups': groups,
- 'use_pdfjs':USE_PDFJS,
+ 'use_pdfjs': USE_PDFJS,
'contributors': contributors,
'latest_contributor': latest_contributor,
'last_modified': last_modified,
diff --git a/seahub/views/repo.py b/seahub/views/repo.py
index c18676250d..c1c57bb1d7 100644
--- a/seahub/views/repo.py
+++ b/seahub/views/repo.py
@@ -189,10 +189,6 @@ def render_repo(request, repo):
protocol = request.is_secure() and 'https' or 'http'
domain = RequestSite(request).domain
- contacts = Contact.objects.get_contacts_by_user(username)
- for c in contacts:
- c.avatar = avatar(c.contact_email, 16)
-
for g in request.user.joined_groups:
g.avatar = grp_avatar(g.id, 20)
@@ -257,7 +253,6 @@ def render_repo(request, repo):
'httpserver_root': httpserver_root,
'protocol': protocol,
'domain': domain,
- 'contacts': contacts,
'fileshare': fileshare,
'dir_shared_link': dir_shared_link,
'uploadlink': uploadlink,