自动聊天和调查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函数。
==
----
模式`
*`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)
-消息已创建或更新复制的它还包含附件和序列化的用户线程(关于未读邮件数的信息)。
粗网络进程多路复用。
…代码::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函数。