udata 11.1.2.dev9__py3-none-any.whl → 11.1.2.dev10__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 (36) hide show
  1. udata/core/dataset/api.py +2 -2
  2. udata/core/dataset/api_fields.py +3 -4
  3. udata/core/dataset/apiv2.py +6 -6
  4. udata/core/dataset/constants.py +124 -38
  5. udata/core/dataset/factories.py +2 -1
  6. udata/core/dataset/forms.py +14 -10
  7. udata/core/dataset/models.py +8 -36
  8. udata/core/dataset/rdf.py +76 -54
  9. udata/core/dataset/tasks.py +4 -9
  10. udata/harvest/backends/ckan/harvesters.py +10 -14
  11. udata/harvest/backends/maaf.py +15 -14
  12. udata/harvest/tests/ckan/test_ckan_backend.py +4 -3
  13. udata/harvest/tests/test_dcat_backend.py +3 -2
  14. udata/migrations/2025-09-04-update-legacy-frequencies.py +36 -0
  15. udata/static/chunks/{11.55ab79044cda0271b595.js → 11.51d706fb9521c16976bc.js} +3 -3
  16. udata/static/chunks/{11.55ab79044cda0271b595.js.map → 11.51d706fb9521c16976bc.js.map} +1 -1
  17. udata/static/chunks/{13.d9c1735d14038b94c17e.js → 13.f29411b06be1883356a3.js} +2 -2
  18. udata/static/chunks/{13.d9c1735d14038b94c17e.js.map → 13.f29411b06be1883356a3.js.map} +1 -1
  19. udata/static/chunks/{17.81c57c0dedf812e43013.js → 17.3bd0340930d4a314ce9c.js} +2 -2
  20. udata/static/chunks/{17.81c57c0dedf812e43013.js.map → 17.3bd0340930d4a314ce9c.js.map} +1 -1
  21. udata/static/chunks/{19.3e0e8651d948e04b8cf2.js → 19.ba0bb2baa40e899d440b.js} +3 -3
  22. udata/static/chunks/{19.3e0e8651d948e04b8cf2.js.map → 19.ba0bb2baa40e899d440b.js.map} +1 -1
  23. udata/static/chunks/{8.494b003a94383b142c18.js → 8.b966402f5d680d4bdf4a.js} +2 -2
  24. udata/static/chunks/{8.494b003a94383b142c18.js.map → 8.b966402f5d680d4bdf4a.js.map} +1 -1
  25. udata/static/common.js +1 -1
  26. udata/static/common.js.map +1 -1
  27. udata/tests/api/test_datasets_api.py +41 -12
  28. udata/tests/dataset/test_dataset_model.py +17 -53
  29. udata/tests/dataset/test_dataset_rdf.py +27 -28
  30. udata/translations/udata.pot +226 -150
  31. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/METADATA +1 -1
  32. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/RECORD +36 -35
  33. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/WHEEL +0 -0
  34. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/entry_points.txt +0 -0
  35. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/licenses/LICENSE +0 -0
  36. {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.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,t){for(var d,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(d in t){var i=t[d];switch(typeof i){case"object":e[d]=function(c){var a=c.slice(1),r=c[0];return function(c,f,t){e[r].apply(this,[c,f,t].concat(a))}}(i);break;case"function":e[d]=i;break;default:e[d]=e[i]}}for(c&&c(f,t);n.length;)n.shift().call(null,__webpack_require__);if(t[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:"0652a860afda96795a53",6:"92d7c2ec6d20005774ef",7:"896bbffe39433bb598f7",8:"494b003a94383b142c18",9:"07515e5187f475bce828",10:"471164b2a9fe15614797",11:"55ab79044cda0271b595",12:"1be61e0201691821bff6",13:"d9c1735d14038b94c17e",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"81c57c0dedf812e43013",18:"56444ebd2456a4ba2201",19:"3e0e8651d948e04b8cf2",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,b){for(var t,d,_=0,n=[];_<f.length;_++)d=f[_],r[d]&&n.push.apply(n,r[d]),r[d]=0;for(t in b){var i=b[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,b){e[r].apply(this,[c,f,b].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,b);n.length;)n.shift().call(null,__webpack_require__);if(b[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:"0652a860afda96795a53",6:"92d7c2ec6d20005774ef",7:"896bbffe39433bb598f7",8:"b966402f5d680d4bdf4a",9:"07515e5187f475bce828",10:"471164b2a9fe15614797",11:"51d706fb9521c16976bc",12:"1be61e0201691821bff6",13:"f29411b06be1883356a3",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"3bd0340930d4a314ce9c",18:"56444ebd2456a4ba2201",19:"ba0bb2baa40e899d440b",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 50ef7acc4783a0778924"],"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\":\"0652a860afda96795a53\",\"6\":\"92d7c2ec6d20005774ef\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"494b003a94383b142c18\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"55ab79044cda0271b595\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"3e0e8651d948e04b8cf2\",\"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\":\"0652a860afda96795a53\",\"6\":\"92d7c2ec6d20005774ef\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"494b003a94383b142c18\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"55ab79044cda0271b595\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"3e0e8651d948e04b8cf2\",\"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 50ef7acc4783a0778924\n **/"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 78a1d2c6335f6f61fe48"],"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\":\"0652a860afda96795a53\",\"6\":\"92d7c2ec6d20005774ef\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"b966402f5d680d4bdf4a\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"51d706fb9521c16976bc\",\"12\":\"1be61e0201691821bff6\",\"13\":\"f29411b06be1883356a3\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"3bd0340930d4a314ce9c\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"ba0bb2baa40e899d440b\",\"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\":\"0652a860afda96795a53\",\"6\":\"92d7c2ec6d20005774ef\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"b966402f5d680d4bdf4a\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"51d706fb9521c16976bc\",\"12\":\"1be61e0201691821bff6\",\"13\":\"f29411b06be1883356a3\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"3bd0340930d4a314ce9c\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"ba0bb2baa40e899d440b\",\"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 78a1d2c6335f6f61fe48\n **/"],"sourceRoot":""}
@@ -16,12 +16,10 @@ from udata.app import cache
16
16
  from udata.core import storages
17
17
  from udata.core.badges.factories import badge_factory
18
18
  from udata.core.dataset.constants import (
19
- DEFAULT_FREQUENCY,
20
19
  DEFAULT_LICENSE,
21
20
  FULL_OBJECTS_HEADER,
22
- LEGACY_FREQUENCIES,
23
21
  RESOURCE_TYPES,
24
- UPDATE_FREQUENCIES,
22
+ UpdateFrequency,
25
23
  )
26
24
  from udata.core.dataset.factories import (
27
25
  CommunityResourceFactory,
@@ -531,14 +529,14 @@ class DatasetAPITest(APITestCase):
531
529
  other = GeoLevelFactory(id="other", name="Autre")
532
530
 
533
531
  dataset = DatasetFactory(
534
- frequency="monthly",
532
+ frequency=UpdateFrequency.MONTHLY,
535
533
  license=license,
536
534
  spatial=SpatialCoverageFactory(zones=[paca.id], granularity=country.id),
537
535
  )
538
536
 
539
537
  response = self.get(url_for("apiv2.dataset", dataset=dataset))
540
538
  self.assert200(response)
541
- assert response.json["frequency"] == "monthly"
539
+ assert response.json["frequency"] == UpdateFrequency.MONTHLY.id
542
540
  assert response.json["license"] == "lov2"
543
541
  assert response.json["spatial"]["zones"][0] == paca.id
544
542
  assert response.json["spatial"]["granularity"] == "country"
@@ -550,8 +548,8 @@ class DatasetAPITest(APITestCase):
550
548
  },
551
549
  )
552
550
  self.assert200(response)
553
- assert response.json["frequency"]["id"] == "monthly"
554
- assert response.json["frequency"]["label"] == "Mensuelle"
551
+ assert response.json["frequency"]["id"] == UpdateFrequency.MONTHLY.id
552
+ assert response.json["frequency"]["label"] == UpdateFrequency.MONTHLY.label
555
553
  assert response.json["license"]["id"] == "lov2"
556
554
  assert response.json["license"]["title"] == license.title
557
555
  assert response.json["spatial"]["zones"][0]["id"] == paca.id
@@ -572,8 +570,8 @@ class DatasetAPITest(APITestCase):
572
570
  },
573
571
  )
574
572
  self.assert200(response)
575
- assert response.json["frequency"]["id"] == DEFAULT_FREQUENCY
576
- assert response.json["frequency"]["label"] == UPDATE_FREQUENCIES.get(DEFAULT_FREQUENCY)
573
+ assert response.json["frequency"]["id"] == UpdateFrequency.UNKNOWN.id
574
+ assert response.json["frequency"]["label"] == UpdateFrequency.UNKNOWN.label
577
575
  assert response.json["license"]["id"] == DEFAULT_LICENSE["id"]
578
576
  assert response.json["license"]["title"] == DEFAULT_LICENSE["title"]
579
577
  assert len(response.json["spatial"]["zones"]) == 0
@@ -723,12 +721,12 @@ class DatasetAPITest(APITestCase):
723
721
  """It should create a dataset from the API with a legacy frequency"""
724
722
  self.login()
725
723
 
726
- for oldFreq, newFreq in LEGACY_FREQUENCIES.items():
724
+ for oldFreq, newFreq in UpdateFrequency._LEGACY_FREQUENCIES.items(): # type: ignore[misc]
727
725
  data = DatasetFactory.as_dict()
728
726
  data["frequency"] = oldFreq
729
727
  response = self.post(url_for("api.datasets"), data)
730
728
  self.assert201(response)
731
- self.assertEqual(response.json["frequency"], newFreq)
729
+ self.assertEqual(response.json["frequency"], newFreq.id)
732
730
 
733
731
  def test_dataset_api_update(self):
734
732
  """It should update a dataset from the API"""
@@ -741,6 +739,37 @@ class DatasetAPITest(APITestCase):
741
739
  self.assertEqual(Dataset.objects.count(), 1)
742
740
  self.assertEqual(Dataset.objects.first().description, "new description")
743
741
 
742
+ def test_dataset_api_update_valid_frequency(self):
743
+ """It should update a dataset from the API"""
744
+ user = self.login()
745
+ dataset = DatasetFactory(owner=user)
746
+ data = dataset.to_dict()
747
+ data["frequency"] = "monthly"
748
+ response = self.put(url_for("api.dataset", dataset=dataset), data)
749
+ self.assert200(response)
750
+ self.assertEqual(Dataset.objects.count(), 1)
751
+ self.assertEqual(Dataset.objects.first().frequency, UpdateFrequency.MONTHLY)
752
+
753
+ def test_dataset_api_update_invalid_frequency(self):
754
+ """It should return an error saying the frequency is invalid"""
755
+ user = self.login()
756
+ dataset = DatasetFactory(owner=user, frequency=UpdateFrequency.ANNUAL)
757
+ data = dataset.to_dict()
758
+
759
+ data["frequency"] = 1 # invalid type
760
+ response = self.put(url_for("api.dataset", dataset=dataset), data)
761
+ self.assert400(response)
762
+ self.assertEqual(response.json.get("message"), "'1' is not a valid UpdateFrequency")
763
+ self.assertEqual(Dataset.objects.count(), 1)
764
+ self.assertEqual(Dataset.objects.first().frequency, UpdateFrequency.ANNUAL)
765
+
766
+ data["frequency"] = "foo" # valid type but invalid term
767
+ response = self.put(url_for("api.dataset", dataset=dataset), data)
768
+ self.assert400(response)
769
+ self.assertEqual(response.json.get("message"), "'foo' is not a valid UpdateFrequency")
770
+ self.assertEqual(Dataset.objects.count(), 1)
771
+ self.assertEqual(Dataset.objects.first().frequency, UpdateFrequency.ANNUAL)
772
+
744
773
  def test_cannot_modify_dataset_id(self):
745
774
  user = self.login()
746
775
  dataset = DatasetFactory(owner=user)
@@ -2044,7 +2073,7 @@ class DatasetReferencesAPITest(APITestCase):
2044
2073
  """It should fetch the dataset frequencies list from the API"""
2045
2074
  response = self.get(url_for("api.dataset_frequencies"))
2046
2075
  self.assert200(response)
2047
- self.assertEqual(len(response.json), len(UPDATE_FREQUENCIES))
2076
+ self.assertEqual(len(response.json), len(UpdateFrequency))
2048
2077
 
2049
2078
  def test_dataset_allowed_resources_extensions(self):
2050
2079
  """It should fetch the resources allowed extensions list from the API"""
@@ -20,7 +20,7 @@ from udata.core.dataset.activities import (
20
20
  UserUpdatedDataset,
21
21
  UserUpdatedResource,
22
22
  )
23
- from udata.core.dataset.constants import LEGACY_FREQUENCIES, UPDATE_FREQUENCIES
23
+ from udata.core.dataset.constants import UpdateFrequency
24
24
  from udata.core.dataset.exceptions import (
25
25
  SchemasCacheUnavailableException,
26
26
  SchemasCatalogNotFoundException,
@@ -157,49 +157,13 @@ class DatasetModelTest:
157
157
  dataset = DatasetFactory()
158
158
  assert dataset.next_update is None
159
159
 
160
- def test_next_update_hourly(self):
161
- dataset = DatasetFactory(frequency="hourly")
162
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(hours=1))
163
-
164
- @pytest.mark.parametrize("freq", ["fourTimesADay", "threeTimesADay", "semidaily", "daily"])
165
- def test_next_update_daily(self, freq):
166
- dataset = DatasetFactory(frequency=freq)
167
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=1))
168
-
169
- @pytest.mark.parametrize("freq", ["fourTimesAWeek", "threeTimesAWeek", "semiweekly", "weekly"])
170
- def test_next_update_weekly(self, freq):
171
- dataset = DatasetFactory(frequency=freq)
172
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=7))
173
-
174
- def test_next_update_biweekly(self):
175
- dataset = DatasetFactory(frequency="biweekly")
176
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(weeks=2))
177
-
178
- def test_next_update_quarterly(self):
179
- dataset = DatasetFactory(frequency="quarterly")
180
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=365 / 4))
181
-
182
- @pytest.mark.parametrize("freq", ["threeTimesAYear", "semiannual", "annual"])
183
- def test_next_update_annual(self, freq):
184
- dataset = DatasetFactory(frequency=freq)
185
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=365))
186
-
187
- def test_next_update_biennial(self):
188
- dataset = DatasetFactory(frequency="biennial")
189
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=365 * 2))
190
-
191
- def test_next_update_triennial(self):
192
- dataset = DatasetFactory(frequency="triennial")
193
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=365 * 3))
194
-
195
- def test_next_update_quinquennial(self):
196
- dataset = DatasetFactory(frequency="quinquennial")
197
- assert_equal_dates(dataset.next_update, datetime.utcnow() + timedelta(days=365 * 5))
198
-
199
- @pytest.mark.parametrize("freq", ["continuous", "punctual", "irregular", "unknown"])
200
- def test_next_update_undefined(self, freq):
160
+ @pytest.mark.parametrize("freq", list(UpdateFrequency) + [None])
161
+ def test_next_update(self, freq: UpdateFrequency | None):
201
162
  dataset = DatasetFactory(frequency=freq)
202
- assert dataset.next_update is None
163
+ if freq is None or freq.delta is None:
164
+ assert dataset.next_update is None
165
+ else:
166
+ assert_equal_dates(dataset.next_update, freq.next_update(datetime.utcnow()))
203
167
 
204
168
  def test_quality_default(self):
205
169
  dataset = DatasetFactory(description="")
@@ -212,21 +176,21 @@ class DatasetModelTest:
212
176
  "score": 0,
213
177
  }
214
178
 
215
- @pytest.mark.parametrize("freq", UPDATE_FREQUENCIES)
216
- def test_quality_frequency_update(self, freq):
179
+ @pytest.mark.parametrize("freq", list(UpdateFrequency) + [None])
180
+ def test_quality_frequency_update(self, freq: UpdateFrequency | None):
217
181
  dataset = DatasetFactory(description="", frequency=freq)
218
- if freq == "unknown":
182
+ if freq in [None, UpdateFrequency.UNKNOWN]:
219
183
  assert dataset.quality["update_frequency"] is False
220
184
  assert "update_fulfilled_in_time" not in dataset.quality
221
- return
222
- assert dataset.quality["update_frequency"] is True
223
- assert dataset.quality["update_fulfilled_in_time"] is True
224
- assert dataset.quality["score"] == Dataset.normalize_score(2)
185
+ else:
186
+ assert dataset.quality["update_frequency"] is True
187
+ assert dataset.quality["update_fulfilled_in_time"] is True
188
+ assert dataset.quality["score"] == Dataset.normalize_score(2)
225
189
 
226
190
  def test_quality_frequency_update_one_day_late(self):
227
191
  dataset = DatasetFactory(
228
192
  description="",
229
- frequency="daily",
193
+ frequency=UpdateFrequency.DAILY,
230
194
  last_modified_internal=datetime.utcnow() - timedelta(days=1, hours=1),
231
195
  )
232
196
  assert dataset.quality["update_frequency"] is True
@@ -236,7 +200,7 @@ class DatasetModelTest:
236
200
  def test_quality_frequency_update_two_days_late(self):
237
201
  dataset = DatasetFactory(
238
202
  description="",
239
- frequency="daily",
203
+ frequency=UpdateFrequency.DAILY,
240
204
  last_modified_internal=datetime.utcnow() - timedelta(days=2, hours=1),
241
205
  )
242
206
  assert dataset.quality["update_frequency"] is True
@@ -309,7 +273,7 @@ class DatasetModelTest:
309
273
  assert dataset.tags[1] == "this-is-a-tag"
310
274
 
311
275
  def test_legacy_frequencies(self):
312
- for oldFreq, newFreq in LEGACY_FREQUENCIES.items():
276
+ for oldFreq, newFreq in UpdateFrequency._LEGACY_FREQUENCIES.items(): # type: ignore[misc]
313
277
  dataset = DatasetFactory(frequency=oldFreq)
314
278
  assert dataset.frequency == newFreq
315
279
 
@@ -10,6 +10,7 @@ from rdflib.resource import Resource as RdfResource
10
10
 
11
11
  from udata.core.contact_point.factories import ContactPointFactory
12
12
  from udata.core.dataservices.factories import DataserviceFactory
13
+ from udata.core.dataset.constants import UpdateFrequency
13
14
  from udata.core.dataset.factories import DatasetFactory, LicenseFactory, ResourceFactory
14
15
  from udata.core.dataset.models import (
15
16
  Checksum,
@@ -20,7 +21,8 @@ from udata.core.dataset.models import (
20
21
  Resource,
21
22
  )
22
23
  from udata.core.dataset.rdf import (
23
- EU_RDF_REQUENCIES,
24
+ EUFREQ_TERM_TO_UDATA,
25
+ FREQ_TERM_TO_UDATA,
24
26
  dataset_from_rdf,
25
27
  dataset_to_rdf,
26
28
  frequency_from_rdf,
@@ -38,6 +40,7 @@ from udata.rdf import (
38
40
  DCAT,
39
41
  DCATAP,
40
42
  DCT,
43
+ EUFREQ,
41
44
  FREQ,
42
45
  GEODCAT,
43
46
  HVD_LEGISLATION,
@@ -54,13 +57,6 @@ from udata.utils import faker
54
57
 
55
58
  pytestmark = pytest.mark.usefixtures("app")
56
59
 
57
- FREQ_SAMPLE = [
58
- (FREQ.annual, "annual"),
59
- (FREQ.monthly, "monthly"),
60
- (FREQ.daily, "daily"),
61
- (FREQ.continuous, "continuous"),
62
- ]
63
-
64
60
  GOV_UK_REF = "http://reference.data.gov.uk/id/year/2017"
65
61
 
66
62
  try:
@@ -104,7 +100,7 @@ class DatasetToRdfTest:
104
100
  dataset = DatasetFactory(
105
101
  tags=faker.tags(nb=3),
106
102
  resources=resources,
107
- frequency="daily",
103
+ frequency=UpdateFrequency.DAILY,
108
104
  acronym="acro",
109
105
  organization=org,
110
106
  contact_points=[contact],
@@ -178,19 +174,19 @@ class DatasetToRdfTest:
178
174
  assert org_rdf.value(RDF.type).identifier == FOAF.Organization
179
175
  assert org_rdf.value(FOAF.name) == Literal("organization")
180
176
 
181
- def test_map_unkownn_frequencies(self):
182
- assert frequency_to_rdf("hourly") == FREQ.continuous
183
-
184
- assert frequency_to_rdf("fourTimesADay") == FREQ.daily
185
- assert frequency_to_rdf("threeTimesADay") == FREQ.daily
186
- assert frequency_to_rdf("semidaily") == FREQ.daily
187
-
188
- assert frequency_to_rdf("fourTimesAWeek") == FREQ.threeTimesAWeek
177
+ def test_map_null_frequency(self):
178
+ assert frequency_to_rdf(None) is None
189
179
 
190
- assert frequency_to_rdf("punctual") is None
191
- assert frequency_to_rdf("unknown") is None
180
+ @pytest.mark.parametrize("term,freq", FREQ_TERM_TO_UDATA.items())
181
+ def test_map_dublin_core_frequencies(self, term, freq):
182
+ assert frequency_to_rdf(freq) == term
192
183
 
193
- assert frequency_to_rdf("quinquennial") is None # Better idea ?
184
+ @pytest.mark.parametrize(
185
+ "term,freq",
186
+ [(k, v) for k, v in EUFREQ_TERM_TO_UDATA.items() if v not in FREQ_TERM_TO_UDATA.values()],
187
+ )
188
+ def test_map_european_frequencies(self, term, freq):
189
+ assert frequency_to_rdf(freq) == term
194
190
 
195
191
  def test_minimal_resource_fields(self):
196
192
  resource = ResourceFactory()
@@ -462,7 +458,7 @@ class RdfToDatasetTest:
462
458
  g.set((node, DCT.title, Literal(title)))
463
459
  g.set((node, SKOS.altLabel, Literal(acronym)))
464
460
  g.set((node, DCT.description, Literal(description)))
465
- g.set((node, DCT.accrualPeriodicity, FREQ.daily))
461
+ g.set((node, DCT.accrualPeriodicity, EUFREQ.DAILY))
466
462
  pot = BNode()
467
463
  g.add((node, DCT.temporal, pot))
468
464
  g.set((pot, RDF.type, DCT.PeriodOfTime))
@@ -478,7 +474,7 @@ class RdfToDatasetTest:
478
474
  assert dataset.title == title
479
475
  assert dataset.acronym == acronym
480
476
  assert dataset.description == description
481
- assert dataset.frequency == "daily"
477
+ assert dataset.frequency == UpdateFrequency.DAILY
482
478
  assert set(dataset.tags) == set(tags)
483
479
  assert isinstance(dataset.temporal_coverage, db.DateRange)
484
480
  assert dataset.temporal_coverage.start == start
@@ -539,31 +535,34 @@ class RdfToDatasetTest:
539
535
  assert isinstance(dataset, Dataset)
540
536
  assert set(dataset.tags) == set(tags + themes)
541
537
 
542
- @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
538
+ def test_parse_null_frequency(self):
539
+ assert frequency_from_rdf(None) is None
540
+
541
+ @pytest.mark.parametrize("freq,expected", FREQ_TERM_TO_UDATA.items())
543
542
  def test_parse_dublin_core_frequencies(self, freq, expected):
544
543
  assert frequency_from_rdf(freq) == expected
545
544
 
546
- @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
545
+ @pytest.mark.parametrize("freq,expected", FREQ_TERM_TO_UDATA.items())
547
546
  def test_parse_dublin_core_frequencies_as_resource(self, freq, expected):
548
547
  g = Graph()
549
548
  resource = RdfResource(g, freq)
550
549
  assert frequency_from_rdf(resource) == expected
551
550
 
552
- @pytest.mark.parametrize("freq,expected", FREQ_SAMPLE)
551
+ @pytest.mark.parametrize("freq,expected", FREQ_TERM_TO_UDATA.items())
553
552
  def test_parse_dublin_core_frequencies_as_url(self, freq, expected):
554
553
  assert frequency_from_rdf(str(freq)) == expected
555
554
 
556
- @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
555
+ @pytest.mark.parametrize("freq,expected", EUFREQ_TERM_TO_UDATA.items())
557
556
  def test_parse_european_frequencies(self, freq, expected):
558
557
  assert frequency_from_rdf(freq) == expected
559
558
 
560
- @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
559
+ @pytest.mark.parametrize("freq,expected", EUFREQ_TERM_TO_UDATA.items())
561
560
  def test_parse_european_frequencies_as_resource(self, freq, expected):
562
561
  g = Graph()
563
562
  resource = RdfResource(g, freq)
564
563
  assert frequency_from_rdf(resource) == expected
565
564
 
566
- @pytest.mark.parametrize("freq,expected", EU_RDF_REQUENCIES.items())
565
+ @pytest.mark.parametrize("freq,expected", EUFREQ_TERM_TO_UDATA.items())
567
566
  def test_parse_european_frequencies_as_url(self, freq, expected):
568
567
  assert frequency_from_rdf(str(freq)) == expected
569
568