自动聊天和调查API

chat_api的Python项目详细描述


聊天api
==


----


模式`
*`userthreads`
*`notifications`
*`surveys`
*`api description`


-




已知的问题和需要改进的方面~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当前所有问题都是静态的,这意味着在从问题生成消息时,不可能注入任何变量,如用户名等。这个功能应该非常广泛和可扩展。例如,对于meta x或show_as_type y的问题,应该有可能基于以下内容生成上下文:

-user
-previous responses(variables pool?)
-数据库中的其他对象

todo:

-设计
-任务输出
-实现

assisted mode没有测试覆盖范围
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

assisted mode应该可以工作(使其他用户进入脚本模式除外),但它不包括测试尚未完成。

todo:

-首先实现线程控制的api
-task out
-实现

不实现重复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

要将脚本聊天模式用作跟踪程序,必须实现重复。它是设计的,并且模型包含必需的字段,但是没有测试覆盖率,也没有脚本来重新启动架构。

todo:

-task out
-实现

发出通知。最好添加一些机制,以通用且高度可自定义的方式处理其他类型的通知。

todo:

-design
-task out
-implement



/>
-架构(也包括脚本/辅助聊天模式和调查)不支持多种语言。
-将分页添加到架构列表
-自定义验证、预保存、缩略图生成等。附件的函数还应接收序列化器对象(因此它可以访问上下文和调查);例如)
-添加推送通知
-添加电子邮件/sms通知
-将解析程序添加到meta(可能还有其他位置)-这样您就可以使用constance



安装和运行的值
----



5+
-django 1.8+,drf&;一串类似arrabela技术的drf调整&;通用通知
-芹菜



代码::python

已安装的应用程序=(

"聊天应用程序接口",
"通用通知"

芹菜应用程序path="tests.celeriy.app",

代码::python

接受的图像文件=("gif"、"png"、"jpg"、"jpeg")
接受的图像mime=("image/gif"、"image/png"、"image/jpg"、"image/jpeg")


mime-to-ext={
"image/gif":"gif"、
"image/png":"png"、
"image/jpg":"jpg"、
"image/jpeg":"jpg"、
"application/pdf":"pdf"、
"application/x-pdf":"pdf"、
"application/vnd.pdf":"pdf"、
"text/pdf":"pdf"
}


将URL添加到要使用的组件:

。代码::python

urlpatterns=[

url(r"^",在clude("chat-api.chat.api-url"),
url(r"^",include("chat-api.schemas.api-url"),
url(r"^",include("chat-api.surveys.api-url"),
]

代码::python

installed\u apps=(

"cachalot"



cachalot\u only\u cachalot\u tables=[
"chat\u api"answer,"chat\u api"attachmenttemplate,"chat\u api"group,"chat\u api"group,"chat\u api"question",
"chat\u api"_schema"
]



remi:请描述设置搜索




配置
----


>聊天设置
~~~~~~~~~~


聊天设置可通过聊天设置单独访问

。代码::python

from chat_api.settings导入chat_settings


account_serializer_cls=chat_settings.account_serializer



chat settings可以在设置中配置:

。代码::python

chat_settings={
"account_serializer":"my_project.account s.serializers.myaccountclass"
}

chat settings可以在使用django的覆盖设置的测试中覆盖。但是,权限类是在前面解析的,因此它们不会受此影响。


account serializer
~~~~~~~~~~~~~~~~~~~~

>默认的account serializer包含:

-id
-名字
-姓氏
-avatar

应该包含在此序列化程序中的ng字段,因此它是完全可自定义的。



schemas settings
~~~~~~~~~~~~~~~~~~~~

schema type:每个架构必须有一个类型。类型可以在每个项目中自由定义。默认类型是"调查"和"自动流量",但在给定的项目中,建议使其更具描述性,例如:"入职流量"、"取消订阅流量"、"健康调查"等。代码::python

"types\u schema":(("schema\u type","schema type label"),("other\u type","other label"),



可以通过api列出/获取的模式类型:通过api获取模式/列出模式可以被限制为某些选择(或强制)。例如,我们希望能够获得完整的调查方案,但不希望获得任何自动化流程。代码::python

"types_schema_list_through_api":("health_survey",),
"types_schema_get_through_api":("health_survey",),


允许编辑已发布的模式:在开发环境中,此功能应仅限用户**。默认情况下,已发布的架构不可编辑。它们可以复制到一个新的,未发布的版本,编辑,一旦发布-它们将使以前的版本过时。但是,如果用户x在某个版本z中启动了模式y,他应该能够完成这个模式版本,否则将导致不可预测的行为。然而,在开发过程中,每次需要调整内容时,复制并发布新版本将非常不方便。代码::python

"允许编辑已发布的架构":false,



thread s types
~~~~~~~~~~~~~~~~


type:每个线程都有自己的类型。类型用于描述(并帮助定义)某些不同的聊天功能。例如:"入职"、"一对一聊天"、"群聊"。您可以配置哪些类型的聊天可以通过API列出,哪些类型的聊天只能通过其他一些端点返回。

…代码::python

"types-chat":(("chat","chat"),("survey","survey"),("tracker","tracker"),
"types-chat-default":"chat",
"types-chat-list-u-through-api":("chat","survey","tracker"),


EAD有一种类型。默认类型是简单的"消息",但是可以指定任何类型。某些消息类型C对某些类型的用户有限制。必须定义两个设置:

…代码::python

ueryset_filter(queryset,user):
如果不是用户,则为超级用户:
返回queryset.exclude(type="secret")


返回queryset

def my_message_user_filter(message,user):
如果用户是超级用户:
返回true

消息。键入!="secret"



在列出消息时使用queryset筛选器,在向用户线程发送ws和分配最后一条消息时使用单个消息筛选器。

**重要**一旦分配最后一条消息,它将保持已分配状态(并可通过threadserializer作为最后一条消息获取)_(数据)在分配新的模式之前,因此如果更改筛选器并且希望100%确保没有人在更改之后不应看到最后一条消息,则需要迁移。




参加一项调查。代码::python

"允许的调查架构类型":("调查",),



分页
~~~~~~~~~~~

线程、消息列表和调查可以分页。默认情况下,使用nocountlimitoffsetpagination(因为它是最快的,对用户来说最方便的无休止的滚动),但是可以覆盖那些:

。代码::python

"分页线程列表":"any.pagination.class.youlike",
"分页消息列表":"any.pagination.class.youlike",
"分页全局调查列表":"any.pagination.class.youlike",
"分页帐户调查列表":"any.pagination.class.youlike",



权限
~这允许完全定制聊天。例如,默认情况下,对给定线程的读/写访问只有在userthread中定义的具有正确权限的线程成员。但是,如果您希望例如给定的用户类型读取所有线程,则覆盖权限类是一种方法。

…代码::python

"Permissions\u-Messages\u-by-Thread\u-ID":"any.permission.class.youlike"、
"Permissions\u-Message\u-by-Thread\u-ID":"any.permission.class.youlike"、


附件设置
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

预先定义的行为:

-图像
-YouTube(URL)
-对象引用

代码::python

"},
"自定义附件缩略图生成器"{"pdf":"my.thumbnail生成器"},
"自定义附件附件"{"pdf":"my.get_src_func"},
"自定义附件缩略图"{"pdf":"my.get_thumbnail_func"},
}
操作函数(数据):
如果"src"不在数据中:
引发序列化程序.validationerror("我想要此字段!")
返回数据

/>def get_src_func(obj):
返回obj.src+"?一些神奇的密钥=dsaokpda"

def get_thumbnail_func(obj):
return obj.thumbnail["src"]



>您还可以定义默认的附件缩略图大小:

……代码::python

"附件缩略图大小":(100,100),




s.google.com/document/d/1d懔u beznnwrhsgjmapa-9lorpzpe1p3xfbdfmjprbhesy/edit




chat modes
--


chat modes是在给定线程中为每个用户定义的。这意味着一个用户可以处于脚本模式,另一个用户可以处于辅助模式,而另一个用户可以处于关闭模式。给定线程中给定用户的模式(状态)在user thread中定义。

open
~~~~

在此模式中,没有为userthread分配架构。处于这种状态的线程成员可以自由地编写消息。

处于这种状态的线程成员无法写入任何消息。在此模式下,必须将脚本化的架构分配给用户线程。在此模式下,用户只能根据当前问题的类型、参数和答案(如果适用)发送正确答案的消息(userthread.question that generated userthread.related廑message)。

d.on_finish_repeat)
-打开(userthread.on_finish==userthread.on_finish_open)
-关闭(userthread.on_finish==userthread.on_finish_close)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

此模式的工作方式与脚本状态几乎相同,但以下情况除外:
-问题中的消息不是在架构转换为另一个问题的瞬间生成的,而是与消息一起生成的。

assisted
~用户线程中没有当前问题,也没有相关消息。辅助模式只是将模式id传递给fe,因此用户可以从中选择一条消息并将其发送到聊天室。一旦实现,它还将允许这样的用户使其他用户进入脚本状态。

示例用例:

…代码:

[patient,open state]嗨,我感觉不舒服
[doctor,assisted state]嗨,我需要更多信息
[doctor,assisted state,选择模式中的"基本评估"部分]
[automated message from doctor]你体温升高了吗?
[患者,脚本状态,从答案中选择]是

对架构中当前问题的回答。如果用户b在他的user thread.permission s中有权限线程中断状态,则可以通过沿"中断状态"向用户发送消息来中断用户a的状态:true。这会将用户A移动到打开状态。



userthreads
----


只有少数线程属性由所有线程成员共享:

-thread id
-title
-updated&created timestamp

所有其他重要属性对于每个线程成员都是唯一的:
-state&all related p属性
-权限和通知
-最后消息

此外,各种api的权限是根据userthread确定的。因此,即使对象包含到线程的FK,如果线程数据将被序列化,则它将是用户线程,而不是在那里进行线程序列化。chat在序列化期间正在进行这些替换,但是如果您将fk添加到某个其他对象中的线程,并且希望正确序列化它,则应该从chat复制解决方案。


默认用户线程
~~~~~~~~~~~~~~~~~~~~

对不是其成员的用户进行读取,在这种情况下,有必要在序列化之前定义一些默认的用户线程。示例:

…代码::python

default戋thread=userthread(
notifications=userthread.notifications戋ws,state=userthread.state戋open,updated=thread.updated,
permissions=userthread.permission戋read,thread=thread,
created=thread.created,last_message=thread.last_message




notifications
----


userthread中的每个用户都可以被分配一个自定义通知级别。默认情况下,他将获得未读状态和websocket通知。也有推送通知的标志,但尚未实现。以后应添加电子邮件/短信/其他通知。

…代码::python

user thread.objects.create(
notifications=userthread.notifications\uUserthread.notifiactions\uUnread,…




unread states
~~~~~~~~~~~~~

thread.notifications_unread flag on in his notifications flags in his userthread.启用或禁用标志不会影响以前的邮件-它们要么保留未读状态,要么不保留未读状态。

出于优化原因,未读状态是一个单独的对象,当用户将邮件标记为已读时,会将其删除。

两种情况:

-当给定用户通过api(get/api/threads/{thread_id}/消息)获得它们时
-当通过ws multiplex发送命令"mark_message_as_read"时

代码::python

ws-u-received.send(消息数据={
"消息":"将消息标记为已读",
"数据":{
"消息":self.message1.id
}
},频道电子邮件=[self.user2.email],sender=none)


~当前是否发送两个websockets:

-消息已创建或更新复制的它还包含附件和序列化的用户线程(关于未读邮件数的信息)。

粗网络进程多路复用。

…代码::python

ws-u-received.send(消息数据={
"消息":"线程有人在写"
"数据":{
"线程":self.thread.id,
"长度":1000米秒
}
},频道电子邮件=[self.user2.email],发件人=无)




非成员的websockets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

同样的对话,如果把每个线程都添加到一个线程中,效率会很低)有一个api来订阅给定的线程websockets:post/api/threads/{thread_id}/ws subscribe。

SER只能订阅一个不是其成员的线程。订阅新线程自动替换旧订阅。默认情况下,此API被阻止-必须重写它的权限类才能使用它。



如果是问题,则应通过API(get/api/schemas/{pk})获取来自调查对象的给定架构。

使用此方法。

state
~r/>确定可见性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

可见性由以下算法定义:

-我们假设第一个问题(具有最低位置)可见。
-如果某个问题可见,则它所指的问题(通过下一个qid)也可见。
-如果存在i一个添加到可见问题中的答案,该答案所指的问题(下一个问题)也可见。


更改答案可能会影响问题的可见性(如果问题失去对它的所有引用),甚至影响整个问题组。可见性是在每次在调查对象中以[可见性]状态保存并返回答案后确定的。


必选字段
~~~~~~~~~~~~~~~~~~

-架构中的每个问题都可以按需标记。
-只有在问题可见时才真正需要该问题(请参阅abov一节e)。

urveys/{survey{id}/items/{pk}),然后添加一个新函数。

api描述
----


将聊天库插入项目后,可以在swagger中找到所有api函数。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用ContentExchange设置请求属性   java Spark/Hdfs/Hdfsclient兼容性   java springcloudstreamkafka配置:instanceCount和instanceIndex   Java中web服务序列化日期   java用动态数据替换占位符   java git gc似乎覆盖了一个packfile,留下了一个打开的文件描述符,其中包含对“oldxxx.pack”的引用   为什么Apache项目对Java版本敏感?   java Anylogic帮助如何在导入的3dobject通过输送机上的多个“站”时更改其颜色?   JavaEclipseNeonM2E可以导入一个大型项目,但似乎不能自动解决依赖关系   java@FindBy搜索具有满足条件的子元素的元素   java如何将ActionEvent e与键绑定一起使用?   java转换以集中方式从外部库抛出的异常   java中用户文件/数据文件与系统/程序文件的区别   java使用变量字符串或字符作为对象名   字体使用Java图形操纵字符串中每个字符的形状   JavaFX图表移动数据   java RandomAccessFile:将所有项设置为相同的字节数?   java Google Play inapp Billing onPurchasesUpdated()错误响应代码1   java在不知道属性名和属性数的情况下处理json对象   java是否可以一次从HazelcastInstance(映射和列表)中删除所有数据?