添加多语言翻译适配和繁体中文语言文件
This commit is contained in:
parent
3b1e907fe5
commit
4a7e67a837
@ -4,11 +4,12 @@
|
||||
# #日期:2019/11/23
|
||||
# 博客地址:zmister.com
|
||||
|
||||
import smtplib
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.conf import settings
|
||||
from email.mime.text import MIMEText
|
||||
from app_admin.models import SysSetting
|
||||
import random
|
||||
import smtplib
|
||||
|
||||
# 生成数字验证码
|
||||
def generate_vcode(n=6):
|
||||
@ -27,7 +28,7 @@ def send_email(to_email,vcode_str):
|
||||
username = SysSetting.objects.get(types='email', name='username').value
|
||||
pwd = SysSetting.objects.get(types='email', name='pwd').value
|
||||
ssl = SysSetting.objects.get(types='email',name='smtp_ssl').value
|
||||
print(smtp_host,smtp_port,send_emailer,username,pwd)
|
||||
# print(smtp_host,smtp_port,send_emailer,username,pwd)
|
||||
|
||||
msg_from = send_emailer # 发件人邮箱
|
||||
passwd = dectry(pwd) # 发件人邮箱密码
|
||||
@ -36,8 +37,8 @@ def send_email(to_email,vcode_str):
|
||||
s = smtplib.SMTP_SSL(smtp_host, int(smtp_port)) # 发件箱邮件服务器及端口号
|
||||
else:
|
||||
s = smtplib.SMTP(smtp_host, int(smtp_port))
|
||||
subject = "MrDoc - 重置密码验证码"
|
||||
content = "你的验证码为:{},验证码30分钟内有效!".format(vcode_str)
|
||||
subject = _("MrDoc - 重置密码验证码")
|
||||
content = _("你的验证码为:{},验证码30分钟内有效!".format(vcode_str))
|
||||
|
||||
msg = MIMEText(content, _subtype='html', _charset='utf-8')
|
||||
msg['Subject'] = subject
|
||||
@ -48,7 +49,7 @@ def send_email(to_email,vcode_str):
|
||||
s.sendmail(msg_from, msg_to, msg.as_string())
|
||||
return True
|
||||
except smtplib.SMTPException as e:
|
||||
print(repr(e))
|
||||
# print(repr(e))
|
||||
return False
|
||||
finally:
|
||||
s.quit()
|
||||
|
||||
@ -6,18 +6,18 @@ from django.contrib.auth.models import User # Django默认用户模型
|
||||
from django.contrib.auth.decorators import login_required # 登录需求装饰器
|
||||
from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器
|
||||
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页
|
||||
from app_admin.decorators import superuser_only,open_register
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db.models import Q
|
||||
from django.urls import reverse
|
||||
import datetime
|
||||
import requests
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from app_admin.decorators import superuser_only,open_register
|
||||
from app_doc.models import *
|
||||
from app_admin.models import *
|
||||
from app_admin.utils import *
|
||||
import traceback
|
||||
from loguru import logger
|
||||
import re
|
||||
import datetime
|
||||
import requests
|
||||
|
||||
|
||||
# 返回验证码图片
|
||||
@ -33,8 +33,8 @@ def check_code(request):
|
||||
request.session["CheckCode"] = code
|
||||
return HttpResponse(stream.getvalue(), content_type="image/png")
|
||||
except Exception as e:
|
||||
logger.exception("生成验证码图片异常")
|
||||
return HttpResponse("请求异常:{}".format(repr(e)))
|
||||
logger.exception(_("生成验证码图片异常"))
|
||||
return HttpResponse(_("请求异常:{}".format(repr(e))))
|
||||
|
||||
|
||||
# 登录视图
|
||||
@ -54,7 +54,7 @@ def log_in(request):
|
||||
if (len(require_login_check_code) > 0) and (require_login_check_code[0].value == 'on'):
|
||||
checkcode = request.POST.get("check_code", None)
|
||||
if checkcode != request.session['CheckCode'].lower():
|
||||
errormsg = '验证码错误!'
|
||||
errormsg = _('验证码错误!')
|
||||
return render(request, 'login.html', locals())
|
||||
if username != '' and pwd != '':
|
||||
user = authenticate(username=username,password=pwd)
|
||||
@ -63,17 +63,17 @@ def log_in(request):
|
||||
login(request,user)
|
||||
return redirect('/')
|
||||
else:
|
||||
errormsg = '用户被禁用!'
|
||||
errormsg = _('用户被禁用!')
|
||||
return render(request, 'login.html', locals())
|
||||
else:
|
||||
errormsg = '用户名或密码错误!'
|
||||
errormsg = _('用户名或密码错误!')
|
||||
return render(request, 'login.html', locals())
|
||||
else:
|
||||
errormsg = '用户名或密码错误!'
|
||||
errormsg = _('用户名或密码错误!')
|
||||
return render(request, 'login.html', locals())
|
||||
except Exception as e:
|
||||
logger.exception("登录异常")
|
||||
return HttpResponse('请求出错')
|
||||
return HttpResponse(_('请求出错'))
|
||||
|
||||
|
||||
# 注册视图
|
||||
@ -97,7 +97,7 @@ def register(request):
|
||||
try:
|
||||
register_code_value = RegisterCode.objects.get(code=register_code,status=1)
|
||||
except ObjectDoesNotExist:
|
||||
errormsg = '注册码无效!'
|
||||
errormsg = _('注册码无效!')
|
||||
return render(request, 'register.html', locals())
|
||||
# 判断是否输入了用户名、邮箱和密码
|
||||
if username and email and password:
|
||||
@ -105,22 +105,22 @@ def register(request):
|
||||
email_exit = User.objects.filter(email=email)
|
||||
username_exit = User.objects.filter(username=username)
|
||||
if email_exit.count() > 0: # 验证电子邮箱
|
||||
errormsg = '此电子邮箱已被注册!'
|
||||
errormsg = _('此电子邮箱已被注册!')
|
||||
return render(request, 'register.html', locals())
|
||||
elif username_exit.count() > 0: # 验证用户名
|
||||
errormsg = '用户名已被使用!'
|
||||
errormsg = _('用户名已被使用!')
|
||||
return render(request, 'register.html', locals())
|
||||
elif re.match('^[0-9a-z]+$',username) is False:
|
||||
errormsg = '用户名只能为英文数字组合'
|
||||
errormsg = _('用户名只能为英文数字组合')
|
||||
return render(request, 'register.html', locals())
|
||||
elif len(username) < 5:
|
||||
errormsg = '用户名必须大于等于5位!'
|
||||
errormsg = _('用户名必须大于等于5位!')
|
||||
return render(request, 'register.html', locals())
|
||||
elif len(password) < 6: # 验证密码长度
|
||||
errormsg = '密码必须大于等于6位!'
|
||||
errormsg = _('密码必须大于等于6位!')
|
||||
return render(request, 'register.html', locals())
|
||||
elif checkcode != request.session['CheckCode'].lower(): # 验证验证码
|
||||
errormsg = "验证码错误"
|
||||
errormsg = _("验证码错误")
|
||||
return render(request, 'register.html', locals())
|
||||
else:
|
||||
# 创建用户
|
||||
@ -148,13 +148,13 @@ def register(request):
|
||||
login(request, user)
|
||||
return redirect('/')
|
||||
else:
|
||||
errormsg = '用户被禁用,请联系管理员!'
|
||||
errormsg = _('用户被禁用,请联系管理员!')
|
||||
return render(request, 'register.html', locals())
|
||||
else:
|
||||
errormsg = '请输入正确的电子邮箱格式!'
|
||||
errormsg = _('请输入正确的电子邮箱格式!')
|
||||
return render(request, 'register.html', locals())
|
||||
else:
|
||||
errormsg = "请检查输入值"
|
||||
errormsg = _("请检查输入值")
|
||||
return render(request, 'register.html', locals())
|
||||
|
||||
|
||||
@ -171,7 +171,7 @@ def log_out(request):
|
||||
resp.delete_cookie(c)
|
||||
return resp
|
||||
except Exception as e:
|
||||
logger.exception("注销异常")
|
||||
logger.exception(_("注销异常"))
|
||||
return redirect(request.META['HTTP_REFERER'])
|
||||
|
||||
|
||||
@ -192,18 +192,18 @@ def forget_pwd(request):
|
||||
user = User.objects.get(email=email)
|
||||
user.set_password(new_pwd)
|
||||
user.save()
|
||||
errormsg = "修改密码成功,请返回登录!"
|
||||
errormsg = _("修改密码成功,请返回登录!")
|
||||
return render(request, 'forget_pwd.html', locals())
|
||||
else:
|
||||
errormsg = "验证码已过期"
|
||||
errormsg = _("验证码已过期")
|
||||
return render(request, 'forget_pwd.html', locals())
|
||||
except ObjectDoesNotExist:
|
||||
logger.error("邮箱不存在:{}".format(email))
|
||||
errormsg = "验证码或邮箱错误"
|
||||
logger.error(_("邮箱不存在:{}".format(email)))
|
||||
errormsg = _("验证码或邮箱错误")
|
||||
return render(request, 'forget_pwd.html', locals())
|
||||
except Exception as e:
|
||||
logger.exception("修改密码异常")
|
||||
errormsg = "验证码或邮箱错误"
|
||||
errormsg = _("验证码或邮箱错误")
|
||||
return render(request,'forget_pwd.html',locals())
|
||||
|
||||
|
||||
@ -228,14 +228,14 @@ def send_email_vcode(request):
|
||||
verification_code = vcode_str,
|
||||
expire_time = expire_time
|
||||
)
|
||||
return JsonResponse({'status':True,'data':'发送成功'})
|
||||
return JsonResponse({'status':True,'data':_('发送成功')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'发送验证码出错,请重试!'})
|
||||
return JsonResponse({'status':False,'data':_('发送验证码出错,请重试!')})
|
||||
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'电子邮箱不存在!'})
|
||||
return JsonResponse({'status':False,'data':_('电子邮箱不存在!')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'方法错误'})
|
||||
return JsonResponse({'status':False,'data':_('方法错误')})
|
||||
|
||||
|
||||
# 后台管理 - 仪表盘
|
||||
@ -303,7 +303,7 @@ def admin_user(request):
|
||||
table_data.append(item)
|
||||
return JsonResponse({'code':0,'data':table_data,"count": user_data.count()})
|
||||
else:
|
||||
return JsonResponse({'code':1,'msg':'方法错误'})
|
||||
return JsonResponse({'code':1,'msg':_('方法错误')})
|
||||
|
||||
|
||||
# 后台管理 - 创建用户
|
||||
@ -319,10 +319,10 @@ def admin_create_user(request):
|
||||
'@' in email and re.match(r'^[0-9a-z]',username) and len(username) >= 5 :
|
||||
# 不允许电子邮箱重复
|
||||
if User.objects.filter(email = email).count() > 0:
|
||||
return JsonResponse({'status':False,'data':'电子邮箱不可重复'})
|
||||
return JsonResponse({'status':False,'data':_('电子邮箱不可重复')})
|
||||
# 不允许重复的用户名
|
||||
if User.objects.filter(username = username).count() > 0:
|
||||
return JsonResponse({'status': False,'data':'用户名不可重复'})
|
||||
return JsonResponse({'status': False,'data':_('用户名不可重复')})
|
||||
try:
|
||||
if user_type == 0:
|
||||
user = User.objects.create_user(
|
||||
@ -340,11 +340,11 @@ def admin_create_user(request):
|
||||
user.save()
|
||||
return JsonResponse({'status':True})
|
||||
except Exception as e:
|
||||
return JsonResponse({'status':False,'data':'系统异常'})
|
||||
return JsonResponse({'status':False,'data':_('系统异常')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'请检查参数'})
|
||||
return JsonResponse({'status':False,'data':_('请检查参数')})
|
||||
else:
|
||||
return HttpResponse('方法不允许')
|
||||
return HttpResponse(_('方法不允许'))
|
||||
|
||||
|
||||
# 后台管理 - 修改密码
|
||||
@ -361,16 +361,16 @@ def admin_change_pwd(request):
|
||||
user = User.objects.get(id=int(user_id))
|
||||
user.set_password(password)
|
||||
user.save()
|
||||
return JsonResponse({'status':True,'data':'修改成功'})
|
||||
return JsonResponse({'status':True,'data':_('修改成功')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'两个密码不一致'})
|
||||
return JsonResponse({'status':False,'data':_('两个密码不一致')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'参数错误'})
|
||||
return JsonResponse({'status':False,'data':_('参数错误')})
|
||||
except Exception as e:
|
||||
print(repr(e))
|
||||
return JsonResponse({'status':False,'data':'请求错误'})
|
||||
return JsonResponse({'status':False,'data':_('请求错误')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'方法错误'})
|
||||
return JsonResponse({'status':False,'data':_('方法错误')})
|
||||
|
||||
|
||||
# 后台管理 - 删除用户
|
||||
@ -389,11 +389,11 @@ def admin_del_user(request):
|
||||
top_doc=colloa.project.id,create_user=user
|
||||
).update(create_user=colloa.project.create_user)
|
||||
user.delete()
|
||||
return JsonResponse({'status':True,'data':'删除成功'})
|
||||
return JsonResponse({'status':True,'data':_('删除成功')})
|
||||
except Exception as e:
|
||||
return JsonResponse({'status':False,'data':'删除出错'})
|
||||
return JsonResponse({'status':False,'data':_('删除出错')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'方法错误'})
|
||||
return JsonResponse({'status':False,'data':_('方法错误')})
|
||||
|
||||
|
||||
# 后台管理 - 文集管理
|
||||
@ -492,8 +492,8 @@ def admin_project_istop(request):
|
||||
Project.objects.filter(id=project_id).update(is_top=is_top)
|
||||
return JsonResponse({'status':True})
|
||||
except:
|
||||
logger.exception("置顶文集出错")
|
||||
return JsonResponse({'status':False,'data':'执行出错'})
|
||||
logger.exception(_("置顶文集出错"))
|
||||
return JsonResponse({'status':False,'data':_('执行出错')})
|
||||
|
||||
|
||||
# 后台管理 - 文档管理
|
||||
@ -645,7 +645,7 @@ def admin_register_code(request):
|
||||
try:
|
||||
all_cnt = int(request.POST.get('all_cnt',1)) # 注册码的最大使用次数
|
||||
if all_cnt <= 0:
|
||||
return JsonResponse({'status': False, 'data': '最大使用次数不可为负数'})
|
||||
return JsonResponse({'status': False, 'data': _('最大使用次数不可为负数')})
|
||||
is_code = False
|
||||
while is_code is False:
|
||||
code_str = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
|
||||
@ -661,24 +661,24 @@ def admin_register_code(request):
|
||||
all_cnt = all_cnt,
|
||||
create_user = request.user
|
||||
)
|
||||
return JsonResponse({'status':True,'data':'新增成功'})
|
||||
return JsonResponse({'status':True,'data':_('新增成功')})
|
||||
except Exception as e:
|
||||
logger.exception("生成注册码异常")
|
||||
return JsonResponse({'status': False,'data':'系统异常'})
|
||||
logger.exception(_("生成注册码异常"))
|
||||
return JsonResponse({'status': False,'data':_('系统异常')})
|
||||
elif int(types) == 2:
|
||||
code_id = request.POST.get('code_id',None)
|
||||
try:
|
||||
register_code = RegisterCode.objects.get(id=int(code_id))
|
||||
register_code.delete()
|
||||
return JsonResponse({'status':True,'data':'删除成功'})
|
||||
return JsonResponse({'status':True,'data':_('删除成功')})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status':False,'data':'注册码不存在'})
|
||||
return JsonResponse({'status':False,'data':_('注册码不存在')})
|
||||
except:
|
||||
return JsonResponse({'status':False,'data':'系统异常'})
|
||||
return JsonResponse({'status':False,'data':_('系统异常')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'类型错误'})
|
||||
return JsonResponse({'status':False,'data':_('类型错误')})
|
||||
else:
|
||||
return JsonResponse({'status': False,'data':'方法错误'})
|
||||
return JsonResponse({'status': False,'data':_('方法错误')})
|
||||
|
||||
|
||||
# 普通用户修改密码
|
||||
@ -695,15 +695,15 @@ def change_pwd(request):
|
||||
user = User.objects.get(id=request.user.id)
|
||||
user.set_password(password)
|
||||
user.save()
|
||||
return JsonResponse({'status':True,'data':'修改成功'})
|
||||
return JsonResponse({'status':True,'data':_('修改成功')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'密码不得少于6位数'})
|
||||
return JsonResponse({'status':False,'data':_('密码不得少于6位数')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'两个密码不一致'})
|
||||
return JsonResponse({'status':False,'data':_('两个密码不一致')})
|
||||
except Exception as e:
|
||||
return JsonResponse({'status':False,'data':'修改出错'})
|
||||
return JsonResponse({'status':False,'data':_('修改出错')})
|
||||
else:
|
||||
return HttpResponse('方法错误')
|
||||
return HttpResponse(_('方法错误'))
|
||||
|
||||
|
||||
# 后台管理 - 应用设置
|
||||
@ -827,7 +827,6 @@ def admin_setting(request):
|
||||
defaults={'value':enable_login_check_code,'types':'basic'}
|
||||
)
|
||||
|
||||
|
||||
return render(request,'app_admin/admin_setting.html',locals())
|
||||
# 邮箱设置
|
||||
elif types == 'email':
|
||||
@ -948,69 +947,69 @@ def admin_center_menu(request):
|
||||
menu_data = [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "仪表盘",
|
||||
"title": _("仪表盘"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"href": reverse('admin_overview'),
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "文集管理",
|
||||
"title": _("文集管理"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-list",
|
||||
"href": reverse('project_manage'),
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "文档管理",
|
||||
"title": _("文档管理"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-form",
|
||||
"href": reverse('doc_manage'),
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"title": "文档模板管理",
|
||||
"title": _("文档模板管理"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-templeate-1",
|
||||
"href": reverse('doctemp_manage'),
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"title": "注册码管理",
|
||||
"title": _("注册码管理"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-component",
|
||||
"href": reverse('register_code_manage'),
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"title": "用户管理",
|
||||
"title": _("用户管理"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-user",
|
||||
"href": reverse('user_manage'),
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"title": "站点设置",
|
||||
"title": _("站点设置"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-set",
|
||||
"href": reverse('sys_setting'),
|
||||
},
|
||||
{
|
||||
"id": "common",
|
||||
"title": "使用帮助",
|
||||
"title": _("使用帮助"),
|
||||
"icon": "layui-icon layui-icon-template-1",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 701,
|
||||
"title": "安装说明",
|
||||
"title": _("安装说明"),
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_blank",
|
||||
"href": "http://mrdoc.zmister.com/project-7/"
|
||||
}, {
|
||||
"id": 702,
|
||||
"title": "使用说明",
|
||||
"title": _("使用说明"),
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_blank",
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
# 博客地址:zmister.com
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework.authentication import BaseAuthentication
|
||||
from rest_framework.exceptions import AuthenticationFailed
|
||||
from app_api.models import *
|
||||
@ -45,8 +46,8 @@ class AppMustAuth(BaseAuthentication):
|
||||
# token 是有效的,返回一个元组
|
||||
return user_obj.user, token # request.user, request.auth
|
||||
else:
|
||||
raise AuthenticationFailed('无效的token')
|
||||
raise AuthenticationFailed(_('无效的token'))
|
||||
# return None
|
||||
else:
|
||||
raise AuthenticationFailed('请求的URL中必须携带token参数')
|
||||
raise AuthenticationFailed(_('请求的URL中必须携带token参数'))
|
||||
# return None
|
||||
@ -8,7 +8,7 @@ from rest_framework.permissions import BasePermission,SAFE_METHODS
|
||||
|
||||
|
||||
class AppPermission(BasePermission):
|
||||
message = '只有VIP才能访问'
|
||||
message = _('只有VIP才能访问')
|
||||
|
||||
def has_permission(self, request, view):
|
||||
# vip才有访问权限
|
||||
|
||||
@ -4,16 +4,17 @@ from django.views.decorators.csrf import csrf_exempt # CSRF装饰器
|
||||
from django.views.decorators.http import require_http_methods,require_safe,require_GET
|
||||
from django.contrib.auth.decorators import login_required # 登录需求装饰器
|
||||
from django.core.exceptions import PermissionDenied,ObjectDoesNotExist
|
||||
from app_api.models import UserToken
|
||||
from app_doc.models import Project,Doc,Image
|
||||
import time,hashlib
|
||||
import traceback,json
|
||||
from django.conf import settings
|
||||
from app_doc.util_upload_img import upload_generation_dir,base_img_upload
|
||||
from loguru import logger
|
||||
from django.contrib.auth import authenticate,login,logout # 认证相关方法
|
||||
from django.contrib.auth.models import User # Django默认用户模型
|
||||
from django.shortcuts import render,redirect
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from app_doc.util_upload_img import upload_generation_dir,base_img_upload
|
||||
from app_api.models import UserToken
|
||||
from app_doc.models import Project,Doc,Image
|
||||
from loguru import logger
|
||||
import time,hashlib
|
||||
import traceback,json
|
||||
# MrDoc 基于用户的Token访问API模块
|
||||
|
||||
# 用户通过该url获取服务器时间戳,便于接口访问
|
||||
@ -40,18 +41,18 @@ def oauth0(request):
|
||||
nowtime = int (time.time())
|
||||
# 时间戳失效时间,默认为3600,可以改短,如30,严格点5秒,如果使用5秒,请求前,需要通过get_timestamp获取服务器时间戳,否则因为和服务器时间差导致无法验证通过
|
||||
if (nowtime - int(timestamp)) > 3600 :
|
||||
raise ValueError('链接已失效,请从合法路径访问,或联系管理员!')
|
||||
raise ValueError(_('链接已失效,请从合法路径访问,或联系管理员!'))
|
||||
# 2、获取userid的Token
|
||||
user = User.objects.get(username=username)
|
||||
if user is None:
|
||||
raise ValueError('请求用户出错!')
|
||||
raise ValueError(_('请求用户出错!'))
|
||||
ID = user.id
|
||||
State = user.is_active
|
||||
if State == 1 and ID is not None:
|
||||
usertoken = UserToken.objects.get(user_id=ID)
|
||||
token = usertoken.token
|
||||
else:
|
||||
raise ValueError('非法用户!')
|
||||
raise ValueError(_('非法用户!'))
|
||||
|
||||
# 3、 验证hash的正确性
|
||||
final_str = str(randstr) + str(timestamp) + str(username) + token
|
||||
@ -63,14 +64,14 @@ def oauth0(request):
|
||||
newurl = unquote(redirecturl)
|
||||
return redirect(newurl)
|
||||
else:
|
||||
raise ValueError('验证失败,可能是用户名或Token不正确!详情请联系管理员!')
|
||||
raise ValueError(_('验证失败,可能是用户名或Token不正确!详情请联系管理员!'))
|
||||
else:
|
||||
raise ValueError('关键字验证失败,请联系管理员!部分关键字为空')
|
||||
raise ValueError(_('关键字验证失败,请联系管理员!部分关键字为空'))
|
||||
except ValueError as e:
|
||||
errormsg = e
|
||||
return render(request, 'app_api/api404.html', locals())
|
||||
except :
|
||||
errormsg = "API接口运行出错!"
|
||||
errormsg = _("API接口运行出错!")
|
||||
return render(request, 'app_api/api404.html', locals())
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'Nothing Here'})
|
||||
@ -84,11 +85,10 @@ def manage_token(request):
|
||||
try:
|
||||
token = UserToken.objects.get(user=request.user).token # 查询用户Token
|
||||
except ObjectDoesNotExist:
|
||||
token = '你还没有生成过Token!'
|
||||
token = _('你还没有生成过Token!')
|
||||
except:
|
||||
if settings.DEBUG:
|
||||
print(traceback.print_exc())
|
||||
logger.exception("Token管理页面异常")
|
||||
logger.exception(_("Token管理页面异常"))
|
||||
return render(request,'app_api/manage_token.html',locals())
|
||||
elif request.method == 'POST':
|
||||
try:
|
||||
@ -105,8 +105,8 @@ def manage_token(request):
|
||||
)
|
||||
return JsonResponse({'status':True,'data':token_str})
|
||||
except:
|
||||
logger.exception("用户Token生成异常")
|
||||
return JsonResponse({'status':False,'data':'生成出错,请重试!'})
|
||||
logger.exception(_("用户Token生成异常"))
|
||||
return JsonResponse({'status':False,'data':_('生成出错,请重试!')})
|
||||
|
||||
|
||||
# 获取文集
|
||||
@ -126,10 +126,10 @@ def get_projects(request):
|
||||
project_list.append(item)
|
||||
return JsonResponse({'status':True,'data':project_list})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status':False,'data':'token无效'})
|
||||
return JsonResponse({'status':False,'data':_('token无效')})
|
||||
except:
|
||||
logger.exception("token获取文集异常")
|
||||
return JsonResponse({'status':False,'data':'系统异常'})
|
||||
logger.exception(_("token获取文集异常"))
|
||||
return JsonResponse({'status':False,'data':_('系统异常')})
|
||||
|
||||
|
||||
# 获取文集下的文档列表
|
||||
@ -154,10 +154,10 @@ def get_docs(request):
|
||||
doc_list.append(item)
|
||||
return JsonResponse({'status': True, 'data': doc_list})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status': False, 'data': 'token无效'})
|
||||
return JsonResponse({'status': False, 'data': _('token无效')})
|
||||
except:
|
||||
logger.exception("token获取文集异常")
|
||||
return JsonResponse({'status': False, 'data': '系统异常'})
|
||||
logger.exception(_("token获取文集异常"))
|
||||
return JsonResponse({'status': False, 'data': _('系统异常')})
|
||||
|
||||
|
||||
# 获取单篇文档
|
||||
@ -181,10 +181,10 @@ def get_doc(request):
|
||||
}
|
||||
return JsonResponse({'status': True, 'data': item})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status': False, 'data': 'token无效'})
|
||||
return JsonResponse({'status': False, 'data': _('token无效')})
|
||||
except:
|
||||
logger.exception("token获取文集异常")
|
||||
return JsonResponse({'status': False, 'data': '系统异常'})
|
||||
return JsonResponse({'status': False, 'data': _('系统异常')})
|
||||
|
||||
|
||||
# 新建文集
|
||||
@ -206,10 +206,10 @@ def create_project(request):
|
||||
)
|
||||
return JsonResponse({'status': True, 'data': 'ok'})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status': False, 'data': 'token无效'})
|
||||
return JsonResponse({'status': False, 'data': _('token无效')})
|
||||
except:
|
||||
logger.exception("token创建文集异常")
|
||||
return JsonResponse({'status':False,'data':'系统异常'})
|
||||
logger.exception(_("token创建文集异常"))
|
||||
return JsonResponse({'status':False,'data':_('系统异常')})
|
||||
|
||||
|
||||
# 新建文档
|
||||
@ -237,12 +237,12 @@ def create_doc(request):
|
||||
)
|
||||
return JsonResponse({'status': True, 'data': 'ok'})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'非法请求'})
|
||||
return JsonResponse({'status':False,'data':_('非法请求')})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status': False, 'data': 'token无效'})
|
||||
return JsonResponse({'status': False, 'data': _('token无效')})
|
||||
except:
|
||||
logger.exception("token创建文档异常")
|
||||
return JsonResponse({'status':False,'data':'系统异常'})
|
||||
logger.exception(_("token创建文档异常"))
|
||||
return JsonResponse({'status':False,'data':_('系统异常')})
|
||||
|
||||
|
||||
# 上传图片
|
||||
@ -263,7 +263,7 @@ def upload_img(request):
|
||||
return JsonResponse(result)
|
||||
# return HttpResponse(json.dumps(result), content_type="application/json")
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'success': 0, 'data': 'token无效'})
|
||||
return JsonResponse({'success': 0, 'data': _('token无效')})
|
||||
except:
|
||||
logger.exception("token上传图片异常")
|
||||
return JsonResponse({'success':0,'data':'上传出错'})
|
||||
logger.exception(_("token上传图片异常"))
|
||||
return JsonResponse({'success':0,'data':_('上传出错')})
|
||||
@ -10,6 +10,7 @@ from django.contrib.auth import authenticate
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db.models import Q
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from rest_framework.views import APIView
|
||||
from app_api.models import AppUserToken
|
||||
from rest_framework.response import Response
|
||||
@ -86,12 +87,12 @@ class LoginView(APIView):
|
||||
res['username'] = username
|
||||
else:
|
||||
res['code'] = 2
|
||||
res["error"] = '账号被禁用'
|
||||
res["error"] = _('账号被禁用')
|
||||
|
||||
else:
|
||||
# 登陆失败
|
||||
res["code"] = 1
|
||||
res["error"] = "用户名或密码错误"
|
||||
res["error"] = _("用户名或密码错误")
|
||||
return Response(res)
|
||||
|
||||
|
||||
@ -337,16 +338,16 @@ class ProjectView(APIView):
|
||||
return Response(resp)
|
||||
else:
|
||||
resp['code'] = 5
|
||||
resp['data'] = '参数不正确'
|
||||
resp['data'] = _('参数不正确')
|
||||
return Response(resp)
|
||||
except Exception as e:
|
||||
logger.exception("创建文集出错")
|
||||
logger.exception(_("创建文集出错"))
|
||||
resp['code'] = 4
|
||||
resp['data'] = '系统异常请稍后再试'
|
||||
resp['data'] = _('系统异常请稍后再试')
|
||||
return Response(resp)
|
||||
else:
|
||||
resp['code'] = 6
|
||||
resp['data'] = '请登录后操作'
|
||||
resp['data'] = _('请登录后操作')
|
||||
return Response(resp)
|
||||
|
||||
# 修改文集
|
||||
@ -372,14 +373,14 @@ class ProjectView(APIView):
|
||||
# return Response(resp)
|
||||
else:
|
||||
resp['code'] = 2
|
||||
resp['data'] = '非法请求'
|
||||
resp['data'] = _('非法请求')
|
||||
# return Response(resp)
|
||||
except ObjectDoesNotExist:
|
||||
resp['code'] = 1
|
||||
resp['data'] = '资源未找到'
|
||||
resp['data'] = _('资源未找到')
|
||||
# return Response(resp)
|
||||
except Exception as e:
|
||||
logger.exception("修改文集出错")
|
||||
logger.exception(_("修改文集出错"))
|
||||
resp['code'] = 4
|
||||
# return Response(resp)
|
||||
else:
|
||||
@ -409,14 +410,14 @@ class ProjectView(APIView):
|
||||
# return Response(resp)
|
||||
else:
|
||||
resp['code'] = 5
|
||||
resp['data'] = '参数错误'
|
||||
resp['data'] = _('参数错误')
|
||||
# return Response(resp)
|
||||
except ObjectDoesNotExist:
|
||||
resp['code'] = 1
|
||||
resp['data'] = '资源未找到'
|
||||
resp['data'] = _('资源未找到')
|
||||
# return Response(resp)
|
||||
except Exception as e:
|
||||
logger.exception("API文集删除异常")
|
||||
logger.exception(_("API文集删除异常"))
|
||||
resp['code'] = 4
|
||||
# return Response(resp)
|
||||
else:
|
||||
@ -481,7 +482,7 @@ class DocView(APIView):
|
||||
resp = {'code':0,'data':serializer.data}
|
||||
return Response(resp)
|
||||
elif doc_format == 'html':
|
||||
logger.info("返回HTML")
|
||||
logger.info(_("返回HTML"))
|
||||
# return Response({'status':'html'})
|
||||
return render(request,'app_api/single_doc_detail.html',locals())
|
||||
else:
|
||||
@ -532,12 +533,12 @@ class DocView(APIView):
|
||||
)
|
||||
return Response({'code':0,'data':{'pro':project,'doc':doc.id}})
|
||||
else:
|
||||
return Response({'code':2,'data':'无权操作此文集'})
|
||||
return Response({'code':2,'data':_('无权操作此文集')})
|
||||
else:
|
||||
return Response({'code':5,'data':'请确认文档标题、文集正确'})
|
||||
return Response({'code':5,'data':_('请确认文档标题、文集正确')})
|
||||
except Exception as e:
|
||||
logger.exception("api新建文档异常")
|
||||
return Response({'status':4,'data':'请求出错'})
|
||||
logger.exception(_("api新建文档异常"))
|
||||
return Response({'status':4,'data':_('请求出错')})
|
||||
|
||||
# 修改文档
|
||||
def put(self, request):
|
||||
@ -572,14 +573,14 @@ class DocView(APIView):
|
||||
modify_time = datetime.datetime.now(),
|
||||
status = status
|
||||
)
|
||||
return Response({'code': 0,'data':'修改成功'})
|
||||
return Response({'code': 0,'data':_('修改成功')})
|
||||
else:
|
||||
return Response({'code':2,'data':'未授权请求'})
|
||||
return Response({'code':2,'data':_('未授权请求')})
|
||||
else:
|
||||
return Response({'code': 5,'data':'参数错误'})
|
||||
return Response({'code': 5,'data':_('参数错误')})
|
||||
except Exception as e:
|
||||
logger.exception("api修改文档出错")
|
||||
return Response({'code':4,'data':'请求出错'})
|
||||
logger.exception(_("api修改文档出错"))
|
||||
return Response({'code':4,'data':_('请求出错')})
|
||||
|
||||
# 删除文档
|
||||
def delete(self, request):
|
||||
@ -611,14 +612,14 @@ class DocView(APIView):
|
||||
Doc.objects.filter(parent_doc__in=chr_doc_ids).update(status=3,
|
||||
modify_time=datetime.datetime.now()) # 修改下级文档的下级文档状态
|
||||
|
||||
return Response({'code': 0, 'data': '删除完成'})
|
||||
return Response({'code': 0, 'data': _('删除完成')})
|
||||
else:
|
||||
return Response({'code': 2, 'data': '非法请求'})
|
||||
return Response({'code': 2, 'data': _('非法请求')})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '参数错误'})
|
||||
return Response({'code': 5, 'data': _('参数错误')})
|
||||
except Exception as e:
|
||||
logger.exception("api删除文档出错")
|
||||
return Response({'code': 4, 'data': '请求出错'})
|
||||
logger.exception(_("api删除文档出错"))
|
||||
return Response({'code': 4, 'data': _('请求出错')})
|
||||
|
||||
|
||||
# 文档模板视图
|
||||
@ -635,7 +636,7 @@ class DocTempView(APIView):
|
||||
serializer = DocTempSerializer(doctemp)
|
||||
resp = {'code': 0, 'data': serializer.data}
|
||||
else:
|
||||
resp = {'code':2,'data':'无权操作'}
|
||||
resp = {'code':2,'data':_('无权操作')}
|
||||
else:
|
||||
doctemps = DocTemp.objects.filter(create_user=request.user)
|
||||
page = PageNumberPagination()
|
||||
@ -644,7 +645,7 @@ class DocTempView(APIView):
|
||||
resp = {'code':0,'data':serializer.data,'count':doctemps.count()}
|
||||
return Response(resp)
|
||||
else:
|
||||
return Response({'code': 6, 'data': '请登录'})
|
||||
return Response({'code': 6, 'data': _('请登录')})
|
||||
|
||||
def post(self, request):
|
||||
try:
|
||||
@ -658,14 +659,14 @@ class DocTempView(APIView):
|
||||
create_user=request.user
|
||||
)
|
||||
doctemp.save()
|
||||
return Response({'code':0,'data':'创建成功'})
|
||||
return Response({'code':0,'data':_('创建成功')})
|
||||
else:
|
||||
return Response({'code':5,'data':'模板标题不能为空'})
|
||||
return Response({'code':5,'data':_('模板标题不能为空')})
|
||||
else:
|
||||
return Response({'code':6,'data':'请登录'})
|
||||
return Response({'code':6,'data':_('请登录')})
|
||||
except Exception as e:
|
||||
logger.exception("api创建文档模板出错")
|
||||
return Response({'code':4,'data':'请求出错'})
|
||||
logger.exception(_("api创建文档模板出错"))
|
||||
return Response({'code':4,'data':_('请求出错')})
|
||||
|
||||
def put(self, request):
|
||||
try:
|
||||
@ -679,14 +680,14 @@ class DocTempView(APIView):
|
||||
doctemp.name = name
|
||||
doctemp.content = content
|
||||
doctemp.save()
|
||||
return Response({'code':0,'data':'修改成功'})
|
||||
return Response({'code':0,'data':_('修改成功')})
|
||||
else:
|
||||
return Response({'code':2,'data':'非法操作'})
|
||||
return Response({'code':2,'data':_('非法操作')})
|
||||
else:
|
||||
return Response({'code':5,'data':'参数错误'})
|
||||
return Response({'code':5,'data':_('参数错误')})
|
||||
except Exception as e:
|
||||
logger.exception("api修改文档模板出错")
|
||||
return Response({'code':4,'data':'请求出错'})
|
||||
logger.exception(_("api修改文档模板出错"))
|
||||
return Response({'code':4,'data':_('请求出错')})
|
||||
|
||||
def delete(self, request):
|
||||
try:
|
||||
@ -695,14 +696,14 @@ class DocTempView(APIView):
|
||||
doctemp = DocTemp.objects.get(id=doctemp_id)
|
||||
if request.user == doctemp.create_user:
|
||||
doctemp.delete()
|
||||
return Response({'code': 0, 'data': '删除完成'})
|
||||
return Response({'code': 0, 'data': _('删除完成')})
|
||||
else:
|
||||
return Response({'code': 2, 'data': '非法请求'})
|
||||
return Response({'code': 2, 'data': _('非法请求')})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '参数错误'})
|
||||
return Response({'code': 5, 'data': _('参数错误')})
|
||||
except Exception as e:
|
||||
logger.exception("api删除文档模板出错")
|
||||
return Response({'code': 4, 'data': '请求出错'})
|
||||
logger.exception(_("api删除文档模板出错"))
|
||||
return Response({'code': 4, 'data': _('请求出错')})
|
||||
|
||||
|
||||
# 图片视图
|
||||
@ -742,7 +743,7 @@ class ImageView(APIView):
|
||||
result = base_img_upload(base_img, dir_name, request.user)
|
||||
resp = {'code': 0, 'data': result['url']}
|
||||
else:
|
||||
resp = {"code": 5, "message": "出错信息"}
|
||||
resp = {"code": 5, "message": _("出错信息")}
|
||||
return Response(resp)
|
||||
|
||||
# 删除
|
||||
@ -750,7 +751,7 @@ class ImageView(APIView):
|
||||
img_id = request.data.get('id', '')
|
||||
img = Image.objects.get(id=img_id)
|
||||
if img.user != request.user:
|
||||
return Response({'code': 2, 'data': '未授权请求'})
|
||||
return Response({'code': 2, 'data': _('未授权请求')})
|
||||
file_path = settings.BASE_DIR + img.file_path
|
||||
is_exist = os.path.exists(file_path)
|
||||
if is_exist:
|
||||
@ -768,8 +769,8 @@ class ImageGroupView(APIView):
|
||||
group_list = []
|
||||
all_cnt = Image.objects.filter(user=request.user).count()
|
||||
non_group_cnt = Image.objects.filter(group_id=None,user=request.user).count()
|
||||
group_list.append({'group_name': '全部图片', 'group_cnt': all_cnt, 'group_id': 0})
|
||||
group_list.append({'group_name': '未分组', 'group_cnt': non_group_cnt, 'group_id': -1})
|
||||
group_list.append({'group_name': _('全部图片'), 'group_cnt': all_cnt, 'group_id': 0})
|
||||
group_list.append({'group_name': _('未分组'), 'group_cnt': non_group_cnt, 'group_id': -1})
|
||||
groups = ImageGroup.objects.filter(user=request.user) # 查询所有分组
|
||||
for group in groups:
|
||||
group_cnt = Image.objects.filter(group_id=group).count()
|
||||
@ -781,27 +782,27 @@ class ImageGroupView(APIView):
|
||||
group_list.append(item)
|
||||
return Response({'code': 0, 'data': group_list})
|
||||
except:
|
||||
return Response({'code': 4, 'data': '出现错误'})
|
||||
return Response({'code': 4, 'data': _('出现错误')})
|
||||
|
||||
def post(self, request):
|
||||
group_name = request.data.get('group_name', '')
|
||||
if group_name not in ['', '默认分组', '未分组']:
|
||||
if group_name not in ['', _('默认分组'), _('未分组')]:
|
||||
ImageGroup.objects.create(
|
||||
user=request.user,
|
||||
group_name=group_name
|
||||
)
|
||||
return Response({'code': 0, 'data': 'ok'})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '名称无效'})
|
||||
return Response({'code': 5, 'data': _('名称无效')})
|
||||
|
||||
def put(self, request):
|
||||
group_name = request.data.get("group_name", '')
|
||||
if group_name not in ['', '默认分组', '未分组']:
|
||||
if group_name not in ['', _('默认分组'), _('未分组')]:
|
||||
group_id = request.POST.get('group_id', '')
|
||||
ImageGroup.objects.filter(id=group_id,user=request.user).update(group_name=group_name)
|
||||
return Response({'code': 0, 'data': 'ok'})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '名称无效'})
|
||||
return Response({'code': 5, 'data': _('名称无效')})
|
||||
|
||||
def delete(self, request):
|
||||
try:
|
||||
@ -811,7 +812,7 @@ class ImageGroupView(APIView):
|
||||
group.delete() # 删除分组
|
||||
return Response({'code': 0, 'data': 'ok'})
|
||||
except:
|
||||
return Response({'code': 4, 'data': '删除错误'})
|
||||
return Response({'code': 4, 'data': _('删除错误')})
|
||||
|
||||
|
||||
# 附件视图
|
||||
@ -864,7 +865,7 @@ class AttachmentView(APIView):
|
||||
attachment_size = self.sizeFormat(attachment.size)
|
||||
# 限制附件大小在50mb以内
|
||||
if attachment.size > 52428800:
|
||||
return Response({'code': False, 'data': '文件大小超出限制'})
|
||||
return Response({'code': False, 'data': _('文件大小超出限制')})
|
||||
# 限制附件为ZIP格式文件
|
||||
if attachment_name.endswith('.zip'):
|
||||
a = Attachment.objects.create(
|
||||
@ -875,9 +876,9 @@ class AttachmentView(APIView):
|
||||
)
|
||||
return Response({'code': 0, 'data': {'name': attachment_name, 'url': a.file_path.name}})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '不支持的格式'})
|
||||
return Response({'code': 5, 'data': _('不支持的格式')})
|
||||
else:
|
||||
return Response({'code': 5, 'data': '无效文件'})
|
||||
return Response({'code': 5, 'data': _('无效文件')})
|
||||
|
||||
def delete(self, request):
|
||||
attach_id = request.data.get('attach_id', '')
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
# 博客地址:zmister.com
|
||||
# 文集导入相关方法
|
||||
|
||||
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from app_doc.models import Doc,Project,Image
|
||||
from app_doc.util_upload_img import upload_generation_dir
|
||||
from django.db import transaction
|
||||
@ -93,7 +93,7 @@ class ImportZipProject():
|
||||
|
||||
|
||||
except:
|
||||
logger.error("未发现yaml文件")
|
||||
logger.error(_("未发现yaml文件"))
|
||||
project_name = zip_file_path[:-4].split('/')[-1]
|
||||
project_desc = ''
|
||||
project_role = 1
|
||||
@ -147,7 +147,7 @@ class ImportZipProject():
|
||||
create_user=create_user
|
||||
)
|
||||
except:
|
||||
logger.exception("解析导入文件异常")
|
||||
logger.exception(_("解析导入文件异常"))
|
||||
# 回滚事务
|
||||
transaction.savepoint_rollback(save_id)
|
||||
|
||||
@ -157,7 +157,7 @@ class ImportZipProject():
|
||||
os.remove(zip_file_path)
|
||||
return project.id
|
||||
except:
|
||||
logger.exception("删除临时文件异常")
|
||||
logger.exception(_("删除临时文件异常"))
|
||||
return None
|
||||
|
||||
# 处理MD内容中的静态文件
|
||||
@ -201,7 +201,7 @@ class ImportZipProject():
|
||||
user=create_user,
|
||||
file_path=new_media_filename,
|
||||
file_name=str(time.time())+'.'+file_suffix,
|
||||
remark='本地上传',
|
||||
remark=_('本地上传'),
|
||||
)
|
||||
md_content = md_content.replace(media_filename, new_media_filename)
|
||||
else:
|
||||
@ -238,7 +238,7 @@ class ImportDocxDoc():
|
||||
user=self.create_user,
|
||||
file_path=new_media_filename,
|
||||
file_name=file_time_name + '.' + file_suffix,
|
||||
remark='本地上传',
|
||||
remark=_('本地上传'),
|
||||
)
|
||||
with open(new_media_file_path, 'wb') as f:
|
||||
f.write(image_bytes.read())
|
||||
@ -266,7 +266,7 @@ class ImportDocxDoc():
|
||||
return {'status':True,'data':result}
|
||||
except:
|
||||
os.remove(self.docx_file_path)
|
||||
return {'status':False,'data':'读取异常'}
|
||||
return {'status':False,'data':_('读取异常')}
|
||||
|
||||
if __name__ == '__main__':
|
||||
imp = ImportZipProject()
|
||||
|
||||
@ -12,6 +12,7 @@ from selenium.webdriver.support.expected_conditions import staleness_of
|
||||
from webdriver_manager.chrome import ChromeDriverManager
|
||||
from webdriver_manager.utils import ChromeType
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
import sys
|
||||
import json
|
||||
import base64
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
# 博客地址:zmister.com
|
||||
# MrDoc文集文档导出相关功能代码
|
||||
from django.conf import settings
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
import subprocess
|
||||
import datetime,time
|
||||
import re
|
||||
@ -172,6 +173,48 @@ class ReportMD():
|
||||
return md_content
|
||||
|
||||
|
||||
# 批量导出文集Markdown压缩包
|
||||
class ReportMdBetch():
|
||||
def __init__(self,username,project_id_list):
|
||||
self.project_list = project_id_list
|
||||
self.username = username
|
||||
# 判断MD导出临时文件夹是否存在
|
||||
if os.path.exists(settings.MEDIA_ROOT + "/reportmd_temp") is False:
|
||||
os.mkdir(settings.MEDIA_ROOT + "/reportmd_temp")
|
||||
|
||||
# 判断用户名+日期文件夹是否存在
|
||||
self.report_file_path = settings.MEDIA_ROOT + "/reportmd_temp/{}_{}".format(
|
||||
self.username,datetime.datetime.strftime(datetime.datetime.now(),"%y%m%d%H%M%S")
|
||||
)
|
||||
is_fold = os.path.exists(self.report_file_path)
|
||||
if is_fold is False:
|
||||
os.mkdir(self.report_file_path)
|
||||
|
||||
def work(self):
|
||||
# 遍历文集列表,打包每一个文集
|
||||
project_file_list = []
|
||||
for project_id in self.project_list:
|
||||
report_func = ReportMD(project_id=project_id)
|
||||
report_project_zip = report_func.work()
|
||||
project_file_list.append(report_project_zip)
|
||||
|
||||
# 遍历打包好的文集列表,将其移入统一文件夹
|
||||
for file in project_file_list:
|
||||
shutil.move(file,self.report_file_path)
|
||||
|
||||
# 压缩打包文集合集文件夹
|
||||
md_file = shutil.make_archive(
|
||||
base_name=self.report_file_path,
|
||||
format='zip',
|
||||
root_dir=self.report_file_path
|
||||
)
|
||||
# print(md_file)
|
||||
# 删除文件夹
|
||||
shutil.rmtree(self.report_file_path)
|
||||
|
||||
return "{}.zip".format(self.report_file_path)
|
||||
|
||||
|
||||
# 导出EPUB
|
||||
@logger.catch()
|
||||
class ReportEPUB():
|
||||
@ -224,7 +267,7 @@ class ReportEPUB():
|
||||
for iframe in iframe_tag:
|
||||
iframe_src = iframe.get('src')
|
||||
iframe.name = 'p'
|
||||
iframe.string = "本格式不支持iframe视频显示,视频地址为:{}".format(iframe_src)
|
||||
iframe.string = _("本格式不支持iframe视频显示,视频地址为:{}".format(iframe_src))
|
||||
|
||||
# 替换HTML文本中静态文件的相对链接为绝对链接
|
||||
for src in src_tag:
|
||||
@ -255,7 +298,7 @@ class ReportEPUB():
|
||||
'id': 0,
|
||||
'link': 'Text/toc_summary.xhtml',
|
||||
'pid': 0,
|
||||
'title': '目录'
|
||||
'title': _('目录')
|
||||
}
|
||||
]
|
||||
nav_str = '''<navMap>'''
|
||||
@ -770,7 +813,7 @@ class ReportPDF():
|
||||
try:
|
||||
convert('file://'+temp_file_path,report_file_path)
|
||||
except:
|
||||
logger.exception("生成PDF出错")
|
||||
logger.exception(_("生成PDF出错"))
|
||||
return False
|
||||
# 处理PDF文件
|
||||
if os.path.exists(report_file_path):
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
# coding:utf-8
|
||||
# 文档自定义模板过滤器
|
||||
from app_doc.models import *
|
||||
|
||||
from django import template
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from app_doc.models import *
|
||||
import re
|
||||
|
||||
register = template.Library()
|
||||
@ -27,7 +29,7 @@ def is_colla_pro(pro,user):
|
||||
if p.exists():
|
||||
return ''
|
||||
else:
|
||||
return '【协作】'
|
||||
return _('【协作】')
|
||||
|
||||
# 获取文档的上级文档名称
|
||||
@register.filter(name='get_doc_parent')
|
||||
@ -35,7 +37,7 @@ def get_doc_parent(value):
|
||||
if int(value) != 0:
|
||||
return Doc.objects.get(id=int(value))
|
||||
else:
|
||||
return '无上级文档'
|
||||
return _('无上级文档')
|
||||
|
||||
# 获取文档的下一篇文档
|
||||
@register.filter(name='get_doc_next')
|
||||
@ -91,8 +93,7 @@ def get_doc_next(value):
|
||||
# print("下一篇:", next_doc.id, next_doc)
|
||||
return next_doc.id
|
||||
except Exception as e:
|
||||
import traceback
|
||||
print(traceback.print_exc())
|
||||
pass
|
||||
|
||||
# 获取文档的上一篇文档
|
||||
@register.filter(name='get_doc_previous')
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
# 文档自定义模板过滤器
|
||||
from app_doc.models import *
|
||||
from django import template
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@ -16,7 +17,7 @@ def get_doc_count(value):
|
||||
def get_new_doc(value):
|
||||
new_doc = Doc.objects.filter(top_doc=int(value),status=1).order_by('-modify_time')[:3]
|
||||
if new_doc is None:
|
||||
new_doc = '它还没有文档……'
|
||||
new_doc = _('它还没有文档……')
|
||||
return new_doc
|
||||
|
||||
# 获取文集的EPUB开放导出状态
|
||||
|
||||
@ -3,6 +3,7 @@ from django.http import HttpResponse
|
||||
from django.conf import settings
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.contrib.auth.decorators import login_required # 登录需求装饰器
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
import datetime,time,json,base64,os,uuid
|
||||
from app_doc.models import Image,ImageGroup,Attachment
|
||||
from app_admin.models import SysSetting
|
||||
@ -53,7 +54,7 @@ def ice_save_file(file_obj,user):
|
||||
# 判断附件格式
|
||||
is_images = ["jpg", "jpeg", "gif", "png", "bmp", "webp"]
|
||||
if file_suffix.lower() not in allow_suffix:
|
||||
return {"error": "文件格式不允许"}
|
||||
return {"error": _("文件格式不允许")}
|
||||
if file_suffix.lower() == 'blob':
|
||||
# 粘贴上传直接默认为png就行
|
||||
file_suffix = 'png'
|
||||
@ -77,7 +78,7 @@ def ice_save_file(file_obj,user):
|
||||
user=user,
|
||||
file_path=file_url,
|
||||
file_name=file_name,
|
||||
remark="iceEditor上传"
|
||||
remark=_("iceEditor上传")
|
||||
)
|
||||
|
||||
else :
|
||||
@ -90,7 +91,7 @@ def ice_save_file(file_obj,user):
|
||||
)
|
||||
return {"error":0, "name": str(file_obj),'url':file_url}
|
||||
|
||||
return {"error": "文件存储异常"}
|
||||
return {"error": _("文件存储异常")}
|
||||
|
||||
|
||||
# ice_url图片上传
|
||||
@ -118,7 +119,7 @@ def ice_url_img_upload(url,user):
|
||||
user=user,
|
||||
file_path=file_url,
|
||||
file_name=file_name,
|
||||
remark='iceurl粘贴上传',
|
||||
remark=_('iceurl粘贴上传'),
|
||||
)
|
||||
resp_data = {"error":0, "name": file_name,'url':file_url}
|
||||
return resp_data
|
||||
@ -165,7 +166,7 @@ def upload_img(request):
|
||||
else:
|
||||
result = url_img_upload(url_img,dir_name,request.user)
|
||||
else:
|
||||
result = {"success": 0, "message": "上传出错"}
|
||||
result = {"success": 0, "message": _("上传出错")}
|
||||
return HttpResponse(json.dumps(result), content_type="application/json")
|
||||
|
||||
|
||||
@ -187,7 +188,7 @@ def img_upload(files, dir_name, user, group_id=None):
|
||||
file_suffix = files.name.split(".")[-1] # 提取图片格式
|
||||
# 判断图片格式
|
||||
if file_suffix.lower() not in allow_suffix:
|
||||
return {"success": 0, "message": "图片格式不正确"}
|
||||
return {"success": 0, "message": _("图片格式不正确")}
|
||||
|
||||
# 判断图片的大小
|
||||
try:
|
||||
@ -197,7 +198,7 @@ def img_upload(files, dir_name, user, group_id=None):
|
||||
# print(repr(e))
|
||||
allow_img_size = 10485760
|
||||
if files.size > allow_img_size:
|
||||
return {"success": 0, "message": "图片大小超出{}MB".format(allow_img_size / 1048576)}
|
||||
return {"success": 0, "message": _("图片大小超出{}MB".format(allow_img_size / 1048576))}
|
||||
|
||||
relative_path = upload_generation_dir(dir_name)
|
||||
file_name = files.name.replace(file_suffix,'').replace('.','') + '_' +str(int(time.time())) + '.' + file_suffix
|
||||
@ -213,10 +214,10 @@ def img_upload(files, dir_name, user, group_id=None):
|
||||
user=user,
|
||||
file_path=file_url,
|
||||
file_name=file_name,
|
||||
remark='本地上传',
|
||||
remark=_('本地上传'),
|
||||
group = group_id,
|
||||
)
|
||||
return {"success": 1, "url": file_url,'message':'上传图片成功'}
|
||||
return {"success": 1, "url": file_url,'message':_('上传图片成功')}
|
||||
|
||||
|
||||
# base64编码图片上传
|
||||
@ -236,9 +237,9 @@ def base_img_upload(files,dir_name, user):
|
||||
user = user,
|
||||
file_path = file_url,
|
||||
file_name=file_name,
|
||||
remark = '粘贴上传',
|
||||
remark = _('粘贴上传'),
|
||||
)
|
||||
return {"success": 1, "url": file_url, 'message': '上传图片成功'}
|
||||
return {"success": 1, "url": file_url, 'message': _('上传图片成功')}
|
||||
|
||||
|
||||
# url图片上传
|
||||
@ -263,7 +264,7 @@ def url_img_upload(url,dir_name,user):
|
||||
user=user,
|
||||
file_path=file_url,
|
||||
file_name=file_name,
|
||||
remark='粘贴上传',
|
||||
remark=_('粘贴上传'),
|
||||
)
|
||||
resp_data = {
|
||||
'msg': '',
|
||||
|
||||
415
app_doc/views.py
415
app_doc/views.py
File diff suppressed because it is too large
Load Diff
@ -17,6 +17,7 @@ from app_doc.models import Project,Doc,DocTemp
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
from django.db import transaction
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from loguru import logger
|
||||
from app_doc.report_utils import *
|
||||
from app_admin.decorators import check_headers,allow_report_file
|
||||
@ -43,7 +44,7 @@ def import_project(request):
|
||||
file_name = import_file.name
|
||||
# 限制文件大小在50mb以内
|
||||
if import_file.size > 52428800:
|
||||
return JsonResponse({'status': False, 'data': '文件大小超出限制'})
|
||||
return JsonResponse({'status': False, 'data': _('文件大小超出限制')})
|
||||
# 限制文件格式为.zip
|
||||
if file_name.endswith('.zip'):
|
||||
if os.path.exists(os.path.join(settings.MEDIA_ROOT,'import_temp')) is False:
|
||||
@ -121,15 +122,15 @@ def import_project(request):
|
||||
}
|
||||
})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'上传失败'})
|
||||
return JsonResponse({'status':False,'data':_('上传失败')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'上传失败'})
|
||||
return JsonResponse({'status':False,'data':_('上传失败')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'仅支持.zip格式'})
|
||||
return JsonResponse({'status':False,'data':_('仅支持.zip格式')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'无有效文件'})
|
||||
return JsonResponse({'status':False,'data':_('无有效文件')})
|
||||
else:
|
||||
return JsonResponse({'status':False,'data':'参数错误'})
|
||||
return JsonResponse({'status':False,'data':_('参数错误')})
|
||||
|
||||
|
||||
# 文集文档排序
|
||||
@ -146,12 +147,12 @@ def project_doc_sort(request):
|
||||
try:
|
||||
sort_data = json.loads(sort_data)
|
||||
except Exception:
|
||||
return JsonResponse({'status':False,'data':'文档参数错误'})
|
||||
return JsonResponse({'status':False,'data':_('文档参数错误')})
|
||||
|
||||
try:
|
||||
Project.objects.get(id=project_id,create_user=request.user)
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({'status':False,'data':'没有匹配的文集'})
|
||||
return JsonResponse({'status':False,'data':_('没有匹配的文集')})
|
||||
|
||||
# 修改文集信息
|
||||
Project.objects.filter(id=project_id).update(
|
||||
@ -194,7 +195,7 @@ def import_doc_docx(request):
|
||||
file_name = import_file.name
|
||||
# 限制文件大小在50mb以内
|
||||
if import_file.size > 52428800:
|
||||
return JsonResponse({'status': False, 'data': '文件大小超出限制'})
|
||||
return JsonResponse({'status': False, 'data': _('文件大小超出限制')})
|
||||
# 限制文件格式为.zip
|
||||
if file_name.endswith('.docx'):
|
||||
if os.path.exists(os.path.join(settings.MEDIA_ROOT, 'import_temp')) is False:
|
||||
@ -213,10 +214,10 @@ def import_doc_docx(request):
|
||||
).run()
|
||||
return JsonResponse(import_file)
|
||||
else:
|
||||
return JsonResponse({'status': False, 'data': '上传失败'})
|
||||
return JsonResponse({'status': False, 'data': _('上传失败')})
|
||||
else:
|
||||
return JsonResponse({'status': False, 'data': '仅支持.docx格式'})
|
||||
return JsonResponse({'status': False, 'data': _('仅支持.docx格式')})
|
||||
else:
|
||||
return JsonResponse({'status': False, 'data': '无有效文件'})
|
||||
return JsonResponse({'status': False, 'data': _('无有效文件')})
|
||||
else:
|
||||
return JsonResponse({'status': False, 'data': '参数错误'})
|
||||
return JsonResponse({'status': False, 'data': _('参数错误')})
|
||||
@ -10,6 +10,7 @@ from django.contrib.auth.decorators import login_required # 登录需求装饰
|
||||
from django.views.decorators.http import require_http_methods,require_GET,require_POST # 视图请求方法装饰器
|
||||
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage,InvalidPage # 后端分页
|
||||
from django.core.exceptions import PermissionDenied,ObjectDoesNotExist
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from app_doc.models import Project,Doc,DocTemp
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
@ -40,21 +41,21 @@ def user_center_menu(request):
|
||||
menu_data = [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "仪表盘",
|
||||
"title": _("仪表盘"),
|
||||
"type": 1,
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"href": reverse('manage_overview'),
|
||||
},
|
||||
{
|
||||
"id": "my_project",
|
||||
"title": "我的文集",
|
||||
"title": _("我的文集"),
|
||||
"icon": "layui-icon layui-icon-component",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [
|
||||
{
|
||||
"id": "manage_project",
|
||||
"title": "文集管理",
|
||||
"title": _("文集管理"),
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -62,7 +63,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "manage_colla_self",
|
||||
"title": "我的协作",
|
||||
"title": _("我的协作"),
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -70,7 +71,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "import_project",
|
||||
"title": "导入文集",
|
||||
"title": _("导入文集"),
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -80,14 +81,14 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "my_doc",
|
||||
"title": "我的文档",
|
||||
"title": _("我的文档"),
|
||||
"icon": "layui-icon layui-icon-file-b",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [
|
||||
{
|
||||
"id": "doc_manage",
|
||||
"title": "文档管理",
|
||||
"title": _("文档管理"),
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -95,7 +96,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "doc_template",
|
||||
"title": "文档模板",
|
||||
"title": _("文档模板"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -103,7 +104,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "doc_tag",
|
||||
"title": "文档标签",
|
||||
"title": _("文档标签"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -111,7 +112,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "doc_share",
|
||||
"title": "我的分享",
|
||||
"title": _("我的分享"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -119,7 +120,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "doc_recycle",
|
||||
"title": "文档回收站",
|
||||
"title": _("文档回收站"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -129,14 +130,14 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "my_fodder",
|
||||
"title": "我的素材",
|
||||
"title": _("我的素材"),
|
||||
"icon": "layui-icon layui-icon-upload-drag",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [
|
||||
{
|
||||
"id": "my_img",
|
||||
"title": "我的图片",
|
||||
"title": _("我的图片"),
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -144,7 +145,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "my_attachment",
|
||||
"title": "我的附件",
|
||||
"title": _("我的附件"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -154,7 +155,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "my_collect",
|
||||
"title": "我的收藏",
|
||||
"title": _("我的收藏"),
|
||||
"icon": "layui-icon layui-icon-star",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -162,14 +163,14 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "self_settings",
|
||||
"title": "个人管理",
|
||||
"title": _("个人管理"),
|
||||
"icon": "layui-icon layui-icon-set-fill",
|
||||
"type": 0,
|
||||
"href": "",
|
||||
"children": [
|
||||
{
|
||||
"id": 601,
|
||||
"title": "个人设置",
|
||||
"title": _("个人设置"),
|
||||
"icon": "layui-icon layui-icon-face-smile",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -177,7 +178,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": 602,
|
||||
"title": "Token管理",
|
||||
"title": _("Token管理"),
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
@ -187,7 +188,7 @@ def user_center_menu(request):
|
||||
},
|
||||
{
|
||||
"id": "user_manual",
|
||||
"title": "使用手册",
|
||||
"title": _("使用手册"),
|
||||
"icon": "layui-icon layui-icon-template-1",
|
||||
"type": 1,
|
||||
"openType": "_blank",
|
||||
|
||||
2342
locale/zh_Hant/LC_MESSAGES/django.po
Normal file
2342
locale/zh_Hant/LC_MESSAGES/django.po
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user