From b85ccbb24c980f696d7388e945cfa9f3e2ec8eec Mon Sep 17 00:00:00 2001 From: zhengxie Date: Mon, 24 Jun 2013 17:56:31 +0800 Subject: [PATCH] Added private share --- seahub/share/models.py | 80 ++++++++++++++ seahub/share/templates/repo/share_admin.html | 35 ++++++ seahub/share/views.py | 20 +++- seahub/templates/repo.html | 49 +++++++-- .../templates/snippets/repo_share_form.html | 1 - seahub/urls.py | 6 +- seahub/utils/__init__.py | 12 +++ seahub/views/file.py | 100 +++++++++++++++--- seahub/views/repo.py | 29 ++++- 9 files changed, 302 insertions(+), 30 deletions(-) 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 %} + + + + + + + + {% for e in priv_shares %} + + {% if e.s_type == 'f' %} + + {% else %} + + {% endif %} + + {% if e.out_or_in == 'out' %} + + {% else %} + + {% endif %} + + + {% endfor %} +
{% trans "File or Folder"%}{% trans "Library"%}{% trans "User"%}{% trans "Operations"%}
{{e.file_or_dir}}{{e.file_or_dir}}{{e.repo.name}}{{e.to_user|email2nickname}}{{e.from_user|email2nickname}}Unshare
+{% 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 @@
{% trans 'Download' %} {% if not repo.encrypted %} - {% trans "Share" %} + {% trans "Share" %} {% endif %} {% if ENABLE_SUB_LIBRARY and not repo.is_virtual %} {% trans "Sub-library" %} @@ -166,7 +166,7 @@ {% if user_perm == 'rw' %} {% trans "Update"%} {% if not repo.encrypted %} - {% trans "Share" %} + {% trans "Share" %} {% endif %} {% endif %}
@@ -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 @@ -