diff --git a/seahub/seadoc/apis.py b/seahub/seadoc/apis.py index 8fc0119f2c..02932c49ca 100644 --- a/seahub/seadoc/apis.py +++ b/seahub/seadoc/apis.py @@ -834,6 +834,7 @@ class SeadocRevisions(APIView): """ username = request.user.username # argument check + origin_file_uuid = request.GET.get('doc_uuid') repo_id = request.GET.get('repo_id') try: page = int(request.GET.get('page', '1')) @@ -844,7 +845,22 @@ class SeadocRevisions(APIView): start = (page - 1) * per_page limit = per_page + 1 - if repo_id: + if origin_file_uuid: + origin_uuid_map = FileUUIDMap.objects.get_fileuuidmap_by_uuid(origin_file_uuid) + if not origin_uuid_map: + error_msg = 'seadoc uuid %s not found.' % origin_file_uuid + return api_error(status.HTTP_404_NOT_FOUND, error_msg) + repo_id = origin_uuid_map.repo_id + username = request.user.username + path = posixpath.join(origin_uuid_map.parent_path, origin_uuid_map.filename) + # permission check + if not check_folder_permission(request, repo_id, path): + error_msg = 'Permission denied.' + return api_error(status.HTTP_403_FORBIDDEN, error_msg) + + revision_queryset = SeadocRevision.objects.list_by_origin_doc_uuid(origin_uuid_map.uuid, start, limit) + count = SeadocRevision.objects.filter(origin_doc_uuid=origin_uuid_map.uuid).count() + elif repo_id: # resource check repo = seafile_api.get_repo(repo_id) if not repo: @@ -915,6 +931,10 @@ class SeadocRevisions(APIView): # origin_file_uuid = get_seadoc_file_uuid(repo, path) + if SeadocRevision.objects.get_by_doc_uuid(origin_file_uuid): + error_msg = 'seadoc %s is already a revision.' % filename + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + origin_file_id = seafile_api.get_file_id_by_path(repo_id, path) revision_file_uuid = str(uuid.uuid4()) revision_filename = revision_file_uuid + '.sdoc' diff --git a/seahub/seadoc/models.py b/seahub/seadoc/models.py index 639466361d..4006f8f82c 100644 --- a/seahub/seadoc/models.py +++ b/seahub/seadoc/models.py @@ -54,10 +54,10 @@ class SeadocDraftManager(models.Manager): return self.filter(doc_uuid__in=doc_uuid_list) def list_by_username(self, username, start, limit): - return self.filter(username=username)[start:limit] + return self.filter(username=username).order_by('-id')[start:limit] def list_by_repo_id(self, repo_id, start, limit): - return self.filter(repo_id=repo_id)[start:limit] + return self.filter(repo_id=repo_id).order_by('-id')[start:limit] class SeadocDraft(models.Model): @@ -87,14 +87,17 @@ class SeadocRevisionManager(models.Manager): def list_by_doc_uuids(self, doc_uuid_list): return self.filter(doc_uuid__in=doc_uuid_list) - def list_by_origin_doc_uuid(self, origin_doc_uuid): - return self.filter(origin_doc_uuid=origin_doc_uuid) + def list_by_origin_doc_uuid(self, origin_doc_uuid, start, limit): + return self.filter( + origin_doc_uuid=origin_doc_uuid, is_published=False).order_by('-id')[start:limit] def list_by_username(self, username, start, limit): - return self.filter(username=username)[start:limit] + return self.filter( + username=username, is_published=False).order_by('-id')[start:limit] def list_by_repo_id(self, repo_id, start, limit): - return self.filter(repo_id=repo_id)[start:limit] + return self.filter( + repo_id=repo_id, is_published=False).order_by('-id')[start:limit] def publish(self, doc_uuid, publisher, publish_file_version): return self.filter(doc_uuid=doc_uuid).update( @@ -115,9 +118,9 @@ class SeadocRevision(models.Model): origin_file_version = models.CharField(max_length=100) publish_file_version = models.CharField(max_length=100, null=True) publisher = models.CharField(max_length=255, null=True) - is_published = models.BooleanField(default=False) - created_at = models.DateTimeField(auto_now_add=True, db_index=True) - updated_at = models.DateTimeField(auto_now=True, db_index=True) + is_published = models.BooleanField(default=False, db_index=True) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) objects = SeadocRevisionManager() diff --git a/seahub/seadoc/utils.py b/seahub/seadoc/utils.py index a03f28016b..5d9e7fd07c 100644 --- a/seahub/seadoc/utils.py +++ b/seahub/seadoc/utils.py @@ -15,6 +15,7 @@ from seahub.utils import normalize_file_path, gen_inner_file_get_url, gen_inner_ from seahub.views import check_folder_permission from seahub.base.templatetags.seahub_tags import email2nickname from seahub.avatar.templatetags.avatar_tags import api_avatar_url +from seahub.seadoc.models import SeadocRevision logger = logging.getLogger(__name__) @@ -172,3 +173,24 @@ def can_access_seadoc_asset(request, repo_id, path, file_uuid): return True return False + +def is_seadoc_revision(doc_uuid): + info = {} + revision = SeadocRevision.objects.get_by_doc_uuid(doc_uuid) + if revision: + info = {'is_sdoc_revision': True} + revision_info = revision.to_dict() + info['origin_doc_uuid'] = revision_info['origin_doc_uuid'] + info['origin_parent_path'] = revision_info['origin_parent_path'] + info['origin_filename'] = revision_info['origin_filename'] + info['origin_file_path'] = revision_info['origin_file_path'] + info['origin_file_version'] = revision_info['origin_file_version'] + info['publish_file_version'] = revision_info['publish_file_version'] + info['publisher'] = revision_info['publisher'] + info['publisher_nickname'] = revision_info['publisher_nickname'] + info['is_published'] = revision_info['is_published'] + info['revision_created_at'] = revision_info['created_at'] + info['revision_updated_at'] = revision_info['updated_at'] + else: + info = {'is_sdoc_revision': False} + return info diff --git a/seahub/templates/sdoc_file_view_react.html b/seahub/templates/sdoc_file_view_react.html index 4eb0ac9871..44106672a1 100644 --- a/seahub/templates/sdoc_file_view_react.html +++ b/seahub/templates/sdoc_file_view_react.html @@ -14,6 +14,18 @@ docUuid: '{{ file_uuid }}', assetsUrl: '{{ assets_url }}', seadocAccessToken: '{{ seadoc_access_token }}', seadocServerUrl: '{{ seadoc_server_url }}', +isSdocRevision: {% if is_sdoc_revision %}true{% else %}false{% endif %}, +originDocUuid: '{{ origin_doc_uuid }}', +originParentPath: '{{ origin_parent_path }}', +originFilename: '{{ origin_filename }}', +originFilePath: '{{ origin_file_path }}', +originFileVersion: '{{ origin_file_version }}', +publishFileVersion: '{{ publish_file_version }}', +publisher: '{{ publisher }}', +publisherNickname: '{{ publisher_nickname }}', +isPublished: {% if is_published %}true{% else %}false{% endif %}, +revisionCreatedAt: '{{ revision_created_at }}', +revisionUpdatedAt: '{{ revision_updated_at }}', {% endblock %} {% block render_bundle %} diff --git a/seahub/views/file.py b/seahub/views/file.py index 8f05137c97..7199f82526 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -75,7 +75,7 @@ from seahub.thumbnail.utils import extract_xmind_image, get_thumbnail_src, \ XMIND_IMAGE_SIZE, get_share_link_thumbnail_src, get_thumbnail_image_path from seahub.drafts.utils import get_file_draft, \ is_draft_file, has_draft_file -from seahub.seadoc.utils import get_seadoc_file_uuid, gen_seadoc_access_token +from seahub.seadoc.utils import get_seadoc_file_uuid, gen_seadoc_access_token, is_seadoc_revision if HAS_OFFICE_CONVERTER: from seahub.utils import ( @@ -666,6 +666,10 @@ def view_lib_file(request, repo_id, path): return_dict['can_edit_file'] = can_edit_file return_dict['seadoc_access_token'] = gen_seadoc_access_token(file_uuid, filename, username, permission=seadoc_perm) + # revision + revision_info = is_seadoc_revision(file_uuid) + return_dict.update(revision_info) + send_file_access_msg(request, repo, path, 'web') return render(request, template, return_dict) diff --git a/sql/mysql.sql b/sql/mysql.sql index 73b94a3572..574f41b8fc 100644 --- a/sql/mysql.sql +++ b/sql/mysql.sql @@ -1416,6 +1416,5 @@ CREATE TABLE `sdoc_revision` ( KEY `sdoc_revision_repo_id` (`repo_id`), KEY `sdoc_revision_origin_doc_uuid` (`origin_doc_uuid`), KEY `sdoc_revision_username` (`username`), - KEY `sdoc_revision_created_at` (`created_at`), - KEY `sdoc_revision_updated_at` (`updated_at`) + KEY `sdoc_revision_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;