diff --git a/seahub/share/models.py b/seahub/share/models.py
index a9a250a17f..d57b19a268 100644
--- a/seahub/share/models.py
+++ b/seahub/share/models.py
@@ -1,6 +1,8 @@
import datetime
from django.db import models
+from seahub.utils import normalize_file_path, normalize_dir_path
+
class AnonymousShare(models.Model):
"""
Model used for sharing repo to unregistered email.
@@ -21,3 +23,81 @@ class FileShare(models.Model):
ctime = models.DateTimeField(default=datetime.datetime.now)
view_cnt = models.IntegerField(default=0)
s_type = models.CharField(max_length=2, db_index=True, default='f') # `f` or `d`
+
+
+class PrivateFileDirShareManager(models.Manager):
+ def add_private_file_share(self, from_user, to_user, repo_id, path, perm):
+ """
+ """
+ path = normalize_file_path(path)
+
+ pfs = self.model(from_user=from_user, to_user=to_user, repo_id=repo_id,
+ path=path, s_type='f', permission=perm)
+ pfs.save(using=self._db)
+ return pfs
+
+ def get_private_share_in_file(self, username, repo_id, path):
+ """Get a file that private shared to ``username``.
+ """
+ path = normalize_file_path(path)
+
+ ret = super(PrivateFileDirShareManager, self).filter(
+ to_user=username, repo_id=repo_id, path=path, s_type='f')
+ return ret[0] if len(ret) > 0 else None
+
+ def add_private_dir_share(self, from_user, to_user, repo_id, path, perm):
+ """
+ """
+ path = normalize_dir_path(path)
+
+ pfs = self.model(from_user=from_user, to_user=to_user, repo_id=repo_id,
+ path=path, s_type='d', permission=perm)
+ pfs.save(using=self._db)
+ return pfs
+
+ def get_private_share_in_dir(self, username, repo_id, path):
+ """Get a directory that private shared to ``username``.
+ """
+ path = normalize_dir_path(path)
+
+ ret = super(PrivateFileDirShareManager, self).filter(
+ to_user=username, repo_id=repo_id, path=path, s_type='d')
+ return ret[0] if len(ret) > 0 else None
+
+ def delete_private_file_dir_share(self, from_user, to_user, repo_id, path):
+ """
+ """
+ super(PrivateFileDirShareManager, self).filter(
+ from_user=from_user, to_user=to_user, repo_id=repo_id,
+ path=path).delete()
+
+ def list_private_share_out_by_user(self, from_user):
+ """List files/directories private shared from ``from_user``.
+ """
+ return super(PrivateFileDirShareManager, self).filter(
+ from_user=from_user)
+
+ def list_private_share_in_by_user(self, to_user):
+ """List files/directories private shared to ``to_user``.
+ """
+ return super(PrivateFileDirShareManager, self).filter(
+ to_user=to_user)
+
+ def list_private_share_in_dirs_by_user_and_repo(self, to_user, repo_id):
+ """List directories private shared to ``to_user`` base on ``repo_id``.
+ """
+ return super(PrivateFileDirShareManager, self).filter(
+ to_user=to_user, repo_id=repo_id)
+
+
+class PrivateFileDirShare(models.Model):
+ from_user = models.CharField(max_length=255, db_index=True)
+ to_user = models.CharField(max_length=255, db_index=True)
+ repo_id = models.CharField(max_length=36, db_index=True)
+ path = models.TextField()
+ permission = models.CharField(max_length=2) # `r` or `rw`
+ s_type = models.CharField(max_length=2, default='f') # `f` or `d`
+ objects = PrivateFileDirShareManager()
+
+
+
diff --git a/seahub/share/templates/repo/share_admin.html b/seahub/share/templates/repo/share_admin.html
index 26cbf260f4..36276e9e3a 100644
--- a/seahub/share/templates/repo/share_admin.html
+++ b/seahub/share/templates/repo/share_admin.html
@@ -109,6 +109,41 @@
{% trans "You can share a folder or a file when you view a library, or share a file when you view it." %}
{% endif %}
+
+{% trans "Private shares" %}
+{% if priv_shares %}
+
+
+ {% trans "File or Folder"%} |
+ {% trans "Library"%} |
+ {% trans "User"%} |
+ {% trans "Operations"%} |
+
+ {% for e in priv_shares %}
+
+ {% if e.s_type == 'f' %}
+ {{e.file_or_dir}} |
+ {% else %}
+ {{e.file_or_dir}} |
+ {% endif %}
+ {{e.repo.name}} |
+ {% if e.out_or_in == 'out' %}
+ {{e.to_user|email2nickname}} |
+ {% else %}
+ {{e.from_user|email2nickname}} |
+ {% endif %}
+ Unshare |
+
+ {% endfor %}
+
+{% else%}
+
+
{% trans "You don't have any private shared files/folders" %}
+
{% trans "You can share a single folder or file to a registered user if you don't want to share hole library to he/she." %}
+
+{% endif %}
+
+
{% endblock %}
{% block extra_script %}
diff --git a/seahub/share/views.py b/seahub/share/views.py
index 50d8966d2f..1541f96012 100644
--- a/seahub/share/views.py
+++ b/seahub/share/views.py
@@ -24,7 +24,7 @@ from seaserv import seafserv_threaded_rpc, get_repo, ccnet_rpc, \
list_inner_pub_repos_by_owner, remove_share
from forms import RepoShareForm, FileLinkShareForm
-from models import AnonymousShare
+from models import AnonymousShare, FileShare, PrivateFileDirShare
from signals import share_repo_to_user_successful
from settings import ANONYMOUS_SHARE_COOKIE_TIMEOUT
from tokens import anon_share_token_generator
@@ -32,7 +32,6 @@ from seahub.auth.decorators import login_required
from seahub.base.accounts import User
from seahub.contacts.models import Contact
from seahub.contacts.signals import mail_sended
-from seahub.share.models import FileShare
from seahub.views import validate_owner, is_registered_user
from seahub.utils import render_permission_error, string2list, render_error, \
gen_token, gen_shared_link, gen_dir_share_link, gen_file_share_link, \
@@ -324,12 +323,27 @@ def share_admin(request):
continue
fs.repo = r
p_fileshares.append(fs)
-
+
+ # Private share out/in files/directories
+ priv_share_out = PrivateFileDirShare.objects.list_private_share_out_by_user(username)
+ for e in priv_share_out:
+ e.file_or_dir = os.path.basename(e.path.rstrip('/'))
+ e.out_or_in = 'out'
+ e.repo = seafile_api.get_repo(e.repo_id)
+
+ priv_share_in = PrivateFileDirShare.objects.list_private_share_in_by_user(username)
+ for e in priv_share_in:
+ e.file_or_dir = os.path.basename(e.path.rstrip('/'))
+ e.out_or_in = 'in'
+ e.repo = seafile_api.get_repo(e.repo_id)
+ priv_shares = list(priv_share_out) + list(priv_share_in)
+
return render_to_response('repo/share_admin.html', {
"org": None,
"shared_repos": shared_repos,
# "out_links": out_links,
"fileshares": p_fileshares,
+ "priv_shares": priv_shares,
}, context_instance=RequestContext(request))
@login_required
diff --git a/seahub/templates/repo.html b/seahub/templates/repo.html
index e691100b0f..ca892dcce8 100644
--- a/seahub/templates/repo.html
+++ b/seahub/templates/repo.html
@@ -117,7 +117,7 @@
@@ -328,17 +328,42 @@
{% trans 'Share' %}
-
{% trans 'Link: ' %}
-
-
+
{% with attach_type='dir' %}
{% include "snippets/group_recommend_form.html" %}
@@ -656,6 +681,15 @@ $('.file-star').click(function() {
//file share
$('.file-share').click(function() {
+ $("#private-share-form input[name=s_type]").val($(this).data('type'));
+ $("#private-share-form input[name=path]").val($(this).data('path'));
+ var contacts = [];
+ {% for contact in contacts %}
+ contact_email = '{{ contact.contact_email }}';
+ contacts.push({value:contact_email, label:contact_email});
+ {% endfor %}
+ addAutocomplete('#emails', '#private-share-form', contacts);
+
var filename = $(this).data('name');
function showPopup(link) {
$('#file-share .op-target').html(trimFilename(filename, 30));
@@ -663,6 +697,7 @@ $('.file-share').click(function() {
$('#main').append('' + link + '
');
$('#shared-link-text').css({'width':$('#linkwidth').width() + 2});
$('#file-share').modal({'focus':false}); // in ff: if 'focus' is true, 'shared-link-text' gets the focus
+ $("#repo-share-tabs").tabs();
$('#linkwidth').remove();
$('#simplemodal-container').css({'height':'auto'});
}
diff --git a/seahub/templates/snippets/repo_share_form.html b/seahub/templates/snippets/repo_share_form.html
index a8e9d544a2..b86fdbb86c 100644
--- a/seahub/templates/snippets/repo_share_form.html
+++ b/seahub/templates/snippets/repo_share_form.html
@@ -42,7 +42,6 @@
-