aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Touhey <thomas@touhey.fr>2020-08-04 00:53:15 +0200
committerThomas Touhey <thomas@touhey.fr>2020-08-04 00:53:15 +0200
commitcaf1063c5f75a140fbc5b2bb4d72931b7c81ca38 (patch)
treee943e9e9da9334f9cee568682e0a26f876f2479b
parent89c0f6a4dacb74e7a50df9a13d962e6ecc5074ac (diff)
Latest edits
-rw-r--r--.python-version2
-rw-r--r--Pipfile1
-rw-r--r--Pipfile.lock391
-rw-r--r--docs/Pipfile1
-rw-r--r--docs/Pipfile.lock258
-rw-r--r--docs/environment/index.rst40
-rw-r--r--docs/environment/intranet/more.rst (renamed from docs/environment/intranet/index.rst)46
-rw-r--r--setup.cfg4
-rwxr-xr-xsetup.py6
-rwxr-xr-xsgdfi/__init__.py12
-rwxr-xr-xsgdfi/_decode.py2
-rwxr-xr-xsgdfi/_intranet.py59
-rwxr-xr-xsgdfi/_manager.py19
-rwxr-xr-xsgdfi/_objects/__init__.py (renamed from sgdfi/_repr.py)64
-rwxr-xr-xsgdfi/_objects/_dbs/__init__.py (renamed from sgdfi/_dbs/__init__.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_code.py (renamed from sgdfi/_dbs/_code.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_dept.py (renamed from sgdfi/_dbs/_dept.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_event.py (renamed from sgdfi/_dbs/_event.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_funcdata.py (renamed from sgdfi/_dbs/_funcdata.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_funcs.py (renamed from sgdfi/_dbs/_funcs.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_ops.py (renamed from sgdfi/_dbs/_ops.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_regime.py (renamed from sgdfi/_dbs/_regime.py)0
-rwxr-xr-xsgdfi/_objects/_dbs/_st.py (renamed from sgdfi/_dbs/_st.py)32
-rwxr-xr-xsgdfi/_objects/_dbs/_stspe.py (renamed from sgdfi/_dbs/_stspe.py)6
-rwxr-xr-xsgdfi/_objects/_dbs/_ststatus.py (renamed from sgdfi/_dbs/_ststatus.py)0
-rwxr-xr-xsgdfi/_objects/_util.py108
-rwxr-xr-xsgdfi/_util.py494
-rwxr-xr-xsgdfi/version.py (renamed from sgdfi/_version.py)2
28 files changed, 673 insertions, 874 deletions
diff --git a/.python-version b/.python-version
index 0b2eb36..897e56b 100644
--- a/.python-version
+++ b/.python-version
@@ -1 +1 @@
-3.7.2
+3.7.6
diff --git a/Pipfile b/Pipfile
index aad8932..585dac7 100644
--- a/Pipfile
+++ b/Pipfile
@@ -12,6 +12,7 @@ bs4 = "*"
pandas = "*"
lxml = "*"
appdirs = "*"
+thobject = "*"
[dev-packages]
sphinx = '*'
diff --git a/Pipfile.lock b/Pipfile.lock
index 98dbf94..0f4a76d 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "68909494cd91e8f088114031662f6d57dc566b5f56c30d952154ed4f26114ee2"
+ "sha256": "41f28a47baa8d515d1894a4baabbcc088335ecfdb66d3f1a161060854ef76658"
},
"pipfile-spec": 6,
"requires": {
@@ -24,11 +24,11 @@
},
"beautifulsoup4": {
"hashes": [
- "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858",
- "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348",
- "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718"
+ "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a",
+ "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887",
+ "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"
],
- "version": "==4.7.1"
+ "version": "==4.8.2"
},
"bs4": {
"hashes": [
@@ -38,10 +38,10 @@
},
"certifi": {
"hashes": [
- "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
- "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
+ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
+ "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
],
- "version": "==2019.3.9"
+ "version": "==2019.11.28"
},
"chardet": {
"hashes": [
@@ -52,150 +52,170 @@
},
"idna": {
"hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
+ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
+ "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
],
- "version": "==2.8"
+ "version": "==2.9"
},
"lxml": {
"hashes": [
- "sha256:0358b9e9642bc7d39aac5cffe9884a99a5ca68e5e2c1b89e570ed60da9139908",
- "sha256:091a359c4dafebbecd3959d9013f1b896b5371859165e4e50b01607a98d9e3e2",
- "sha256:1998e4e60603c64bcc35af61b4331ab3af087457900d3980e18d190e17c3a697",
- "sha256:2000b4088dee9a41f459fddaf6609bba48a435ce6374bb254c5ccdaa8928c5ba",
- "sha256:2afb0064780d8aaf165875be5898c1866766e56175714fa5f9d055433e92d41d",
- "sha256:2d8f1d9334a4e3ff176d096c14ded3100547d73440683567d85b8842a53180bb",
- "sha256:2e38db22f6a3199fd63675e1b4bd795d676d906869047398f29f38ca55cb453a",
- "sha256:3181f84649c1a1ca62b19ddf28436b1b2cb05ae6c7d2628f33872e713994c364",
- "sha256:37462170dfd88af8431d04de6b236e6e9c06cda71e2ca26d88ef2332fd2a5237",
- "sha256:3a9d8521c89bf6f2a929c3d12ad3ad7392c774c327ea809fd08a13be6b3bc05f",
- "sha256:3d0bbd2e1a28b4429f24fd63a122a450ce9edb7a8063d070790092d7343a1aa4",
- "sha256:483d60585ce3ee71929cea70949059f83850fa5e12deb9c094ed1c8c2ec73cbd",
- "sha256:4888be27d5cba55ce94209baef5bcd7bbd7314a3d17021a5fc10000b3a5f737d",
- "sha256:64b0d62e4209170a2a0c404c446ab83b941a0003e96604d2e4f4cb735f8a2254",
- "sha256:68010900898fdf139ac08549c4dba8206c584070a960ffc530aebf0c6f2794ef",
- "sha256:872ecb066de602a0099db98bd9e57f4cfc1d62f6093d94460c787737aa08f39e",
- "sha256:88a32b03f2e4cd0e63f154cac76724709f40b3fc2f30139eb5d6f900521b44ed",
- "sha256:b1dc7683da4e67ab2bebf266afa68098d681ae02ce570f0d1117312273d2b2ac",
- "sha256:b29e27ce9371810250cb1528a771d047a9c7b0f79630dc7dc5815ff828f4273b",
- "sha256:ce197559596370d985f1ce6b7051b52126849d8159040293bf8b98cb2b3e1f78",
- "sha256:d45cf6daaf22584eff2175f48f82c4aa24d8e72a44913c5aff801819bb73d11f",
- "sha256:e2ff9496322b2ce947ba4a7a5eb048158de9d6f3fe9efce29f1e8dd6878561e6",
- "sha256:f7b979518ec1f294a41a707c007d54d0f3b3e1fd15d5b26b7e99b62b10d9a72e",
- "sha256:f9c7268e9d16e34e50f8246c4f24cf7353764affd2bc971f0379514c246e3f6b",
- "sha256:f9c839806089d79de588ee1dde2dae05dc1156d3355dfeb2b51fde84d9c960ad",
- "sha256:ff962953e2389226adc4d355e34a98b0b800984399153c6678f2367b11b4d4b8"
- ],
- "version": "==4.3.2"
+ "sha256:06d4e0bbb1d62e38ae6118406d7cdb4693a3fa34ee3762238bcb96c9e36a93cd",
+ "sha256:0701f7965903a1c3f6f09328c1278ac0eee8f56f244e66af79cb224b7ef3801c",
+ "sha256:1f2c4ec372bf1c4a2c7e4bb20845e8bcf8050365189d86806bad1e3ae473d081",
+ "sha256:4235bc124fdcf611d02047d7034164897ade13046bda967768836629bc62784f",
+ "sha256:5828c7f3e615f3975d48f40d4fe66e8a7b25f16b5e5705ffe1d22e43fb1f6261",
+ "sha256:585c0869f75577ac7a8ff38d08f7aac9033da2c41c11352ebf86a04652758b7a",
+ "sha256:5d467ce9c5d35b3bcc7172c06320dddb275fea6ac2037f72f0a4d7472035cea9",
+ "sha256:63dbc21efd7e822c11d5ddbedbbb08cd11a41e0032e382a0fd59b0b08e405a3a",
+ "sha256:7bc1b221e7867f2e7ff1933165c0cec7153dce93d0cdba6554b42a8beb687bdb",
+ "sha256:8620ce80f50d023d414183bf90cc2576c2837b88e00bea3f33ad2630133bbb60",
+ "sha256:8a0ebda56ebca1a83eb2d1ac266649b80af8dd4b4a3502b2c1e09ac2f88fe128",
+ "sha256:90ed0e36455a81b25b7034038e40880189169c308a3df360861ad74da7b68c1a",
+ "sha256:95e67224815ef86924fbc2b71a9dbd1f7262384bca4bc4793645794ac4200717",
+ "sha256:afdb34b715daf814d1abea0317b6d672476b498472f1e5aacbadc34ebbc26e89",
+ "sha256:b4b2c63cc7963aedd08a5f5a454c9f67251b1ac9e22fd9d72836206c42dc2a72",
+ "sha256:d068f55bda3c2c3fcaec24bd083d9e2eede32c583faf084d6e4b9daaea77dde8",
+ "sha256:d5b3c4b7edd2e770375a01139be11307f04341ec709cf724e0f26ebb1eef12c3",
+ "sha256:deadf4df349d1dcd7b2853a2c8796593cc346600726eff680ed8ed11812382a7",
+ "sha256:df533af6f88080419c5a604d0d63b2c33b1c0c4409aba7d0cb6de305147ea8c8",
+ "sha256:e4aa948eb15018a657702fee0b9db47e908491c64d36b4a90f59a64741516e77",
+ "sha256:e5d842c73e4ef6ed8c1bd77806bf84a7cb535f9c0cf9b2c74d02ebda310070e1",
+ "sha256:ebec08091a22c2be870890913bdadd86fcd8e9f0f22bcb398abd3af914690c15",
+ "sha256:edc15fcfd77395e24543be48871c251f38132bb834d9fdfdad756adb6ea37679",
+ "sha256:f2b74784ed7e0bc2d02bd53e48ad6ba523c9b36c194260b7a5045071abbb1012",
+ "sha256:fa071559f14bd1e92077b1b5f6c22cf09756c6de7139370249eb372854ce51e6",
+ "sha256:fd52e796fee7171c4361d441796b64df1acfceb51f29e545e812f16d023c4bbc",
+ "sha256:fe976a0f1ef09b3638778024ab9fb8cde3118f203364212c198f71341c0715ca"
+ ],
+ "version": "==4.5.0"
},
"numpy": {
"hashes": [
- "sha256:1980f8d84548d74921685f68096911585fee393975f53797614b34d4f409b6da",
- "sha256:22752cd809272671b273bb86df0f505f505a12368a3a5fc0aa811c7ece4dfd5c",
- "sha256:23cc40313036cffd5d1873ef3ce2e949bdee0646c5d6f375bf7ee4f368db2511",
- "sha256:2b0b118ff547fecabc247a2668f48f48b3b1f7d63676ebc5be7352a5fd9e85a5",
- "sha256:3a0bd1edf64f6a911427b608a894111f9fcdb25284f724016f34a84c9a3a6ea9",
- "sha256:3f25f6c7b0d000017e5ac55977a3999b0b1a74491eacb3c1aa716f0e01f6dcd1",
- "sha256:4061c79ac2230594a7419151028e808239450e676c39e58302ad296232e3c2e8",
- "sha256:560ceaa24f971ab37dede7ba030fc5d8fa173305d94365f814d9523ffd5d5916",
- "sha256:62be044cd58da2a947b7e7b2252a10b42920df9520fc3d39f5c4c70d5460b8ba",
- "sha256:6c692e3879dde0b67a9dc78f9bfb6f61c666b4562fd8619632d7043fb5b691b0",
- "sha256:6f65e37b5a331df950ef6ff03bd4136b3c0bbcf44d4b8e99135d68a537711b5a",
- "sha256:7a78cc4ddb253a55971115f8320a7ce28fd23a065fc33166d601f51760eecfa9",
- "sha256:80a41edf64a3626e729a62df7dd278474fc1726836552b67a8c6396fd7e86760",
- "sha256:893f4d75255f25a7b8516feb5766c6b63c54780323b9bd4bc51cdd7efc943c73",
- "sha256:972ea92f9c1b54cc1c1a3d8508e326c0114aaf0f34996772a30f3f52b73b942f",
- "sha256:9f1d4865436f794accdabadc57a8395bd3faa755449b4f65b88b7df65ae05f89",
- "sha256:9f4cd7832b35e736b739be03b55875706c8c3e5fe334a06210f1a61e5c2c8ca5",
- "sha256:adab43bf657488300d3aeeb8030d7f024fcc86e3a9b8848741ea2ea903e56610",
- "sha256:bd2834d496ba9b1bdda3a6cf3de4dc0d4a0e7be306335940402ec95132ad063d",
- "sha256:d20c0360940f30003a23c0adae2fe50a0a04f3e48dc05c298493b51fd6280197",
- "sha256:d3b3ed87061d2314ff3659bb73896e622252da52558f2380f12c421fbdee3d89",
- "sha256:dc235bf29a406dfda5790d01b998a1c01d7d37f449128c0b1b7d1c89a84fae8b",
- "sha256:fb3c83554f39f48f3fa3123b9c24aecf681b1c289f9334f8215c1d3c8e2f6e5b"
- ],
- "version": "==1.16.2"
+ "sha256:1598a6de323508cfeed6b7cd6c4efb43324f4692e20d1f76e1feec7f59013448",
+ "sha256:1b0ece94018ae21163d1f651b527156e1f03943b986188dd81bc7e066eae9d1c",
+ "sha256:2e40be731ad618cb4974d5ba60d373cdf4f1b8dcbf1dcf4d9dff5e212baf69c5",
+ "sha256:4ba59db1fcc27ea31368af524dcf874d9277f21fd2e1f7f1e2e0c75ee61419ed",
+ "sha256:59ca9c6592da581a03d42cc4e270732552243dc45e87248aa8d636d53812f6a5",
+ "sha256:5e0feb76849ca3e83dd396254e47c7dba65b3fa9ed3df67c2556293ae3e16de3",
+ "sha256:6d205249a0293e62bbb3898c4c2e1ff8a22f98375a34775a259a0523111a8f6c",
+ "sha256:6fcc5a3990e269f86d388f165a089259893851437b904f422d301cdce4ff25c8",
+ "sha256:82847f2765835c8e5308f136bc34018d09b49037ec23ecc42b246424c767056b",
+ "sha256:87902e5c03355335fc5992a74ba0247a70d937f326d852fc613b7f53516c0963",
+ "sha256:9ab21d1cb156a620d3999dd92f7d1c86824c622873841d6b080ca5495fa10fef",
+ "sha256:a1baa1dc8ecd88fb2d2a651671a84b9938461e8a8eed13e2f0a812a94084d1fa",
+ "sha256:a244f7af80dacf21054386539699ce29bcc64796ed9850c99a34b41305630286",
+ "sha256:a35af656a7ba1d3decdd4fae5322b87277de8ac98b7d9da657d9e212ece76a61",
+ "sha256:b1fe1a6f3a6f355f6c29789b5927f8bd4f134a4bd9a781099a7c4f66af8850f5",
+ "sha256:b5ad0adb51b2dee7d0ee75a69e9871e2ddfb061c73ea8bc439376298141f77f5",
+ "sha256:ba3c7a2814ec8a176bb71f91478293d633c08582119e713a0c5351c0f77698da",
+ "sha256:cd77d58fb2acf57c1d1ee2835567cd70e6f1835e32090538f17f8a3a99e5e34b",
+ "sha256:cdb3a70285e8220875e4d2bc394e49b4988bdb1298ffa4e0bd81b2f613be397c",
+ "sha256:deb529c40c3f1e38d53d5ae6cd077c21f1d49e13afc7936f7f868455e16b64a0",
+ "sha256:e7894793e6e8540dbeac77c87b489e331947813511108ae097f1715c018b8f3d"
+ ],
+ "version": "==1.18.2"
},
"pandas": {
"hashes": [
- "sha256:071e42b89b57baa17031af8c6b6bbd2e9a5c68c595bc6bf9adabd7a9ed125d3b",
- "sha256:17450e25ae69e2e6b303817bdf26b2cd57f69595d8550a77c308be0cd0fd58fa",
- "sha256:17916d818592c9ec891cbef2e90f98cc85e0f1e89ed0924c9b5220dc3209c846",
- "sha256:2538f099ab0e9f9c9d09bbcd94b47fd889bad06dc7ae96b1ed583f1dc1a7a822",
- "sha256:366f30710172cb45a6b4f43b66c220653b1ea50303fbbd94e50571637ffb9167",
- "sha256:42e5ad741a0d09232efbc7fc648226ed93306551772fc8aecc6dce9f0e676794",
- "sha256:4e718e7f395ba5bfe8b6f6aaf2ff1c65a09bb77a36af6394621434e7cc813204",
- "sha256:4f919f409c433577a501e023943e582c57355d50a724c589e78bc1d551a535a2",
- "sha256:4fe0d7e6438212e839fc5010c78b822664f1a824c0d263fd858f44131d9166e2",
- "sha256:5149a6db3e74f23dc3f5a216c2c9ae2e12920aa2d4a5b77e44e5b804a5f93248",
- "sha256:627594338d6dd995cfc0bacd8e654cd9e1252d2a7c959449228df6740d737eb8",
- "sha256:83c702615052f2a0a7fb1dd289726e29ec87a27272d775cb77affe749cca28f8",
- "sha256:8c872f7fdf3018b7891e1e3e86c55b190e6c5cee70cab771e8f246c855001296",
- "sha256:90f116086063934afd51e61a802a943826d2aac572b2f7d55caaac51c13db5b5",
- "sha256:a3352bacac12e1fc646213b998bce586f965c9d431773d9e91db27c7c48a1f7d",
- "sha256:bcdd06007cca02d51350f96debe51331dec429ac8f93930a43eb8fb5639e3eb5",
- "sha256:c1bd07ebc15285535f61ddd8c0c75d0d6293e80e1ee6d9a8d73f3f36954342d0",
- "sha256:c9a4b7c55115eb278c19aa14b34fcf5920c8fe7797a09b7b053ddd6195ea89b3",
- "sha256:cc8fc0c7a8d5951dc738f1c1447f71c43734244453616f32b8aa0ef6013a5dfb",
- "sha256:d7b460bc316064540ce0c41c1438c416a40746fd8a4fb2999668bf18f3c4acf1"
- ],
- "version": "==0.24.2"
+ "sha256:07c1b58936b80eafdfe694ce964ac21567b80a48d972879a359b3ebb2ea76835",
+ "sha256:0ebe327fb088df4d06145227a4aa0998e4f80a9e6aed4b61c1f303bdfdf7c722",
+ "sha256:11c7cb654cd3a0e9c54d81761b5920cdc86b373510d829461d8f2ed6d5905266",
+ "sha256:12f492dd840e9db1688126216706aa2d1fcd3f4df68a195f9479272d50054645",
+ "sha256:167a1315367cea6ec6a5e11e791d9604f8e03f95b57ad227409de35cf850c9c5",
+ "sha256:1a7c56f1df8d5ad8571fa251b864231f26b47b59cbe41aa5c0983d17dbb7a8e4",
+ "sha256:1fa4bae1a6784aa550a1c9e168422798104a85bf9c77a1063ea77ee6f8452e3a",
+ "sha256:32f42e322fb903d0e189a4c10b75ba70d90958cc4f66a1781ed027f1a1d14586",
+ "sha256:387dc7b3c0424327fe3218f81e05fc27832772a5dffbed385013161be58df90b",
+ "sha256:6597df07ea361231e60c00692d8a8099b519ed741c04e65821e632bc9ccb924c",
+ "sha256:743bba36e99d4440403beb45a6f4f3a667c090c00394c176092b0b910666189b",
+ "sha256:858a0d890d957ae62338624e4aeaf1de436dba2c2c0772570a686eaca8b4fc85",
+ "sha256:863c3e4b7ae550749a0bb77fa22e601a36df9d2905afef34a6965bed092ba9e5",
+ "sha256:a210c91a02ec5ff05617a298ad6f137b9f6f5771bf31f2d6b6367d7f71486639",
+ "sha256:ca84a44cf727f211752e91eab2d1c6c1ab0f0540d5636a8382a3af428542826e",
+ "sha256:d234bcf669e8b4d6cbcd99e3ce7a8918414520aeb113e2a81aeb02d0a533d7f7"
+ ],
+ "version": "==1.0.3"
},
"python-dateutil": {
"hashes": [
- "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
- "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
+ "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
+ "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
],
- "version": "==2.8.0"
+ "version": "==2.8.1"
},
"pytz": {
"hashes": [
- "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9",
- "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c"
+ "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
+ "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
],
- "version": "==2018.9"
+ "version": "==2019.3"
},
"regex": {
"hashes": [
- "sha256:0306149889c1a1bec362511f737bc446245ddfcdbe4b556abdfc506ed46dfa47",
- "sha256:4b08704a5939c698d2d5950b5dc950597613216cc8c01048efc0da860a0c3db9",
- "sha256:6ba0eb777ada6887062c2620e6d644b011078d5d3dc09119ae7107285f6f95e9",
- "sha256:7789cc323948792c4c62b269a56f2f2f9bc77d44e54fd81e01b12a967dd7244c",
- "sha256:825143aadca0da7d26eeaf2ab0f8bc33921a5642e570ded92dde08c5aaebc65f",
- "sha256:8fbd057faab28ce552d89c46f7a968e950f07e80752dfb93891dd11c6b0ee3b4",
- "sha256:a41aabb0b9072a14f1e2e554f959ed6439b83610ed656edace9096a0b27e378e",
- "sha256:d8807231aed332a1d0456d2088967b87e8c664222bed8e566384ca0ec0b43bfd",
- "sha256:dfd89b642fe71f4e8a9906455d4147d453061377b650e6233ddd9ea822971360"
- ],
- "version": "==2019.3.12"
+ "sha256:08119f707f0ebf2da60d2f24c2f39ca616277bb67ef6c92b72cbf90cbe3a556b",
+ "sha256:0ce9537396d8f556bcfc317c65b6a0705320701e5ce511f05fc04421ba05b8a8",
+ "sha256:1cbe0fa0b7f673400eb29e9ef41d4f53638f65f9a2143854de6b1ce2899185c3",
+ "sha256:2294f8b70e058a2553cd009df003a20802ef75b3c629506be20687df0908177e",
+ "sha256:23069d9c07e115537f37270d1d5faea3e0bdded8279081c4d4d607a2ad393683",
+ "sha256:24f4f4062eb16c5bbfff6a22312e8eab92c2c99c51a02e39b4eae54ce8255cd1",
+ "sha256:295badf61a51add2d428a46b8580309c520d8b26e769868b922750cf3ce67142",
+ "sha256:2a3bf8b48f8e37c3a40bb3f854bf0121c194e69a650b209628d951190b862de3",
+ "sha256:4385f12aa289d79419fede43f979e372f527892ac44a541b5446617e4406c468",
+ "sha256:5635cd1ed0a12b4c42cce18a8d2fb53ff13ff537f09de5fd791e97de27b6400e",
+ "sha256:5bfed051dbff32fd8945eccca70f5e22b55e4148d2a8a45141a3b053d6455ae3",
+ "sha256:7e1037073b1b7053ee74c3c6c0ada80f3501ec29d5f46e42669378eae6d4405a",
+ "sha256:90742c6ff121a9c5b261b9b215cb476eea97df98ea82037ec8ac95d1be7a034f",
+ "sha256:a58dd45cb865be0ce1d5ecc4cfc85cd8c6867bea66733623e54bd95131f473b6",
+ "sha256:c087bff162158536387c53647411db09b6ee3f9603c334c90943e97b1052a156",
+ "sha256:c162a21e0da33eb3d31a3ac17a51db5e634fc347f650d271f0305d96601dc15b",
+ "sha256:c9423a150d3a4fc0f3f2aae897a59919acd293f4cb397429b120a5fcd96ea3db",
+ "sha256:ccccdd84912875e34c5ad2d06e1989d890d43af6c2242c6fcfa51556997af6cd",
+ "sha256:e91ba11da11cf770f389e47c3f5c30473e6d85e06d7fd9dcba0017d2867aab4a",
+ "sha256:ea4adf02d23b437684cd388d557bf76e3afa72f7fed5bbc013482cc00c816948",
+ "sha256:fb95debbd1a824b2c4376932f2216cc186912e389bdb0e27147778cf6acb3f89"
+ ],
+ "version": "==2020.4.4"
},
"requests": {
"hashes": [
- "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e",
- "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"
+ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
+ "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
],
- "version": "==2.21.0"
+ "version": "==2.23.0"
},
"six": {
"hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
],
- "version": "==1.12.0"
+ "version": "==1.14.0"
},
"soupsieve": {
"hashes": [
- "sha256:3aef141566afd07201b525c17bfaadd07580a8066f82b57f7c9417f26adbd0a3",
- "sha256:e41a65e99bd125972d84221022beb1e4b5cfc68fa12c170c39834ce32d1b294c"
+ "sha256:e914534802d7ffd233242b785229d5ba0766a7f487385e3f714446a07bf540ae",
+ "sha256:fcd71e08c0aee99aca1b73f45478549ee7e7fc006d51b37bec9e9def7dc22b69"
+ ],
+ "version": "==2.0"
+ },
+ "thobject": {
+ "hashes": [
+ "sha256:de04d82e798f2e55e38bbb7f9f39e5cd6460b4d4fab9823f8a0184cc51c4c3e4"
+ ],
+ "version": "==0.1"
+ },
+ "tinydb": {
+ "hashes": [
+ "sha256:1087ade5300c47dbf9539d9f6dafd53115bd5e85a67d480d8188bdbfa2d9eaf4",
+ "sha256:f273d9b6d8b1b5e1d094a6eb8b72851b39b81099293344132c73332b60e3b893"
],
- "version": "==1.9"
+ "version": "==3.15.2"
},
"urllib3": {
"hashes": [
- "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39",
- "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"
+ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
+ "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
],
- "version": "==1.24.1"
+ "version": "==1.25.8"
}
},
"develop": {
@@ -208,17 +228,17 @@
},
"babel": {
"hashes": [
- "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669",
- "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23"
+ "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38",
+ "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"
],
- "version": "==2.6.0"
+ "version": "==2.8.0"
},
"certifi": {
"hashes": [
- "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
- "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
+ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
+ "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
],
- "version": "==2019.3.9"
+ "version": "==2019.11.28"
},
"chardet": {
"hashes": [
@@ -235,32 +255,31 @@
},
"docutils": {
"hashes": [
- "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
- "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
- "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
+ "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
+ "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
],
- "version": "==0.14"
+ "version": "==0.16"
},
"idna": {
"hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
+ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
+ "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
],
- "version": "==2.8"
+ "version": "==2.9"
},
"imagesize": {
"hashes": [
- "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8",
- "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5"
+ "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
+ "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
],
- "version": "==1.1.0"
+ "version": "==1.2.0"
},
"jinja2": {
"hashes": [
- "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd",
- "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4"
+ "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
+ "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
],
- "version": "==2.10"
+ "version": "==2.11.1"
},
"markupsafe": {
"hashes": [
@@ -268,13 +287,16 @@
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
@@ -291,79 +313,116 @@
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
- "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
],
"version": "==1.1.1"
},
"packaging": {
"hashes": [
- "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af",
- "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3"
+ "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3",
+ "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752"
],
- "version": "==19.0"
+ "version": "==20.3"
},
"pygments": {
"hashes": [
- "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a",
- "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d"
+ "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
+ "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
],
- "version": "==2.3.1"
+ "version": "==2.6.1"
},
"pyparsing": {
"hashes": [
- "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a",
- "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3"
+ "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f",
+ "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"
],
- "version": "==2.3.1"
+ "version": "==2.4.6"
},
"pytz": {
"hashes": [
- "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9",
- "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c"
+ "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
+ "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
],
- "version": "==2018.9"
+ "version": "==2019.3"
},
"requests": {
"hashes": [
- "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e",
- "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"
+ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
+ "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
],
- "version": "==2.21.0"
+ "version": "==2.23.0"
},
"six": {
"hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
],
- "version": "==1.12.0"
+ "version": "==1.14.0"
},
"snowballstemmer": {
"hashes": [
- "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128",
- "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89"
+ "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0",
+ "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"
],
- "version": "==1.2.1"
+ "version": "==2.0.0"
},
"sphinx": {
"hashes": [
- "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c",
- "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"
+ "sha256:b4c750d546ab6d7e05bdff6ac24db8ae3e8b8253a3569b754e445110a0a12b66",
+ "sha256:fc312670b56cb54920d6cc2ced455a22a547910de10b3142276495ced49231cb"
+ ],
+ "version": "==2.4.4"
+ },
+ "sphinxcontrib-applehelp": {
+ "hashes": [
+ "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a",
+ "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"
+ ],
+ "version": "==1.0.2"
+ },
+ "sphinxcontrib-devhelp": {
+ "hashes": [
+ "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e",
+ "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"
+ ],
+ "version": "==1.0.2"
+ },
+ "sphinxcontrib-htmlhelp": {
+ "hashes": [
+ "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f",
+ "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"
+ ],
+ "version": "==1.0.3"
+ },
+ "sphinxcontrib-jsmath": {
+ "hashes": [
+ "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
+ "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
+ ],
+ "version": "==1.0.1"
+ },
+ "sphinxcontrib-qthelp": {
+ "hashes": [
+ "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72",
+ "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"
],
- "version": "==1.8.5"
+ "version": "==1.0.3"
},
- "sphinxcontrib-websupport": {
+ "sphinxcontrib-serializinghtml": {
"hashes": [
- "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd",
- "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9"
+ "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc",
+ "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"
],
- "version": "==1.1.0"
+ "version": "==1.1.4"
},
"urllib3": {
"hashes": [
- "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39",
- "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"
+ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
+ "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
],
- "version": "==1.24.1"
+ "version": "==1.25.8"
}
}
}
diff --git a/docs/Pipfile b/docs/Pipfile
index 57a81a3..09c87a2 100644
--- a/docs/Pipfile
+++ b/docs/Pipfile
@@ -8,6 +8,7 @@ verify_ssl = true
[packages]
sphinx = "*"
sphinx-rtd-theme = "*"
+sphinx-autobuild = "*"
[requires]
python_version = "3.7"
diff --git a/docs/Pipfile.lock b/docs/Pipfile.lock
index 78bb695..e0fe045 100644
--- a/docs/Pipfile.lock
+++ b/docs/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "ad49cdffc75c09b6abfb00f80a96f9c4967858dfc7153f34febb993592308482"
+ "sha256": "6d8826054098dd25b2b5d62c6a903410a1e1777e50e73c379e6b48d4b6be3fb9"
},
"pipfile-spec": 6,
"requires": {
@@ -23,19 +23,27 @@
],
"version": "==0.7.12"
},
+ "argh": {
+ "hashes": [
+ "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3",
+ "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"
+ ],
+ "version": "==0.26.2"
+ },
"babel": {
"hashes": [
- "sha256:af92e6106cb7c55286b25b38ad7695f8b4efb36a90ba483d7f7a6628c46158ab",
- "sha256:e86135ae101e31e2c8ec20a4e0c5220f4eed12487d5cf3f78be7e98d3a57fc28"
+ "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38",
+ "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"
],
- "version": "==2.7.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.8.0"
},
"certifi": {
"hashes": [
- "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
- "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
+ "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
+ "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
],
- "version": "==2019.3.9"
+ "version": "==2020.6.20"
},
"chardet": {
"hashes": [
@@ -46,179 +54,263 @@
},
"docutils": {
"hashes": [
- "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
- "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
- "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
+ "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
+ "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
],
- "version": "==0.14"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+ "version": "==0.16"
},
"idna": {
"hashes": [
- "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407",
- "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"
+ "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
+ "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
],
- "version": "==2.8"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.10"
},
"imagesize": {
"hashes": [
- "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8",
- "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5"
+ "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
+ "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
],
- "version": "==1.1.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==1.2.0"
},
"jinja2": {
"hashes": [
- "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013",
- "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b"
+ "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0",
+ "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+ "version": "==2.11.2"
+ },
+ "livereload": {
+ "hashes": [
+ "sha256:d1eddcb5c5eb8d2ca1fa1f750e580da624c0f7fcb734aa5780dc81b7dcbd89be"
],
- "version": "==2.10.1"
+ "version": "==2.6.2"
},
"markupsafe": {
"hashes": [
- "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
- "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
- "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
- "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
- "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
- "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
- "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
- "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
- "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
- "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
- "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
- "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
- "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
+ "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
+ "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
- "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
- "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
- "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
+ "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
+ "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
+ "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
- "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
- "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"
+ "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
+ "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
+ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be",
+ "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
+ "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"
],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.1.1"
},
"packaging": {
"hashes": [
- "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af",
- "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3"
+ "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8",
+ "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==20.4"
+ },
+ "pathtools": {
+ "hashes": [
+ "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"
+ ],
+ "version": "==0.1.2"
+ },
+ "port-for": {
+ "hashes": [
+ "sha256:b16a84bb29c2954db44c29be38b17c659c9c27e33918dec16b90d375cc596f1c"
],
- "version": "==19.0"
+ "version": "==0.3.1"
},
"pygments": {
"hashes": [
- "sha256:71e430bc85c88a430f000ac1d9b331d2407f681d6f6aec95e8bcfbc3df5b0127",
- "sha256:881c4c157e45f30af185c1ffe8d549d48ac9127433f2c380c24b84572ad66297"
+ "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
+ "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
],
- "version": "==2.4.2"
+ "markers": "python_version >= '3.5'",
+ "version": "==2.6.1"
},
"pyparsing": {
"hashes": [
- "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a",
- "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03"
+ "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
+ "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
],
- "version": "==2.4.0"
+ "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.4.7"
},
"pytz": {
"hashes": [
- "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda",
- "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141"
+ "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed",
+ "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"
],
- "version": "==2019.1"
+ "version": "==2020.1"
+ },
+ "pyyaml": {
+ "hashes": [
+ "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97",
+ "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76",
+ "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2",
+ "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648",
+ "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf",
+ "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f",
+ "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2",
+ "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee",
+ "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d",
+ "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c",
+ "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"
+ ],
+ "version": "==5.3.1"
},
"requests": {
"hashes": [
- "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4",
- "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"
+ "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
+ "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
],
- "version": "==2.22.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+ "version": "==2.24.0"
},
"six": {
"hashes": [
- "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
- "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
+ "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
+ "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
],
- "version": "==1.12.0"
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==1.15.0"
},
"snowballstemmer": {
"hashes": [
- "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128",
- "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89"
+ "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0",
+ "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"
],
- "version": "==1.2.1"
+ "version": "==2.0.0"
},
"sphinx": {
"hashes": [
- "sha256:2c5becc0fd6706dc0aeb4703f9f1f8a1d1eecacf02e9ac5943cbae48b11e5e42",
- "sha256:7a359a91fb04054ec77d68ff97cb8728f8cc322e25f22dc94299d67e0e6a7123"
+ "sha256:97dbf2e31fc5684bb805104b8ad34434ed70e6c588f6896991b2fdfd2bef8c00",
+ "sha256:b9daeb9b39aa1ffefc2809b43604109825300300b987a24f45976c001ba1a8fd"
],
"index": "pypi",
- "version": "==2.1.0"
+ "version": "==3.1.2"
+ },
+ "sphinx-autobuild": {
+ "hashes": [
+ "sha256:66388f81884666e3821edbe05dd53a0cfb68093873d17320d0610de8db28c74e",
+ "sha256:e60aea0789cab02fa32ee63c7acae5ef41c06f1434d9fd0a74250a61f5994692"
+ ],
+ "index": "pypi",
+ "version": "==0.7.1"
},
"sphinx-rtd-theme": {
"hashes": [
- "sha256:00cf895504a7895ee433807c62094cf1e95f065843bf3acd17037c3e9a2becd4",
- "sha256:728607e34d60456d736cc7991fd236afb828b21b82f956c5ea75f94c8414040a"
+ "sha256:22c795ba2832a169ca301cd0a083f7a434e09c538c70beb42782c073651b707d",
+ "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"
],
"index": "pypi",
- "version": "==0.4.3"
+ "version": "==0.5.0"
},
"sphinxcontrib-applehelp": {
"hashes": [
- "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897",
- "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d"
+ "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a",
+ "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"
],
- "version": "==1.0.1"
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.2"
},
"sphinxcontrib-devhelp": {
"hashes": [
- "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34",
- "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981"
+ "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e",
+ "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"
],
- "version": "==1.0.1"
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.2"
},
"sphinxcontrib-htmlhelp": {
"hashes": [
- "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422",
- "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7"
+ "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f",
+ "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"
],
- "version": "==1.0.2"
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.3"
},
"sphinxcontrib-jsmath": {
"hashes": [
"sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
"sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
],
+ "markers": "python_version >= '3.5'",
"version": "==1.0.1"
},
"sphinxcontrib-qthelp": {
"hashes": [
- "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20",
- "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f"
+ "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72",
+ "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"
],
- "version": "==1.0.2"
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.3"
},
"sphinxcontrib-serializinghtml": {
"hashes": [
- "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227",
- "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768"
+ "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc",
+ "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==1.1.4"
+ },
+ "tornado": {
+ "hashes": [
+ "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc",
+ "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52",
+ "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6",
+ "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d",
+ "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b",
+ "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673",
+ "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9",
+ "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a",
+ "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740"
],
- "version": "==1.1.3"
+ "markers": "python_version >= '3.5'",
+ "version": "==6.0.4"
},
"urllib3": {
"hashes": [
- "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1",
- "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232"
+ "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a",
+ "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
+ "version": "==1.25.10"
+ },
+ "watchdog": {
+ "hashes": [
+ "sha256:4214e1379d128b0588021880ccaf40317ee156d4603ac388b9adcf29165e0c04"
],
- "version": "==1.25.3"
+ "version": "==0.10.3"
}
},
"develop": {}
diff --git a/docs/environment/index.rst b/docs/environment/index.rst
index 4868c8e..3a885f1 100644
--- a/docs/environment/index.rst
+++ b/docs/environment/index.rst
@@ -76,10 +76,48 @@ The `main website <https://www.sgdf.fr/>`_, also contains a few tools:
The Intranet
------------
+Most management actions linked to the organization goes through the intranet,
+which is edited, maintained and hosted by `Supralog`_ since circa 2006.
+It is available through:
+
+- the official domain, `<https://intranet.sgdf.fr/>`_.
+- a development domain, `<https://sgdf.intrassoc.com/>`_, although the
+ HTTPS certificate doesn't cover it.
+
+A test instance is available through:
+
+- the official domain, `<http://intranet-qualification.sgdf.fr/>`_.
+- a development domain, `<http://sgdf-qualification.intrassoc.com/>`_.
+
+The intranet allows one to manage, amongst other things:
+
+- registrations and adherents.
+- access to other services.
+- functions within the organization (nominations, …).
+- structures (groups, territories, …).
+- estate, places.
+- events (meetings, work meetings, camps, rallies, …).
+- accountancy (spendings, donations, …).
+- training courses.
+- accidents and sinisters.
+
+See these documents for more details:
+
.. toctree::
:maxdepth: 2
- intranet/index
+ intranet/more
+ intranet/auth
+ intranet/ids
+ intranet/adherents
+ intranet/structures
+ intranet/functions
+ intranet/events
+ intranet/places
+ intranet/attendees
+ intranet/rallies
+ intranet/operations
+ intranet/misc
Unimplemented
-------------
diff --git a/docs/environment/intranet/index.rst b/docs/environment/intranet/more.rst
index b94d7a7..ac83311 100644
--- a/docs/environment/intranet/index.rst
+++ b/docs/environment/intranet/more.rst
@@ -1,30 +1,5 @@
-The intranet
-============
-
-Most management actions linked to the organization goes through the intranet,
-which is edited, maintained and hosted by `Supralog`_ since circa 2006.
-It is available through:
-
-- the official domain, `<https://intranet.sgdf.fr/>`_.
-- a development domain, `<https://sgdf.intrassoc.com/>`_, although the
- HTTPS certificate doesn't cover it.
-
-A test instance is available through:
-
-- the official domain, `<http://intranet-qualification.sgdf.fr/>`_.
-- a development domain, `<http://sgdf-qualification.intrassoc.com/>`_.
-
-The intranet allows one to manage, amongst other things:
-
-- registrations and adherents.
-- access to other services.
-- functions within the organization (nominations, …).
-- structures (groups, territories, …).
-- estate, places.
-- events (meetings, work meetings, camps, rallies, …).
-- accountancy (spendings, donations, …).
-- training courses.
-- accidents and sinisters.
+Intranet concepts
+=================
The intranet is an `Intr@ssoc`_ derivative (this is also the case, amongst
french scouting organizations, for the `Éclaireuses et Éclaireurs
@@ -53,23 +28,6 @@ Returned documents are usually one of these:
`Microsoft Ajax`_ response.
- ``application/json``: a JSON document.
-See these documents for more details:
-
-.. toctree::
- :maxdepth: 2
-
- auth
- ids
- adherents
- structures
- functions
- events
- places
- attendees
- rallies
- operations
- misc
-
.. _Supralog: http://www.supralog.com
.. _Intr@ssoc: http://www.intrassoc.com/
.. _ASP.NET: https://www.asp.net/
diff --git a/setup.cfg b/setup.cfg
index b095fc6..d4b9957 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = sgdfi
-version = attr: sgdfi.version
+version = attr: sgdfi.version.version
url = https://sgdfi.touhey.pro/
author = Thomas Touhey
author_email = thomas@touhey.fr
@@ -20,6 +20,8 @@ zip_safe = False
include_package_data = True
packages = find:
test_suite = test
+install_requires =
+ thobject
[options.package_data]
* = *.txt, *.rst
diff --git a/setup.py b/setup.py
index 4741404..56060b1 100755
--- a/setup.py
+++ b/setup.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
-#******************************************************************************
+#**************************************************************************
# Copyright (C) 2018 Thomas Touhey <thomas@touhey.fr>
-# This file is part of the fingerd Python 3.x module, which is MIT-licensed.
-#******************************************************************************
+# This file is part of the sgdfi module, which is MIT-licensed.
+#**************************************************************************
""" Setup script for the textoutpc Python package and script. """
from setuptools import setup as _setup
diff --git a/sgdfi/__init__.py b/sgdfi/__init__.py
index b51f926..080c317 100755
--- a/sgdfi/__init__.py
+++ b/sgdfi/__init__.py
@@ -5,13 +5,13 @@
#**************************************************************************
""" SGDFi allows you to interact with SGDF's intranet. """
-from ._version import version
+from .version import version
from ._manager import Manager
-from ._repr import Structure, Adherent, RallyRegistration, Camp, Place, \
- Operation, OperationType, Function, Event, StructureType, \
- StructureStatus, AllocationsRegime
-from ._util import InvalidCredentialsError, InvalidUserError, \
- InvalidPasswordError, UnauthorizedAccountError
+from ._objects import (Structure, Adherent, RallyRegistration, Camp, Place,
+ Operation, OperationType, Function, Event, StructureType,
+ StructureStatus, AllocationsRegime)
+from ._util import (InvalidCredentialsError, InvalidUserError,
+ InvalidPasswordError, UnauthorizedAccountError)
__all__ = ["version", "Manager",
diff --git a/sgdfi/_decode.py b/sgdfi/_decode.py
index de49d02..412801d 100755
--- a/sgdfi/_decode.py
+++ b/sgdfi/_decode.py
@@ -20,7 +20,7 @@ from csv import reader as _csvreader
from bs4 import BeautifulSoup as _BeautifulSoup
from pandas import read_excel as _read_excel
-from ._repr import (Structure as _Structure, Adherent as _Adherent,
+from ._objects import (Structure as _Structure, Adherent as _Adherent,
Place as _Place, RallyRegistration as _RallyRegistration,
Camp as _Camp, Operation as _Operation,
FunctionRawData as _FunctionRawData)
diff --git a/sgdfi/_intranet.py b/sgdfi/_intranet.py
index 9c4ddc8..67c6420 100755
--- a/sgdfi/_intranet.py
+++ b/sgdfi/_intranet.py
@@ -7,35 +7,34 @@
from os import linesep as _linesep
from sys import stderr as _stderr
-from time import strftime as _strftime, localtime as _localtime, \
- clock_gettime as _getclocktime, CLOCK_MONOTONIC as _MONOCLOCK
+from time import (strftime as _strftime, localtime as _localtime,
+ clock_gettime as _getclocktime, CLOCK_MONOTONIC as _MONOCLOCK)
from datetime import date as _date, datetime as _datetime
from io import StringIO as _StringIO
from itertools import count as _count
from base64 import b64encode as _b64encode
-from urllib.parse import urlencode as _urlencode, urlparse as _urlparse, \
- parse_qs as _parse_qs
+from urllib.parse import (urlencode as _urlencode, urlparse as _urlparse,
+ parse_qs as _parse_qs)
from json import dumps as _jsondumps
from requests import Session as _Session
from bs4 import BeautifulSoup as _BeautifulSoup
-from ._repr import IID as _IID
-from ._util import InvalidCredentialsError as _InvalidCredentialsError, \
- InvalidUserError as _InvalidUserError, \
- InvalidPasswordError as _InvalidPasswordError, \
- UnauthorizedAccountError as _UnauthorizedAccountError, \
- RedirectError as _RedirectError, BadRequestError as _BadRequestError, \
- NotFoundError as _NotFoundError, ForbiddenError as _ForbiddenError, \
- Pagination as _Pagination
-from ._dbs import StructureType as _StructureType, \
- StructureTypeData as _StructureTypeData, \
- StructureStatus as _StructureStatus, \
- StructureStatusData as _StructureStatusData, \
- StructureSpeciality as _StructureSpeciality, \
- StructureSpecialityData as _StructureSpecialityData, \
- Department as _Department, \
- DepartmentData as _DepartmentData
+from ._objects import (IID as _IID, StructureType as _StructureType,
+ StructureTypeData as _StructureTypeData,
+ StructureStatus as _StructureStatus,
+ StructureStatusData as _StructureStatusData,
+ StructureSpeciality as _StructureSpeciality,
+ StructureSpecialityData as _StructureSpecialityData,
+ Department as _Department, DepartmentData as _DepartmentData)
+from ._util import (InvalidCredentialsError as _InvalidCredentialsError,
+ InvalidUserError as _InvalidUserError,
+ InvalidPasswordError as _InvalidPasswordError,
+ UnauthorizedAccountError as _UnauthorizedAccountError,
+ ServerError as _ServerError,
+ RedirectError as _RedirectError, BadRequestError as _BadRequestError,
+ NotFoundError as _NotFoundError, ForbiddenError as _ForbiddenError,
+ Pagination as _Pagination)
__all__ = ["AnonymousIntranetSession", "IntranetSession"]
@@ -178,7 +177,9 @@ class AnonymousIntranetSession:
# Check if it is a redirection.
- if status_code in (301, 302):
+ if status_code in (503,):
+ raise _ServerError()
+ elif status_code in (301, 302):
loc = r.headers['Location']
self.__log(f"({r.status_code}) {loc}")
@@ -569,7 +570,7 @@ class IntranetSession(AnonymousIntranetSession):
'__EVENTARGUMENT': f"Page${page}",
'__EVENTTARGET': 'ctl00$Popup$_evenements$_gvEvenements'},
method = self.METHOD_FORM,
- hint = 'operations')
+ hint = 'intranet_operations')
def get_ops(self, ent_type, ent_id):
""" Get the operations corresponding to something. """
@@ -591,7 +592,7 @@ class IntranetSession(AnonymousIntranetSession):
for page in _count(1):
# Récupération du document et décodage.
- resp = self._get_ops_page(ent_type, ent_iid, page)
+ result = self._get_ops_page(ent_type, ent_iid, page)
pgn_idx = next(idx for idx, e in enumerate(result) \
if isinstance(e, _Pagination))
@@ -605,7 +606,7 @@ class IntranetSession(AnonymousIntranetSession):
# Let's add the obtained structures to the result.
- activities.extend(resp)
+ activities.extend(result)
# And check if we're at the end.
@@ -645,7 +646,7 @@ class IntranetSession(AnonymousIntranetSession):
args = {
'__EVENTARGUMENT': "",
'__EVENTTARGET': "",
- 'ctl00_Popup__recherche__pnlFormulaire_CurrentState': 'true',
+ #'ctl00_Popup__recherche__pnlFormulaire_CurrentState': 'true',
'ctl00$Popup$_recherche': {
'_ddDepartement': st_dept,
'_ddSpecialite': st_spe,
@@ -661,8 +662,12 @@ class IntranetSession(AnonymousIntranetSession):
'_btnAnnuler': None}}
if page == 1:
- args['ctl00$Popup$_recherche']['Rechercher.x'] = '45'
- args['ctl00$Popup$_recherche']['Rechercher.y'] = '5'
+ # TODO: n'est plus présent ?
+
+ #args['ctl00$Popup$_recherche']['Rechercher.x'] = '45'
+ #args['ctl00$Popup$_recherche']['Rechercher.y'] = '5'
+
+ args['__EVENTTARGET'] = 'ctl00$Popup$_recherche$_btnRechercher'
else:
# TODO: if this is the first page ever gathered, first gather
# page 1 so we can then get the page?
diff --git a/sgdfi/_manager.py b/sgdfi/_manager.py
index f5ab0e8..6b0b12d 100755
--- a/sgdfi/_manager.py
+++ b/sgdfi/_manager.py
@@ -8,9 +8,9 @@
import os.path as _path
-from os import listdir as _listdir, makedirs as _makedirs, open as _open, \
- fdopen as _fdopen, O_WRONLY as _O_WRONLY, O_CREAT as _O_CREAT, \
- O_EXCL as _O_EXCL
+from os import (listdir as _listdir, makedirs as _makedirs, open as _open,
+ fdopen as _fdopen, O_WRONLY as _O_WRONLY, O_CREAT as _O_CREAT,
+ O_EXCL as _O_EXCL)
from io import RawIOBase as _RawIOBase, TextIOWrapper as _TextIOWrapper
from sys import stdout as _stdout
from string import ascii_letters as _ascii_letters
@@ -19,7 +19,7 @@ from datetime import datetime as _datetime, date as _date
from appdirs import user_cache_dir as _user_cache_dir
-from ._repr import (Base as _Base, Structure as _Structure,
+from ._objects import (Structure as _Structure,
Adherent as _Adherent, Place as _Place,
RallyRegistration as _RallyRegistration, Camp as _Camp,
Operation as _Operation, FunctionRawData as _FunctionRawData)
@@ -446,7 +446,10 @@ class Manager(_Decoder):
l = _listdir(self.__folder)
l.sort()
- return self.load_dump(l[-1])
+ try:
+ return self.load_dump(l[-1])
+ except:
+ raise Exception("No latest dump.") from None
def load_dump(self, time, id = None):
""" Read from a saved dump (with headers). """
@@ -619,7 +622,7 @@ class Manager(_Decoder):
result = self.decode(inp, type = type, hint = hint, **kwargs)
- if isinstance(result, _Base) or _type(result) == list:
+ if result is not None:
# TODO: go through the result(s), feed our knowledge and
# complete it with it.
@@ -641,8 +644,8 @@ class Manager(_Decoder):
print("#!/usr/bin/env python3", file = to)
print("#" + "*" * 78, file = to)
- print("# Copyright (C) 2018 Thomas Touhey <thomas@touhey.fr>",
- file = to)
+ print("# Copyright (C) {_date.now().year} " \
+ + "Thomas Touhey <thomas@touhey.fr>", file = to)
print("# This file is part of the sgdfi project, which " \
"is MIT-licensed.", file = to)
print("#" + "*" * 78, file = to)
diff --git a/sgdfi/_repr.py b/sgdfi/_objects/__init__.py
index c009485..0457285 100755
--- a/sgdfi/_repr.py
+++ b/sgdfi/_objects/__init__.py
@@ -7,27 +7,31 @@
import regex as _re
-from ._util import (IID, Enum as _Enum, Base,
- Property as _Property, IIDProperty as _IIDProperty,
- DateProperty as _DateProperty, BoolProperty as _BoolProperty,
- EnumProperty as _EnumProperty, ArrayProperty as _ArrayProperty,
- TextProperty as _TextProperty, ObjectProperty as _ObjectProperty,
- ValueProperty as _ValueProperty)
-from ._dbs import (Department, DepartmentData as _DepartmentData,
+from enum import Enum as _Enum
+
+from thobject import (Object as _Object,
+ Property as _Property, DateProperty as _DateProperty,
+ BoolProperty as _BoolProperty, EnumProperty as _EnumProperty,
+ ArrayProperty as _ArrayProperty, TextProperty as _TextProperty,
+ ObjectProperty as _ObjectProperty, ValueProperty as _ValueProperty)
+from pytz import timezone as _timezone
+from ._util import IID, IIDProperty as _IIDProperty
+from ._dbs import (Department, DepartmentData,
OperationType, OperationTypeData as _OperationTypeData,
Function, FunctionRawData, FunctionData as _FunctionData,
- StructureType, StructureTypeData as _StructureTypeData,
- StructureStatus, StructureStatusData as _StructureStatusData,
+ StructureType, StructureTypeData,
+ StructureStatus, StructureStatusData,
StructureSpeciality, EventTypeData as _EventTypeData,
- StructureSpecialityData as _StructureSpecialityData,
- AllocationsRegime, Code as _Code)
+ StructureSpecialityData, AllocationsRegime, Code as _Code)
-__all__ = ["Base", "IID", "Title", "Structure", "Adherent",
+__all__ = ["Object", "IID", "Title", "Structure", "Adherent",
"RallyRegistration", "Camp", "Place", "Operation", "OperationType",
- "Function", "Event", "StructureType", "StructureStatus",
- "StructureSpeciality", "AllocationsRegime", "Department"]
+ "Function", "Event", "StructureType", "StructureTypeData",
+ "StructureStatus", "StructureStatusData", "StructureSpeciality",
+ "StructureSpecialityData", "AllocationsRegime", "Department",
+ "DepartmentData"]
-_Base = Base
+_paristz = _timezone('Europe/Paris')
# ---
# Internal classes.
@@ -244,32 +248,32 @@ class _OperationFieldsProperty(_Property):
# Objects.
# ---
-class Structure(_Base):
+class Structure(_Object):
""" A structure (unit, group, territory, …). """
iid = _IIDProperty()
- type = _ValueProperty(cls = _StructureTypeData)
+ type = _ValueProperty(cls = StructureTypeData)
name = _TextProperty()
code = _ValueProperty(cls = _Code)
# TODO: private code thingy?
description = _TextProperty(not_empty = True)
- status = _ValueProperty(cls = _StructureStatusData)
+ status = _ValueProperty(cls = StructureStatusData)
hemisphere = _TextProperty()
address = _TextProperty(not_empty = True)
postal_code = _TextProperty()
town = _TextProperty()
country = _TextProperty(not_empty = True)
- department = _ValueProperty(cls = _DepartmentData)
+ department = _ValueProperty(cls = DepartmentData)
phone = _TextProperty(not_empty = True)
fax = _TextProperty(not_empty = True)
email = _TextProperty(not_empty = True)
website = _TextProperty(not_empty = True)
- start = _DateProperty()
+ start = _DateProperty(timezone = _paristz)
location_info = _TextProperty(not_empty = True)
gps_latitude = _TextProperty(not_empty = True)
gps_longitude = _TextProperty(not_empty = True)
-class Adherent(_Base):
+class Adherent(_Object):
""" A person who is part of the organization. """
iid = _IIDProperty()
@@ -291,7 +295,7 @@ class Adherent(_Base):
portable_phone2 = _TextProperty()
home_email = _TextProperty()
work_email = _TextProperty()
- birth_date = _DateProperty()
+ birth_date = _DateProperty(timezone = _paristz)
birth_postal_code = _TextProperty()
birth_insee_code = _TextProperty()
birth_town = _TextProperty()
@@ -306,19 +310,19 @@ class Adherent(_Base):
ice_first_name = _TextProperty()
ice_phone = _TextProperty()
-class RallyRegistration(_Base):
+class RallyRegistration(_Object):
""" A registration to an event common to several structures. """
iid = _IIDProperty()
name = _TextProperty()
-class Camp(_Base):
+class Camp(_Object):
""" A scout camp. """
iid = _IIDProperty()
name = _TextProperty()
-class Place(_Base):
+class Place(_Object):
""" A place. """
iid = _IIDProperty()
@@ -350,13 +354,13 @@ class Place(_Base):
closest_bus_stop = _TextProperty()
closest_bus_stop_distance = _TextProperty()
-class Event(_Base):
+class Event(_Object):
""" An event. """
iid = _IIDProperty()
type = _ValueProperty(cls = _EventTypeData)
- start = _DateProperty()
- end = _DateProperty()
+ start = _DateProperty(timezone = _paristz)
+ end = _DateProperty(timezone = _paristz)
# TODO: structure principale ayant proposé l'évènement.
# TODO: dernier utilisateur ayant mis à jour l'évènement.
# TODO: visibilité de l'évènement.
@@ -368,10 +372,10 @@ class Event(_Base):
# TODO: date de rappel de l'évènement.
# TODO: date de dernier envoi des invitations.
-class Operation(_Base):
+class Operation(_Object):
""" An event on the website.. """
- time = _DateProperty()
+ time = _DateProperty(timezone = _paristz)
type = _ValueProperty(cls = _OperationTypeData)
author = _ObjectProperty(types = (Adherent,),
default = Adherent())
diff --git a/sgdfi/_dbs/__init__.py b/sgdfi/_objects/_dbs/__init__.py
index 8bc7dec..8bc7dec 100755
--- a/sgdfi/_dbs/__init__.py
+++ b/sgdfi/_objects/_dbs/__init__.py
diff --git a/sgdfi/_dbs/_code.py b/sgdfi/_objects/_dbs/_code.py
index 1d8434b..1d8434b 100755
--- a/sgdfi/_dbs/_code.py
+++ b/sgdfi/_objects/_dbs/_code.py
diff --git a/sgdfi/_dbs/_dept.py b/sgdfi/_objects/_dbs/_dept.py
index c5e1144..c5e1144 100755
--- a/sgdfi/_dbs/_dept.py
+++ b/sgdfi/_objects/_dbs/_dept.py
diff --git a/sgdfi/_dbs/_event.py b/sgdfi/_objects/_dbs/_event.py
index 4cd4bce..4cd4bce 100755
--- a/sgdfi/_dbs/_event.py
+++ b/sgdfi/_objects/_dbs/_event.py
diff --git a/sgdfi/_dbs/_funcdata.py b/sgdfi/_objects/_dbs/_funcdata.py
index 8df963b..8df963b 100755
--- a/sgdfi/_dbs/_funcdata.py
+++ b/sgdfi/_objects/_dbs/_funcdata.py
diff --git a/sgdfi/_dbs/_funcs.py b/sgdfi/_objects/_dbs/_funcs.py
index 9dc2861..9dc2861 100755
--- a/sgdfi/_dbs/_funcs.py
+++ b/sgdfi/_objects/_dbs/_funcs.py
diff --git a/sgdfi/_dbs/_ops.py b/sgdfi/_objects/_dbs/_ops.py
index f631d01..f631d01 100755
--- a/sgdfi/_dbs/_ops.py
+++ b/sgdfi/_objects/_dbs/_ops.py
diff --git a/sgdfi/_dbs/_regime.py b/sgdfi/_objects/_dbs/_regime.py
index 7115a5c..7115a5c 100755
--- a/sgdfi/_dbs/_regime.py
+++ b/sgdfi/_objects/_dbs/_regime.py
diff --git a/sgdfi/_dbs/_st.py b/sgdfi/_objects/_dbs/_st.py
index 46be987..77edf43 100755
--- a/sgdfi/_dbs/_st.py
+++ b/sgdfi/_objects/_dbs/_st.py
@@ -64,22 +64,22 @@ _ma = "Membres associés "
_StructureTypeData = {
StructureType.UNKNOWN: ("Tous", -1),
- StructureType.AUTRES: ("Autres", 1211),
-
- StructureType.SOMMET: ("Sommet", 1207),
- StructureType.TERRITOIRE: ("Territoire", 1203),
- StructureType.GROUPE: ("Groupe", 1200),
- StructureType.ASSOCIES_N: (f"{_ma}National", 1206),
- StructureType.ASSOCIES_T: (f"{_ma}Territorial", 1204),
- StructureType.ASSOCIES_L: (f"{_ma}local", 1201),
- StructureType.CENTRE_NATIONAL: ("Centre National", 1205),
-
- StructureType.UNITE_FARFADET: ("Unité Farfadet", 1208),
- StructureType.UNITE_8_11_ANS: ("Unité 8-11 ans", 1199),
- StructureType.UNITE_11_14_ANS: ("Unité 11-14 ans", 1212),
- StructureType.UNITE_14_17_ANS: ("Unité 14-17 ans", 1210),
- StructureType.UNITE_17_20_ANS: ("Unité 17-20 ans", 1209),
- StructureType.UNITE_VENT_DU_LARGE: ("Unité Vent du Large", 1202),
+ StructureType.AUTRES: ("Autres", 1223),
+
+ StructureType.SOMMET: ("Sommet", 1218),
+ StructureType.TERRITOIRE: ("Territoire", 1219),
+ StructureType.GROUPE: ("Groupe", 1214),
+ StructureType.ASSOCIES_N: (f"{_ma}National", 1217),
+ StructureType.ASSOCIES_T: (f"{_ma}Territorial", 1220),
+ StructureType.ASSOCIES_L: (f"{_ma}local", 1221),
+ StructureType.CENTRE_NATIONAL: ("Centre National", 1216),
+
+ StructureType.UNITE_FARFADET: ("Unité Farfadet", 1226),
+ StructureType.UNITE_8_11_ANS: ("Unité 8-11 ans", 1213),
+ StructureType.UNITE_11_14_ANS: ("Unité 11-14 ans", 1222),
+ StructureType.UNITE_14_17_ANS: ("Unité 14-17 ans", 1224),
+ StructureType.UNITE_17_20_ANS: ("Unité 17-20 ans", 1225),
+ StructureType.UNITE_VENT_DU_LARGE: ("Unité Vent du Large", 1215),
}
_StructureTypeLeads = {}
diff --git a/sgdfi/_dbs/_stspe.py b/sgdfi/_objects/_dbs/_stspe.py
index b1102da..d4ddb25 100755
--- a/sgdfi/_dbs/_stspe.py
+++ b/sgdfi/_objects/_dbs/_stspe.py
@@ -30,9 +30,9 @@ class StructureSpeciality(_Enum):
_StructureSpecialityData = {
StructureSpeciality.UNKNOWN: ("Toutes", -1),
- StructureSpeciality.WITHOUT: ("sans spécialité", 624),
- StructureSpeciality.MARINE: ("Marine", 622),
- StructureSpeciality.VENT_DU_LARGE: ("Vent du Large", 623),
+ StructureSpeciality.WITHOUT: ("sans spécialité", 627),
+ StructureSpeciality.MARINE: ("Marine", 625),
+ StructureSpeciality.VENT_DU_LARGE: ("Vent du Large", 626),
}
_StructureSpecialityLeads = {}
diff --git a/sgdfi/_dbs/_ststatus.py b/sgdfi/_objects/_dbs/_ststatus.py
index f8f27e9..f8f27e9 100755
--- a/sgdfi/_dbs/_ststatus.py
+++ b/sgdfi/_objects/_dbs/_ststatus.py
diff --git a/sgdfi/_objects/_util.py b/sgdfi/_objects/_util.py
new file mode 100755
index 0000000..320cfd0
--- /dev/null
+++ b/sgdfi/_objects/_util.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+#**************************************************************************
+# Copyright (C) 2018 Thomas Touhey <thomas@touhey.fr>
+# This file is part of the sgdfi project, which is MIT-licensed.
+#**************************************************************************
+""" Base objects for the intranet objects representations, never used
+ by the end user of the module. """
+
+from urllib.parse import quote as _quote, unquote as _unquote
+from base64 import b64decode as _b64decode, b64encode as _b64encode
+from thobject import Property as _Property
+
+__all__ = ["IID", "IIDProperty"]
+
+# ---
+# Attribute helpers.
+# ---
+
+class IID:
+ """ Identifier for any resource on the intranet. """
+
+ # Three formats are managed:
+ # - a 16-byte sequence.
+ # - the equivalent in base64 as a byte sequence.
+ # - the equivalent as text.
+
+ def __init__(self, value):
+ if isinstance(value, IID):
+ self.__val = bytes(value)
+ return
+
+ validbyteident = lambda x: len(x) == 16
+
+ if isinstance(value, str):
+ value = str(value)
+ try:
+ value = _unquote(value)
+ except:
+ pass
+
+ try:
+ b = _b64decode(value)
+ assert validbyteident(b)
+ self.__val = b
+ return
+ except:
+ pass
+ elif isinstance(value, bytes):
+ value = bytes(value)
+
+ try:
+ b = value.decode('ASCII')
+ try:
+ b = _unquote(b)
+ except:
+ pass
+
+ b = _b64decode(b)
+ assert validbyteident(b)
+ self.__val = b
+ return
+ except:
+ try:
+ assert validbyteident(value)
+ self.__val = value
+ return
+ except:
+ pass
+
+ raise ValueError(f"unsuitable iid: {repr(value)}")
+
+ def __str__(self):
+ return _b64encode(self.__val).decode('ASCII')
+
+ def __repr__(self):
+ return str(self)
+
+ def __bytes__(self):
+ return self.__val
+
+ def urlsafe(self):
+ """ Get a URL-safe version of the identifier. """
+
+ return _quote(_b64encode(self.__val))
+
+
+class IIDProperty(_Property):
+ """ An intranet identifier property. """
+
+ def init(self):
+ self.__iid = None
+
+ def defaultdoc(self, element, name):
+ return f"The intranet identifier for a {element.lower()}."
+
+ def get(self):
+ return self.__iid
+
+ def set(self, value):
+ if value is None:
+ self.__iid = None
+ else:
+ self.__iid = IID(value)
+
+ def delete(self):
+ self.__iid = value
+
+# End of file.
diff --git a/sgdfi/_util.py b/sgdfi/_util.py
index cb2cd86..ff604d6 100755
--- a/sgdfi/_util.py
+++ b/sgdfi/_util.py
@@ -6,487 +6,9 @@
""" Base objects for the intranet objects representations, never used
by the end user of the module. """
-from inspect import getargspec as _getargspec
-from copy import deepcopy as _deepcopy
-from urllib.parse import quote as _quote, unquote as _unquote
-from enum import Enum
-from datetime import datetime as _datetime, date as _date
-from base64 import b64decode as _b64decode, b64encode as _b64encode
-
-import regex as _re
-from pytz import timezone as _timezone
-
-__all__ = ["IID", "Enum",
- "Property", "IIDProperty", "DateProperty", "BoolProperty",
- "EnumProperty", "ArrayProperty", "TextProperty", "ObjectProperty",
- "ValueProperty", "Base", "InvalidCredentialsError", "InvalidUserError",
- "InvalidPasswordError", "UnauthorizedAccountError"]
-
-# ---
-# Attribute helpers.
-# ---
-
-class IID:
- """ Identifier for any resource on the intranet. """
-
- # Three formats are managed:
- # - a 16-byte sequence.
- # - the equivalent in base64 as a byte sequence.
- # - the equivalent as text.
-
- def __init__(self, value):
- if isinstance(value, IID):
- self.__val = bytes(value)
- return
-
- validbyteident = lambda x: len(x) == 16
-
- if isinstance(value, str):
- value = str(value)
- try:
- value = _unquote(value)
- except:
- pass
-
- try:
- b = _b64decode(value)
- assert validbyteident(b)
- self.__val = b
- return
- except:
- pass
- elif isinstance(value, bytes):
- value = bytes(value)
-
- try:
- b = value.decode('ASCII')
- try:
- b = _unquote(b)
- except:
- pass
-
- b = _b64decode(b)
- assert validbyteident(b)
- self.__val = b
- return
- except:
- try:
- assert validbyteident(value)
- self.__val = value
- return
- except:
- pass
-
- raise ValueError(f"unsuitable iid: {repr(value)}")
-
- def __str__(self):
- return _b64encode(self.__val).decode('ASCII')
-
- def __repr__(self):
- return str(self)
-
- def __bytes__(self):
- return self.__val
-
- def urlsafe(self):
- """ Get a URL-safe version of the identifier. """
-
- return _quote(_b64encode(self.__val))
-
-class _Array:
- """ An array of certain objects, for the base class. """
-
- def __init__(self, types = ()):
- self.__list = []
- self.__types = types
-
- def __repr__(self):
- return repr(self.__list)
-
- def __iter__(self):
- return iter(self.__list)
-
- def __len__(self):
- return len(self.__list)
-
- def __getitem__(self, x):
- return self.__list[x]
-
- def add(self, elt):
- """ Add an element into the array. """
-
- if self.__types and not any(isinstance(elt, t) \
- for t in self.__types):
- raise TypeError("element to add is of unknown type "
- f"{type(elt)}")
- if any(elt is e or elt == e for e in self.__list):
- raise ValueError("element already inserted")
- self.__list.append(elt)
-
- def empty(self):
- """ Empty the array. """
-
- self.__list = []
-
-# ---
-# Attributes.
-# ---
-
-class Property:
- """ A base property. """
-
- def __init__(self, doc = None, *args, **kwargs):
- self._doc = doc
- kwargs['doc'] = doc
-
- try:
- spec = _getargspec(self.init)
- if not 'doc' in spec.args and spec.varargs is None and \
- spec.keywords is None:
- del kwargs['doc']
- except:
- pass
-
- self.init(*args, **kwargs)
-
- def init(self, *args, **kwargs):
- """ Normal initialize method. """
-
- self.doc = "The default property."
-
- def doc(self, element, name):
- """ The documentation string method. """
-
- if self.__doc is not None:
- return self.__doc
- return self.defaultdoc(element, name)
-
- def defaultdoc(self, element, name):
- """ A default documentation string method. """
-
- return f"A default property for a {element.lower()}."
-
- def defaultdoc(self, element, name):
- """ """
-
- def get(self):
- """ Get the current property value. """
-
- return None
-
- def set(self, value):
- """ Set the current property value. """
-
- pass
-
- def delete(self):
- """ Delete the current property value. """
-
- pass
-
-class IIDProperty(Property):
- """ An intranet identifier property. """
-
- def init(self):
- self.__iid = None
-
- def defaultdoc(self, element, name):
- return f"The intranet identifier for a {element.lower()}."
-
- def get(self):
- return self.__iid
-
- def set(self, value):
- if value is None:
- self.__iid = None
- else:
- self.__iid = IID(value)
-
- def delete(self):
- self.__iid = value
-
-_datere = _re.compile('(?P<dom>[0-9]+)\/(?P<mon>[0-9]+)\/(?P<yr>[0-9]+)')
-
-class DateProperty(Property):
- """ A date property. """
-
- def init(self):
- self.__date = None
-
- def defaultdoc(self, element, name):
- return f"The {name.replace('_', ' ')} timestamp for the {element}."
-
- def get(self):
- return self.__date
-
- def set(self, value):
- if value is None:
- self.__date = value
- return
-
- if isinstance(value, _datetime):
- pass # use the value as is.
- elif isinstance(value, _date):
- value = _datetime.fromordinal(value.toordinal())
- elif type(value) == str:
- m = _datere.match(value)
- if m is None:
- raise TypeError("uncorrectly formatted date string: " \
- f"{repr(value)}")
- else: # if m.group('yr'):
- year = int(m.group('yr'))
- mon = int(m.group('mon'))
- dom = int(m.group('dom'))
- value = _datetime(year, mon, dom)
- else:
- raise TypeError("Could not determinate a valid datetime.")
-
- if value.tzinfo is None:
- value = value.replace(tzinfo = _timezone('Europe/Paris'))
- self.__date = value
-
- def delete(self):
- self.__date = value
-
-class BoolProperty(Property):
- """ A boolean property. """
-
- def init(self, default = False):
- self.__default = bool(default)
- self.__value = self.__default
-
- def defaultdoc(self, element, name):
- return f"If the {element} has {name.replace('_', ' ')}."
-
- def get(self):
- return self.__value
-
- def set(self, value):
- if value is None:
- self.__value = self.__default
- else:
- self.__value = bool(value)
-
- def delete(self):
- self.__value = self.__default
-
-class EnumProperty(Property):
- """ An enumeration property. """
-
- def init(self, enum = Enum, default = None):
- if default is not None:
- try:
- default = enum(default)
- except ValueError:
- msg = "Default should be None or a valid enum value."
- raise ValueError(msg) from None
-
- self.__enum = enum
- self.__default = default
- self.__value = default
-
- def defaultdoc(self, element, name):
- return f"The {name.replace('_', ' ')} constant for " \
- f"the {element.lower()}."
-
- def get(self):
- return self.__value
-
- def set(self, value):
- if value is None:
- self.__value = self.__default
- else:
- self.__value = self.__enum(value)
-
- def delete(self):
- self.__value = self.__default
-
-class ArrayProperty(Property):
- """ An array made of different objets.
- `types` are the accepted types (an empty array representing that
- all types are accepted). """
-
- def init(self, types = ()):
- self.__array = _Array(types)
-
- def defaultdoc(self, element, name):
- return f"The {name.replace('_', ' ')} array for the " \
- f"{element.lower()}."
-
- def get(self):
- return self.__array
-
- def set(self, value):
- if value is None:
- self.__array.empty()
- return
-
- raise ValueError("non settable")
-
- def delete(self):
- self.__array.empty()
-
-class ObjectProperty(Property):
- """ An object property among specified types. """
-
- def init(self, types = (), default = None):
- self.__default = default
- self.__types = types
- self.__value = self.__default
-
- def get(self):
- return self.__value
-
- def set(self, value):
- if value is None:
- self.__value = self.__default
- return
-
- if not any(isinstance(value, cls) for cls in self.__types):
- raise ValueError("Shall be an instance of one of: " \
- f"{repr(self.__types)}")
-
- self.__value = value
-
- def delete(self):
- self.__value = self.__default
-
-class ValueProperty(Property):
- """ A value property.
- Basically uses a class to store its value. """
-
- def init(self, cls, default = None):
- self.__cls = cls
- self.__data = default
-
- def get(self):
- return self.__data
-
- def set(self, value):
- if value is None:
- self.__data = _deepcopy(default)
- return
-
- self.__data = self.__cls(value)
-
- def delete(self):
- self.__data = _deepcopy(default)
-
-class TextProperty(Property):
- """ A text property.
- `lines` represents the maximum number of allowed lines.
- `maxchars` represents the maximum number of characters.
- `not_empty`: if True, empty strings are considered as None. """
-
- def init(self, lines = 0, maxchars = 0, not_empty = False):
- self.__value = None
- self.__lines = lines
- self.__maxchars = maxchars
- self.__nempty = bool(not_empty)
-
- def get(self):
- return self.__value
-
- def set(self, value):
- if value is None or (self.__nempty and value == ''):
- self.__value = None
- return
-
- value = str(value)
-
- # Manage the lines.
-
- value = value.splitlines()
- lines = self.__lines
- if lines < 0:
- lines = len(value)
-
- tab = ['\n'.join(value[:lines])] if lines != 0 else []
- tab += value[lines:]
- value = ' '.join(tab)
- del tab
-
- # Manage the maximum number of characters.
-
- maxchars = self.__maxchars
- if maxchars > 0 and len(value) > maxchars:
- msg = f"{name}: max text length exceeded (> {maxchars})"
- raise ValueError(msg)
-
- self.__value = value
-
- def delete(self):
- self.__value = None
-
-# ---
-# Main object class.
-# ---
-
-class Base:
- """ The base class for all complex objects. """
-
- def __init__(self):
- for name in self.__findprops():
- super().__setattr__(name,
- _deepcopy(super().__getattribute__(name)))
-
- def __repr__(self):
- def getproperty(self, name):
- return super().__getattribute__(name)
-
- attrs = lambda: (f"{name} = {repr(val)}" for name, val \
- in map(lambda x: (x, getproperty(self, x).get()), \
- self.__findprops()) if val is not None)
-
- return f"{self.__class__.__name__}({', '.join(attrs())})"
-
- def __findprops(self):
- """ Find the properties' names. """
-
- def getproperty(self, name):
- return super().__getattribute__(name)
-
- return [i for i in dir(self) if not i.startswith('_') \
- and isinstance(getproperty(self, i), Property)]
-
- def __getattribute__(self, name):
- try:
- attr = super().__getattribute__(name)
- except AttributeError as e:
- raise e from None
-
- if name.startswith('_') or not isinstance(attr, Property):
- return attr
-
- if isinstance(attr, Property):
- return attr.get()
- return attr
-
- def __setattr__(self, name, value):
- if name.startswith('_'):
- super().__setattr__(name, value)
- return
-
- attr = super().__getattribute__(name)
-
- if not isinstance(attr, Property):
- super().__setattr__(name, value)
- attr.set(value)
-
- def __delattr__(self, name):
- if name.startswith('_'):
- super().__delattr__(name, value)
- return
-
- attr = super().__getattribute__(name)
-
- if not isinstance(attr, property):
- super().__delattr__(name, value)
- attr.delete()
-
-# ---
-# Exceptions.
-# ---
+__all__ = ["InvalidCredentialsError", "InvalidUserError",
+ "InvalidPasswordError", "UnauthorizedAccountError",
+ "Pagination"]
class InvalidCredentialsError(Exception):
""" Exception for when the credentials are invalid. """
@@ -523,8 +45,8 @@ class InvalidPasswordError(InvalidCredentialsError):
""" Exception for when the password is invalid. """
def __init__(self, user, pw):
- super().__init__(f"Invalid password for {repr(user)} ({repr(pw)}).",
- user = user, pw = pw)
+ super().__init__(f"Invalid password for {repr(user)} "
+ f"({repr(pw)}).", user = user, pw = pw)
class UnauthorizedAccountError(InvalidCredentialsError):
""" Exception for when the user is not allowed to log in. """
@@ -564,6 +86,12 @@ class ForbiddenError(Exception):
def __init__(self):
super().__init__("Access to this page was denied.")
+class ServerError(Exception):
+ """ The server has given a server error. """
+
+ def __init__(self):
+ super().__init__("The server was unavailable.")
+
# ---
# Other utilities.
# ---
diff --git a/sgdfi/_version.py b/sgdfi/version.py
index 66a8fea..ad1afa0 100755
--- a/sgdfi/_version.py
+++ b/sgdfi/version.py
@@ -8,6 +8,6 @@
__all__ = ["version"]
-version = "20190326"
+version = "20200803"
# End of file.