From 4d974a536426271f3bcb05895c27cd96ec3647f3 Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Mon, 7 May 2018 22:28:48 +1000 Subject: [PATCH] Create a basic but functional micropub media endpoint :o --- Pipfile | 1 + Pipfile.lock | 72 ++++++++++++++++++------------------ lemoncurry.paw | Bin 16597 -> 20309 bytes lemoncurry/settings/base.py | 1 + lemoncurry/utils.py | 4 ++ micropub/urls.py | 6 ++- micropub/views/media.py | 54 +++++++++++++++++++++++++++ micropub/views/query.py | 3 ++ 8 files changed, 103 insertions(+), 38 deletions(-) create mode 100644 micropub/views/media.py diff --git a/Pipfile b/Pipfile index 024cae0..ccf5b8d 100644 --- a/Pipfile +++ b/Pipfile @@ -46,5 +46,6 @@ django-super-favicon = "*" django-redis = "*" gevent = "*" django-extensions = "*" +python-magic = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index fb01127..cc078ac 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d62130799f04a1649c0e6bd978dca2816500d94e27af5d21d1ec328dc795a2f8" + "sha256": "0347a58bdf44bc71022adb2ced6ae592ff1f7fd44520caee906f3e8e0e3730e4" }, "pipfile-spec": 6, "requires": { @@ -571,44 +571,29 @@ ], "version": "==1.5.3" }, + "pyasn1": { + "hashes": [ + "sha256:0d7f6e959fe53f3960a23d73f35e1fce61348b30915b6664309ca756de7c1f89", + "sha256:5a0db897b311d265cde49615cf783f1c78613138605cdd0f907ecfa5b2aba3ee", + "sha256:758cb50abddc03e4563fd9e7f03db56e3e87b58c0bd01247360326e5c0c7ffa5", + "sha256:7d626683e3d792cccc608da02498aff37ab4f3dafd8905d6bf755d11f9b26b43", + "sha256:a7efe807c4b83a859e2735c692b92ed7b567cfddc4163763412920041d876c2b", + "sha256:b5a9ca48055b9a20f6d1b3d68e38692e5431c86a0f99ea602e61294e891fee5b", + "sha256:c07d6e587b2f928366b1f67c09bda026a3e6fcc99e80a744dc67f8fca3895626", + "sha256:d258b0a71994f7770599835249cece1caef3c70def868c4915e6e5ca49b67d15", + "sha256:d5cd6ed995dba16fad0c521cfe31cd2d68400b53fcc2bce93326829be73ab6d1", + "sha256:d84c2aea3cf43780e9e6a19f4e4dddee9f6976519020e64e47c57e5c7a8c3dd2", + "sha256:e85895087905c65b5b594eb91f7522664c85545b147d5f4d4e7b1b07da8dcbdc", + "sha256:f81c96761fca60d64b1c9b79ec2e40cf9495a745cf570613079ef324aeb9672b" + ], + "version": "==0.4.2" + }, "pycparser": { "hashes": [ "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226" ], "version": "==2.18" }, - "pycryptodome": { - "hashes": [ - "sha256:043c82cd3dd3120286a1b325ace93000cf52abb13a067c3ecb6220f874fe4c30", - "sha256:0cdd73492859d853f60b8185715312dbca465879661e28d354d1cf5ea11860e7", - "sha256:15013007e393d0cc0e69f4329a47c4c8597b7f3d02c12c03f805405542f70c71", - "sha256:19d81b92bff837cdade735b9023808556bb4868e1ce194dad4d5ec4e2b2851f3", - "sha256:1ceb3e87605c4f0080115a8a00abf45f5df27b0166a37fd669fbff4523273cfc", - "sha256:2354a77051ed4a2959ce2aac508071eb3e42fc348ea39228b2eac335990bf508", - "sha256:27bd2878200690b050dca34f505b5c623532324b3de40267c1484784063134df", - "sha256:322f239e51fda80233762400a8975ab728639b571fa58545b95b9c44042af010", - "sha256:49a71eb990af30ff6276cfe201eb83ed3640ae989c1b5973f7b55a46c94232d1", - "sha256:4b5a2680008da3ac0cef2d3661597e0cbf8a3eb19eed35b859fd67e2de63eb85", - "sha256:6d34fe5134eb5d62368e21e6f203ac1770bc7273e9536c4a280121312c2de53a", - "sha256:733d5eb7e5ceed8b9d0b3c24c81f52c04cb5de6786461388204fceefe4456aa5", - "sha256:7c73d3798fe2946953768b788ce554c0d4b390780f5e73d63bd833241af27bfe", - "sha256:97af76f5200f15e97cac58d77f319dec40b4bada98de697c91a9517e63b41d1a", - "sha256:97cc46ff02b99dafdc2e0385b325cec0f8a15bf8b285d6ed1d7e4a3bc2067ce1", - "sha256:a561b59e0c3548eb649af381b7c38c6fd8392bbd4d0a8214794b2b761f405af4", - "sha256:ab2c633bfc23cf41be9281228517cb6f87879f4f1aeb154ed72bd53ab7cc83e9", - "sha256:adb54316998337f315520bbd8ef4d8bbd940b4ddfaef8ba1db3c137c5e499399", - "sha256:b4a3b710287eb1fc3e2cc1af018063f003530dff00c9ea4c55ae19bc1f3923cc", - "sha256:bcfdb66d6604882c3f96eea922552c2487cc0aec4b883cd217b9d341d2f8fad0", - "sha256:c08c053eb8716bbbd5e13e38f453b9e46a063e68df8659f3c421dcb7519fd381", - "sha256:e51da4ef9d9e2695a04044152f380c2db17adc9fc6fad8e24d863ead9cd548ed", - "sha256:e850e07f54dc3de9a1efdd59d227fcd1cb30cdd307dafdc647c79e8f30cf5032", - "sha256:ebc579c41fe26748dc1bad4f9105f08740ee28826293a28103b3875968695a5e", - "sha256:ed94cb1b4bf24be734f2bf2db3e8ea75f3914d2f8e684291bee54bbe4a5a9151", - "sha256:f5e19802295e63bdf83bb92849285c01f7167840efb1c1e08507a50b10ba7efa", - "sha256:fc569682f012b1f62f8d28d8f9bc71f1de67648cd1bc124ef8ccf8db4edfc28a" - ], - "version": "==3.6.1" - }, "pytest": { "hashes": [ "sha256:54713b26c97538db6ff0703a12b19aeaeb60b5e599de542e7fca0ec83b9038e8", @@ -633,11 +618,19 @@ }, "python-jose": { "hashes": [ - "sha256:391f860dbe274223d73dd87de25e4117bf09e8fe5f93a417663b1f2d7b591165", - "sha256:3b35cdb0e55a88581ff6d3f12de753aa459e940b50fe7ca5aa25149bc94cb37b" + "sha256:e06dd2e5e9125da79b519ff2652b8c666d64a5ea228fcd9862e0b29a534ccc53", + "sha256:e8255fb3cc524c04f4c790547a6215468f2a32d3a866424175523359e69f3aeb" ], "index": "pypi", - "version": "==2.0.2" + "version": "==3.0.0" + }, + "python-magic": { + "hashes": [ + "sha256:f2674dcfad52ae6c49d4803fa027809540b130db1dec928cfbb9240316831375", + "sha256:f3765c0f582d2dfc72c15f3b5a82aecfae9498bd29ca840d72f37d7bd38bfcd5" + ], + "index": "pypi", + "version": "==0.4.15" }, "python-memcached": { "hashes": [ @@ -730,6 +723,13 @@ ], "version": "==0.10.0" }, + "rsa": { + "hashes": [ + "sha256:25df4e10c263fb88b5ace923dd84bf9aa7f5019687b5e55382ffcdb8bede9db5", + "sha256:43f682fea81c452c98d09fc316aae12de6d30c4b5c84226642cf8f8fd1c93abd" + ], + "version": "==3.4.2" + }, "six": { "hashes": [ "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", diff --git a/lemoncurry.paw b/lemoncurry.paw index f77eded6c0cc5257f540855cd39ff304306407b3..1a5de7a19bd39153d88546d8c03bc2d8d9f27df5 100644 GIT binary patch delta 10542 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 NaYe)`!~cTO{|D%XJ=6dI delta 7522 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