diff --git a/seahub/api2/urls.py b/seahub/api2/urls.py index 0642ef19bf..1679a61815 100644 --- a/seahub/api2/urls.py +++ b/seahub/api2/urls.py @@ -19,6 +19,7 @@ urlpatterns = patterns('', url(r'^regdevice/$', RegDevice.as_view(), name="regdevice"), url(r'^search/$', Search.as_view(), name='api_search'), url(r'^repos/$', Repos.as_view(), name="api2-repos"), + url(r'^repos/public/$', PubRepos.as_view(), name="api2-pub-repos"), url(r'^repos/(?P[-0-9a-f]{36})/$', Repo.as_view(), name="api2-repo"), url(r'^repos/(?P[-0-9a-f]{36})/history/$', RepoHistory.as_view()), url(r'^repos/(?P[-0-9a-f]{36})/download-info/$', DownloadRepo.as_view()), diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 13428b821d..f92b9c6b3c 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -693,7 +693,7 @@ class Repos(APIView): if not repo_name: return api_error(status.HTTP_400_BAD_REQUEST, 'Library name is required.') - repo_desc = request.DATA.get("desc", 'new repo') + repo_desc = request.DATA.get("desc", '') passwd = request.DATA.get("passwd", None) if not passwd: passwd = None @@ -729,6 +729,90 @@ class Repos(APIView): # resp['Location'] = reverse('api2-repo', args=[repo_id]) return resp +class PubRepos(APIView): + authentication_classes = (TokenAuthentication, SessionAuthentication) + permission_classes = (IsAuthenticated,) + throttle_classes = (UserRateThrottle, ) + + def get(self, request, format=None): + # List public repos + if not request.user.permissions.can_view_org(): + return api_error(status.HTTP_403_FORBIDDEN, + 'You do not have permission to view pub repos.') + + repos_json = [] + public_repos = list_inner_pub_repos(request) + for r in public_repos: + repo = { + "id": r.repo_id, + "name": r.repo_name, + "desc": r.repo_desc, + "owner": r.user, + "owner_nickname": email2nickname(r.user), + "mtime": r.last_modified, + "mtime_relative": translate_seahub_time(r.last_modified), + "size": r.size, + "size_formatted": filesizeformat(r.size), + "encrypted": r.encrypted, + "permission": r.permission, + "root": r.root, + } + if r.encrypted: + repo["enc_version"] = r.enc_version + repo["magic"] = r.magic + repo["random_key"] = r.random_key + repos_json.append(repo) + + return Response(repos_json) + + def post(self, request, format=None): + # Create public repo + if not request.user.permissions.can_add_repo(): + return api_error(status.HTTP_403_FORBIDDEN, + 'You do not have permission to create library.') + + username = request.user.username + repo_name = request.DATA.get("name", None) + if not repo_name: + return api_error(status.HTTP_400_BAD_REQUEST, + 'Library name is required.') + repo_desc = request.DATA.get("desc", '') + passwd = request.DATA.get("passwd", None) + if not passwd: + passwd = None + permission = request.DATA.get("permission", 'r') + if permission != 'r' and permission != 'rw': + return api_error(status.HTTP_400_BAD_REQUEST, 'Invalid permission') + + if is_org_context(request): + org_id = request.user.org.org_id + repo_id = seafile_api.create_org_repo(repo_name, repo_desc, + username, passwd, org_id) + repo = seafile_api.get_repo(repo_id) + seaserv.seafserv_threaded_rpc.set_org_inner_pub_repo( + org_id, repo.id, permission) + else: + repo_id = seafile_api.create_repo(repo_name, repo_desc, + username, passwd) + repo = seafile_api.get_repo(repo_id) + seafile_api.add_inner_pub_repo(repo.id, permission) + + pub_repo = { + "id": repo.id, + "name": repo.name, + "desc": repo.desc, + "size": repo.size, + "size_formatted": filesizeformat(repo.size), + "mtime": repo.last_modify, + "mtime_relative": translate_seahub_time(repo.last_modify), + "encrypted": repo.encrypted, + "permission": 'rw', # Always have read-write permission to owned repo + "owner": username, + "owner_nickname": email2nickname(username), + } + + return Response(pub_repo, status=201) + def set_repo_password(request, repo, password): assert password, 'password must not be none' @@ -3011,7 +3095,7 @@ class GroupRepos(APIView): # add group repo username = request.user.username repo_name = request.DATA.get("name", None) - repo_desc = request.DATA.get("desc", 'new repo') + repo_desc = request.DATA.get("desc", '') passwd = request.DATA.get("passwd", None) if not passwd: passwd = None @@ -3044,7 +3128,7 @@ class GroupRepos(APIView): "encrypted": repo.encrypted, "permission": 'rw', # Always have read-write permission to owned repo "owner": username, - "owner_nickname": email2nickname(username) + "owner_nickname": email2nickname(username), } return Response(group_repo, status=200) diff --git a/seahub/templates/js/templates.html b/seahub/templates/js/templates.html index 5630a8f8ce..b6d221031e 100644 --- a/seahub/templates/js/templates.html +++ b/seahub/templates/js/templates.html @@ -85,7 +85,7 @@ <%- size_formatted %> <%= mtime_relative %> - <%- share_from %> + <%- owner_nickname %> diff --git a/static/scripts/app/collections/pub-repos.js b/static/scripts/app/collections/pub-repos.js new file mode 100644 index 0000000000..4211d4fa10 --- /dev/null +++ b/static/scripts/app/collections/pub-repos.js @@ -0,0 +1,17 @@ +define([ + 'underscore', + 'backbone', + 'app/models/pub-repo' +], function(_, Backbone, PubRepo) { + 'use strict'; + + var PubRepoCollection = Backbone.Collection.extend({ + model: PubRepo, + url: app.pageOptions.pubReposUrl, + + comparator: -'mtime', + + }); + + return PubRepoCollection; +}); diff --git a/static/scripts/app/models/pub-repo.js b/static/scripts/app/models/pub-repo.js new file mode 100644 index 0000000000..de7f81a056 --- /dev/null +++ b/static/scripts/app/models/pub-repo.js @@ -0,0 +1,17 @@ +define([ + 'underscore', + 'backbone', + 'app/models/repo' +], function(_, Backbone, Repo) { + 'use strict'; + + var PubRepo = Repo.extend({ + defaults: { + permission: "r", + } + }); + + _.extend(PubRepo.prototype.defaults, Repo.prototype.defaults); + + return PubRepo; +}); diff --git a/static/scripts/app/views/add-pub-repo.js b/static/scripts/app/views/add-pub-repo.js new file mode 100644 index 0000000000..8108af011c --- /dev/null +++ b/static/scripts/app/views/add-pub-repo.js @@ -0,0 +1,27 @@ +define([ + 'jquery', + 'simplemodal', + 'underscore', + 'backbone', + 'common', + 'app/views/add-repo' +], function($, simplemodal, _, Backbone, Common, AddRepoView) { + 'use strict'; + + var AddPubRepoView = AddRepoView.extend({ + templateData: function() { + return { + showSharePerm: true + }; + }, + + newAttributes: function() { + var baseAttrs = AddRepoView.prototype.newAttributes.apply(this); + + return _.extend(baseAttrs, {'permission': $('select[name=permission]', this.$el).val()}); + }, + + }); + + return AddPubRepoView; +}); diff --git a/static/scripts/app/views/organization.js b/static/scripts/app/views/organization.js index 19f214e6d6..00a201fafc 100644 --- a/static/scripts/app/views/organization.js +++ b/static/scripts/app/views/organization.js @@ -3,25 +3,28 @@ define([ 'underscore', 'backbone', 'common', - 'app/collections/repos', + 'app/collections/pub-repos', 'app/views/organization-repo', 'app/views/dir', 'app/views/group-nav', -], function($, _, Backbone, Common, RepoCollection, OrganizationRepoView, - DirView, GroupNavView) { + 'app/views/add-pub-repo' +], function($, _, Backbone, Common, PubRepoCollection, OrganizationRepoView, + DirView, GroupNavView, AddPubRepoView) { 'use strict'; var OrganizationView = Backbone.View.extend({ el: '#main', initialize: function() { + Common.prepareApiCsrf(); + this.$reposDiv = $('#organization-repos'); this.$table = $('#organization-repos table'); this.$tableBody = $('tbody', this.$table); this.$loadingTip = $('#organization-repos .loading-tip'); this.$emptyTip = $('#organization-repos .empty-tips'); - this.repos = new RepoCollection({type: 'org'}); + this.repos = new PubRepoCollection(); this.listenTo(this.repos, 'add', this.addOne); this.listenTo(this.repos, 'reset', this.reset); @@ -39,7 +42,7 @@ define([ }, createRepo: function() { - alert('todo'); + new AddPubRepoView(this.repos).render(); }, addOne: function(repo, collection, options) {