udata 10.3.2.dev34939__py2.py3-none-any.whl → 10.3.2.dev34982__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 (40) hide show
  1. udata/{frontend → core}/csv.py +1 -1
  2. udata/core/dataservices/csv.py +1 -1
  3. udata/core/dataset/api.py +11 -0
  4. udata/core/dataset/csv.py +1 -1
  5. udata/core/dataset/tasks.py +1 -2
  6. udata/core/discussions/csv.py +1 -1
  7. udata/core/organization/api.py +40 -0
  8. udata/core/organization/csv.py +1 -1
  9. udata/core/reuse/csv.py +1 -1
  10. udata/core/site/api.py +106 -1
  11. udata/core/tags/csv.py +1 -1
  12. udata/core/tags/views.py +1 -1
  13. udata/harvest/csv.py +1 -1
  14. udata/static/chunks/{10.8ca60413647062717b1e.js → 10.471164b2a9fe15614797.js} +3 -3
  15. udata/static/chunks/{10.8ca60413647062717b1e.js.map → 10.471164b2a9fe15614797.js.map} +1 -1
  16. udata/static/chunks/{11.b6f741fcc366abfad9c4.js → 11.83535504cd650ea08f65.js} +3 -3
  17. udata/static/chunks/{11.b6f741fcc366abfad9c4.js.map → 11.83535504cd650ea08f65.js.map} +1 -1
  18. udata/static/chunks/{13.2d06442dd9a05d9777b5.js → 13.d9c1735d14038b94c17e.js} +2 -2
  19. udata/static/chunks/{13.2d06442dd9a05d9777b5.js.map → 13.d9c1735d14038b94c17e.js.map} +1 -1
  20. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js → 17.81c57c0dedf812e43013.js} +2 -2
  21. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js.map → 17.81c57c0dedf812e43013.js.map} +1 -1
  22. udata/static/chunks/{19.f03a102365af4315f9db.js → 19.df16abde17a42033a7f8.js} +3 -3
  23. udata/static/chunks/{19.f03a102365af4315f9db.js.map → 19.df16abde17a42033a7f8.js.map} +1 -1
  24. udata/static/chunks/{8.778091d55cd8ea39af6b.js → 8.462bb3029de008497675.js} +2 -2
  25. udata/static/chunks/{8.778091d55cd8ea39af6b.js.map → 8.462bb3029de008497675.js.map} +1 -1
  26. udata/static/chunks/{9.033d7e190ca9e226a5d0.js → 9.07515e5187f475bce828.js} +3 -3
  27. udata/static/chunks/{9.033d7e190ca9e226a5d0.js.map → 9.07515e5187f475bce828.js.map} +1 -1
  28. udata/static/common.js +1 -1
  29. udata/static/common.js.map +1 -1
  30. udata/tests/api/test_organizations_api.py +98 -1
  31. udata/tests/apiv2/test_datasets.py +16 -0
  32. udata/tests/frontend/test_csv.py +1 -1
  33. udata/tests/site/test_site_csv_exports.py +464 -0
  34. udata/tests/test_tags.py +1 -1
  35. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/METADATA +3 -1
  36. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/RECORD +40 -39
  37. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/LICENSE +0 -0
  38. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/WHEEL +0 -0
  39. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/entry_points.txt +0 -0
  40. {udata-10.3.2.dev34939.dist-info → udata-10.3.2.dev34982.dist-info}/top_level.txt +0 -0
udata/static/common.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,d){for(var t,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(t in d){var i=d[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,d){e[r].apply(this,[c,f,d].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,d);n.length;)n.shift().call(null,__webpack_require__);if(d[0])return a[0]=0,__webpack_require__(0)};var a={},r={31:0};__webpack_require__.e=function(e,c){if(0===r[e])return c.call(null,__webpack_require__);if(void 0!==r[e])r[e].push(c);else{r[e]=[c];var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.src=__webpack_require__.p+"chunks/"+e+"."+{0:"4dd4f378428d1eed85c8",1:"0a96f54313c89e541ccb",2:"c67aa76cc078c193aed5",3:"174a03e48d267820919b",4:"98dca3045c034c154d5f",5:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"778091d55cd8ea39af6b",9:"033d7e190ca9e226a5d0",10:"8ca60413647062717b1e",11:"b6f741fcc366abfad9c4",12:"1be61e0201691821bff6",13:"2d06442dd9a05d9777b5",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"e8e4caaad5cb0cc0bacc",18:"56444ebd2456a4ba2201",19:"f03a102365af4315f9db",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
1
+ !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,d){for(var t,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(t in d){var i=d[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,d){e[r].apply(this,[c,f,d].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,d);n.length;)n.shift().call(null,__webpack_require__);if(d[0])return a[0]=0,__webpack_require__(0)};var a={},r={31:0};__webpack_require__.e=function(e,c){if(0===r[e])return c.call(null,__webpack_require__);if(void 0!==r[e])r[e].push(c);else{r[e]=[c];var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.src=__webpack_require__.p+"chunks/"+e+"."+{0:"4dd4f378428d1eed85c8",1:"0a96f54313c89e541ccb",2:"c67aa76cc078c193aed5",3:"174a03e48d267820919b",4:"98dca3045c034c154d5f",5:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"462bb3029de008497675",9:"07515e5187f475bce828",10:"471164b2a9fe15614797",11:"83535504cd650ea08f65",12:"1be61e0201691821bff6",13:"d9c1735d14038b94c17e",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"81c57c0dedf812e43013",18:"56444ebd2456a4ba2201",19:"df16abde17a42033a7f8",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
2
2
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 44a61f162b1337addb9e"],"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\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[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\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[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 44a61f162b1337addb9e\n **/"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap a7d39102b8c9209d537b"],"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\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"462bb3029de008497675\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"83535504cd650ea08f65\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"df16abde17a42033a7f8\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[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\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"462bb3029de008497675\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"83535504cd650ea08f65\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"df16abde17a42033a7f8\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[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 a7d39102b8c9209d537b\n **/"],"sourceRoot":""}
@@ -1,12 +1,15 @@
1
1
  from datetime import datetime
2
+ from io import StringIO
2
3
 
3
4
  import pytest
4
5
  from flask import url_for
5
6
 
6
7
  import udata.core.organization.constants as org_constants
8
+ from udata.core import csv
7
9
  from udata.core.badges.factories import badge_factory
8
10
  from udata.core.badges.signals import on_badge_added, on_badge_removed
9
- from udata.core.dataset.factories import DatasetFactory
11
+ from udata.core.dataset.factories import DatasetFactory, ResourceFactory
12
+ from udata.core.discussions.factories import DiscussionFactory
10
13
  from udata.core.organization.factories import OrganizationFactory
11
14
  from udata.core.reuse.factories import ReuseFactory
12
15
  from udata.core.user.factories import AdminFactory, UserFactory
@@ -22,6 +25,7 @@ from udata.tests.helpers import (
22
25
  assert410,
23
26
  assert_emit,
24
27
  assert_not_emit,
28
+ assert_starts_with,
25
29
  assert_status,
26
30
  )
27
31
  from udata.utils import faker
@@ -967,3 +971,96 @@ class OrganizationContactPointsAPITest:
967
971
 
968
972
  assert response.json["data"][0]["name"] == data["name"]
969
973
  assert response.json["data"][0]["email"] == data["email"]
974
+
975
+
976
+ class OrganizationCsvExportsTest:
977
+ modules = []
978
+
979
+ def test_datasets_csv(self, api):
980
+ org = OrganizationFactory()
981
+ [DatasetFactory(organization=org, resources=[ResourceFactory()]) for _ in range(3)]
982
+
983
+ response = api.get(url_for("api.organization_datasets_csv", org=org))
984
+
985
+ assert200(response)
986
+ assert response.mimetype == "text/csv"
987
+ assert response.charset == "utf-8"
988
+
989
+ csvfile = StringIO(response.data.decode("utf-8"))
990
+ reader = csv.get_reader(csvfile)
991
+ header = next(reader)
992
+
993
+ assert header[0] == "id"
994
+ assert "title" in header
995
+ assert "url" in header
996
+ assert "description" in header
997
+ assert "created_at" in header
998
+ assert "last_modified" in header
999
+ assert "tags" in header
1000
+ assert "metric.reuses" in header
1001
+
1002
+ def test_resources_csv(self, api):
1003
+ org = OrganizationFactory()
1004
+ datasets = [
1005
+ DatasetFactory(organization=org, resources=[ResourceFactory(), ResourceFactory()])
1006
+ for _ in range(3)
1007
+ ]
1008
+ not_org_dataset = DatasetFactory(resources=[ResourceFactory()])
1009
+ hidden_dataset = DatasetFactory(private=True)
1010
+
1011
+ response = api.get(url_for("api.organization_datasets_resources_csv", org=org))
1012
+
1013
+ assert200(response)
1014
+ assert response.mimetype == "text/csv"
1015
+ assert response.charset == "utf-8"
1016
+
1017
+ csvfile = StringIO(response.data.decode("utf-8"))
1018
+ reader = csv.get_reader(csvfile)
1019
+ header = next(reader)
1020
+
1021
+ assert header[0] == "dataset.id"
1022
+ assert "dataset.title" in header
1023
+ assert "dataset.url" in header
1024
+ assert "title" in header
1025
+ assert "filetype" in header
1026
+ assert "url" in header
1027
+ assert "created_at" in header
1028
+ assert "modified" in header
1029
+ assert "downloads" in header
1030
+
1031
+ resource_id_index = header.index("id")
1032
+
1033
+ rows = list(reader)
1034
+ ids = [(row[0], row[resource_id_index]) for row in rows]
1035
+
1036
+ assert len(rows) == sum(len(d.resources) for d in datasets)
1037
+ for dataset in datasets:
1038
+ for resource in dataset.resources:
1039
+ assert (str(dataset.id), str(resource.id)) in ids
1040
+
1041
+ dataset_ids = set(row[0] for row in rows)
1042
+ assert str(hidden_dataset.id) not in dataset_ids
1043
+ assert str(not_org_dataset.id) not in dataset_ids
1044
+
1045
+ def test_discussions_csv_content_empty(self, api):
1046
+ organization = OrganizationFactory()
1047
+ response = api.get(url_for("api.organization_discussions_csv", org=organization))
1048
+ assert200(response)
1049
+
1050
+ assert response.data.decode("utf8") == (
1051
+ '"id";"user";"subject";"subject_class";"subject_id";"title";"size";"participants";'
1052
+ '"messages";"created";"closed";"closed_by";"closed_by_id";"closed_by_organization";'
1053
+ '"closed_by_organization_id"\r\n'
1054
+ )
1055
+
1056
+ def test_discussions_csv_content_filled(self, api):
1057
+ organization = OrganizationFactory()
1058
+ dataset = DatasetFactory(organization=organization)
1059
+ user = UserFactory(first_name="John", last_name="Snow")
1060
+ discussion = DiscussionFactory(subject=dataset, user=user)
1061
+ response = api.get(url_for("api.organization_discussions_csv", org=organization))
1062
+ assert200(response)
1063
+
1064
+ headers, data = response.data.decode("utf-8").strip().split("\r\n")
1065
+ expected = '"{discussion.id}";"{discussion.user}"'
1066
+ assert_starts_with(data, expected.format(discussion=discussion))
@@ -11,6 +11,7 @@ from udata.core.dataset.factories import (
11
11
  )
12
12
  from udata.core.dataset.models import ResourceMixin
13
13
  from udata.core.organization.factories import Member, OrganizationFactory
14
+ from udata.core.reuse.factories import ReuseFactory
14
15
  from udata.models import Dataset, db
15
16
  from udata.tests.api import APITestCase
16
17
  from udata.tests.helpers import assert_not_emit
@@ -43,6 +44,21 @@ class DatasetAPIV2Test(APITestCase):
43
44
  assert data["data"][1]["community_resources"]["total"] == 0
44
45
  assert data["data"][0]["community_resources"]["total"] == 0
45
46
 
47
+ def test_filter_by_reuse(self):
48
+ DatasetFactory(title="Dataset without reuse")
49
+
50
+ dataset_with_reuse = DatasetFactory(title="Dataset with reuse")
51
+ archived_dataset_with_reuse = DatasetFactory(
52
+ title="Dataset with reuse", archived=datetime(2022, 2, 22)
53
+ )
54
+ reuse = ReuseFactory(datasets=[dataset_with_reuse.id, archived_dataset_with_reuse.id])
55
+
56
+ response = self.get(url_for("apiv2.datasets", reuse=reuse.id))
57
+ self.assert200(response)
58
+ data = response.json
59
+ assert len(data["data"]) == 1
60
+ assert data["data"][0]["title"] == dataset_with_reuse.title
61
+
46
62
  def test_get_dataset(self):
47
63
  resources = [ResourceFactory() for _ in range(2)]
48
64
  dataset = DatasetFactory(resources=resources)
@@ -6,7 +6,7 @@ import factory
6
6
  from factory.mongoengine import MongoEngineFactory
7
7
  from flask import Blueprint, url_for
8
8
 
9
- from udata.frontend import csv
9
+ from udata.core import csv
10
10
  from udata.mongo import db
11
11
  from udata.utils import faker
12
12