Skip to main content

Best Gantt chart in Python

Project description

netkiller-gantt

Best project gantt charts in Python

甘特图

Python Gantt 工具

安装依赖

MacOS 环境

brew install cairo
brew install pkg-config
pip3 install pycairo -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux 环境

dnf install -y cairo-devel python3-cairo python3-pillow

配置镜像

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

root@netkiller ~# cat /root/.config/pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

安装 netkiller-gantt

pip install netkiller-gantt -i https://pypi.tuna.tsinghua.edu.cn/simple

命令帮助

root@netkiller ~# gantt 

Usage: gantt [options] 

Options:
  -h, --help            show this help message and exit
  --stdin               cat gantt.json | gantt -s file.svg
  -c /path/to/gantt.csv, --csv=/path/to/gantt.csv
                        /path/to/gantt.csv
  -l /path/to/gantt.json, --load=/path/to/gantt.json
                        load data from file.
  -d, --debug           debug mode

  loading data from mysql:
    -H localhost, --host=localhost
    -u root, --username=root
    -p PASSWORD, --password=PASSWORD
    -D test, --database=test

  Charts:
    -t 项目甘特图, --title=项目甘特图
                        甘特图标题
    -W 5, --workweeks=5
                        workweeks default 5
    -g, --gantt         Gantt chart
    -w, --workload      Workload chart
    -s /path/to/gantt.svg, --save=/path/to/gantt.svg
                        save file

Homepage: https://www.netkiller.cn	Author: Neo <netkiller@msn.com>

生成甘特图

从标准输出载入json数据生成甘特图

准备 json 文件

{
    "1": {
        "id": 1,
        "name": "开发需求排期",
        "start": "2023-02-22",
        "finish": "2023-03-03",
        "subitem": {
            "11": {
                "id": 11,
                "name": "用户登录开发",
                "start": "2023-02-22",
                "finish": "2023-02-24",
                "progress": 4,
                "resource": "陈景峰"
            },
            "12": {
                "id": 12,
                "name": "权限角色开发",
                "start": "2023-02-27",
                "finish": "2023-03-03",
                "resource": "Neo",
                "progress": 5,
                "predecessor": 11
            },
            "2": {
                "id": "2",
                "name": "测试任务排期",
                "start": "2023-03-01",
                "finish": "2023-03-15",
                "subitem": {
                    "21": {
                        "id": 21,
                        "name": "用户登陆测试",
                        "start": "2023-03-01",
                        "finish": "2023-03-08",
                        "resource": "陈景峰",
                        "progress": 4
                    },
                    "22": {
                        "id": 22,
                        "name": "权限角色测试",
                        "start": "2023-03-09",
                        "finish": "2023-03-15",
                        "resource": "netkiller",
                        "progress": 0,
                        "predecessor": 21
                    }
                }
            }
        }
    },
    "3": {
        "id": 3,
        "name": "任务组测试",
        "start": "2023-02-25",
        "finish": "2023-03-10",
        "resource": "陈景峰",
        "progress": 3,
        "subitem": {
            "4": {
                "id": 4,
                "name": "Java",
                "start": "2023-02-24",
                "finish": "2023-02-27",
                "resource": "司空摘星",
                "progress": 2
            },
            "5": {
                "id": 5,
                "name": "PHP",
                "start": "2023-03-03",
                "finish": "2023-03-15",
                "resource": "阿不都沙拉木",
                "progress": 5,
                "predecessor": 4,
                "subitem": {
                    "83": {
                        "id": 83,
                        "name": "V7.0",
                        "start": "2023-03-03",
                        "finish": "2023-03-05",
                        "predecessor": 82,
                        "subitem": {
                            "83": {
                                "id": 83,
                                "name": "V8.0",
                                "start": "2023-03-06",
                                "finish": "2023-03-10",
                                "predecessor": 82,
                                "subitem": {
                                    "83": {
                                        "id": 83,
                                        "name": "V8.5",
                                        "start": "2023-03-13",
                                        "finish": "2023-03-16",
                                        "predecessor": 82
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "6": {
                "id": "6",
                "name": "Go",
                "start": "2023-03-10",
                "finish": "2023-03-20",
                "milestone": true
            },
            "7": {
                "id": 7,
                "name": "Python",
                "start": "2023-03-06",
                "finish": "2023-03-08",
                "predecessor": 5
            },
            "8": {
                "id": 8,
                "name": "Swift",
                "start": "2023-02-27",
                "finish": "2023-03-16",
                "subitem": {
                    "81": {
                        "id": 81,
                        "name": "LLVM",
                        "start": "2023-02-28",
                        "finish": "2023-03-06",
                        "predecessor": 4
                    },
                    "82": {
                        "id": 82,
                        "name": "Clang",
                        "start": "2023-03-07",
                        "finish": "2023-03-10",
                        "predecessor": 81
                    },
                    "83": {
                        "id": 83,
                        "name": "Rust",
                        "start": "2023-03-13",
                        "finish": "2023-03-16",
                        "predecessor": 82
                    }
                }
            }
        }
    }
}

开始生成 Gantt 甘特图

neo@MacBook-Pro-M2 ~> cat gantt.json | gantt --stdin
/Users/neo/workspace/GitHub/devops
Usage: gantt [options] message

Options:
  -h, --help            show this help message and exit
  -l /path/to/gantt.json, --load=/path/to/gantt.json
                        load data from file.
  -s /path/to/gantt.svg, --save=/path/to/gantt.svg
                        save file
  --stdin               cat gantt.json | gantt -s file.svg
  -d, --debug           debug mode

从 CSV 文件生成

从禅道导出 csv 文件

select id, parent, name,estStarted,deadline,assignedTo  from zt_task 
INTO OUTFILE '/tmp/project.csv'
FIELDS ENCLOSED BY '"'
TERMINATED BY ,
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';

命令行执行方法

rm -rf /tmp/project.csv
cat <<EOF | mysql -h127.0.0.1 -uroot -p123456 zentao
SELECT 'id','name','start','finish', 'resource', 'parent'
UNION
select id, name,estStarted,deadline,assignedTo, parent  from zt_task
INTO OUTFILE '/tmp/project.csv'
FIELDS ENCLOSED BY '"'
TERMINATED BY ','
ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
EOF

如果导出指定的资源,可以通过查询 assignedTo 实现

select id, name,estStarted as start, deadline as finish,  assignedTo as resource, parent from zt_task where `group` = 4 order by id desc limit 100;
select id, name,estStarted as start, deadline as finish,  assignedTo as resource, parent from zt_task where assignedTo in ('neo','netkiller','tom','jerry') order by id desc limit 100;

从 MySQL 数据库生成甘特图

注意:MySQL 5.7 和 MySQL 8.0 有略微差别

MySQL 5.7

CREATE TABLE `project` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '任务名称',
  `start` date NOT NULL COMMENT '开始日期',
  `finish` date NOT NULL COMMENT '完成日期',
  `resource` varchar(255) DEFAULT NULL COMMENT '资源',
  `predecessor` bigint(20) DEFAULT NULL COMMENT '前置任务',
  `milestone` bit(1) DEFAULT NULL COMMENT '里程碑',
  `parent` bigint(20) DEFAULT NULL COMMENT '父任务',
  `status` enum('Enabled','Disabled') DEFAULT 'Enabled' COMMENT '状态',
  PRIMARY KEY (`id`),
  KEY `project_has_subproject` (`parent`),
  CONSTRAINT `project_has_subproject` FOREIGN KEY (`parent`) REFERENCES `project` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4

MySQL 8.0

CREATE TABLE `project` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称',
  `start` date NOT NULL DEFAULT (curdate()) COMMENT '开始日期',
  `finish` date NOT NULL DEFAULT (curdate()) COMMENT '完成日期',
  `resource` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '资源',
  `predecessor` bigint unsigned DEFAULT NULL COMMENT '前置任务',
  `milestone` bit(1) DEFAULT b'0' COMMENT '里程碑',
  `parent` bigint unsigned DEFAULT NULL COMMENT '父任务',
  PRIMARY KEY (`id`),
  KEY `project_has_subproject` (`parent`),
  KEY `task_has_predecessor_idx` (`predecessor`),
  CONSTRAINT `project_has_subproject` FOREIGN KEY (`parent`) REFERENCES `project` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

插入测试数据

INSERT INTO `project` (`id`,`name`,`start`,`finish`,`resource`,`predecessor`,`milestone`,`parent`) VALUES (1,'任务组','2023-03-26','2023-04-10','小明',NULL,'0',NULL);
INSERT INTO `project` (`id`,`name`,`start`,`finish`,`resource`,`predecessor`,`milestone`,`parent`) VALUES (2,'任务A','2023-03-26','2023-03-29','小明',NULL,'0',1);
INSERT INTO `project` (`id`,`name`,`start`,`finish`,`resource`,`predecessor`,`milestone`,`parent`) VALUES (3,'任务B','2023-03-31','2023-04-01','小张',2,'0',1);
INSERT INTO `project` (`id`,`name`,`start`,`finish`,`resource`,`predecessor`,`milestone`,`parent`) VALUES (4,'任务C','2023-04-02','2023-04-08','小张',3,'0',1);
INSERT INTO `project` (`id`,`name`,`start`,`finish`,`resource`,`predecessor`,`milestone`,`parent`) VALUES (5,'里程碑','2023-04-06','2023-04-06',NULL,NULL,'1',NULL);

bit(1) 类型数据更新注意事项

UPDATE `test`.`project` SET `milestone` = b'001'  WHERE (`id` = '11');

生成甘特图

gantt --host mysql.netkiller.cn -u root -p passw0rd --database test -g

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

netkiller-gantt-0.0.3.tar.gz (94.1 kB view details)

Uploaded Source

File details

Details for the file netkiller-gantt-0.0.3.tar.gz.

File metadata

  • Download URL: netkiller-gantt-0.0.3.tar.gz
  • Upload date:
  • Size: 94.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.10.5

File hashes

Hashes for netkiller-gantt-0.0.3.tar.gz
Algorithm Hash digest
SHA256 a26c8f1243a72627774f7ad054bc29518bb9b0ab137812cac695881fd6aa08ff
MD5 5328422e773a5ca446993d7d9f585808
BLAKE2b-256 acebe8089f9369afd660a45142a9b0baa67841171eca59f4d9636e026d59912d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page