Django的多用户、多组任务管理和分配系统。
项目描述
django-todo
django-todo是一个可插入的多用户、多组任务管理和分配应用程序,专为Django设计,可作为一个可重用的应用程序集成到现有的网站中。django-todo可以用作个人待办事项跟踪器,或团队任务管理系统,或组织的票务系统(或同时使用所有这些!)
了解django-todo的最佳方式是访问django-todo.org的实时演示网站!
特性
- 拖放任务优先级排序
- 电子邮件任务通知
- 搜索
- 对任务的评论
- 面向公众的票据提交表单
- 移动友好(进行中)
- 我的任务(跨列表)的独立视图
- 通过CSV批量导入任务
- 以CSV格式批量导出任务
- 每个任务可以附加多个文件(见设置)
- 集成邮件跟踪(统一任务列表与邮箱)
需求
- Django 2.0+
- Python 3.6+
- jQuery(完整版本,不是“slim”,用于拖放优先级排序)
- Bootstrap(虽然可以覆盖它们,但您需要使用提供的模板)
- bleach(
pip install bleach
) - django-autocomplete-light(可选,合并任务时需要)
概述
我们假设您的组织有多个员工组,每个组都有多个用户(实际用户和组映射到Django用户和组)。用户可能属于多个组,每个组都可以有多个待办事项列表。
您必须在Django管理后台中至少设置一个组,并且该组必须至少有一个用户成员。即使您是django-todo的唯一用户,这也适用。
用户可以查看和修改属于他们组的所有待办事项列表。只有具有is_staff
权限的用户才能添加或删除列表。
相同的列表名称可以存在于不同的组中,但不能在同一组中存在。
创建新任务时,会向分配给的人员发送电子邮件。
默认情况下,允许在任务上使用几种类型的文件附件。请参阅设置以禁用或限制文件类型。如果您担心文件大小,请在您的Web服务器配置中限制它们(目前django-todo未单独处理)。
可以在任务中添加评论线程。当添加新评论时,线程中的每个参与者都会收到电子邮件。
django-todo仅支持身份验证。您必须设置登录系统并在部署前至少设置一个组。
所有任务都由当前用户“创建”,并可“分配给”特定用户。未分配的条目在UI中显示为“任何人”。
django-todo v2利用了Django 2.0才有的功能。它不会在先前版本中工作。v2仅在Python 3.x上进行了测试——对旧版本没有保证。
安装
django-todo是一个Django应用程序,而不是项目站点。它需要一个站点来生存。您可以将其安装到现有的Django项目站点中,或者克隆django-todo 演示站点(GTD)。
如果您使用自己的站点,请确保您已经配置并启用了jQuery和Bootstrap。
django-todo视图在需要时将在页面标题中插入额外的CSS/JavaScript,因此您的项目的基模板必须包括
{% block extrahead %}{% endblock extrahead %}
{% block extra_js %}{% endblock extra_js %}
django-todo附带自己的todo/base.html
,它扩展了您的base.html
。所有内容都位于
{% block content %}{% endblock %}
如果您为主内容区域使用其他名称,则需要覆盖和修改提供的模板。
所有视图都需要登录。因此,您必须有一个工作着的用户认证系统。
要使电子邮件通知工作,请确保您的站点/项目已设置好以发送电子邮件。
请确保您已安装Django的“sites”框架,并在设置中指定了默认站点,例如SITE_ID = 1
将django-todo/todo放置在您的Python路径上的某个位置,或通过pip安装
pip install django-todo
添加到您的设置中
INSTALLED_APPS = (
...
'todo',
)
迁移数据库表
python manage.py migrate todo
添加到您的URL配置中
path('todo/', include('todo.urls', namespace="todo")),
添加链接到您的站点导航系统
<a href="{% url 'todo:lists' %}">Todo Lists</a>
<a href="{% url 'todo:mine' %}">My Tasks</a>
django-todo使用Django的messages
系统。请确保您的base.html
中类似于这个(链接)。
登录并访问/todo
!
自定义模板
提供的模板非常基础,仅作为起点。与 django-todo 的先前版本不同,它们现在是 Bootstrap 示例,但您可以自由地覆盖它们——没有对 Bootstrap 的严格依赖。要覆盖模板,在项目的 templates
目录中创建一个 todo
文件夹,然后将您想要覆盖的 django-todo 源模板复制到该目录。
提交公共工单
如果您想使用公共工单提交系统,首先创建一个应提交这些工单的列表,然后将它的缩略名添加到设置中的 TODO_DEFAULT_LIST_SLUG
(更多关于设置的内容见下文)。
设置
可选配置参数,可以添加到您的项目设置中
# Restrict access to ALL todo lists/views to `is_staff` users.
# If False or unset, all users can see all views (but more granular permissions are still enforced
# within views, such as requiring staff for adding and deleting lists).
TODO_STAFF_ONLY = True
# If you use the "public" ticket filing option, to whom should these tickets be assigned?
# Must be a valid username in your system. If unset, unassigned tickets go to "Anyone."
TODO_DEFAULT_ASSIGNEE = 'johndoe'
# If you use the "public" ticket filing option, to which list should these tickets be saved?
# Defaults to first list found, which is probably not what you want!
TODO_DEFAULT_LIST_SLUG = 'tickets'
# If you use the "public" ticket filing option, to which *named URL* should the user be
# redirected after submitting? (since they can't see the rest of the ticket system).
# Defaults to "/"
TODO_PUBLIC_SUBMIT_REDIRECT = 'dashboard'
# Enable or disable file attachments on Tasks
# Optionally limit list of allowed filetypes
TODO_ALLOW_FILE_ATTACHMENTS = True
TODO_ALLOWED_FILE_ATTACHMENTS = [".jpg", ".gif", ".csv", ".pdf", ".zip"]
TODO_MAXIMUM_ATTACHMENT_SIZE = 5000000 # In bytes
# Additional classes the comment body should hold.
# Adding "text-monospace" makes comment monospace
TODO_COMMENT_CLASSES = []
# The following two settings are relevant only if you want todo to track a support mailbox -
# see Mail Tracking below.
TODO_MAIL_BACKENDS
TODO_MAIL_TRACKERS
当前 django-todo 版本号可在 todo 包 中找到
python -c "import todo; print(todo.__version__)"
通过 CSV 导入任务
django-todo 具有从特定格式的 CSV 电子表格批量导入(“上插”)任务的能力。此功能通过管理命令和 Web 界面提供。
管理命令
./manage.py import_csv -f /path/to/file.csv
Web 导入器
从您的导航链接到 {url "todo:import_csv"}
。点击结果链接以访问 CSV Web 上传视图。
CSV 格式化
将 todo/data/import_example.csv
复制到系统上的另一个位置并使用电子表格软件或直接编辑。
不要编辑标题行!
前四列:'标题', '组', '任务列表', '创建者'
是必需的——所有其他列都是可选的,并且应该与通过 Web UI 进行手动任务输入的方式大致相同。
注意:在内部,任务是根据任务列表而不是组(任务列表在组中)进行键控的。但是,我们要求在 CSV 中提供组,因为可能在不同的组中存在具有相同名称的多个任务列表;即我们需要它进行命名空间和权限。
导入规则
由于通过 CSV 输入的数据不会经过 django-todo 中其余部分强制执行的相同视图权限,为了简化数据依赖逻辑,并预防 django-todo 用户之间的分歧,导入器将 不会 创建新用户、组或任务列表。所有在您的 CSV 中引用的用户、组和任务列表必须已经存在,并且组成员资格必须正确。
任何验证错误(例如无法解析的日期、不正确的组成员资格)将导致该行被跳过。
在运行结束时提供有关已上插和跳过的行的报告(包括行号和原因)。
上插逻辑
对于每一行有效数据,我们需要决定是创建一个新任务还是更新现有任务。django-todo 通过匹配四个必需列的唯一组合来匹配。如果我们找到一个匹配的任务,我们将 更新 其余列。换句话说,如果您一次导入 CSV,然后编辑任务的分配者并再次导入,原始任务将用新的分配者更新(以及其他列也是如此)。
否则我们创建一个新的任务。
邮件跟踪
如果您可以将 django-todo 转换为共享邮箱会怎样?Django-todo 包含一个可选功能,允许将发送到专用邮箱的电子邮件推送到 todo 作为新任务,并将响应添加到这些任务的注释中。这使得支持团队可以与完全统一的电子邮件 + 错误跟踪系统一起工作,以避免对谁看过或响应了什么产生混淆。
要启用邮件跟踪,您需要
- 定义一个用于发送电子邮件的电子邮件后端
- 定义一个用于接收电子邮件的电子邮件后端
- 启动一个工作进程,它将等待新电子邮件
在设置中
from todo.mail.producers import imap_producer
from todo.mail.consumers import tracker_consumer
from todo.mail.delivery import smtp_backend, console_backend
# email notifications configuration
# each task list can get its own delivery method
TODO_MAIL_BACKENDS = {
# mail-queue is the name of the task list, not the worker name
"mail-queue": smtp_backend(
host="smtp.example.com",
port=465,
use_ssl=True,
username="test@example.com",
password="foobar",
# used as the From field when sending notifications.
# a username might be prepended later on
from_address="test@example.com",
# additionnal headers
headers={}
),
}
# incoming mail worker configuration
TODO_MAIL_TRACKERS = {
# configuration for worker "test_tracker"
"test_tracker": {
"producer": imap_producer(
host="imap.example.com",
username="text@example.com",
password="foobar",
# process_all=False, # by default, only unseen emails are processed
# preserve=False, # delete emails if False
# nap_duration=1, # duration of the pause between polling rounds
# input_folder="INBOX", # where to read emails from
),
"consumer": tracker_consumer(
group="Mail Queuers",
task_list_slug="mail-queue",
priority=1,
task_title_format="[TEST_MAIL] {subject}",
)
}
}
可选地,可以将收件人的电子邮件地址映射回 Django 用户。如果用户向 test_tracker 发送电子邮件,并且是该应用程序的注册用户,则用户将显示为已创建任务或评论。默认情况下,只会显示电子邮件地址。
默认情况下,此选项未启用,因为一些域名配置错误且无法防止冒充。如果启用此选项,但您的设置无法正确验证电子邮件,则恶意传入的电子邮件可能会错误地归因于用户。
设置
TODO_MAIL_USER_MAPPER = None # Set to True if you would like to match users. If you do not have authentication setup, do not set this to True.
可以使用以下方式启动邮件工作者:
./manage.py mail_worker test_tracker
在 2.0 版中,为了逻辑一致性,对一些视图和 URL 进行了重命名。如果这影响到您,请参阅源代码和演示 GTD 网站以参考新的 URL 名称。
如果您想记录邮件事件,请确保正确配置 django 日志。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
},
}
运行测试
django-todo 专用于测试,使用 pytest。运行测试套件的最佳方法是将其克隆到自己的目录中,安装 pytest,然后
pip install pytest pytest-django
pip install --editable .
pytest -x -v
版本历史
2.5.0 将设置改为 pyproject.toml
2.4.11 添加 SECURITY.md
2.4.10 现在可以使用 Unicode 字符(如中文)作为列表标题的唯一字符。
2.4.9 修复:编辑任务不应更改其完成/未完成状态
2.4.8 修复:设置未指定设置时的默认值时出现的错误
2.4.7 在 external_add 中支持自定义用户模型
2.4.6 使用 defaults
哈希为默认设置,更新权限和测试
2.4.5 在任务编辑期间重新启用“通知”功能
2.4.4 修复 setup.py / 安装问题
2.4.0 实现任务可选附件功能
2.3.2 更新 setup.py 元数据
2.3.1 改进对格式错误或不存在 CSV 上传的错误处理
2.3.0 实现邮件跟踪系统。添加了通过 CSV 批量导入任务的功能。修复了后台删除任务时任务重新排序的问题。
2.2.2 更新依赖项
2.2.1 将任务删除和切换完成的视图转换为仅 POST
2.2.0 重新实施 TODO_STAFF_ONLY 设置的强制执行
2.1.1 正确说明文档中的 Python 版本要求为 Python 3.6
2.1.1 将视图拆分为单独的模块。
2.1.0 2018 年 12 月:不再允许在任务或评论正文中使用 JavaScript。修复了一些错误。
2.0.3 2018 年 4 月:在 setup.py 中提升生产状态
2.0.2 2018 年 4 月:改进通知电子邮件的主题和正文
2.0.1 2018 年 4 月:重构了“切换完成”和“删除”操作,从列表视图中分离出来。
2.0 2018 年 4 月:主要项目重构,几乎完全重写了视图、模板和 todo 的第一个真正的测试套件。
1.6.2 添加了对列表名称/缩略名的 Unicode 字符的支持。
1.6.1 修复了一些小错误。
1.6 允许未分配(“任何人”)的任务。清理/现代化模板和视图。建立了测试基础设施。
1.5 flake8 支持,项目备注不再是一个必填字段,修复 Django 1.8、Python 2/3 兼容的 Unicode 字符串警告,简单的任务搜索,item 的 get_absolute_url()。
1.4 - 从默认模板中删除了样式。在表单定义中添加了排除字段以防止警告。从模板中删除了过时的 'cycle' 标签。添加了各种元素的设置,以供公共票据提交使用。
1.3 - 删除了多余的 direct_to_template 引用。引用了所有命名的 URL 引用以兼容 Django 1.5。
1.2 - 为所有示例模板添加了 CSRF 保护。添加了集成搜索功能。现在显示每个列表的完成/总项目比率。更好地分离媒体和模板。清理了项目编辑表单(删除了多余的字段)。重新分配任务现在正确限制分配者列表。将项目迁移到 github。
1.1 - 在勾选列表项时设置完成日期是正确的,但在从项目详情页保存时则不行。在项目上添加了保存方法来修复此问题。修复了关于context_processors的文档错误。现在,所有参与任务线程的人都会收到新评论的电子邮件。
1.0.1 - 当查看一个您想关闭的单个任务时,能够同时评论和关闭任务非常有用。我们之前使用的是django-comments,所以这些在视图中的模型是不同的。解决方案是停止使用django-comments,然后自己实现,然后重新配置视图。如果您之前使用的是旧版本,您可能需要将评论迁移到新系统。
1.0.0 - 升级到发布版本。拖放任务优先级。电子邮件通知(现在更像是一个票据系统)。更吸引人的日期选择器。错误修复。
0.9.5 - 修复了编辑现有事件时的jQuery错误 - 现在日期选择器显示正确的日期。已从基础模板中移除那个讨厌的Django马。
0.9.4 - 在“我的任务”视图中将模型中的str替换为unicode。修复了回到列表的链接。
0.9.3 - 缺少到单个任务编辑视图的链接。
0.9.2 - 现在在尝试向同一组添加相同名称的第二个列表时,会优雅地失败。- 任务的截止日期现在是真正可选的。- 修复了编辑任务时的datetime编辑冲突。- 任务名称的最大长度已从60个字符增加到140个字符。如果升级,请相应地修改您的数据库(字段todo_item.name = maxlength 140)。- 安全性:提供直接任务URL的用户不能再查看/编辑其组范围之外的任务 - 同样适用于列表视图 - 仅授权视图。- 主页上的项目和组计数正确(注意 - 管理员用户看到所有组,而不仅仅是他们“属于”的组)
0.9.1 - 移除了context_processors.py - 剩余的冗余文件。
0.9 - 第一个版本。
Todo 2.0 升级说明
django-todo 2.0 几乎完全重建,包括一些重大变化,包括模型名称更改。因此,它 不兼容 django-todo 1.x的数据。如果您想升级现有安装,请尝试以下步骤
- 使用
./manage.py dumpdata todo --indent 4 > todo.json
导出旧todo数据 - 编辑导出的文件,将旧模型名称
Item
和List
替换为新的模型名称(《Task》和《TaskList》) - 删除现有的todo数据
- 卸载旧todo应用程序并重新安装
- 迁移后,使用
./manage.py loaddata todo.json
导入编辑后的数据
为什么不提供迁移工具?
这原计划是这样的,但不幸的是,makemigrations
创建了新表并删除了旧表,这使得这是一个破坏性更新。不幸的是,makemigrations
无法重命名模型,而且我真的不想保留那些糟糕命名的原始模型。对不起!
日期选择器
django-todo不再引用jQuery日期选择器,而是默认使用原生的html5浏览器日期选择器。您可以自由地实现您选择的任何一种。
URL
一些视图和URL已重命名以保持逻辑一致性。如果这影响到您,请参阅源代码和示例GTD站点以参考新的URL名称。