跳转到主要内容

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数据
  • 编辑导出的文件,将旧模型名称 ItemList 替换为新的模型名称(《Task》和《TaskList》)
  • 删除现有的todo数据
  • 卸载旧todo应用程序并重新安装
  • 迁移后,使用 ./manage.py loaddata todo.json 导入编辑后的数据

为什么不提供迁移工具?

这原计划是这样的,但不幸的是,makemigrations 创建了新表并删除了旧表,这使得这是一个破坏性更新。不幸的是,makemigrations 无法重命名模型,而且我真的不想保留那些糟糕命名的原始模型。对不起!

日期选择器

django-todo不再引用jQuery日期选择器,而是默认使用原生的html5浏览器日期选择器。您可以自由地实现您选择的任何一种。

URL

一些视图和URL已重命名以保持逻辑一致性。如果这影响到您,请参阅源代码和示例GTD站点以参考新的URL名称。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-todo-2.5.0.tar.gz (55.0 kB 查看哈希值)

上传时间

支持