def post(self, request, format=None): """Add a new wiki. """ result = {} content_type = 'application/json; charset=utf-8' name = request.POST.get('name', '') if not name: return api_error(status.HTTP_400_BAD_REQUEST, _('Name is required.')) if not is_valid_wiki_name(name): msg = _( 'Name can only contain letters, numbers, blank, hyphen or underscore.' ) return api_error(status.HTTP_400_BAD_REQUEST, msg) permission = request.POST.get('permission', '').lower() if permission not in [x[0] for x in Wiki.PERM_CHOICES]: msg = 'Permission invalid' return api_error(status.HTTP_400_BAD_REQUEST, msg) org_id = -1 if is_org_context(request): org_id = request.user.org.org_id username = request.user.username try: wiki = Wiki.objects.add(name, username, permission=permission, org_id=org_id) except DuplicateWikiNameError: result['error'] = _( '%s is taken by others, please try another name.') % name return HttpResponse(json.dumps(result), status=400, content_type=content_type) except IntegrityError: result['error'] = 'Internal Server Error' return HttpResponse(json.dumps(result), status=500, content_type=content_type) # create home page page_name = "home.md" try: seafile_api.post_empty_file(wiki.repo_id, '/', page_name, request.user.username) except SearpcError as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return Response(wiki.to_dict())
def post(self, request, slug): """Rename a Wiki """ username = request.user.username try: wiki = Wiki.objects.get(slug=slug) except Wiki.DoesNotExist: error_msg = _("Wiki not found.") return api_error(status.HTTP_404_NOT_FOUND, error_msg) if wiki.username != username: error_msg = _("Permission denied.") return api_error(status.HTTP_403_FORBIDDEN, error_msg) wiki_name = request.POST.get('wiki_name', '') if not wiki_name: error_msg = _('Name is required.') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) if not is_valid_wiki_name(wiki_name): msg = _( 'Name can only contain letters, numbers, blank, hyphen or underscore.' ) return api_error(status.HTTP_400_BAD_REQUEST, msg) wiki_slug = slugfy_wiki_name(wiki_name) wiki_exist = Wiki.objects.filter(slug=wiki_slug) if wiki_exist.exists(): msg = _( '%s is taken by others, please try another name.') % wiki_name return api_error(status.HTTP_400_BAD_REQUEST, msg) if edit_repo(wiki.repo_id, wiki_name, '', username): wiki.slug = wiki_slug wiki.name = wiki_name wiki.save() else: return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, "Unable to rename wiki") return Response(wiki.to_dict())
def post(self, request, slug): """Rename a Wiki """ username = request.user.username try: wiki = Wiki.objects.get(slug=slug) except Wiki.DoesNotExist: error_msg = _("Wiki not found.") return api_error(status.HTTP_404_NOT_FOUND, error_msg) if wiki.username != username: error_msg = _("Permission denied.") return api_error(status.HTTP_403_FORBIDDEN, error_msg) wiki_name = request.POST.get('wiki_name', '') if not wiki_name: error_msg = _('Name is required.') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) if not is_valid_wiki_name(wiki_name): msg = _('Name can only contain letters, numbers, blank, hyphen or underscore.') return api_error(status.HTTP_400_BAD_REQUEST, msg) wiki_slug = slugfy_wiki_name(wiki_name) wiki_exist = Wiki.objects.filter(slug=wiki_slug) if wiki_exist.exists(): msg = _('%s is taken by others, please try another name.') % wiki_name return api_error(status.HTTP_400_BAD_REQUEST, msg) if edit_repo(wiki.repo_id, wiki_name, '', username): wiki.slug = wiki_slug wiki.name = wiki_name wiki.save() else: return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, "Unable to rename wiki") return Response(wiki.to_dict())
def post(self, request, format=None): """Add a new wiki. """ use_exist_repo = request.POST.get('use_exist_repo', '') if not use_exist_repo: msg = 'Use exist repo is invalid' return api_error(status.HTTP_400_BAD_REQUEST, msg) name = request.POST.get('name', '') if not name: msg = 'Name is invalid' return api_error(status.HTTP_400_BAD_REQUEST, msg) if not is_valid_wiki_name(name): msg = _('Name can only contain letters, numbers, blank, hyphen or underscore.') return api_error(status.HTTP_400_BAD_REQUEST, msg) username = request.user.username org_id = -1 if is_org_context(request): org_id = request.user.org.org_id if use_exist_repo == 'false': try: wiki = Wiki.objects.add(name, username, org_id=org_id) except DuplicateWikiNameError: msg = _('%s is taken by others, please try another name.') % name return api_error(status.HTTP_400_BAD_REQUEST, msg) except IntegrityError: msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, msg) # create home page page_name = "home.md" try: seafile_api.post_empty_file(wiki.repo_id, '/', page_name, request.user.username) except SearpcError as e: logger.error(e) msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, msg) return Response(wiki.to_dict()) if use_exist_repo == 'true': repo_id = request.POST.get('repo_id', '') if not repo_id: msg = 'Repo id is invalid.' return api_error(status.HTTP_400_BAD_REQUEST, msg) repo = seafile_api.get_repo(repo_id) if check_folder_permission(request, repo_id, '/') != 'rw': error_msg = _('Permission denied.') return api_error(status.HTTP_403_FORBIDDEN, error_msg) try: wiki = Wiki.objects.add(wiki_name=repo.repo_name, username=username, repo_id=repo.repo_id, org_id=org_id) except DuplicateWikiNameError: msg = _('%s is taken by others, please try another name.') % repo.repo_name return api_error(status.HTTP_400_BAD_REQUEST, msg) except IntegrityError: msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, msg) # create home page if not exist page_name = "home.md" if not seafile_api.get_file_id_by_path(repo_id, "/" + page_name): try: seafile_api.post_empty_file(repo_id, '/', page_name, username) except SearpcError as e: logger.error(e) msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, msg) return Response(wiki.to_dict())
def test_valid_name(self): assert is_valid_wiki_name('a -_123') is True assert is_valid_wiki_name('维基 abc') is True
def test_invalid_name(self): assert is_valid_wiki_name('aa/.') is False assert is_valid_wiki_name(' ') is False