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.
- udata/core/dataset/api.py +2 -2
- udata/core/dataset/api_fields.py +3 -4
- udata/core/dataset/apiv2.py +6 -6
- udata/core/dataset/constants.py +124 -38
- udata/core/dataset/factories.py +2 -1
- udata/core/dataset/forms.py +14 -10
- udata/core/dataset/models.py +8 -36
- udata/core/dataset/rdf.py +76 -54
- udata/core/dataset/tasks.py +4 -9
- udata/harvest/backends/ckan/harvesters.py +10 -14
- udata/harvest/backends/maaf.py +15 -14
- udata/harvest/tests/ckan/test_ckan_backend.py +4 -3
- udata/harvest/tests/test_dcat_backend.py +3 -2
- udata/migrations/2025-09-04-update-legacy-frequencies.py +36 -0
- udata/static/chunks/{11.55ab79044cda0271b595.js → 11.51d706fb9521c16976bc.js} +3 -3
- udata/static/chunks/{11.55ab79044cda0271b595.js.map → 11.51d706fb9521c16976bc.js.map} +1 -1
- udata/static/chunks/{13.d9c1735d14038b94c17e.js → 13.f29411b06be1883356a3.js} +2 -2
- udata/static/chunks/{13.d9c1735d14038b94c17e.js.map → 13.f29411b06be1883356a3.js.map} +1 -1
- udata/static/chunks/{17.81c57c0dedf812e43013.js → 17.3bd0340930d4a314ce9c.js} +2 -2
- udata/static/chunks/{17.81c57c0dedf812e43013.js.map → 17.3bd0340930d4a314ce9c.js.map} +1 -1
- udata/static/chunks/{19.3e0e8651d948e04b8cf2.js → 19.ba0bb2baa40e899d440b.js} +3 -3
- udata/static/chunks/{19.3e0e8651d948e04b8cf2.js.map → 19.ba0bb2baa40e899d440b.js.map} +1 -1
- udata/static/chunks/{8.494b003a94383b142c18.js → 8.b966402f5d680d4bdf4a.js} +2 -2
- udata/static/chunks/{8.494b003a94383b142c18.js.map → 8.b966402f5d680d4bdf4a.js.map} +1 -1
- udata/static/common.js +1 -1
- udata/static/common.js.map +1 -1
- udata/tests/api/test_datasets_api.py +41 -12
- udata/tests/dataset/test_dataset_model.py +17 -53
- udata/tests/dataset/test_dataset_rdf.py +27 -28
- udata/translations/udata.pot +226 -150
- {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/METADATA +1 -1
- {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/RECORD +36 -35
- {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/WHEEL +0 -0
- {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/entry_points.txt +0 -0
- {udata-11.1.2.dev9.dist-info → udata-11.1.2.dev10.dist-info}/licenses/LICENSE +0 -0
- {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,
|
|
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
|
udata/static/common.js.map
CHANGED
|
@@ -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
|
-
|
|
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=
|
|
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"] ==
|
|
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"] ==
|
|
554
|
-
assert response.json["frequency"]["label"] ==
|
|
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"] ==
|
|
576
|
-
assert response.json["frequency"]["label"] ==
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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",
|
|
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
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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=
|
|
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=
|
|
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
|
|
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
|
-
|
|
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=
|
|
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
|
|
182
|
-
assert frequency_to_rdf(
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
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,
|
|
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 ==
|
|
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
|
-
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
|