diff --git a/CHANGES.md b/CHANGES.md index 5e17c95..fe8982a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,8 @@ - 添加基于用户的API模块,支持通过用户Token获取文集、新建文档和上传图片; - 优化文档编辑页面布局; +- 添加文集协作者功能,文集支持多用户协同协作了; +- 修改文档阅读页面的文档内链接新窗口打开; ### v0.3.3 2020-03-21 diff --git a/README.md b/README.md index b21547e..f5514f0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MrDoc - 记录文档,汇聚思想 +## MrDoc - 记录文档,汇聚思想 ![Mrdoc首页](./docs/mrdoc_2019080101.gif) @@ -8,14 +8,14 @@ MarkDown快速书写,两栏式阅读布局,清晰高效浏览。 -当前版本为:**v0.3.4**,版本发布时间为**2020-03-29** +当前版本为:**v0.3.4**,版本发布时间为**2020-04-03** 完整更新记录详见:[CHANGES.md](./CHANGES.md) MrDoc拥有以下特点: - 简洁的站点与用户系统 - - 基于Django自带的用户模型,实现简单高效的用户管理,支持用户注册、用户登录、管理员等控制等功能; + - 支持用户注册、用户登录、用户管理、管理员等控制等功能; - 支持全站关闭注册; - 支持注册邀请码配置; - 支持广告位自定义配置; @@ -29,6 +29,8 @@ MrDoc拥有以下特点: - 支持三级目录层级显示; - 支持文集后台导出为markdown文本格式.md文件、前台导出为EPUB电子书; - 基于文集进行权限控制,提供公开、私密、指定用户可见、访问码可见4种权限模式; + - 支持基于账户的API接口,可以借助账户token通过API获取文集、上传图片和创建文档; + - 支持文集协作功能,一个文集可以拥有一个创建者和多个协作者,可灵活选择协作权限; 在开发过程中,参考和借鉴了GitBook、ShowDoc、Wordbook等应用和网站的功能与样式,并使用了众多开源组件、插件。 diff --git a/app_doc/migrations/0015_projectcollaborator.py b/app_doc/migrations/0015_projectcollaborator.py new file mode 100644 index 0000000..b3ccd84 --- /dev/null +++ b/app_doc/migrations/0015_projectcollaborator.py @@ -0,0 +1,31 @@ +# Generated by Django 2.2.11 on 2020-03-30 21:14 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('app_doc', '0014_auto_20200322_1459'), + ] + + operations = [ + migrations.CreateModel( + name='ProjectCollaborator', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('role', models.IntegerField(choices=[(0, 0), (1, 1)], default=0, verbose_name='协作模式')), + ('create_time', models.DateTimeField(auto_now=True, verbose_name='添加时间')), + ('modify_time', models.DateTimeField(auto_now_add=True, verbose_name='修改时间')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app_doc.Project')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': '文集协作', + 'verbose_name_plural': '文集协作', + }, + ), + ] diff --git a/app_doc/models.py b/app_doc/models.py index 61dbc34..f168427 100644 --- a/app_doc/models.py +++ b/app_doc/models.py @@ -26,21 +26,21 @@ class Project(models.Model): "pro_id":self.pk} ) -# # 文集协作模型 -# class ProjectCollaborator(models.Model): -# project = models.ForeignKey(Project,on_delete=models.CASCADE) -# user = models.ForeignKey(User,on_delete=models.CASCADE) -# # 用户的协作模式:0表示可新建文档可修改删除自己新建的文档,1表示可新建文档可修改删除所有文档 -# role = models.IntegerField(choices=((0,0),(1,1)),default=0,verbose_name='协作模式') -# create_time = models.DateTimeField(auto_now=True,verbose_name='添加时间') -# modify_time = models.DateTimeField(auto_now_add=True,verbose_name='修改时间') -# -# def __str__(self): -# return self.project -# -# class Meta: -# verbose_name = '文集协作' -# verbose_name_plural = verbose_name +# 文集协作模型 +class ProjectCollaborator(models.Model): + project = models.ForeignKey(Project,on_delete=models.CASCADE) # 文集 + user = models.ForeignKey(User,on_delete=models.CASCADE) # 用户 + # 用户的协作模式:0表示可新建文档,可修改、删除自己新建的文档,1表示可新建文档,可删除自己创建的文档、可修改所有文档 + role = models.IntegerField(choices=((0,0),(1,1)),default=0,verbose_name='协作模式') + create_time = models.DateTimeField(auto_now=True,verbose_name='添加时间') + modify_time = models.DateTimeField(auto_now_add=True,verbose_name='修改时间') + + def __str__(self): + return self.project + + class Meta: + verbose_name = '文集协作' + verbose_name_plural = verbose_name # 文档模型 class Doc(models.Model): diff --git a/app_doc/templatetags/doc_filter.py b/app_doc/templatetags/doc_filter.py index c744ebc..e729394 100644 --- a/app_doc/templatetags/doc_filter.py +++ b/app_doc/templatetags/doc_filter.py @@ -15,6 +15,15 @@ def get_next_doc(value): def get_doc_top(value): return Project.objects.get(id=int(value)) +# 获取用户是否为文集创建者 +@register.filter(name='is_colla_pro') +def is_colla_pro(pro,user): + p = Project.objects.filter(id=pro,create_user=user) + if p.exists(): + return '' + else: + return '【协作】' + # 获取文档的上级文档名称 @register.filter(name='get_doc_parent') def get_doc_parent(value): diff --git a/app_doc/templatetags/project_filter.py b/app_doc/templatetags/project_filter.py index 95fd7c3..15bc760 100644 --- a/app_doc/templatetags/project_filter.py +++ b/app_doc/templatetags/project_filter.py @@ -34,4 +34,10 @@ def get_report_status(value): @register.filter(name='img_group_cnt') def get_img_group_cnt(value): cnt = Image.objects.filter(group_id=value).count() - return cnt \ No newline at end of file + return cnt + +# 获取文集的协作用户数 +@register.filter(name='project_collaborator_cnt') +def get_project_collaborator_cnt(value): + cnt = ProjectCollaborator.objects.filter(project=value).count() + return cnt diff --git a/app_doc/urls.py b/app_doc/urls.py index 0a827b1..53ad3fe 100644 --- a/app_doc/urls.py +++ b/app_doc/urls.py @@ -15,6 +15,8 @@ urlpatterns = [ path('modify_pro_role//',views.modify_project_role,name="modify_pro_role"),# 修改文集权限 path('modify_pro_download//', views.modify_project_download, name="modify_pro_download"), # 修改文集前台下载权限 path('check_viewcode/',views.check_viewcode,name='check_viewcode'),# 文集访问码验证 + path('manage_project_colla//',views.manage_project_collaborator,name="manage_pro_colla"), # 管理文集协作 + path('manage_pro_colla_self/',views.manage_pro_colla_self,name="manage_pro_colla_self"), # 我协作的文集 #################文档相关 path('project-/doc-/', views.doc, name='doc'), # 文档浏览页 path('create_doc/', views.create_doc, name="create_doc"), # 新建文档 diff --git a/app_doc/views.py b/app_doc/views.py index 6bbb5b2..7637ed0 100644 --- a/app_doc/views.py +++ b/app_doc/views.py @@ -26,8 +26,14 @@ def validateTitle(title): def project_list(request): # 登录用户 if request.user.is_authenticated: + # 用户的协作文集 + colla_list = [i.project.id for i in ProjectCollaborator.objects.filter(user=request.user)] + # 查询所有可显示的文集 project_list = Project.objects.filter( - Q(role__in=[0,3]) | Q(role=2,role_value__contains=str(request.user.username)) | Q(create_user=request.user) + Q(role__in=[0,3]) | \ + Q(role=2,role_value__contains=str(request.user.username)) | \ + Q(create_user=request.user) | \ + Q(id__in=colla_list) ) else: # 非登录用户只显示公开文集和需要访问码的文集 @@ -72,6 +78,11 @@ def project_index(request,pro_id): try: # 获取文集信息 project = Project.objects.get(id=int(pro_id)) + # 获取文集的协作用户信息 + if request.user.is_authenticated: # 对登陆用户查询其协作文档信息 + colla_user = ProjectCollaborator.objects.filter(project=project,user=request.user).count() + else: + colla_user = 0 # 获取问价文集前台下载权限 try: @@ -79,21 +90,23 @@ def project_index(request,pro_id): except ObjectDoesNotExist: allow_epub_download = 0 - # 私密文集并且访问者非创建者 - if project.role == 1 and request.user != project.create_user: + # 私密文集并且访问者非创建者非协作者 + if (project.role == 1) and (request.user != project.create_user) and (colla_user == 0): return render(request,'404.html') # 指定用户可见文集 elif project.role == 2: user_list = project.role_value if request.user.is_authenticated: # 认证用户判断是否在许可用户列表中 - if request.user.username not in user_list and request.user != project.create_user: # 访问者不在指定用户之中 + if (request.user.username not in user_list) and \ + (request.user != project.create_user) and \ + (colla_user == 0): # 访问者不在指定用户之中 return render(request, '404.html') else:# 游客直接返回404 return render(request, '404.html') # 访问码可见 elif project.role == 3: - # 浏览用户不为创建者 - if request.user != project.create_user: + # 浏览用户不为创建者、协作者 + if request.user != project.create_user and colla_user == 0: viewcode = project.role_value viewcode_name = 'viewcode-{}'.format(project.id) r_viewcode = request.COOKIES[viewcode_name] if viewcode_name in request.COOKIES.keys() else 0 # 从cookie中获取访问码 @@ -121,6 +134,7 @@ def modify_project(request): try: pro_id = request.POST.get('pro_id',None) project = Project.objects.get(id=pro_id) + # 验证用户有权限修改文集 if (request.user == project.create_user) or request.user.is_superuser: name = request.POST.get('name',None) content = request.POST.get('desc',None) @@ -288,6 +302,81 @@ def modify_project_download(request,pro_id): return render(request,'app_doc/manage_project_download.html',locals()) +# 文集协作管理 +@login_required() +def manage_project_collaborator(request,pro_id): + project = Project.objects.filter(id=pro_id, create_user=request.user) + if project.exists() is False: + return Http404 + + if request.method == 'GET': + pro = project[0] + collaborator = ProjectCollaborator.objects.filter(project=pro) + return render(request, 'app_doc/manage_project_collaborator.html', locals()) + + elif request.method == 'POST': + # type类型:0表示新增协作者、1表示删除协作者、2表示修改协作者 + types = request.POST.get('types','') + try: + types = int(types) + except: + return JsonResponse({'status':False,'data':'参数错误'}) + # 添加文集协作者 + if int(types) == 0: + colla_user = request.POST.get('username','') + role = request.POST.get('role',0) + user = User.objects.filter(username=colla_user) + if user.exists(): + if user[0] == project[0].create_user: # 用户为文集的创建者 + return JsonResponse({'status':False,'data':'文集创建者无需添加'}) + elif ProjectCollaborator.objects.filter(user=user[0],project=project[0]).exists(): + return JsonResponse({'status':False,'data':'用户已存在'}) + else: + ProjectCollaborator.objects.create( + project = project[0], + user = user[0], + role = role if role in ['1',1] else 0 + ) + return JsonResponse({'status':True,'data':'添加成功'}) + else: + return JsonResponse({'status':False,'data':'用户不存在'}) + # 删除文集协作者 + elif int(types) == 1: + username = request.POST.get('username','') + try: + user = User.objects.get(username=username) + pro_colla = ProjectCollaborator.objects.get(project=project[0],user=user) + pro_colla.delete() + return JsonResponse({'status':True,'data':'删除成功'}) + except: + if settings.DEBUG: + print(traceback.print_exc()) + return JsonResponse({'status':False,'data':'删除出错'}) + # 修改协作权限 + elif int(types) == 2: + username = request.POST.get('username', '') + role = request.POST.get('role','') + try: + user = User.objects.get(username=username) + pro_colla = ProjectCollaborator.objects.filter(project=project[0], user=user) + pro_colla.update(role=role) + return JsonResponse({'status':True,'data':'修改成功'}) + except: + if settings.DEBUG: + print(traceback.print_exc()) + return JsonResponse({'status':False,'data':'修改失败'}) + + else: + return JsonResponse({'status':False,'data':'无效的类型'}) + + +# 我协作的文集 +@login_required() +def manage_pro_colla_self(request): + colla_pros = ProjectCollaborator.objects.filter(user=request.user) + return render(request,'app_doc/manage_project_self_colla.html',locals()) + + # 文档浏览页页 @require_http_methods(['GET']) def doc(request,pro_id,doc_id): @@ -295,22 +384,35 @@ def doc(request,pro_id,doc_id): if pro_id != '' and doc_id != '': # 获取文集信息 project = Project.objects.get(id=int(pro_id)) + # 获取文集的协作用户信息 + if request.user.is_authenticated: + colla_user = ProjectCollaborator.objects.filter(project=project,user=request.user) + if colla_user.exists(): + colla_user_role = colla_user[0].role + colla_user = colla_user.count() + else: + colla_user = colla_user.count() + else: + colla_user = 0 - # 私密文集并且访问者非创建者 - if project.role == 1 and request.user != project.create_user: + # 私密文集且访问者非创建者、协作者 - 不能访问 + if (project.role == 1) and (request.user != project.create_user) and (colla_user == 0): return render(request, '404.html') + # 指定用户可见文集 elif project.role == 2: user_list = project.role_value if request.user.is_authenticated: # 认证用户判断是否在许可用户列表中 - if request.user.username not in user_list and request.user != project.create_user: # 访问者不在指定用户之中 + if (request.user.username not in user_list) and \ + (request.user != project.create_user) and \ + (colla_user == 0): # 访问者不在指定用户之中,也不是协作者 return render(request, '404.html') else: # 游客直接返回404 return render(request, '404.html') # 访问码可见 elif project.role == 3: - # 浏览用户不为创建者 - if request.user != project.create_user: + # 浏览用户不为创建者和协作者 - 需要访问码 + if (request.user != project.create_user) and (colla_user == 0): viewcode = project.role_value viewcode_name = 'viewcode-{}'.format(project.id) r_viewcode = request.COOKIES[ @@ -342,8 +444,8 @@ def create_doc(request): if request.method == 'GET': try: pid = request.GET.get('pid',-999) - # doc_list = Doc.objects.filter(create_user=request.user) - project_list = Project.objects.filter(create_user=request.user) + project_list = Project.objects.filter(create_user=request.user) # 自己创建的文集列表 + colla_project_list = ProjectCollaborator.objects.filter(user=request.user) # 协作的文集列表 doctemp_list = DocTemp.objects.filter(create_user=request.user).values('id','name','create_time') return render(request,'app_doc/create_doc.html',locals()) except Exception as e: @@ -360,19 +462,26 @@ def create_doc(request): sort = request.POST.get('sort','') status = request.POST.get('status',1) if project != '' and doc_name != '' and project != '-1': - doc = Doc.objects.create( - name=doc_name, - content = doc_content, - pre_content= pre_content, - parent_doc= int(parent_doc) if parent_doc != '' else 0, - top_doc= int(project), - sort = sort if sort != '' else 99, - create_user=request.user, - status = status - ) - return JsonResponse({'status':True,'data':{'pro':project,'doc':doc.id}}) + # 验证请求者是否有文集的权限 + check_project = Project.objects.filter(id=project,create_user=request.user) + colla_project = ProjectCollaborator.objects.filter(project=project,user=request.user) + if check_project.count() > 0 or colla_project.count() > 0: + # 创建文档 + doc = Doc.objects.create( + name=doc_name, + content = doc_content, + pre_content= pre_content, + parent_doc= int(parent_doc) if parent_doc != '' else 0, + top_doc= int(project), + sort = sort if sort != '' else 99, + create_user=request.user, + status = status + ) + return JsonResponse({'status':True,'data':{'pro':project,'doc':doc.id}}) + else: + return JsonResponse({'status':False,'data':'无权操作此文集'}) else: - return JsonResponse({'status':False,'data':'参数错误'}) + return JsonResponse({'status':False,'data':'请确认文档标题、文集正确'}) except Exception as e: if settings.DEBUG: print(traceback.print_exc()) @@ -387,13 +496,15 @@ def modify_doc(request,doc_id): if request.method == 'GET': try: doc = Doc.objects.get(id=doc_id) - if request.user == doc.create_user: - project = Project.objects.get(id=doc.top_doc) + project = Project.objects.get(id=doc.top_doc) + pro_colla = ProjectCollaborator.objects.get(project=project,user=request.user) + if request.user == doc.create_user or pro_colla.role == 1: doc_list = Doc.objects.filter(top_doc=project.id) doctemp_list = DocTemp.objects.filter(create_user=request.user) return render(request,'app_doc/modify_doc.html',locals()) else: - return HttpResponse("非法请求") + # return HttpResponse("非法的请求") + return render(request,'403.html') except Exception as e: if settings.DEBUG: print(traceback.print_exc()) @@ -408,18 +519,25 @@ def modify_doc(request,doc_id): pre_content = request.POST.get('pre_content', '') # 文档Markdown格式内容 sort = request.POST.get('sort', '') # 文档排序 status = request.POST.get('status',1) # 文档状态 + if doc_id != '' and project != '' and doc_name != '' and project != '-1': - # 更新文档内容 - Doc.objects.filter(id=int(doc_id)).update( - name=doc_name, - content=doc_content, - pre_content=pre_content, - parent_doc=int(parent_doc) if parent_doc != '' else 0, - sort=sort if sort != '' else 99, - modify_time = datetime.datetime.now(), - status = status - ) - return JsonResponse({'status': True,'data':'修改成功'}) + doc = Doc.objects.get(id=doc_id) + pro_colla = ProjectCollaborator.objects.get(project=project, user=request.user) + # 验证用户有权限修改文档 - 文档的创建者或文集的高级协作者 + if (request.user == doc.create_user) or (pro_colla.role == 1): + # 更新文档内容 + Doc.objects.filter(id=int(doc_id)).update( + name=doc_name, + content=doc_content, + pre_content=pre_content, + parent_doc=int(parent_doc) if parent_doc != '' else 0, + sort=sort if sort != '' else 99, + modify_time = datetime.datetime.now(), + status = status + ) + return JsonResponse({'status': True,'data':'修改成功'}) + else: + return JsonResponse({'status':False,'data':'未授权请求'}) else: return JsonResponse({'status': False,'data':'参数错误'}) except Exception as e: @@ -495,7 +613,7 @@ def manage_doc(request): status = 0 ).order_by('-modify_time') # 分页处理 - paginator = Paginator(doc_list, 10) + paginator = Paginator(doc_list, 20) page = request.GET.get('page', 1) try: docs = paginator.page(page) @@ -537,7 +655,7 @@ def manage_doc(request): else: doc_list = Doc.objects.filter(create_user=request.user).order_by('-modify_time') # 分页处理 - paginator = Paginator(doc_list, 10) + paginator = Paginator(doc_list, 20) page = request.GET.get('page', 1) try: docs = paginator.page(page) diff --git a/template/404.html b/template/404.html index 0c1977c..5d322ca 100644 --- a/template/404.html +++ b/template/404.html @@ -12,7 +12,7 @@ {% include 'app_doc/head_base.html' %}
-
+ diff --git a/template/app_api/manage_token.html b/template/app_api/manage_token.html index be6b33c..aa851ff 100644 --- a/template/app_api/manage_token.html +++ b/template/app_api/manage_token.html @@ -18,8 +18,8 @@
- - + +

diff --git a/template/app_doc/create_base.html b/template/app_doc/create_base.html index a67bed7..20aefe7 100644 --- a/template/app_doc/create_base.html +++ b/template/app_doc/create_base.html @@ -95,7 +95,7 @@ "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase","kaiSpan", "|", "h1", "h2", "h3", "h4", "h5", "h6", "|", "list-ul", "list-ol", "hr", "|", - "link", "reference-link","imgUpload", "code", "preformatted-text", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|", + "link", "reference-link","imgUpload", "code", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|", "watch", "preview", "|", "help" ] diff --git a/template/app_doc/create_doc.html b/template/app_doc/create_doc.html index 302653a..f445070 100644 --- a/template/app_doc/create_doc.html +++ b/template/app_doc/create_doc.html @@ -21,17 +21,28 @@ @@ -110,7 +121,7 @@ $.post("{% url 'create_project' %}",data,function(r){ if(r.status){ //创建成功,更新文集select - $("#project").append(""); + $("#self-project").append(""); form.render(); //window.location.reload(); layer.close(index) @@ -208,9 +219,10 @@ else{ $.post("{% url 'create_doc' %}",data,function(r){ if(r.status){ - //创建成功 + //保存成功 + md_changed = false; layer.msg('保存草稿成功',function(){ - window.location.href = "/modify_doc/"+r.data+"/"; + window.location.href = "/modify_doc/"+r.data.doc+"/"; }); }else{ //创建失败 diff --git a/template/app_doc/doc.html b/template/app_doc/doc.html index f210288..56a3cbf 100644 --- a/template/app_doc/doc.html +++ b/template/app_doc/doc.html @@ -9,11 +9,25 @@ {% block head_toolbar %} {% if request.user == doc.create_user %} + | - 修改 + 修改 - 新建 + 添加 + + + 管理 + + {% elif colla_user > 0 %} + | + {% if colla_user_role == 1 %} + + 修改 + + {% endif %} + + 添加 {% endif %} @@ -61,6 +75,7 @@ {% block custom_script %} {% endblock %} \ No newline at end of file diff --git a/template/app_doc/docs_base.html b/template/app_doc/docs_base.html index d65b450..d1c35e4 100644 --- a/template/app_doc/docs_base.html +++ b/template/app_doc/docs_base.html @@ -55,6 +55,10 @@ ul.markdown-toc-list a{ text-decoration: underline!important; } + /* 块级代码和行内代码去除边框 */ + .markdown-body p code{ + border:none; + } diff --git a/template/app_doc/foot_base.html b/template/app_doc/foot_base.html index 3c5f5f8..4291d7f 100644 --- a/template/app_doc/foot_base.html +++ b/template/app_doc/foot_base.html @@ -1,6 +1,6 @@ -
-
-
- - - - - -
-
-
@@ -62,11 +51,13 @@ {% endif %} - + {% endfor %} @@ -78,13 +69,13 @@ diff --git a/template/app_doc/manage_doctemp.html b/template/app_doc/manage_doctemp.html index 1b9efe6..4c88835 100644 --- a/template/app_doc/manage_doctemp.html +++ b/template/app_doc/manage_doctemp.html @@ -14,8 +14,8 @@
- - + + @@ -40,8 +40,8 @@ {% endfor %} @@ -53,13 +53,13 @@ diff --git a/template/app_doc/manage_image.html b/template/app_doc/manage_image.html index ea49f5d..7754f0c 100644 --- a/template/app_doc/manage_image.html +++ b/template/app_doc/manage_image.html @@ -14,10 +14,10 @@ - - - - 分组管理 + + + + 分组管理 @@ -56,13 +56,13 @@ diff --git a/template/app_doc/manage_image_group.html b/template/app_doc/manage_image_group.html index d41d5a5..07ccc3e 100644 --- a/template/app_doc/manage_image_group.html +++ b/template/app_doc/manage_image_group.html @@ -42,8 +42,8 @@ {% endfor %} diff --git a/template/app_doc/manage_project.html b/template/app_doc/manage_project.html index 9b3dd93..d622d8a 100644 --- a/template/app_doc/manage_project.html +++ b/template/app_doc/manage_project.html @@ -14,8 +14,9 @@
- - + + + 我协作的文集 @@ -23,11 +24,12 @@
{{ doc.parent_doc|get_doc_parent }}{{ doc.top_doc|get_doc_top }} + {{ doc.top_doc|is_colla_pro:doc.create_user }}{{ doc.top_doc|get_doc_top }} + {{ doc.create_time }} - 修改 - 删除 + 修改 + 删除
{{ temp.create_time }} {# 查看#} - 修改 - 删除 + 修改 + 删除
{{ group.group_name }} {{ group.id | img_group_cnt }} - 修改 - 删除 + 修改 + 删除
- - + + + @@ -38,6 +40,7 @@ + @@ -69,11 +72,12 @@ {% endif %} + {% endfor %} diff --git a/template/app_doc/manage_project_collaborator.html b/template/app_doc/manage_project_collaborator.html new file mode 100644 index 0000000..43d3378 --- /dev/null +++ b/template/app_doc/manage_project_collaborator.html @@ -0,0 +1,200 @@ +{% extends 'app_doc/manage_base.html' %} +{% load staticfiles %} +{% block title %}文集协作管理{% endblock %} +{% block content %} + + +
+ +
+ 管理文集《{{pro.name}}》的协作者 + +
+
+
+
+ {% csrf_token %} + {% load project_filter %} +
+ +
+ + +
+
+
+ +
+ +
+
+ +
+
+ +
+ {% if collaborator.count != 0 %} +
+
创建时间 前台下载 阅读权限协作人数 操作
{{ pro.id | project_collaborator_cnt }} - 修改 - 删除 - 导出 + 修改 + 删除 + 导出
+ + + + + + + + + {% for colla in collaborator %} + + + + + + {% endfor %} + +
用户名协作权限操作
{{ colla.user }} + {% if colla.role == 0 %} + 新建文档,修改、删除新建的文档 + {% else %} + 可操作所有文档 + {% endif %} + + 修改 + 删除 +
+
+ {% endif %} +{% endblock %} +{% block custom_script %} + + + + + + +{% endblock %} \ No newline at end of file diff --git a/template/app_doc/manage_project_self_colla.html b/template/app_doc/manage_project_self_colla.html new file mode 100644 index 0000000..120e2a4 --- /dev/null +++ b/template/app_doc/manage_project_self_colla.html @@ -0,0 +1,64 @@ +{% extends 'app_doc/manage_base.html' %} +{% load staticfiles %} +{% block title %}我协作的文集{% endblock %} +{% block content %} + + +
+ +
+ 协作的文集列表 + +
+
+ {% if colla_pros.count != 0 %} +
+ + + + + + + + + + + {% for colla in colla_pros %} + + + + + + + {% endfor %} + +
文集名称作者权限操作
{{ colla.project }}{{ colla.project.create_user }} + {% if colla.role == 0 %} + 初级 - 可新建文档、修改和删除自己创建的文档 + {% else %} + 高级 - 可新建文档、修改所有文档、删除自己创建的文档 + {% endif %} + + 查看 +
+
+ {% else %} +
+ 你还没有成为任何文集的协作者 +
+ {% endif %} +{% endblock %} +{% block custom_script %} + + +{% endblock %} \ No newline at end of file diff --git a/template/app_doc/project.html b/template/app_doc/project.html index 685c4de..935ea17 100644 --- a/template/app_doc/project.html +++ b/template/app_doc/project.html @@ -6,8 +6,9 @@ {% block title %}{{ project.name }}{% endblock %} {% block head_toolbar %} - {% if request.user == project.create_user %} - + {% if request.user == project.create_user or colla_user > 0 %} + | + 添加文档 {% endif %} diff --git a/template/login.html b/template/login.html index 4a67e8e..75664cb 100644 --- a/template/login.html +++ b/template/login.html @@ -12,6 +12,7 @@ +