udata 7.0.4.dev27782__py2.py3-none-any.whl → 7.0.5__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of udata might be problematic. Click here for more details.

Files changed (71) hide show
  1. udata/__init__.py +1 -1
  2. udata/api/__init__.py +1 -1
  3. udata/core/dataset/api.py +14 -14
  4. udata/core/dataset/api_fields.py +7 -7
  5. udata/core/dataset/apiv2.py +3 -3
  6. udata/core/dataset/rdf.py +43 -1
  7. udata/core/organization/csv.py +27 -1
  8. udata/core/organization/models.py +20 -1
  9. udata/core/organization/tasks.py +61 -1
  10. udata/core/spatial/commands.py +26 -2
  11. udata/core/topic/api.py +6 -0
  12. udata/core/topic/apiv2.py +6 -0
  13. udata/core/topic/forms.py +5 -0
  14. udata/core/topic/models.py +3 -5
  15. udata/forms/fields.py +10 -0
  16. udata/frontend/csv.py +8 -8
  17. udata/harvest/actions.py +11 -0
  18. udata/harvest/api.py +3 -3
  19. udata/harvest/backends/dcat.py +42 -5
  20. udata/harvest/tests/dcat/bnodes.xml +16 -2
  21. udata/harvest/tests/test_dcat_backend.py +87 -1
  22. udata/settings.py +9 -0
  23. udata/static/chunks/{11.c0ccea08914b6b41568e.js → 11.a23c110811a9ac943478.js} +3 -3
  24. udata/static/chunks/{11.c0ccea08914b6b41568e.js.map → 11.a23c110811a9ac943478.js.map} +1 -1
  25. udata/static/chunks/{13.526a25163ababaa44409.js → 13.0889e093f8664e38568c.js} +2 -2
  26. udata/static/chunks/{13.526a25163ababaa44409.js.map → 13.0889e093f8664e38568c.js.map} +1 -1
  27. udata/static/chunks/{16.7901839b4227881947f6.js → 16.f41599478d3e97ad9a30.js} +2 -2
  28. udata/static/chunks/{16.7901839b4227881947f6.js.map → 16.f41599478d3e97ad9a30.js.map} +1 -1
  29. udata/static/chunks/{19.471d5a2a08eef6e5338a.js → 19.2b534a26af8b17e9170b.js} +3 -3
  30. udata/static/chunks/{19.471d5a2a08eef6e5338a.js.map → 19.2b534a26af8b17e9170b.js.map} +1 -1
  31. udata/static/chunks/{5.534e0531d0e2b150146f.js → 5.7115454a1183e5c12eef.js} +3 -3
  32. udata/static/chunks/{5.534e0531d0e2b150146f.js.map → 5.7115454a1183e5c12eef.js.map} +1 -1
  33. udata/static/chunks/{6.e56975229e6065f68d2a.js → 6.16bb24fb8240f2746488.js} +3 -3
  34. udata/static/chunks/{6.e56975229e6065f68d2a.js.map → 6.16bb24fb8240f2746488.js.map} +1 -1
  35. udata/static/chunks/{9.534426728626f11f4571.js → 9.3e752966ff14e47e11f2.js} +2 -2
  36. udata/static/chunks/{9.534426728626f11f4571.js.map → 9.3e752966ff14e47e11f2.js.map} +1 -1
  37. udata/static/common.js +1 -1
  38. udata/static/common.js.map +1 -1
  39. udata/storage/__init__.py +0 -0
  40. udata/storage/s3.py +54 -0
  41. udata/templates/mail/badge_added_association.html +33 -0
  42. udata/templates/mail/badge_added_association.txt +11 -0
  43. udata/templates/mail/badge_added_company.html +33 -0
  44. udata/templates/mail/badge_added_company.txt +11 -0
  45. udata/templates/mail/badge_added_local_authority.html +33 -0
  46. udata/templates/mail/badge_added_local_authority.txt +11 -0
  47. udata/tests/api/test_datasets_api.py +27 -0
  48. udata/tests/api/test_topics_api.py +31 -1
  49. udata/tests/apiv2/test_topics.py +4 -0
  50. udata/tests/organization/test_csv_adapter.py +43 -0
  51. udata/translations/ar/LC_MESSAGES/udata.mo +0 -0
  52. udata/translations/ar/LC_MESSAGES/udata.po +90 -44
  53. udata/translations/de/LC_MESSAGES/udata.mo +0 -0
  54. udata/translations/de/LC_MESSAGES/udata.po +91 -45
  55. udata/translations/es/LC_MESSAGES/udata.mo +0 -0
  56. udata/translations/es/LC_MESSAGES/udata.po +90 -44
  57. udata/translations/fr/LC_MESSAGES/udata.mo +0 -0
  58. udata/translations/fr/LC_MESSAGES/udata.po +91 -45
  59. udata/translations/it/LC_MESSAGES/udata.mo +0 -0
  60. udata/translations/it/LC_MESSAGES/udata.po +90 -44
  61. udata/translations/pt/LC_MESSAGES/udata.mo +0 -0
  62. udata/translations/pt/LC_MESSAGES/udata.po +91 -45
  63. udata/translations/sr/LC_MESSAGES/udata.mo +0 -0
  64. udata/translations/sr/LC_MESSAGES/udata.po +91 -45
  65. udata/translations/udata.pot +91 -45
  66. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/METADATA +20 -3
  67. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/RECORD +71 -62
  68. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/LICENSE +0 -0
  69. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/WHEEL +0 -0
  70. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/entry_points.txt +0 -0
  71. {udata-7.0.4.dev27782.dist-info → udata-7.0.5.dist-info}/top_level.txt +0 -0
udata/static/common.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e){function __webpack_require__(a){if(c[a])return c[a].exports;var b=c[a]={exports:{},id:a,loaded:!1};return e[a].call(b.exports,b,b.exports,__webpack_require__),b.loaded=!0,b.exports}var a=window.webpackJsonp;window.webpackJsonp=function(r,f){for(var t,d,_=0,n=[];_<r.length;_++)d=r[_],b[d]&&n.push.apply(n,b[d]),b[d]=0;for(t in f){var i=f[t];switch(typeof i){case"object":e[t]=function(a){var c=a.slice(1),b=a[0];return function(a,r,f){e[b].apply(this,[a,r,f].concat(c))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(a&&a(r,f);n.length;)n.shift().call(null,__webpack_require__);if(f[0])return c[0]=0,__webpack_require__(0)};var c={},b={31:0};__webpack_require__.e=function(e,a){if(0===b[e])return a.call(null,__webpack_require__);if(void 0!==b[e])b[e].push(a);else{b[e]=[a];var c=document.getElementsByTagName("head")[0],r=document.createElement("script");r.type="text/javascript",r.charset="utf-8",r.async=!0,r.src=__webpack_require__.p+"chunks/"+e+"."+{0:"dd9000783a522bc2069d",1:"4a09db78b21075c05a30",2:"95c0fc4f129186dba94b",3:"1ca609753b5a02de0ca3",4:"379d0586872a1bae2ebd",5:"534e0531d0e2b150146f",6:"e56975229e6065f68d2a",7:"2ebc6662cf10a678b2ac",8:"17d1afb591ad1495bd03",9:"534426728626f11f4571",10:"e97ea231893dc435d6b5",11:"c0ccea08914b6b41568e",12:"d39612a569bcc3a358a8",13:"526a25163ababaa44409",14:"cdb85e78de233e6556ff",15:"92b2cef3032ea35da04a",16:"7901839b4227881947f6",17:"13db80c90b998be14e1b",18:"ad41fb75ac4226e1f3ce",19:"471d5a2a08eef6e5338a",20:"14a92e5c503f74ff40df",21:"ccbfce6680a2b11a5284",22:"bc79367e5f4c8ad00038",23:"58f008bb10313268bf7d",24:"554ea613112f1ba6c246",25:"bebb170f65c104b18777",26:"9a0fd93accfc31686ed0",27:"dbd31d749f51f362b968",28:"c9c89e04a005ae62b473",29:"a0f8fce10d9e93e23b12",30:"9dc7b1b44817569daec6",32:"9b68f125e2598d22d5b5",33:"70f8e7b1964892a24e67"}[e]+".js",c.appendChild(r)}},__webpack_require__.m=e,__webpack_require__.c=c,__webpack_require__.p="/static/"}(function(e){for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a))switch(typeof e[a]){case"function":break;case"object":e[a]=function(a){var c=a.slice(1),b=e[a[0]];return function(e,a,r){b.apply(this,[e,a,r].concat(c))}}(e[a]);break;default:e[a]=e[e[a]]}return e}([]));
1
+ !function(e){function __webpack_require__(a){if(c[a])return c[a].exports;var b=c[a]={exports:{},id:a,loaded:!1};return e[a].call(b.exports,b,b.exports,__webpack_require__),b.loaded=!0,b.exports}var a=window.webpackJsonp;window.webpackJsonp=function(r,f){for(var t,_,d=0,n=[];d<r.length;d++)_=r[d],b[_]&&n.push.apply(n,b[_]),b[_]=0;for(t in f){var i=f[t];switch(typeof i){case"object":e[t]=function(a){var c=a.slice(1),b=a[0];return function(a,r,f){e[b].apply(this,[a,r,f].concat(c))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(a&&a(r,f);n.length;)n.shift().call(null,__webpack_require__);if(f[0])return c[0]=0,__webpack_require__(0)};var c={},b={31:0};__webpack_require__.e=function(e,a){if(0===b[e])return a.call(null,__webpack_require__);if(void 0!==b[e])b[e].push(a);else{b[e]=[a];var c=document.getElementsByTagName("head")[0],r=document.createElement("script");r.type="text/javascript",r.charset="utf-8",r.async=!0,r.src=__webpack_require__.p+"chunks/"+e+"."+{0:"dd9000783a522bc2069d",1:"4a09db78b21075c05a30",2:"95c0fc4f129186dba94b",3:"1ca609753b5a02de0ca3",4:"379d0586872a1bae2ebd",5:"7115454a1183e5c12eef",6:"16bb24fb8240f2746488",7:"2ebc6662cf10a678b2ac",8:"17d1afb591ad1495bd03",9:"3e752966ff14e47e11f2",10:"e97ea231893dc435d6b5",11:"a23c110811a9ac943478",12:"d39612a569bcc3a358a8",13:"0889e093f8664e38568c",14:"cdb85e78de233e6556ff",15:"92b2cef3032ea35da04a",16:"f41599478d3e97ad9a30",17:"13db80c90b998be14e1b",18:"ad41fb75ac4226e1f3ce",19:"2b534a26af8b17e9170b",20:"14a92e5c503f74ff40df",21:"ccbfce6680a2b11a5284",22:"bc79367e5f4c8ad00038",23:"58f008bb10313268bf7d",24:"554ea613112f1ba6c246",25:"bebb170f65c104b18777",26:"9a0fd93accfc31686ed0",27:"dbd31d749f51f362b968",28:"c9c89e04a005ae62b473",29:"a0f8fce10d9e93e23b12",30:"9dc7b1b44817569daec6",32:"9b68f125e2598d22d5b5",33:"70f8e7b1964892a24e67"}[e]+".js",c.appendChild(r)}},__webpack_require__.m=e,__webpack_require__.c=c,__webpack_require__.p="/static/"}(function(e){for(var a in e)if(Object.prototype.hasOwnProperty.call(e,a))switch(typeof e[a]){case"function":break;case"object":e[a]=function(a){var c=a.slice(1),b=e[a[0]];return function(e,a,r){b.apply(this,[e,a,r].concat(c))}}(e[a]);break;default:e[a]=e[e[a]]}return e}([]));
2
2
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap af2fbd64f908b4b6b777"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","parentJsonpFunction","window","chunkIds","moreModules","chunkId","i","callbacks","length","installedChunks","push","apply","_m","args","slice","templateId","a","b","c","this","concat","shift","31","e","callback","undefined","head","document","getElementsByTagName","script","createElement","type","charset","async","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","32","33","appendChild","m","Object","prototype","hasOwnProperty","fn"],"mappings":"CAAS,SAAUA,GCwDnB,QAAAC,qBAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,qBAGAI,EAAAE,QAAA,EAGAF,EAAAD,QA3EA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,GAIA,IADA,GAAAV,GAAAW,EAAAC,EAAA,EAAAC,KACQD,EAAAH,EAAAK,OAAoBF,IAC5BD,EAAAF,EAAAG,GACAG,EAAAJ,IACAE,EAAAG,KAAAC,MAAAJ,EAAAE,EAAAJ,IACAI,EAAAJ,GAAA,CAEA,KAAAX,IAAAU,GAAA,CACA,GAAAQ,GAAAR,EAAAV,EAGA,cAAAkB,IACA,aAEApB,EAAAE,GAAA,SAAAkB,GACA,GAAAC,GAAAD,EAAAE,MAAA,GAAAC,EAAAH,EAAA,EACA,iBAAAI,EAAAC,EAAAC,GACA1B,EAAAuB,GAAAJ,MAAAQ,MAAAH,EAAAC,EAAAC,GAAAE,OAAAP,MAEMD,EACN,MACA,gBAEApB,EAAAE,GAAAkB,CACA,MACA,SAEApB,EAAAE,GAAAF,EAAAoB,IAKA,IADAX,KAAAE,EAAAC,GACAG,EAAAC,QACAD,EAAAc,QAAArB,KAAA,KAAAP,oBACA,IAAAW,EAAA,GAEA,MADAT,GAAA,KACAF,oBAAA,GAKA,IAAAE,MAKAc,GACAa,GAAA,EA6BA7B,qBAAA8B,EAAA,SAAAlB,EAAAmB,GAEA,OAAAf,EAAAJ,GACA,MAAAmB,GAAAxB,KAAA,KAAAP,oBAGA,IAAAgC,SAAAhB,EAAAJ,GACAI,EAAAJ,GAAAK,KAAAc,OACI,CAEJf,EAAAJ,IAAAmB,EACA,IAAAE,GAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,SACAD,GAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EAEAJ,EAAAK,IAAAzC,oBAAA0C,EAAA,UAAA9B,EAAA,KAAsE+B,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAk5B/D,GAAA,MACx9BqB,EAAA2C,YAAAxC,KAKApC,oBAAA6E,EAAA9E,EAGAC,oBAAAyB,EAAAvB,EAGAF,oBAAA0C,EAAA,YDIW,SAAS3C,GAEnB,IAAI,GAAIc,KAAKd,GACZ,GAAG+E,OAAOC,UAAUC,eAAezE,KAAKR,EAASc,GAChD,aAAcd,GAAQc,IACtB,IAAK,WAAY,KACjB,KAAK,SAEJd,EAAQc,GAAM,SAASM,GACtB,GAAIC,GAAOD,EAAGE,MAAM,GAAI4D,EAAKlF,EAAQoB,EAAG,GACxC,OAAO,UAAUI,EAAEC,EAAEC,GACpBwD,EAAG/D,MAAMQ,MAAOH,EAAEC,EAAEC,GAAGE,OAAOP,MAE9BrB,EAAQc,GACV,MACD,SAECd,EAAQc,GAAKd,EAAQA,EAAQc,IAKhC,MAAOd","file":"common.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tvar _m = moreModules[moduleId];\n/******/\n/******/ \t\t\t// Check if module is deduplicated\n/******/ \t\t\tswitch(typeof _m) {\n/******/ \t\t\tcase \"object\":\n/******/ \t\t\t\t// Module can be created from a template\n/******/ \t\t\t\tmodules[moduleId] = (function(_m) {\n/******/ \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n/******/ \t\t\t\t\treturn function (a,b,c) {\n/******/ \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}(_m));\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tcase \"function\":\n/******/ \t\t\t\t// Normal module\n/******/ \t\t\t\tmodules[moduleId] = _m;\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tdefault:\n/******/ \t\t\t\t// Module is a copy of another module\n/******/ \t\t\t\tmodules[moduleId] = modules[_m];\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n/******/ \t\twhile(callbacks.length)\n/******/ \t\t\tcallbacks.shift().call(null, __webpack_require__);\n/******/ \t\tif(moreModules[0]) {\n/******/ \t\t\tinstalledModules[0] = 0;\n/******/ \t\t\treturn __webpack_require__(0);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \t// Array means \"loading\", array contains callbacks\n/******/ \tvar installedChunks = {\n/******/ \t\t31:0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n/******/ \t\t// \"0\" is the signal for \"already loaded\"\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn callback.call(null, __webpack_require__);\n/******/\n/******/ \t\t// an array means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId] !== undefined) {\n/******/ \t\t\tinstalledChunks[chunkId].push(callback);\n/******/ \t\t} else {\n/******/ \t\t\t// start chunk loading\n/******/ \t\t\tinstalledChunks[chunkId] = [callback];\n/******/ \t\t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\t\tvar script = document.createElement('script');\n/******/ \t\t\tscript.type = 'text/javascript';\n/******/ \t\t\tscript.charset = 'utf-8';\n/******/ \t\t\tscript.async = true;\n/******/\n/******/ \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"dd9000783a522bc2069d\",\"1\":\"4a09db78b21075c05a30\",\"2\":\"95c0fc4f129186dba94b\",\"3\":\"1ca609753b5a02de0ca3\",\"4\":\"379d0586872a1bae2ebd\",\"5\":\"534e0531d0e2b150146f\",\"6\":\"e56975229e6065f68d2a\",\"7\":\"2ebc6662cf10a678b2ac\",\"8\":\"17d1afb591ad1495bd03\",\"9\":\"534426728626f11f4571\",\"10\":\"e97ea231893dc435d6b5\",\"11\":\"c0ccea08914b6b41568e\",\"12\":\"d39612a569bcc3a358a8\",\"13\":\"526a25163ababaa44409\",\"14\":\"cdb85e78de233e6556ff\",\"15\":\"92b2cef3032ea35da04a\",\"16\":\"7901839b4227881947f6\",\"17\":\"13db80c90b998be14e1b\",\"18\":\"ad41fb75ac4226e1f3ce\",\"19\":\"471d5a2a08eef6e5338a\",\"20\":\"14a92e5c503f74ff40df\",\"21\":\"ccbfce6680a2b11a5284\",\"22\":\"bc79367e5f4c8ad00038\",\"23\":\"58f008bb10313268bf7d\",\"24\":\"554ea613112f1ba6c246\",\"25\":\"bebb170f65c104b18777\",\"26\":\"9a0fd93accfc31686ed0\",\"27\":\"dbd31d749f51f362b968\",\"28\":\"c9c89e04a005ae62b473\",\"29\":\"a0f8fce10d9e93e23b12\",\"30\":\"9dc7b1b44817569daec6\",\"32\":\"9b68f125e2598d22d5b5\",\"33\":\"70f8e7b1964892a24e67\"}[chunkId] + \".js\";\n/******/ \t\t\thead.appendChild(script);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/ })\n/************************************************************************/\n/******/ ((function(modules) {\n\t// Check all modules for deduplicated modules\n\tfor(var i in modules) {\n\t\tif(Object.prototype.hasOwnProperty.call(modules, i)) {\n\t\t\tswitch(typeof modules[i]) {\n\t\t\tcase \"function\": break;\n\t\t\tcase \"object\":\n\t\t\t\t// Module can be created from a template\n\t\t\t\tmodules[i] = (function(_m) {\n\t\t\t\t\tvar args = _m.slice(1), fn = modules[_m[0]];\n\t\t\t\t\treturn function (a,b,c) {\n\t\t\t\t\t\tfn.apply(this, [a,b,c].concat(args));\n\t\t\t\t\t};\n\t\t\t\t}(modules[i]));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Module is a copy of another module\n\t\t\t\tmodules[i] = modules[modules[i]];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn modules;\n}([])));\n\n\n/** WEBPACK FOOTER **\n ** common.js\n **/"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tvar _m = moreModules[moduleId];\n\n \t\t\t// Check if module is deduplicated\n \t\t\tswitch(typeof _m) {\n \t\t\tcase \"object\":\n \t\t\t\t// Module can be created from a template\n \t\t\t\tmodules[moduleId] = (function(_m) {\n \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n \t\t\t\t\treturn function (a,b,c) {\n \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n \t\t\t\t\t};\n \t\t\t\t}(_m));\n \t\t\t\tbreak;\n \t\t\tcase \"function\":\n \t\t\t\t// Normal module\n \t\t\t\tmodules[moduleId] = _m;\n \t\t\t\tbreak;\n \t\t\tdefault:\n \t\t\t\t// Module is a copy of another module\n \t\t\t\tmodules[moduleId] = modules[_m];\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t31:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"dd9000783a522bc2069d\",\"1\":\"4a09db78b21075c05a30\",\"2\":\"95c0fc4f129186dba94b\",\"3\":\"1ca609753b5a02de0ca3\",\"4\":\"379d0586872a1bae2ebd\",\"5\":\"534e0531d0e2b150146f\",\"6\":\"e56975229e6065f68d2a\",\"7\":\"2ebc6662cf10a678b2ac\",\"8\":\"17d1afb591ad1495bd03\",\"9\":\"534426728626f11f4571\",\"10\":\"e97ea231893dc435d6b5\",\"11\":\"c0ccea08914b6b41568e\",\"12\":\"d39612a569bcc3a358a8\",\"13\":\"526a25163ababaa44409\",\"14\":\"cdb85e78de233e6556ff\",\"15\":\"92b2cef3032ea35da04a\",\"16\":\"7901839b4227881947f6\",\"17\":\"13db80c90b998be14e1b\",\"18\":\"ad41fb75ac4226e1f3ce\",\"19\":\"471d5a2a08eef6e5338a\",\"20\":\"14a92e5c503f74ff40df\",\"21\":\"ccbfce6680a2b11a5284\",\"22\":\"bc79367e5f4c8ad00038\",\"23\":\"58f008bb10313268bf7d\",\"24\":\"554ea613112f1ba6c246\",\"25\":\"bebb170f65c104b18777\",\"26\":\"9a0fd93accfc31686ed0\",\"27\":\"dbd31d749f51f362b968\",\"28\":\"c9c89e04a005ae62b473\",\"29\":\"a0f8fce10d9e93e23b12\",\"30\":\"9dc7b1b44817569daec6\",\"32\":\"9b68f125e2598d22d5b5\",\"33\":\"70f8e7b1964892a24e67\"}[chunkId] + \".js\";\n \t\t\thead.appendChild(script);\n \t\t}\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap af2fbd64f908b4b6b777\n **/"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 4d6737f13b4fdd696b36"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","parentJsonpFunction","window","chunkIds","moreModules","chunkId","i","callbacks","length","installedChunks","push","apply","_m","args","slice","templateId","a","b","c","this","concat","shift","31","e","callback","undefined","head","document","getElementsByTagName","script","createElement","type","charset","async","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","32","33","appendChild","m","Object","prototype","hasOwnProperty","fn"],"mappings":"CAAS,SAAUA,GCwDnB,QAAAC,qBAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,qBAGAI,EAAAE,QAAA,EAGAF,EAAAD,QA3EA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,GAIA,IADA,GAAAV,GAAAW,EAAAC,EAAA,EAAAC,KACQD,EAAAH,EAAAK,OAAoBF,IAC5BD,EAAAF,EAAAG,GACAG,EAAAJ,IACAE,EAAAG,KAAAC,MAAAJ,EAAAE,EAAAJ,IACAI,EAAAJ,GAAA,CAEA,KAAAX,IAAAU,GAAA,CACA,GAAAQ,GAAAR,EAAAV,EAGA,cAAAkB,IACA,aAEApB,EAAAE,GAAA,SAAAkB,GACA,GAAAC,GAAAD,EAAAE,MAAA,GAAAC,EAAAH,EAAA,EACA,iBAAAI,EAAAC,EAAAC,GACA1B,EAAAuB,GAAAJ,MAAAQ,MAAAH,EAAAC,EAAAC,GAAAE,OAAAP,MAEMD,EACN,MACA,gBAEApB,EAAAE,GAAAkB,CACA,MACA,SAEApB,EAAAE,GAAAF,EAAAoB,IAKA,IADAX,KAAAE,EAAAC,GACAG,EAAAC,QACAD,EAAAc,QAAArB,KAAA,KAAAP,oBACA,IAAAW,EAAA,GAEA,MADAT,GAAA,KACAF,oBAAA,GAKA,IAAAE,MAKAc,GACAa,GAAA,EA6BA7B,qBAAA8B,EAAA,SAAAlB,EAAAmB,GAEA,OAAAf,EAAAJ,GACA,MAAAmB,GAAAxB,KAAA,KAAAP,oBAGA,IAAAgC,SAAAhB,EAAAJ,GACAI,EAAAJ,GAAAK,KAAAc,OACI,CAEJf,EAAAJ,IAAAmB,EACA,IAAAE,GAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,SACAD,GAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EAEAJ,EAAAK,IAAAzC,oBAAA0C,EAAA,UAAA9B,EAAA,KAAsE+B,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAk5B/D,GAAA,MACx9BqB,EAAA2C,YAAAxC,KAKApC,oBAAA6E,EAAA9E,EAGAC,oBAAAyB,EAAAvB,EAGAF,oBAAA0C,EAAA,YDIW,SAAS3C,GAEnB,IAAI,GAAIc,KAAKd,GACZ,GAAG+E,OAAOC,UAAUC,eAAezE,KAAKR,EAASc,GAChD,aAAcd,GAAQc,IACtB,IAAK,WAAY,KACjB,KAAK,SAEJd,EAAQc,GAAM,SAASM,GACtB,GAAIC,GAAOD,EAAGE,MAAM,GAAI4D,EAAKlF,EAAQoB,EAAG,GACxC,OAAO,UAAUI,EAAEC,EAAEC,GACpBwD,EAAG/D,MAAMQ,MAAOH,EAAEC,EAAEC,GAAGE,OAAOP,MAE9BrB,EAAQc,GACV,MACD,SAECd,EAAQc,GAAKd,EAAQA,EAAQc,IAKhC,MAAOd","file":"common.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tvar _m = moreModules[moduleId];\n/******/\n/******/ \t\t\t// Check if module is deduplicated\n/******/ \t\t\tswitch(typeof _m) {\n/******/ \t\t\tcase \"object\":\n/******/ \t\t\t\t// Module can be created from a template\n/******/ \t\t\t\tmodules[moduleId] = (function(_m) {\n/******/ \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n/******/ \t\t\t\t\treturn function (a,b,c) {\n/******/ \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}(_m));\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tcase \"function\":\n/******/ \t\t\t\t// Normal module\n/******/ \t\t\t\tmodules[moduleId] = _m;\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tdefault:\n/******/ \t\t\t\t// Module is a copy of another module\n/******/ \t\t\t\tmodules[moduleId] = modules[_m];\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n/******/ \t\twhile(callbacks.length)\n/******/ \t\t\tcallbacks.shift().call(null, __webpack_require__);\n/******/ \t\tif(moreModules[0]) {\n/******/ \t\t\tinstalledModules[0] = 0;\n/******/ \t\t\treturn __webpack_require__(0);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \t// Array means \"loading\", array contains callbacks\n/******/ \tvar installedChunks = {\n/******/ \t\t31:0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n/******/ \t\t// \"0\" is the signal for \"already loaded\"\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn callback.call(null, __webpack_require__);\n/******/\n/******/ \t\t// an array means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId] !== undefined) {\n/******/ \t\t\tinstalledChunks[chunkId].push(callback);\n/******/ \t\t} else {\n/******/ \t\t\t// start chunk loading\n/******/ \t\t\tinstalledChunks[chunkId] = [callback];\n/******/ \t\t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\t\tvar script = document.createElement('script');\n/******/ \t\t\tscript.type = 'text/javascript';\n/******/ \t\t\tscript.charset = 'utf-8';\n/******/ \t\t\tscript.async = true;\n/******/\n/******/ \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"dd9000783a522bc2069d\",\"1\":\"4a09db78b21075c05a30\",\"2\":\"95c0fc4f129186dba94b\",\"3\":\"1ca609753b5a02de0ca3\",\"4\":\"379d0586872a1bae2ebd\",\"5\":\"7115454a1183e5c12eef\",\"6\":\"16bb24fb8240f2746488\",\"7\":\"2ebc6662cf10a678b2ac\",\"8\":\"17d1afb591ad1495bd03\",\"9\":\"3e752966ff14e47e11f2\",\"10\":\"e97ea231893dc435d6b5\",\"11\":\"a23c110811a9ac943478\",\"12\":\"d39612a569bcc3a358a8\",\"13\":\"0889e093f8664e38568c\",\"14\":\"cdb85e78de233e6556ff\",\"15\":\"92b2cef3032ea35da04a\",\"16\":\"f41599478d3e97ad9a30\",\"17\":\"13db80c90b998be14e1b\",\"18\":\"ad41fb75ac4226e1f3ce\",\"19\":\"2b534a26af8b17e9170b\",\"20\":\"14a92e5c503f74ff40df\",\"21\":\"ccbfce6680a2b11a5284\",\"22\":\"bc79367e5f4c8ad00038\",\"23\":\"58f008bb10313268bf7d\",\"24\":\"554ea613112f1ba6c246\",\"25\":\"bebb170f65c104b18777\",\"26\":\"9a0fd93accfc31686ed0\",\"27\":\"dbd31d749f51f362b968\",\"28\":\"c9c89e04a005ae62b473\",\"29\":\"a0f8fce10d9e93e23b12\",\"30\":\"9dc7b1b44817569daec6\",\"32\":\"9b68f125e2598d22d5b5\",\"33\":\"70f8e7b1964892a24e67\"}[chunkId] + \".js\";\n/******/ \t\t\thead.appendChild(script);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/ })\n/************************************************************************/\n/******/ ((function(modules) {\n\t// Check all modules for deduplicated modules\n\tfor(var i in modules) {\n\t\tif(Object.prototype.hasOwnProperty.call(modules, i)) {\n\t\t\tswitch(typeof modules[i]) {\n\t\t\tcase \"function\": break;\n\t\t\tcase \"object\":\n\t\t\t\t// Module can be created from a template\n\t\t\t\tmodules[i] = (function(_m) {\n\t\t\t\t\tvar args = _m.slice(1), fn = modules[_m[0]];\n\t\t\t\t\treturn function (a,b,c) {\n\t\t\t\t\t\tfn.apply(this, [a,b,c].concat(args));\n\t\t\t\t\t};\n\t\t\t\t}(modules[i]));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Module is a copy of another module\n\t\t\t\tmodules[i] = modules[modules[i]];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn modules;\n}([])));\n\n\n/** WEBPACK FOOTER **\n ** common.js\n **/"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tvar _m = moreModules[moduleId];\n\n \t\t\t// Check if module is deduplicated\n \t\t\tswitch(typeof _m) {\n \t\t\tcase \"object\":\n \t\t\t\t// Module can be created from a template\n \t\t\t\tmodules[moduleId] = (function(_m) {\n \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n \t\t\t\t\treturn function (a,b,c) {\n \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n \t\t\t\t\t};\n \t\t\t\t}(_m));\n \t\t\t\tbreak;\n \t\t\tcase \"function\":\n \t\t\t\t// Normal module\n \t\t\t\tmodules[moduleId] = _m;\n \t\t\t\tbreak;\n \t\t\tdefault:\n \t\t\t\t// Module is a copy of another module\n \t\t\t\tmodules[moduleId] = modules[_m];\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t31:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"dd9000783a522bc2069d\",\"1\":\"4a09db78b21075c05a30\",\"2\":\"95c0fc4f129186dba94b\",\"3\":\"1ca609753b5a02de0ca3\",\"4\":\"379d0586872a1bae2ebd\",\"5\":\"7115454a1183e5c12eef\",\"6\":\"16bb24fb8240f2746488\",\"7\":\"2ebc6662cf10a678b2ac\",\"8\":\"17d1afb591ad1495bd03\",\"9\":\"3e752966ff14e47e11f2\",\"10\":\"e97ea231893dc435d6b5\",\"11\":\"a23c110811a9ac943478\",\"12\":\"d39612a569bcc3a358a8\",\"13\":\"0889e093f8664e38568c\",\"14\":\"cdb85e78de233e6556ff\",\"15\":\"92b2cef3032ea35da04a\",\"16\":\"f41599478d3e97ad9a30\",\"17\":\"13db80c90b998be14e1b\",\"18\":\"ad41fb75ac4226e1f3ce\",\"19\":\"2b534a26af8b17e9170b\",\"20\":\"14a92e5c503f74ff40df\",\"21\":\"ccbfce6680a2b11a5284\",\"22\":\"bc79367e5f4c8ad00038\",\"23\":\"58f008bb10313268bf7d\",\"24\":\"554ea613112f1ba6c246\",\"25\":\"bebb170f65c104b18777\",\"26\":\"9a0fd93accfc31686ed0\",\"27\":\"dbd31d749f51f362b968\",\"28\":\"c9c89e04a005ae62b473\",\"29\":\"a0f8fce10d9e93e23b12\",\"30\":\"9dc7b1b44817569daec6\",\"32\":\"9b68f125e2598d22d5b5\",\"33\":\"70f8e7b1964892a24e67\"}[chunkId] + \".js\";\n \t\t\thead.appendChild(script);\n \t\t}\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 4d6737f13b4fdd696b36\n **/"],"sourceRoot":""}
File without changes
udata/storage/s3.py ADDED
@@ -0,0 +1,54 @@
1
+ from typing import Any, Optional
2
+ import boto3
3
+ from flask import current_app
4
+ import json
5
+
6
+ def get_client():
7
+ url = current_app.config.get('S3_URL')
8
+ if url is None:
9
+ raise ValueError('No S3_URL provided')
10
+
11
+ access_key_id = current_app.config.get('S3_ACCESS_KEY_ID')
12
+ if access_key_id is None:
13
+ raise ValueError('No S3_ACCESS_KEY_ID provided')
14
+
15
+ secret_access_key = current_app.config.get('S3_SECRET_ACCESS_KEY')
16
+ if secret_access_key is None:
17
+ raise ValueError('No S3_SECRET_ACCESS_KEY provided')
18
+
19
+ return boto3.client(
20
+ "s3",
21
+ endpoint_url=url,
22
+ aws_access_key_id=access_key_id,
23
+ aws_secret_access_key=secret_access_key,
24
+ )
25
+
26
+ def store_bytes(bucket: str, filename: str, bytes: bytes):
27
+ return get_client().put_object(
28
+ Bucket=bucket,
29
+ Key=filename,
30
+ Body=bytes,
31
+ )
32
+
33
+ def store_as_json(bucket: str, filename: str, value):
34
+ return store_bytes(bucket, filename, bytes(json.dumps(value).encode('UTF-8')))
35
+
36
+ def get_bytes(bucket: str, filename: str) -> Optional[bytes]:
37
+ client = get_client()
38
+ try:
39
+ return client.get_object(Bucket=bucket, Key=filename)['Body'].read()
40
+ except client.exceptions.NoSuchKey:
41
+ return None
42
+
43
+ def get_from_json(bucket: str, filename: str) -> Optional[Any]:
44
+ bytes = get_bytes(bucket, filename)
45
+ if bytes is None:
46
+ return None
47
+
48
+ return json.loads(bytes.decode('utf-8'))
49
+
50
+ def delete_file(bucket: str, filename: str):
51
+ return get_client().delete_object(
52
+ Bucket=bucket,
53
+ Key=filename,
54
+ )
@@ -0,0 +1,33 @@
1
+ {% extends 'mail/base.html' %}
2
+ {% from 'mail/button.html' import mail_button %}
3
+
4
+ {% block body %}
5
+ <p style="margin: 0;padding: 0;">{{
6
+ _('%(user)s has identified your organization "%(name)s" as an association',
7
+ user=(
8
+ '<a href="'|safe
9
+ + url_for('api.user', user=badge.created_by, _external=True)
10
+ + '">'|safe
11
+ + badge.created_by.fullname
12
+ + '</a>'|safe
13
+ ),
14
+ name=(
15
+ '<a href="'|safe
16
+ + organization.external_url
17
+ + '">'|safe
18
+ + organization.name|string
19
+ + '</a>'|safe
20
+ )
21
+ ) }}.</p>
22
+ <br/>
23
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
24
+ <tr>
25
+ <td align="center">
26
+ {{ mail_button(
27
+ _('See the badge'),
28
+ organization.external_url
29
+ ) }}
30
+ </td>
31
+ </tr>
32
+ </table>
33
+ {% endblock %}
@@ -0,0 +1,11 @@
1
+ {% extends 'mail/base.txt' %}
2
+
3
+ {% block body %}
4
+ {{ _('%(user)s has identified your organization "%(name)s" as an association',
5
+ name=organization.name,
6
+ user=badge.created_by.fullname
7
+ ) }}.
8
+
9
+ {{ _('You can see the badge on this page:') }}
10
+ {{ organization.external_url }}
11
+ {% endblock %}
@@ -0,0 +1,33 @@
1
+ {% extends 'mail/base.html' %}
2
+ {% from 'mail/button.html' import mail_button %}
3
+
4
+ {% block body %}
5
+ <p style="margin: 0;padding: 0;">{{
6
+ _('%(user)s has identified your organization "%(name)s" as a company',
7
+ user=(
8
+ '<a href="'|safe
9
+ + url_for('api.user', user=badge.created_by, _external=True)
10
+ + '">'|safe
11
+ + badge.created_by.fullname
12
+ + '</a>'|safe
13
+ ),
14
+ name=(
15
+ '<a href="'|safe
16
+ + organization.external_url
17
+ + '">'|safe
18
+ + organization.name|string
19
+ + '</a>'|safe
20
+ )
21
+ ) }}.</p>
22
+ <br/>
23
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
24
+ <tr>
25
+ <td align="center">
26
+ {{ mail_button(
27
+ _('See the badge'),
28
+ organization.external_url
29
+ ) }}
30
+ </td>
31
+ </tr>
32
+ </table>
33
+ {% endblock %}
@@ -0,0 +1,11 @@
1
+ {% extends 'mail/base.txt' %}
2
+
3
+ {% block body %}
4
+ {{ _('%(user)s has identified your organization "%(name)s" as a company',
5
+ name=organization.name,
6
+ user=badge.created_by.fullname
7
+ ) }}.
8
+
9
+ {{ _('You can see the badge on this page:') }}
10
+ {{ organization.external_url }}
11
+ {% endblock %}
@@ -0,0 +1,33 @@
1
+ {% extends 'mail/base.html' %}
2
+ {% from 'mail/button.html' import mail_button %}
3
+
4
+ {% block body %}
5
+ <p style="margin: 0;padding: 0;">{{
6
+ _('%(user)s has identified your organization "%(name)s" as a local authority',
7
+ user=(
8
+ '<a href="'|safe
9
+ + url_for('api.user', user=badge.created_by, _external=True)
10
+ + '">'|safe
11
+ + badge.created_by.fullname
12
+ + '</a>'|safe
13
+ ),
14
+ name=(
15
+ '<a href="'|safe
16
+ + organization.external_url
17
+ + '">'|safe
18
+ + organization.name|string
19
+ + '</a>'|safe
20
+ )
21
+ ) }}.</p>
22
+ <br/>
23
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
24
+ <tr>
25
+ <td align="center">
26
+ {{ mail_button(
27
+ _('See the badge'),
28
+ organization.external_url
29
+ ) }}
30
+ </td>
31
+ </tr>
32
+ </table>
33
+ {% endblock %}
@@ -0,0 +1,11 @@
1
+ {% extends 'mail/base.txt' %}
2
+
3
+ {% block body %}
4
+ {{ _('%(user)s has identified your organization "%(name)s" as a local authority',
5
+ name=organization.name,
6
+ user=badge.created_by.fullname
7
+ ) }}.
8
+
9
+ {{ _('You can see the badge on this page:') }}
10
+ {{ organization.external_url }}
11
+ {% endblock %}
@@ -462,6 +462,33 @@ class DatasetAPITest(APITestCase):
462
462
  dataset = Dataset.objects.first()
463
463
  self.assertEqual(len(dataset.resources), initial_length + 1)
464
464
 
465
+ def test_dataset_api_update_private(self):
466
+ user = self.login()
467
+ dataset = DatasetFactory(owner=user, private=True)
468
+ data = dataset.to_dict()
469
+ data['description'] = 'new description'
470
+ del data['private']
471
+
472
+ response = self.put(url_for('api.dataset', dataset=dataset), data)
473
+ self.assert200(response)
474
+ dataset.reload()
475
+ self.assertEqual(dataset.description, 'new description')
476
+ self.assertEqual(dataset.private, True)
477
+
478
+ data['private'] = None
479
+ response = self.put(url_for('api.dataset', dataset=dataset), data)
480
+ self.assert200(response)
481
+ dataset.reload()
482
+ self.assertEqual(dataset.private, False)
483
+
484
+ data['private'] = True
485
+ response = self.put(url_for('api.dataset', dataset=dataset), data)
486
+ self.assert200(response)
487
+ dataset.reload()
488
+ self.assertEqual(dataset.private, True)
489
+
490
+
491
+
465
492
  def test_dataset_api_update_new_resource_with_extras(self):
466
493
  '''It should update a dataset with a new resource with extras'''
467
494
  user = self.login()
@@ -1,10 +1,13 @@
1
1
  from flask import url_for
2
2
 
3
3
  from udata.core.organization.factories import OrganizationFactory
4
+ from udata.core.spatial.models import spatial_granularities
4
5
  from udata.core.topic.models import Topic
5
6
  from udata.core.topic.factories import TopicFactory
6
7
  from udata.core.user.factories import UserFactory
7
8
  from udata.models import Member, Discussion
9
+ from udata.tests.api.test_datasets_api import SAMPLE_GEOM
10
+ from udata.tests.features.territories import create_geozones_fixtures
8
11
 
9
12
  from . import APITestCase
10
13
 
@@ -53,6 +56,8 @@ class TopicsAPITest(APITestCase):
53
56
  self.assert200(response)
54
57
 
55
58
  data = response.json
59
+ self.assertIn('spatial', data)
60
+
56
61
  for dataset, expected in zip(data['datasets'], [d.fetch() for d in topic.datasets]):
57
62
  self.assertEqual(dataset['id'], str(expected.id))
58
63
  self.assertEqual(dataset['title'], str(expected.title))
@@ -65,6 +70,9 @@ class TopicsAPITest(APITestCase):
65
70
  self.assertIsNotNone(reuse['page'])
66
71
  self.assertIsNotNone(reuse['uri'])
67
72
 
73
+ self.assertIsNotNone(data.get('created_at'))
74
+ self.assertIsNotNone(data.get('last_modified'))
75
+
68
76
  def test_topic_api_create(self):
69
77
  '''It should create a topic from the API'''
70
78
  data = TopicFactory.as_dict()
@@ -97,6 +105,26 @@ class TopicsAPITest(APITestCase):
97
105
  assert topic.owner is None
98
106
  assert topic.organization == org
99
107
 
108
+ def test_topic_api_create_spatial(self):
109
+ paca, _, _ = create_geozones_fixtures()
110
+ granularity = spatial_granularities[0][0]
111
+ data = TopicFactory.as_dict()
112
+ data['datasets'] = [str(d.id) for d in data['datasets']]
113
+ data['reuses'] = [str(r.id) for r in data['reuses']]
114
+ data['spatial'] = {
115
+ 'zones': [paca.id],
116
+ 'geom': SAMPLE_GEOM,
117
+ 'granularity': granularity,
118
+ }
119
+ self.login()
120
+ response = self.post(url_for('api.topics'), data)
121
+ self.assert201(response)
122
+ self.assertEqual(Topic.objects.count(), 1)
123
+ topic = Topic.objects.first()
124
+ self.assertEqual([str(z) for z in topic.spatial.zones], [paca.id])
125
+ self.assertEqual(topic.spatial.geom, SAMPLE_GEOM)
126
+ self.assertEqual(topic.spatial.granularity, granularity)
127
+
100
128
  def test_topic_api_update(self):
101
129
  '''It should update a topic from the API'''
102
130
  owner = self.login()
@@ -106,7 +134,9 @@ class TopicsAPITest(APITestCase):
106
134
  response = self.put(url_for('api.topic', topic=topic), data)
107
135
  self.assert200(response)
108
136
  self.assertEqual(Topic.objects.count(), 1)
109
- self.assertEqual(Topic.objects.first().description, 'new description')
137
+ topic = Topic.objects.first()
138
+ self.assertEqual(topic.description, 'new description')
139
+ self.assertGreater(topic.last_modified, topic.created_at)
110
140
 
111
141
  def test_topic_api_update_perm(self):
112
142
  '''It should not update a topic from the API'''
@@ -40,6 +40,10 @@ class TopicsAPITest(APITestCase):
40
40
  topic = TopicFactory()
41
41
  topic_response = self.get(url_for('apiv2.topic', topic=topic))
42
42
  assert topic_response.status_code == 200
43
+ assert 'spatial' in topic_response.json
44
+
45
+ assert topic_response.json['created_at'] is not None
46
+ assert topic_response.json['last_modified'] is not None
43
47
 
44
48
  response = self.get(topic_response.json['datasets']['href'])
45
49
  data = response.json
@@ -0,0 +1,43 @@
1
+ from datetime import datetime, timedelta
2
+
3
+ import pytest
4
+
5
+ from udata.core.dataset.csv import ResourcesCsvAdapter, DatasetCsvAdapter
6
+ from udata.core.dataset.factories import DatasetFactory, ResourceFactory
7
+ from udata.core.dataset.models import Dataset
8
+ from udata.core.organization.csv import OrganizationCsvAdapter
9
+ from udata.core.organization.factories import OrganizationFactory
10
+ from udata.core.organization.models import Organization
11
+
12
+
13
+ @pytest.mark.frontend
14
+ @pytest.mark.usefixtures('clean_db')
15
+ class OrganizationCSVAdapterTest:
16
+
17
+ def test_organization_downloads_counts(self):
18
+ org_with_dataset = OrganizationFactory()
19
+ org_without_dataset = OrganizationFactory()
20
+
21
+ DatasetFactory(organization=org_with_dataset, resources=[
22
+ ResourceFactory(metrics={
23
+ 'views': 42,
24
+ }),
25
+ ResourceFactory(metrics={
26
+ 'views': 1337,
27
+ }),
28
+ ResourceFactory(),
29
+ ])
30
+ DatasetFactory(organization=org_with_dataset, resources=[])
31
+ adapter = OrganizationCsvAdapter(Organization.objects.all())
32
+
33
+ # Build a dict (Org ID to dict of header name to value) from the CSV values and headers to simplify testing below.
34
+ csv = {}
35
+ for row in adapter.rows():
36
+ values = dict(zip(adapter.header(), row))
37
+ csv[values['id']] = values
38
+
39
+ org_values = csv[str(org_with_dataset.id)]
40
+ assert org_values['downloads'] == 1337 + 42
41
+
42
+ org_values = csv[str(org_without_dataset.id)]
43
+ assert org_values['downloads'] == 0
Binary file