This commit is contained in:
louiscklaw
2025-01-31 19:51:33 +08:00
parent 78d53aeddb
commit 118e4a5f39
125 changed files with 4895 additions and 0 deletions

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/HD_information_window.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/Personal_info_window.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@@ -0,0 +1,12 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
markdown2docx = "*"
[dev-packages]
[requires]
python_version = "3.12"

312
hdhdjshxh/task2/project/doc/Pipfile.lock generated Normal file
View File

@@ -0,0 +1,312 @@
{
"_meta": {
"hash": {
"sha256": "ce7bc21caf64cf9ad732d9869c89e2cf568c1b1d036c73753a58b09450611617"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.12"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"beautifulsoup4": {
"hashes": [
"sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051",
"sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
],
"markers": "python_full_version >= '3.6.0'",
"version": "==4.12.3"
},
"bs4": {
"hashes": [
"sha256:a48685c58f50fe127722417bae83fe6badf500d54b55f7e39ffe43b798653925",
"sha256:abf8742c0805ef7f662dce4b51cca104cffe52b835238afc169142ab9b3fbccc"
],
"version": "==0.0.2"
},
"lxml": {
"hashes": [
"sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04",
"sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0",
"sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739",
"sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a",
"sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1",
"sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218",
"sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9",
"sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188",
"sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138",
"sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585",
"sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637",
"sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe",
"sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d",
"sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1",
"sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095",
"sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9",
"sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81",
"sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57",
"sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536",
"sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a",
"sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052",
"sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01",
"sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98",
"sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433",
"sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1",
"sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f",
"sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4",
"sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b",
"sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6",
"sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8",
"sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5",
"sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306",
"sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5",
"sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f",
"sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4",
"sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be",
"sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919",
"sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af",
"sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66",
"sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1",
"sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af",
"sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec",
"sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b",
"sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289",
"sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a",
"sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d",
"sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102",
"sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9",
"sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc",
"sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45",
"sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa",
"sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a",
"sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c",
"sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461",
"sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708",
"sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca",
"sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd",
"sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913",
"sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da",
"sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0",
"sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5",
"sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5",
"sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96",
"sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41",
"sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3",
"sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456",
"sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c",
"sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867",
"sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0",
"sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213",
"sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619",
"sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240",
"sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c",
"sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377",
"sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b",
"sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c",
"sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54",
"sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b",
"sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53",
"sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029",
"sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6",
"sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885",
"sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94",
"sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134",
"sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8",
"sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9",
"sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863",
"sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b",
"sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806",
"sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11",
"sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9",
"sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817",
"sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95",
"sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8",
"sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc",
"sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47",
"sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b",
"sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0",
"sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a",
"sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f",
"sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56",
"sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef",
"sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851",
"sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7",
"sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62",
"sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4",
"sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a",
"sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c",
"sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533",
"sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f",
"sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e",
"sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a",
"sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3",
"sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b",
"sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4",
"sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0",
"sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d",
"sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3",
"sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5",
"sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534",
"sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4",
"sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144",
"sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd",
"sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd",
"sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860",
"sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704",
"sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8",
"sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d",
"sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9",
"sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f",
"sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad",
"sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc",
"sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510",
"sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937",
"sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a",
"sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460",
"sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85",
"sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86",
"sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0",
"sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246",
"sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7",
"sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa",
"sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08",
"sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270",
"sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a",
"sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169",
"sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e",
"sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75",
"sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd",
"sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354",
"sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c",
"sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1",
"sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb",
"sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f",
"sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"
],
"markers": "python_version >= '3.6'",
"version": "==5.2.1"
},
"markdown2": {
"hashes": [
"sha256:18ceb56590da77f2c22382e55be48c15b3c8f0c71d6398def387275e6c347a9f",
"sha256:855bde5cbcceb9beda7c80efdf7f406c23e6079172c497fcfce22fdce998e892"
],
"markers": "python_version >= '3.5' and python_version < '4'",
"version": "==2.4.13"
},
"markdown2docx": {
"hashes": [
"sha256:026504ec82b59b9de2641366157fe11d5f3c4781b28cf6422460126dbbec7472",
"sha256:a3a54f75be046e662630c7f2eb570d45cc98ada9892f17e84583db24c10a7510"
],
"index": "pypi",
"version": "==0.1.0"
},
"pillow": {
"hashes": [
"sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c",
"sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2",
"sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb",
"sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d",
"sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa",
"sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3",
"sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1",
"sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a",
"sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd",
"sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8",
"sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999",
"sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599",
"sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936",
"sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375",
"sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d",
"sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b",
"sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60",
"sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572",
"sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3",
"sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced",
"sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f",
"sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b",
"sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19",
"sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f",
"sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d",
"sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383",
"sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795",
"sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355",
"sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57",
"sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09",
"sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b",
"sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462",
"sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf",
"sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f",
"sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a",
"sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad",
"sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9",
"sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d",
"sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45",
"sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994",
"sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d",
"sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338",
"sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463",
"sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451",
"sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591",
"sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c",
"sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd",
"sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32",
"sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9",
"sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf",
"sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5",
"sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828",
"sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3",
"sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5",
"sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2",
"sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b",
"sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2",
"sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475",
"sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3",
"sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb",
"sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef",
"sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015",
"sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002",
"sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170",
"sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84",
"sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57",
"sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f",
"sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27",
"sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"
],
"markers": "python_version >= '3.8'",
"version": "==10.3.0"
},
"python-docx": {
"hashes": [
"sha256:5829b722141cf1ab79aedf0c34d9fe9924b29764584c0f2164eb2b02dcdf17c9",
"sha256:bac9773278098a1ddc43a52d84e22f5909c4a3080a624530b3ecb3771b07c6cd"
],
"markers": "python_version >= '3.7'",
"version": "==1.1.0"
},
"soupsieve": {
"hashes": [
"sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690",
"sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"
],
"markers": "python_version >= '3.8'",
"version": "==2.5"
},
"typing-extensions": {
"hashes": [
"sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0",
"sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"
],
"markers": "python_version >= '3.8'",
"version": "==4.11.0"
}
},
"develop": {}
}

View File

@@ -0,0 +1 @@
python ./to_docx.py

BIN
hdhdjshxh/task2/project/doc/result_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_10.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_10_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_11.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_11_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_12.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_12_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_13.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_13_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_13_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_14.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_14_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_14_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_1_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_2_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_3.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_3_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_4.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_4_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_5.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_5_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_6.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_6_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_7.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_7_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_8_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_8_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_8_3.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_8_4.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_9.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/result_9_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
hdhdjshxh/task2/project/doc/summary_window.png (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,24 @@
# TEST plan
### Gui
1. Validation on the input data and display appropriate error messages
1. Test Plan with test cases and test results.
| ID | Test Case Name | Procedure | Expected Output | Result | screen capture |
| --- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------- |
| 1 | Missing "Applicant Name" | 1. leave "applicant name" field empty.<br />1. Click "Next" button | The error MessageBox appears "name cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_1.png) <br />![](../doc/result_1_1.png) |
| 2 | Missing "Applicant Email" | 1. leave "applicant email" field empty.<br />1. Click "Next" button | The error MessageBox appears "email field cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_2.png) <br />![](../doc/result_2_1.png) |
| 3 | Missing "Date of Birth" | 1. leave "date of birth" field empty. <br />1. Click "Next" button | The error MessageBox appears "dob field cannot empty."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_3.png) <br />![](../doc/result_3_1.png) |
| 4 | Missing Institution Name | 1. leave "Institution Name" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_4.png) <br />![](../doc/result_4_1.png) |
| 5 | Missing Programme Title | 1. leave "Programme Title" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_5.png) <br />![](../doc/result_5_1.png) |
| 6 | Missing GPA | 1. leave "GPA" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_6.png) <br />![](../doc/result_6_1.png) |
| 7 | Missing Expected Graduation Year | 1. leave "Expected Graduation Year" field empty <br />1. Click "Next" button | The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_7.png) <br />![](../doc/result_7_1.png) |
| 8 | Showing summary if all input field fullfilled | 1. filling all required information in "Personal Information" <br />1. clici "Next" button <br /> 1. Filling all required information in"Higher Diploma Information" windows. <br />1. Click "Next" button<br /> 1. click "show" button to show summary | finally the summary window showing information in the page inputted before | Pass/Fail | ![](../doc/result_8_1.png) <br />![](../doc/result_8_2.png)<br />![](../doc/result_8_3.png)<br />![](../doc/result_8_4.png) |
| 9 | Date of birth should be in the past | 1. enter a day after today to the "date of birth" field <br /> 1. click next button | The error MessageBox appears "DOB: the day entered is latter than today."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_9.png) <br />![](../doc/result_9_1.png) |
| 10 | email entered should be valid | 1. enter an invalid email e.g. "ankitrai326.com" <br /> 1. click "next" button | The error MessageBox appears "email format error, it should be email."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_10.png)<br />![](../doc/result_10_1.png) |
| 11 | GPA should be a number / decimal | 1. enter a non numeric value into "GPA" field <br />1. Click "Next" button | The error MessageBox appears "GPA field should be a number."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_11.png)<br />![](../doc/result_11_1.png) |
| 12 | Expected graduation year should be in future | 1. enter a day in the past in "Graduation year" field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_12.png)<br />![](../doc/result_12_1.png) |
| 13 | female appliciant | 1. select female in applicant gender field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_13.png)<br />![](../doc/result_13_1.png)<br />![](../doc/result_13_2.png) |
| 14 | "Bachelor of Science in Computer Science and AI" in apply programme | 1. select female in applicant gender field <br />1. Click "Next" button | The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." | Pass/Fail | ![](../doc/result_14.png)<br />![](../doc/result_14_1.png)<br />![](../doc/result_14_2.png) |

View File

@@ -0,0 +1,15 @@
ID , Test Case Name , Procedure , Expected Output , Result , screen capture ,
1," Missing ""Applicant Name"" "," 1. leave ""applicant name"" field empty.<br />1. Click ""Next"" button "," The error MessageBox appears ""name cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_1.png) <br />![](../doc/result_1_1.png) ,
2," Missing ""Applicant Email"" "," 1. leave ""applicant email"" field empty.<br />1. Click ""Next"" button "," The error MessageBox appears ""email field cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_2.png) <br />![](../doc/result_2_1.png) ,
3," Missing ""Date of Birth"" "," 1. leave ""date of birth"" field empty. <br />1. Click ""Next"" button "," The error MessageBox appears ""dob field cannot empty.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_3.png) <br />![](../doc/result_3_1.png) ,
4, Missing Institution Name ," 1. leave ""Institution Name"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_4.png) <br />![](../doc/result_4_1.png) ,
5, Missing Programme Title ," 1. leave ""Programme Title"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_5.png) <br />![](../doc/result_5_1.png) ,
6, Missing GPA ," 1. leave ""GPA"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_6.png) <br />![](../doc/result_6_1.png) ,
7, Missing Expected Graduation Year ," 1. leave ""Expected Graduation Year"" field empty <br />1. Click ""Next"" button "," The error MessageBox appears ""Please enter all required information.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_7.png) <br />![](../doc/result_7_1.png) ,
8, Showing summary if all input field fullfilled ," 1. filling all required information in ""Personal Information"" <br />1. clici ""Next"" button <br /> 1. Filling all required information in""Higher Diploma Information"" windows. <br />1. Click ""Next"" button<br /> 1. click ""show"" button to show summary ", finally the summary window showing information in the page inputted before , Pass/Fail , ![](../doc/result_8_1.png) <br />![](../doc/result_8_2.png)<br />![](../doc/result_8_3.png)<br />![](../doc/result_8_4.png),
9, Date of birth should be in the past ," 1. enter a day after today to the ""date of birth"" field <br /> 1. click next button "," The error MessageBox appears ""DOB: the day entered is latter than today.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_9.png) <br />![](../doc/result_9_1.png) ,
10, email entered should be valid ," 1. enter an invalid email e.g. ""ankitrai326.com"" <br /> 1. click ""next"" button "," The error MessageBox appears ""email format error"," it should be email.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_10.png)<br />![](../doc/result_10_1.png)
11, GPA should be a number / decimal ," 1. enter a non numeric value into ""GPA"" field <br />1. Click ""Next"" button "," The error MessageBox appears ""GPA field should be a number.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_11.png)<br />![](../doc/result_11_1.png) ,
12, Expected graduation year should be in future ," 1. enter a day in the past in ""Graduation year"" field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_12.png)<br />![](../doc/result_12_1.png) ,
13, female appliciant ," 1. select female in applicant gender field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_13.png)<br />![](../doc/result_13_1.png)<br />![](../doc/result_13_2.png) ,
14," ""Bachelor of Science in Computer Science and AI"" in apply programme "," 1. select female in applicant gender field <br />1. Click ""Next"" button "," The error MessageBox appears ""Expected graduation year should be after current year.""<br />The error MessageBox appears ""Please enter all required information."" ", Pass/Fail , ![](../doc/result_14.png)<br />![](../doc/result_14_1.png)<br />![](../doc/result_14_2.png),
1 ID Test Case Name Procedure Expected Output Result screen capture
2 1 Missing "Applicant Name" 1. leave "applicant name" field empty.<br />1. Click "Next" button The error MessageBox appears "name cannot empty."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_1.png) <br />![](../doc/result_1_1.png)
3 2 Missing "Applicant Email" 1. leave "applicant email" field empty.<br />1. Click "Next" button The error MessageBox appears "email field cannot empty."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_2.png) <br />![](../doc/result_2_1.png)
4 3 Missing "Date of Birth" 1. leave "date of birth" field empty. <br />1. Click "Next" button The error MessageBox appears "dob field cannot empty."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_3.png) <br />![](../doc/result_3_1.png)
5 4 Missing Institution Name 1. leave "Institution Name" field empty <br />1. Click "Next" button The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_4.png) <br />![](../doc/result_4_1.png)
6 5 Missing Programme Title 1. leave "Programme Title" field empty <br />1. Click "Next" button The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_5.png) <br />![](../doc/result_5_1.png)
7 6 Missing GPA 1. leave "GPA" field empty <br />1. Click "Next" button The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_6.png) <br />![](../doc/result_6_1.png)
8 7 Missing Expected Graduation Year 1. leave "Expected Graduation Year" field empty <br />1. Click "Next" button The error MessageBox appears "Please enter all required information."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_7.png) <br />![](../doc/result_7_1.png)
9 8 Showing summary if all input field fullfilled 1. filling all required information in "Personal Information" <br />1. clici "Next" button <br /> 1. Filling all required information in"Higher Diploma Information" windows. <br />1. Click "Next" button<br /> 1. click "show" button to show summary finally the summary window showing information in the page inputted before Pass/Fail ![](../doc/result_8_1.png) <br />![](../doc/result_8_2.png)<br />![](../doc/result_8_3.png)<br />![](../doc/result_8_4.png)
10 9 Date of birth should be in the past 1. enter a day after today to the "date of birth" field <br /> 1. click next button The error MessageBox appears "DOB: the day entered is latter than today."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_9.png) <br />![](../doc/result_9_1.png)
11 10 email entered should be valid 1. enter an invalid email e.g. "ankitrai326.com" <br /> 1. click "next" button The error MessageBox appears "email format error it should be email."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_10.png)<br />![](../doc/result_10_1.png)
12 11 GPA should be a number / decimal 1. enter a non numeric value into "GPA" field <br />1. Click "Next" button The error MessageBox appears "GPA field should be a number."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_11.png)<br />![](../doc/result_11_1.png)
13 12 Expected graduation year should be in future 1. enter a day in the past in "Graduation year" field <br />1. Click "Next" button The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_12.png)<br />![](../doc/result_12_1.png)
14 13 female appliciant 1. select female in applicant gender field <br />1. Click "Next" button The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_13.png)<br />![](../doc/result_13_1.png)<br />![](../doc/result_13_2.png)
15 14 "Bachelor of Science in Computer Science and AI" in apply programme 1. select female in applicant gender field <br />1. Click "Next" button The error MessageBox appears "Expected graduation year should be after current year."<br />The error MessageBox appears "Please enter all required information." Pass/Fail ![](../doc/result_14.png)<br />![](../doc/result_14_1.png)<br />![](../doc/result_14_2.png)

Binary file not shown.

View File

@@ -0,0 +1,285 @@
# TEST plan
### Test purpose
1. Validation on the input data and display appropriate error messages
1. Test Plan with test cases and test results.
### Test #1
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------ |
| Test Case Name | Missing "Applicant Name" |
| Procedure | 1. leave "applicant name" field empty.\n1. Click "Next" button |
| Expected Output | The error MessageBox appears "name cannot empty."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_1.png)
#### step 2 screenshot
![](../doc/result_1_1.png)
### Test #2
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing "Applicant Email" |
| Procedure | 1. leave "applicant email" field empty.\n1. Click "Next" button |
| Expected Output | The error MessageBox appears "email field cannot empty."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_2.png)
#### step 2 screenshot
![](../doc/result_2_1.png)
### Test #3
| del me | del me |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing "Date of Birth" |
| Procedure | 1. leave "date of birth" field empty. \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "dob field cannot empty."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_3.png)
#### step 2 screenshot
![](../doc/result_3_1.png)
### Test #4
| del me | del me |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing Institution Name |
| Procedure | 1. leave "Institution Name" field empty \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_4.png)
#### step 2 screenshot
![](../doc/result_4_1.png)
### Test #5
| del me | del me |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing Programme Title |
| Procedure | 1. leave "Programme Title" field empty \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_5.png)
#### step 2 screenshot
![](../doc/result_5_1.png)
### Test #6
| del me | del me |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing GPA |
| Procedure | 1. leave "GPA" field empty \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_6.png)
#### step 2 screenshot
![](../doc/result_6_1.png)
### Test #7
| del me | del me |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Missing Expected Graduation Year |
| Procedure | 1. leave "Expected Graduation Year" field empty \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Please enter all required information."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_7.png)
#### step 2 screenshot
![](../doc/result_7_1.png)
### Test #8
| del me | del me |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | Showing summary if all input field fullfilled |
| Procedure | 1. filling all required information in "Personal Information" \n1. clici "Next" button \n 1. Filling all required information in"Higher Diploma Information" windows. \n1. Click "Next" button\n 1. click "show" button to show summary |
| Expected Output | finally the summary window showing information in the page inputted before |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_8_1.png)
#### step 2 screenshot
![](../doc/result_8_2.png)
#### step 3 screenshot
![](../doc/result_8_3.png)
#### step 4 screenshot
![](../doc/result_8_4.png)
### Test #9
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Test Case Name | Date of birth should be in the past |
| Procedure | 1. enter a day after today to the "date of birth" field \n 1. click next button |
| Expected Output | The error MessageBox appears "DOB: the day entered is latter than today."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_9.png)
#### step 2 screenshot
![](../doc/result_9_1.png)
### Test #10
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------- |
| Test Case Name | email entered should be valid |
| Procedure | 1. enter an invalid email e.g. "ankitrai326.com" \n 1. click "next" button |
| Expected Output | The error MessageBox appears "email format error |
| Result | it should be email."\nThe error MessageBox appears "Please enter all required information." |
### Screen capture
#### step 1 screenshot
Pass/Fail
### Test #11
| del me | del me |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| Test Case Name | GPA should be a number / decimal |
| Procedure | 1. enter a non numeric value into "GPA" field \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "GPA field should be a number."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_11.png)
#### step 2 screenshot
![](../doc/result_11_1.png)
### Test #12
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Test Case Name | Expected graduation year should be in future |
| Procedure | 1. enter a day in the past in "Graduation year" field \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_12.png)
#### step 2 screenshot
![](../doc/result_12_1.png)
### Test #13
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Test Case Name | female appliciant |
| Procedure | 1. select female in applicant gender field \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_13.png)
#### step 2 screenshot
![](../doc/result_13_1.png)
#### step 3 screenshot
![](../doc/result_13_2.png)
### Test #14
| del me | del me |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Test Case Name | "Bachelor of Science in Computer Science and AI" in apply programme |
| Procedure | 1. select female in applicant gender field \n1. Click "Next" button |
| Expected Output | The error MessageBox appears "Expected graduation year should be after current year."\nThe error MessageBox appears "Please enter all required information." |
| Result | Pass/Fail |
### Screen capture
#### step 1 screenshot
![](../doc/result_14.png)
#### step 2 screenshot
![](../doc/result_14_1.png)
#### step 3 screenshot
![](../doc/result_14_2.png)

View File

@@ -0,0 +1,6 @@
from Markdown2docx import Markdown2docx
print("writing Q9950_GetDocx")
project = Markdown2docx('test')
project.eat_soup()
project.save()

View File

@@ -0,0 +1,38 @@
import csv
print('''# TEST plan
### Test purpose
1. Validation on the input data and display appropriate error messages
1. Test Plan with test cases and test results.''')
print('\n')
print('\n')
print('\n')
# read a csv file named test.csv
with open('test.csv', 'r') as f:
# creating a csv reader object
csvreader = csv.reader(f)
# extracting each data row one by one
for row in csvreader:
print(f'### Test #{row[0]}')
print('\n')
print(f'| del me | del me |')
print(f'| ----- | ----- |')
print(f'| Test Case Name | {row[1]} |')
print(f'| Procedure | {row[2].replace("<br />",'\\n')} |')
print(f'| Expected Output | {row[3].replace("<br />",'\\n')} |')
print(f'| Result | {row[4].replace("<br />",'\\n')} |')
print('\n')
print("### Screen capture")
print( '\n'.join([ (f'\n#### step {i+1} screenshot\n'+x.strip()) for i, x in enumerate(row[5].split("<br />"))]) )
print('\n')
print('\n')

View File

@@ -0,0 +1,508 @@
import os
import sys
import re
import datetime
import tkinter
import tkinter.ttk
import tkinter.messagebox
import tkinter.scrolledtext
from tkinter import *
# class starts
class HDinfo():
# Attributes:
# institutionName a non-public string to store the HD institution name of the applicant.
# programmeTitle a non-public string to store the HD programme name of the applicant.
# gpa a non-public double to store the HD GPA of the applicant.
# expectedGradeYear a non-public int to store the Expected HD Graduation Year of the applicant.
# Methods:
# init initialize all attributes in HDinfo object. It is a Parameterized constructor.
# str return a string containing the Attributes of HDinfo object. This method is used to display in Summary ScrolledText.
# constructor __init__
def __init__(self, institutionName="", programmeTitle="", gpa="", expectedGraYear=""):
self.institutionName = institutionName
self.programmeTitle = programmeTitle
self.gpa = gpa
self.expectedGraYear = expectedGraYear
pass
# __str__ method
def __str__(self):
return """
Higher Diploma Information:
Institution Name: {hd_institution_name}
Programme Title: {hd_programme_title}
GPA: {hd_gpa}
Expected Graduation Year: {expectedGraYear}
""".strip().format(
hd_institution_name=self.institutionName,
hd_programme_title=self.programmeTitle,
hd_gpa=self.gpa,
expectedGraYear=self.expectedGraYear,
)
class Applicant():
# Attributes:
# name a non-public string to store the name of the applicant.
# email a non-public string to store the email of the applicant.
# gender a non-public string to store the gender of the applicant.
# dateOfBirth a non-public string to store the applicant date of birth.
# applyDegreeProgramme a non-public string to store the applicant selected
# degree programme
# hdInfo a non-public HDinfo(self-defined class) to store the applicant Higher
# Diploma information
# Methods:
# init initialize all attributes in Applicant object. It is a Parameterized constructor.
# setPeronalInfo setter method to set the name, email, gender, dateOfBirth, applyDegreeProgrmme into the Applicant object.
# setHDinfo setter method to set the HDinfo object into the Applicant object.
# str return a string containing the Attributes of this Applicant. This function is used to display in Summary ScrolledText.
# constructor __init__
def __init__(self, name="", email="", gender="", dateOfBirth="", applyDegreeProgramme="", hdInfo=HDinfo()):
self.name = name
self.email = email
self.gender = gender
self.dateOfBirth = dateOfBirth
self.applyDegreeProgramme = applyDegreeProgramme
pass
# Set Personal Info Method
def setPeronalInfo(self, name, email, gender, dateOfBirth, applyDegreeProgramme):
self.name = name
self.email = email
self.gender = gender
self.dateOfBirth = dateOfBirth
self.applyDegreeProgramme = applyDegreeProgramme
# Set HD Info Method
def setHDInfo(self, hd):
self.hd = hd
pass
# __str__ method
def __str__(self):
"""
Returns a string representation of the Applicant object.
Returns:
str: A formatted string containing the applicant's name, email, gender, date of birth, and applied degree programme.
Also includes a string representation of the Higher Diploma object.
"""
return """
Applicant Name: {applicant_name}
Applicant Email: {applicant_email}
Gender: {gender}
Date of Birth: {DOB}
Apply Degree Programme: {applyDegreeProgramme}
""".strip().format(
applicant_name=self.name,
applicant_email=self.email,
gender=self.gender,
DOB=self.dateOfBirth,
applyDegreeProgramme=self.applyDegreeProgramme,
) + '\n' + self.hd.__str__()
applicant = Applicant()
# class ends
# Tkinter starts
# Parent class for Personal and HighDiploma
class ApplicationPage(tkinter.Frame):
"""Base class for managed pages. Provides methods to be overridden by subclasses."""
def __init__(self, master):
super().__init__(master)
def is_complete(self) -> bool:
"""Check if the current page is complete."""
return True
class Personal(ApplicationPage):
def __init__(self, master):
super().__init__(master)
frm_base = tkinter.Frame(self)
frm_base.pack(fill=tkinter.BOTH, expand=True)
frm_title = tkinter.Frame(frm_base)
frm_title.pack(fill=tkinter.BOTH)
lbl_title = tkinter.Label(
frm_title, text="Personal Infromation", font=("bold", 15))
lbl_title.pack(anchor=tkinter.W)
###
# Write your coding here
# Frame for the content
frm_content = tkinter.Frame(frm_base)
frm_content.pack(fill=tkinter.BOTH, expand=True)
frm_content.grid_columnconfigure(2, weight=1)
# Row counter, to advance row in screen
row = 0
# Label for applicant name
lbl_name = tkinter.Label(
frm_content, text="Applicant Name", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
# Entry box for applicant name
self.ent_applicant_name = tkinter.Entry(frm_content)
self.ent_applicant_name.insert(0, "")
self.ent_applicant_name.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# Label for applicant email
lbl_name = tkinter.Label(
frm_content, text="Applicant Email", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
# Entry box for applicant email
self.ent_applicant_email = tkinter.Entry(frm_content)
self.ent_applicant_email.insert(0, "")
self.ent_applicant_email.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# String variable to store the selected gender
self.gender_select = tkinter.StringVar(value="Male")
# Label for gender
lbl_gender = tkinter.Label(
frm_content, text="Gender", anchor="w", justify="left", width=20)
lbl_gender.grid(row=row, column=0)
# Radio buttons for gender selection
rad_male = tkinter.Radiobutton(
frm_content, variable=self.gender_select, text="Male", value="Male")
rad_male.grid(row=row, column=1)
rad_female = tkinter.Radiobutton(
frm_content, variable=self.gender_select, text="Female", value="Female")
rad_female.grid(row=row, column=2)
row += 1
# Label for date of birth
lbl_name = tkinter.Label(
frm_content, text="Date of Birth", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
# Entry box for date of birth
self.ent_applicant_DOB = tkinter.Entry(frm_content)
self.ent_applicant_DOB.insert(0, "")
self.ent_applicant_DOB.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# Label for apply programme
lbl_name = tkinter.Label(
frm_content, text="Apply Programme", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
# List of programme options and combobox for apply programme
lst_programme = ["Bachelor of Science in Cybersecurity",
"Bachelor of Science in Computer Science and AI"]
self.applicant_programme = tkinter.ttk.Combobox(
frm_content, textvariable=lst_programme, values=lst_programme, state="readonly",)
self.applicant_programme.current(0)
self.applicant_programme.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
def is_complete(self):
###
# Write your coding here
entry_valid = True
if self.ent_applicant_name.get() == "":
tkinter.messagebox.showinfo("Information", "name cannot empty.")
entry_valid = False
if self.ent_applicant_email.get() == "":
tkinter.messagebox.showinfo(
"Information", "email field cannot empty.")
entry_valid = False
else:
# check if email field valid
# https://www.geeksforgeeks.org/check-if-email-address-valid-or-not-in-python/
if not re.match(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b', self.ent_applicant_email.get()):
tkinter.messagebox.showinfo(
"Information", "email: format error, it should be email.")
entry_valid = False
if self.ent_applicant_DOB.get() == "":
tkinter.messagebox.showinfo(
"Information", "dob field cannot empty.")
entry_valid = False
else:
# python re to check if yyyy/mm/dd
if not re.match(r'^\d{4}/\d{2}/\d{2}$', self.ent_applicant_DOB.get()):
tkinter.messagebox.showinfo(
"Information", "DOB format error, it should be yyyy/mm/dd.")
entry_valid = False
# ptyhon to check if the day entered is latter than today
today = datetime.date.today()
if datetime.datetime.strptime(self.ent_applicant_DOB.get(), '%Y/%m/%d').date() > today:
tkinter.messagebox.showinfo(
"Information", "DOB the day enter is latter than today.")
entry_valid = False
if (entry_valid):
applicant.setPeronalInfo(
self.ent_applicant_name.get(),
self.ent_applicant_email.get(),
self.gender_select.get(),
self.ent_applicant_DOB.get(),
self.applicant_programme.get()
)
return True
return False
class HighDiploma(ApplicationPage):
def __init__(self, master):
super().__init__(master)
frm_base = tkinter.Frame(self)
frm_base.pack(fill=tkinter.BOTH, expand=True)
frm_title = tkinter.Frame(frm_base)
frm_title.pack(fill=tkinter.BOTH)
lbl_title = tkinter.Label(
frm_title, text="Higher Diploma Information", font=("bold", 15))
lbl_title.pack(anchor=tkinter.W)
###
# Write your coding here
# Content frame for the form entries
row = 0 # row counter for the form
frm_content = tkinter.Frame(frm_base)
frm_content.pack(fill=tkinter.BOTH)
frm_content.grid_columnconfigure(2, weight=1)
# Label and entry for Institution name
lbl_name = tkinter.Label(
frm_content, text="Institution Name", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
self.ent_institution_name = tkinter.Entry(frm_content)
self.ent_institution_name.insert(0, "")
self.ent_institution_name.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# Label and entry for Programme Title
lbl_name = tkinter.Label(
frm_content, text="Programme Title", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
self.ent_programme_title = tkinter.Entry(frm_content)
self.ent_programme_title.insert(0, "")
self.ent_programme_title.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# Label and entry for GPA
lbl_name = tkinter.Label(
frm_content, text="GPA", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
self.ent_GPA = tkinter.Entry(frm_content)
self.ent_GPA.insert(0, "")
self.ent_GPA.grid(row=row, column=1, columnspan=2,
sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
# Label and entry for Expected Graduation Year
lbl_name = tkinter.Label(
frm_content, text="Expected Graduation Year", anchor="w", justify="left", width=20)
lbl_name.grid(row=row, column=0)
self.expected_grad_year = tkinter.Entry(frm_content)
self.expected_grad_year.insert(0, "")
self.expected_grad_year.grid(
row=row, column=1, columnspan=2, sticky="nsew", pady=(10, 10), padx=(10, 10))
row += 1
###
def is_complete(self):
###
# Write your coding here
entry_valid = True
if self.ent_institution_name.get() == "":
tkinter.messagebox.showinfo(
"Information", "institution name field cannot empty.")
entry_valid = False
if self.ent_programme_title.get() == "":
tkinter.messagebox.showinfo(
"Information", "programme title field cannot empty.")
entry_valid = False
if self.ent_GPA.get() == "":
tkinter.messagebox.showinfo(
"Information", "GPA field cannot empty.")
entry_valid = False
else:
# check if gpa field is a number
try:
float(self.ent_GPA.get())
except ValueError:
tkinter.messagebox.showinfo(
"Information", "GPA field should be a number.")
entry_valid = False
if self.expected_grad_year.get() == "":
tkinter.messagebox.showinfo(
"Information", "Expected graduation year field cannot empty.")
entry_valid = False
else:
# check if gpa field is a number
try:
int(self.expected_grad_year.get())
# check if expected grad year is after current year
today = datetime.date.today()
if int(self.expected_grad_year.get()) < today.year:
tkinter.messagebox.showinfo(
"Information", "Expected graduation year should be after current year.")
entry_valid = False
except ValueError:
tkinter.messagebox.showinfo(
"Information", "Expected graduation year field should be a number.")
entry_valid = False
hd = HDinfo(
self.ent_institution_name.get(),
self.ent_programme_title.get(),
self.ent_GPA.get(),
self.expected_grad_year.get()
)
if (entry_valid):
applicant.setHDInfo(hd)
return True
return False
class Result(ApplicationPage):
def __init__(self, master):
super().__init__(master)
frm_base = tkinter.Frame(self)
frm_base.pack(fill=tkinter.BOTH, expand=True)
frm_title = tkinter.Frame(frm_base)
frm_title.pack(fill=tkinter.BOTH)
lbl_title = tkinter.Label(frm_base, text="Summary", font=("bold", 15))
lbl_title.pack(anchor=tkinter.W)
# Summary Output
###
# Write your coding here
row = 0
frm_content = tkinter.Frame(frm_base)
frm_content.pack(fill=tkinter.BOTH)
frm_content.grid_columnconfigure(2, weight=1)
# textbox for summary
self.txt_summary = tkinter.Text(frm_content, height=12)
self.txt_summary.grid(row=row, column=1, columnspan=2,
sticky="nsew", pady=(1, 1), padx=(1, 1))
row += 1
# right justify button with text "show"
btn_show = tkinter.Button(frm_base, text="Show", anchor=tkinter.E)
btn_show.pack(side=tkinter.RIGHT)
# tkinter bind button click
btn_show.bind("<Button-1>", self.show)
###
def show(self, _): # Show Button method
###
# Write your coding here
self.txt_summary.insert(tkinter.INSERT, str(applicant))
###
class Application(tkinter.Tk):
def __init__(self):
super().__init__()
# Configure GUI
self.title("Undergraduate Application Form")
self.geometry("450x300")
# Content Frame
frm_content = tkinter.Frame(self, relief=tkinter.RIDGE, borderwidth=1)
frm_content.pack(fill=tkinter.BOTH, expand=True)
frm_content.rowconfigure(0, weight=1)
frm_content.columnconfigure(0, weight=1)
# Application Pages
self.__frames: list[ApplicationPage] = [
Personal(frm_content),
HighDiploma(frm_content),
Result(frm_content),
]
for i in self.__frames:
i.grid(row=0, column=0, sticky=tkinter.NSEW)
self.__current_page = 0
self.__frames[self.__current_page].tkraise()
# Bottom Frame
frm_button = tkinter.Frame(self, padx=4, pady=4)
frm_button.pack(side=tkinter.BOTTOM, fill=tkinter.X)
# Next Button
self.btn_next = tkinter.Button(
frm_button, text="Next", command=self.next_page)
self.btn_next.pack(side=tkinter.RIGHT)
# Quit Button
self.btn_quit = tkinter.Button(
frm_button, text="Quit", command=self.destroy)
def next_page(self):
# Check if the current page is complete
if not self.__frames[self.__current_page].is_complete():
tkinter.messagebox.showinfo(
"Information", "Please fill the missing fields."
)
return
# Navigate to next page
self.__current_page += 1
self.__frames[self.__current_page].tkraise()
# If we reached the last page, replace the next button with quit button
if self.__current_page + 1 == len(self.__frames):
self.btn_next.pack_forget()
self.btn_quit.pack(side=tkinter.RIGHT)
# Tkinter ends
if __name__ == "__main__":
app = Application()
app.mainloop()

View File

@@ -0,0 +1,10 @@
@REM rm *.bas
@REM rm *.frm
@REM rm *.frx
@REM timeout 1
:loop
python ./Assignment.py
timeout /t 1
goto loop

Binary file not shown.