udata 10.4.2.dev35475__py2.py3-none-any.whl → 10.4.3__py2.py3-none-any.whl

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

Potentially problematic release.


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

Files changed (62) hide show
  1. udata/__init__.py +1 -1
  2. udata/api_fields.py +27 -2
  3. udata/commands/fixtures.py +11 -1
  4. udata/core/dataservices/api.py +12 -10
  5. udata/core/dataservices/apiv2.py +4 -1
  6. udata/core/dataservices/constants.py +19 -0
  7. udata/core/dataservices/models.py +54 -1
  8. udata/core/dataset/api.py +33 -27
  9. udata/core/dataset/api_fields.py +21 -0
  10. udata/core/dataset/apiv2.py +14 -11
  11. udata/core/dataset/models.py +60 -15
  12. udata/core/dataset/rdf.py +1 -1
  13. udata/core/dataset/tasks.py +3 -2
  14. udata/core/organization/api.py +11 -0
  15. udata/core/organization/models.py +29 -2
  16. udata/core/reuse/api.py +4 -5
  17. udata/core/reuse/api_fields.py +8 -0
  18. udata/core/reuse/apiv2.py +2 -0
  19. udata/core/reuse/models.py +18 -1
  20. udata/core/spatial/models.py +9 -0
  21. udata/core/user/models.py +11 -5
  22. udata/harvest/api.py +2 -1
  23. udata/harvest/tests/dcat/bnodes.xml +5 -0
  24. udata/harvest/tests/test_dcat_backend.py +1 -0
  25. udata/migrations/2025-06-18-clean-spatial-coverages.py +25 -0
  26. udata/static/chunks/{11.0f04e49a40a0a381bcce.js → 11.b6f741fcc366abfad9c4.js} +3 -3
  27. udata/static/chunks/{11.0f04e49a40a0a381bcce.js.map → 11.b6f741fcc366abfad9c4.js.map} +1 -1
  28. udata/static/chunks/{13.d9c1735d14038b94c17e.js → 13.2d06442dd9a05d9777b5.js} +2 -2
  29. udata/static/chunks/{13.d9c1735d14038b94c17e.js.map → 13.2d06442dd9a05d9777b5.js.map} +1 -1
  30. udata/static/chunks/{17.81c57c0dedf812e43013.js → 17.e8e4caaad5cb0cc0bacc.js} +2 -2
  31. udata/static/chunks/{17.81c57c0dedf812e43013.js.map → 17.e8e4caaad5cb0cc0bacc.js.map} +1 -1
  32. udata/static/chunks/{19.8da42e8359d72afc2618.js → 19.f03a102365af4315f9db.js} +3 -3
  33. udata/static/chunks/{19.8da42e8359d72afc2618.js.map → 19.f03a102365af4315f9db.js.map} +1 -1
  34. udata/static/chunks/{8.494b003a94383b142c18.js → 8.778091d55cd8ea39af6b.js} +2 -2
  35. udata/static/chunks/{8.494b003a94383b142c18.js.map → 8.778091d55cd8ea39af6b.js.map} +1 -1
  36. udata/static/common.js +1 -1
  37. udata/static/common.js.map +1 -1
  38. udata/tests/api/test_dataservices_api.py +78 -0
  39. udata/tests/api/test_follow_api.py +20 -0
  40. udata/tests/api/test_organizations_api.py +25 -0
  41. udata/tests/test_api_fields.py +35 -0
  42. udata/translations/ar/LC_MESSAGES/udata.mo +0 -0
  43. udata/translations/ar/LC_MESSAGES/udata.po +98 -38
  44. udata/translations/de/LC_MESSAGES/udata.mo +0 -0
  45. udata/translations/de/LC_MESSAGES/udata.po +98 -38
  46. udata/translations/es/LC_MESSAGES/udata.mo +0 -0
  47. udata/translations/es/LC_MESSAGES/udata.po +98 -38
  48. udata/translations/fr/LC_MESSAGES/udata.mo +0 -0
  49. udata/translations/fr/LC_MESSAGES/udata.po +98 -38
  50. udata/translations/it/LC_MESSAGES/udata.mo +0 -0
  51. udata/translations/it/LC_MESSAGES/udata.po +98 -38
  52. udata/translations/pt/LC_MESSAGES/udata.mo +0 -0
  53. udata/translations/pt/LC_MESSAGES/udata.po +98 -38
  54. udata/translations/sr/LC_MESSAGES/udata.mo +0 -0
  55. udata/translations/sr/LC_MESSAGES/udata.po +98 -38
  56. udata/translations/udata.pot +98 -38
  57. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/METADATA +16 -4
  58. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/RECORD +62 -61
  59. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/LICENSE +0 -0
  60. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/WHEEL +0 -0
  61. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/entry_points.txt +0 -0
  62. {udata-10.4.2.dev35475.dist-info → udata-10.4.3.dist-info}/top_level.txt +0 -0
udata/static/common.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,d){for(var t,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(t in d){var i=d[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,d){e[r].apply(this,[c,f,d].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,d);n.length;)n.shift().call(null,__webpack_require__);if(d[0])return a[0]=0,__webpack_require__(0)};var a={},r={31:0};__webpack_require__.e=function(e,c){if(0===r[e])return c.call(null,__webpack_require__);if(void 0!==r[e])r[e].push(c);else{r[e]=[c];var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.src=__webpack_require__.p+"chunks/"+e+"."+{0:"4dd4f378428d1eed85c8",1:"0a96f54313c89e541ccb",2:"c67aa76cc078c193aed5",3:"174a03e48d267820919b",4:"98dca3045c034c154d5f",5:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"494b003a94383b142c18",9:"033d7e190ca9e226a5d0",10:"8ca60413647062717b1e",11:"0f04e49a40a0a381bcce",12:"1be61e0201691821bff6",13:"d9c1735d14038b94c17e",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"81c57c0dedf812e43013",18:"56444ebd2456a4ba2201",19:"8da42e8359d72afc2618",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
1
+ !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,d){for(var t,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(t in d){var i=d[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,d){e[r].apply(this,[c,f,d].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,d);n.length;)n.shift().call(null,__webpack_require__);if(d[0])return a[0]=0,__webpack_require__(0)};var a={},r={31:0};__webpack_require__.e=function(e,c){if(0===r[e])return c.call(null,__webpack_require__);if(void 0!==r[e])r[e].push(c);else{r[e]=[c];var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.src=__webpack_require__.p+"chunks/"+e+"."+{0:"4dd4f378428d1eed85c8",1:"0a96f54313c89e541ccb",2:"c67aa76cc078c193aed5",3:"174a03e48d267820919b",4:"98dca3045c034c154d5f",5:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"778091d55cd8ea39af6b",9:"033d7e190ca9e226a5d0",10:"8ca60413647062717b1e",11:"b6f741fcc366abfad9c4",12:"1be61e0201691821bff6",13:"2d06442dd9a05d9777b5",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"e8e4caaad5cb0cc0bacc",18:"56444ebd2456a4ba2201",19:"f03a102365af4315f9db",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
2
2
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 496b4fb3bcc208e01bbb"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","parentJsonpFunction","window","chunkIds","moreModules","chunkId","i","callbacks","length","installedChunks","push","apply","_m","args","slice","templateId","a","b","c","this","concat","shift","31","e","callback","undefined","head","document","getElementsByTagName","script","createElement","type","charset","async","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","32","33","appendChild","m","Object","prototype","hasOwnProperty","fn"],"mappings":"CAAS,SAAUA,GCwDnB,QAAAC,qBAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,qBAGAI,EAAAE,QAAA,EAGAF,EAAAD,QA3EA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,GAIA,IADA,GAAAV,GAAAW,EAAAC,EAAA,EAAAC,KACQD,EAAAH,EAAAK,OAAoBF,IAC5BD,EAAAF,EAAAG,GACAG,EAAAJ,IACAE,EAAAG,KAAAC,MAAAJ,EAAAE,EAAAJ,IACAI,EAAAJ,GAAA,CAEA,KAAAX,IAAAU,GAAA,CACA,GAAAQ,GAAAR,EAAAV,EAGA,cAAAkB,IACA,aAEApB,EAAAE,GAAA,SAAAkB,GACA,GAAAC,GAAAD,EAAAE,MAAA,GAAAC,EAAAH,EAAA,EACA,iBAAAI,EAAAC,EAAAC,GACA1B,EAAAuB,GAAAJ,MAAAQ,MAAAH,EAAAC,EAAAC,GAAAE,OAAAP,MAEMD,EACN,MACA,gBAEApB,EAAAE,GAAAkB,CACA,MACA,SAEApB,EAAAE,GAAAF,EAAAoB,IAKA,IADAX,KAAAE,EAAAC,GACAG,EAAAC,QACAD,EAAAc,QAAArB,KAAA,KAAAP,oBACA,IAAAW,EAAA,GAEA,MADAT,GAAA,KACAF,oBAAA,GAKA,IAAAE,MAKAc,GACAa,GAAA,EA6BA7B,qBAAA8B,EAAA,SAAAlB,EAAAmB,GAEA,OAAAf,EAAAJ,GACA,MAAAmB,GAAAxB,KAAA,KAAAP,oBAGA,IAAAgC,SAAAhB,EAAAJ,GACAI,EAAAJ,GAAAK,KAAAc,OACI,CAEJf,EAAAJ,IAAAmB,EACA,IAAAE,GAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,SACAD,GAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EAEAJ,EAAAK,IAAAzC,oBAAA0C,EAAA,UAAA9B,EAAA,KAAsE+B,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAk5B/D,GAAA,MACx9BqB,EAAA2C,YAAAxC,KAKApC,oBAAA6E,EAAA9E,EAGAC,oBAAAyB,EAAAvB,EAGAF,oBAAA0C,EAAA,YDIW,SAAS3C,GAEnB,IAAI,GAAIc,KAAKd,GACZ,GAAG+E,OAAOC,UAAUC,eAAezE,KAAKR,EAASc,GAChD,aAAcd,GAAQc,IACtB,IAAK,WAAY,KACjB,KAAK,SAEJd,EAAQc,GAAM,SAASM,GACtB,GAAIC,GAAOD,EAAGE,MAAM,GAAI4D,EAAKlF,EAAQoB,EAAG,GACxC,OAAO,UAAUI,EAAEC,EAAEC,GACpBwD,EAAG/D,MAAMQ,MAAOH,EAAEC,EAAEC,GAAGE,OAAOP,MAE9BrB,EAAQc,GACV,MACD,SAECd,EAAQc,GAAKd,EAAQA,EAAQc,IAKhC,MAAOd","file":"common.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tvar _m = moreModules[moduleId];\n/******/\n/******/ \t\t\t// Check if module is deduplicated\n/******/ \t\t\tswitch(typeof _m) {\n/******/ \t\t\tcase \"object\":\n/******/ \t\t\t\t// Module can be created from a template\n/******/ \t\t\t\tmodules[moduleId] = (function(_m) {\n/******/ \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n/******/ \t\t\t\t\treturn function (a,b,c) {\n/******/ \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}(_m));\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tcase \"function\":\n/******/ \t\t\t\t// Normal module\n/******/ \t\t\t\tmodules[moduleId] = _m;\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tdefault:\n/******/ \t\t\t\t// Module is a copy of another module\n/******/ \t\t\t\tmodules[moduleId] = modules[_m];\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n/******/ \t\twhile(callbacks.length)\n/******/ \t\t\tcallbacks.shift().call(null, __webpack_require__);\n/******/ \t\tif(moreModules[0]) {\n/******/ \t\t\tinstalledModules[0] = 0;\n/******/ \t\t\treturn __webpack_require__(0);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \t// Array means \"loading\", array contains callbacks\n/******/ \tvar installedChunks = {\n/******/ \t\t31:0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n/******/ \t\t// \"0\" is the signal for \"already loaded\"\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn callback.call(null, __webpack_require__);\n/******/\n/******/ \t\t// an array means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId] !== undefined) {\n/******/ \t\t\tinstalledChunks[chunkId].push(callback);\n/******/ \t\t} else {\n/******/ \t\t\t// start chunk loading\n/******/ \t\t\tinstalledChunks[chunkId] = [callback];\n/******/ \t\t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\t\tvar script = document.createElement('script');\n/******/ \t\t\tscript.type = 'text/javascript';\n/******/ \t\t\tscript.charset = 'utf-8';\n/******/ \t\t\tscript.async = true;\n/******/\n/******/ \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"494b003a94383b142c18\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"0f04e49a40a0a381bcce\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"8da42e8359d72afc2618\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[chunkId] + \".js\";\n/******/ \t\t\thead.appendChild(script);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/ })\n/************************************************************************/\n/******/ ((function(modules) {\n\t// Check all modules for deduplicated modules\n\tfor(var i in modules) {\n\t\tif(Object.prototype.hasOwnProperty.call(modules, i)) {\n\t\t\tswitch(typeof modules[i]) {\n\t\t\tcase \"function\": break;\n\t\t\tcase \"object\":\n\t\t\t\t// Module can be created from a template\n\t\t\t\tmodules[i] = (function(_m) {\n\t\t\t\t\tvar args = _m.slice(1), fn = modules[_m[0]];\n\t\t\t\t\treturn function (a,b,c) {\n\t\t\t\t\t\tfn.apply(this, [a,b,c].concat(args));\n\t\t\t\t\t};\n\t\t\t\t}(modules[i]));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Module is a copy of another module\n\t\t\t\tmodules[i] = modules[modules[i]];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn modules;\n}([])));\n\n\n/** WEBPACK FOOTER **\n ** common.js\n **/"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tvar _m = moreModules[moduleId];\n\n \t\t\t// Check if module is deduplicated\n \t\t\tswitch(typeof _m) {\n \t\t\tcase \"object\":\n \t\t\t\t// Module can be created from a template\n \t\t\t\tmodules[moduleId] = (function(_m) {\n \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n \t\t\t\t\treturn function (a,b,c) {\n \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n \t\t\t\t\t};\n \t\t\t\t}(_m));\n \t\t\t\tbreak;\n \t\t\tcase \"function\":\n \t\t\t\t// Normal module\n \t\t\t\tmodules[moduleId] = _m;\n \t\t\t\tbreak;\n \t\t\tdefault:\n \t\t\t\t// Module is a copy of another module\n \t\t\t\tmodules[moduleId] = modules[_m];\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t31:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"494b003a94383b142c18\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"0f04e49a40a0a381bcce\",\"12\":\"1be61e0201691821bff6\",\"13\":\"d9c1735d14038b94c17e\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"81c57c0dedf812e43013\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"8da42e8359d72afc2618\",\"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 496b4fb3bcc208e01bbb\n **/"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 44a61f162b1337addb9e"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","parentJsonpFunction","window","chunkIds","moreModules","chunkId","i","callbacks","length","installedChunks","push","apply","_m","args","slice","templateId","a","b","c","this","concat","shift","31","e","callback","undefined","head","document","getElementsByTagName","script","createElement","type","charset","async","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","32","33","appendChild","m","Object","prototype","hasOwnProperty","fn"],"mappings":"CAAS,SAAUA,GCwDnB,QAAAC,qBAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,qBAGAI,EAAAE,QAAA,EAGAF,EAAAD,QA3EA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,GAIA,IADA,GAAAV,GAAAW,EAAAC,EAAA,EAAAC,KACQD,EAAAH,EAAAK,OAAoBF,IAC5BD,EAAAF,EAAAG,GACAG,EAAAJ,IACAE,EAAAG,KAAAC,MAAAJ,EAAAE,EAAAJ,IACAI,EAAAJ,GAAA,CAEA,KAAAX,IAAAU,GAAA,CACA,GAAAQ,GAAAR,EAAAV,EAGA,cAAAkB,IACA,aAEApB,EAAAE,GAAA,SAAAkB,GACA,GAAAC,GAAAD,EAAAE,MAAA,GAAAC,EAAAH,EAAA,EACA,iBAAAI,EAAAC,EAAAC,GACA1B,EAAAuB,GAAAJ,MAAAQ,MAAAH,EAAAC,EAAAC,GAAAE,OAAAP,MAEMD,EACN,MACA,gBAEApB,EAAAE,GAAAkB,CACA,MACA,SAEApB,EAAAE,GAAAF,EAAAoB,IAKA,IADAX,KAAAE,EAAAC,GACAG,EAAAC,QACAD,EAAAc,QAAArB,KAAA,KAAAP,oBACA,IAAAW,EAAA,GAEA,MADAT,GAAA,KACAF,oBAAA,GAKA,IAAAE,MAKAc,GACAa,GAAA,EA6BA7B,qBAAA8B,EAAA,SAAAlB,EAAAmB,GAEA,OAAAf,EAAAJ,GACA,MAAAmB,GAAAxB,KAAA,KAAAP,oBAGA,IAAAgC,SAAAhB,EAAAJ,GACAI,EAAAJ,GAAAK,KAAAc,OACI,CAEJf,EAAAJ,IAAAmB,EACA,IAAAE,GAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,SACAD,GAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EAEAJ,EAAAK,IAAAzC,oBAAA0C,EAAA,UAAA9B,EAAA,KAAsE+B,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAk5B/D,GAAA,MACx9BqB,EAAA2C,YAAAxC,KAKApC,oBAAA6E,EAAA9E,EAGAC,oBAAAyB,EAAAvB,EAGAF,oBAAA0C,EAAA,YDIW,SAAS3C,GAEnB,IAAI,GAAIc,KAAKd,GACZ,GAAG+E,OAAOC,UAAUC,eAAezE,KAAKR,EAASc,GAChD,aAAcd,GAAQc,IACtB,IAAK,WAAY,KACjB,KAAK,SAEJd,EAAQc,GAAM,SAASM,GACtB,GAAIC,GAAOD,EAAGE,MAAM,GAAI4D,EAAKlF,EAAQoB,EAAG,GACxC,OAAO,UAAUI,EAAEC,EAAEC,GACpBwD,EAAG/D,MAAMQ,MAAOH,EAAEC,EAAEC,GAAGE,OAAOP,MAE9BrB,EAAQc,GACV,MACD,SAECd,EAAQc,GAAKd,EAAQA,EAAQc,IAKhC,MAAOd","file":"common.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tvar _m = moreModules[moduleId];\n/******/\n/******/ \t\t\t// Check if module is deduplicated\n/******/ \t\t\tswitch(typeof _m) {\n/******/ \t\t\tcase \"object\":\n/******/ \t\t\t\t// Module can be created from a template\n/******/ \t\t\t\tmodules[moduleId] = (function(_m) {\n/******/ \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n/******/ \t\t\t\t\treturn function (a,b,c) {\n/******/ \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}(_m));\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tcase \"function\":\n/******/ \t\t\t\t// Normal module\n/******/ \t\t\t\tmodules[moduleId] = _m;\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tdefault:\n/******/ \t\t\t\t// Module is a copy of another module\n/******/ \t\t\t\tmodules[moduleId] = modules[_m];\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n/******/ \t\twhile(callbacks.length)\n/******/ \t\t\tcallbacks.shift().call(null, __webpack_require__);\n/******/ \t\tif(moreModules[0]) {\n/******/ \t\t\tinstalledModules[0] = 0;\n/******/ \t\t\treturn __webpack_require__(0);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \t// Array means \"loading\", array contains callbacks\n/******/ \tvar installedChunks = {\n/******/ \t\t31:0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n/******/ \t\t// \"0\" is the signal for \"already loaded\"\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn callback.call(null, __webpack_require__);\n/******/\n/******/ \t\t// an array means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId] !== undefined) {\n/******/ \t\t\tinstalledChunks[chunkId].push(callback);\n/******/ \t\t} else {\n/******/ \t\t\t// start chunk loading\n/******/ \t\t\tinstalledChunks[chunkId] = [callback];\n/******/ \t\t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\t\tvar script = document.createElement('script');\n/******/ \t\t\tscript.type = 'text/javascript';\n/******/ \t\t\tscript.charset = 'utf-8';\n/******/ \t\t\tscript.async = true;\n/******/\n/******/ \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[chunkId] + \".js\";\n/******/ \t\t\thead.appendChild(script);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/ })\n/************************************************************************/\n/******/ ((function(modules) {\n\t// Check all modules for deduplicated modules\n\tfor(var i in modules) {\n\t\tif(Object.prototype.hasOwnProperty.call(modules, i)) {\n\t\t\tswitch(typeof modules[i]) {\n\t\t\tcase \"function\": break;\n\t\t\tcase \"object\":\n\t\t\t\t// Module can be created from a template\n\t\t\t\tmodules[i] = (function(_m) {\n\t\t\t\t\tvar args = _m.slice(1), fn = modules[_m[0]];\n\t\t\t\t\treturn function (a,b,c) {\n\t\t\t\t\t\tfn.apply(this, [a,b,c].concat(args));\n\t\t\t\t\t};\n\t\t\t\t}(modules[i]));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Module is a copy of another module\n\t\t\t\tmodules[i] = modules[modules[i]];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn modules;\n}([])));\n\n\n/** WEBPACK FOOTER **\n ** common.js\n **/"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tvar _m = moreModules[moduleId];\n\n \t\t\t// Check if module is deduplicated\n \t\t\tswitch(typeof _m) {\n \t\t\tcase \"object\":\n \t\t\t\t// Module can be created from a template\n \t\t\t\tmodules[moduleId] = (function(_m) {\n \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n \t\t\t\t\treturn function (a,b,c) {\n \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n \t\t\t\t\t};\n \t\t\t\t}(_m));\n \t\t\t\tbreak;\n \t\t\tcase \"function\":\n \t\t\t\t// Normal module\n \t\t\t\tmodules[moduleId] = _m;\n \t\t\t\tbreak;\n \t\t\tdefault:\n \t\t\t\t// Module is a copy of another module\n \t\t\t\tmodules[moduleId] = modules[_m];\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t31:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[chunkId] + \".js\";\n \t\t\thead.appendChild(script);\n \t\t}\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 44a61f162b1337addb9e\n **/"],"sourceRoot":""}
@@ -8,6 +8,10 @@ from werkzeug.test import TestResponse
8
8
 
9
9
  import udata.core.organization.constants as org_constants
10
10
  from udata.core.dataservices.constants import (
11
+ DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
12
+ DATASERVICE_ACCESS_AUDIENCE_COMPANY,
13
+ DATASERVICE_ACCESS_AUDIENCE_UNDER_CONDITIONS,
14
+ DATASERVICE_ACCESS_AUDIENCE_YES,
11
15
  DATASERVICE_ACCESS_TYPE_OPEN,
12
16
  DATASERVICE_ACCESS_TYPE_OPEN_WITH_ACCOUNT,
13
17
  DATASERVICE_ACCESS_TYPE_RESTRICTED,
@@ -127,6 +131,17 @@ class DataserviceAPITest(APITestCase):
127
131
  "extras": {
128
132
  "foo": "bar",
129
133
  },
134
+ "access_type": DATASERVICE_ACCESS_TYPE_RESTRICTED,
135
+ "access_audiences": [
136
+ {
137
+ "role": DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
138
+ "condition": DATASERVICE_ACCESS_AUDIENCE_YES,
139
+ },
140
+ {
141
+ "role": DATASERVICE_ACCESS_AUDIENCE_COMPANY,
142
+ "condition": DATASERVICE_ACCESS_AUDIENCE_UNDER_CONDITIONS,
143
+ },
144
+ ],
130
145
  },
131
146
  )
132
147
  self.assert200(response)
@@ -140,6 +155,21 @@ class DataserviceAPITest(APITestCase):
140
155
  self.assertEqual(
141
156
  response.json["self_api_url"], "http://local.test/api/1/dataservices/updated-title/"
142
157
  )
158
+ self.assertEqual(response.json["access_type"], DATASERVICE_ACCESS_TYPE_RESTRICTED)
159
+ self.assertEqual(len(response.json["access_audiences"]), 2)
160
+ self.assertEqual(
161
+ response.json["access_audiences"][0]["role"], DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION
162
+ )
163
+ self.assertEqual(
164
+ response.json["access_audiences"][0]["condition"], DATASERVICE_ACCESS_AUDIENCE_YES
165
+ )
166
+ self.assertEqual(
167
+ response.json["access_audiences"][1]["role"], DATASERVICE_ACCESS_AUDIENCE_COMPANY
168
+ )
169
+ self.assertEqual(
170
+ response.json["access_audiences"][1]["condition"],
171
+ DATASERVICE_ACCESS_AUDIENCE_UNDER_CONDITIONS,
172
+ )
143
173
  # metadata_modified_at should have been updated during the patch
144
174
  self.assertNotEqual(
145
175
  response.json["metadata_modified_at"].split("+")[0],
@@ -550,6 +580,54 @@ class DataserviceAPITest(APITestCase):
550
580
  self.assertEqual(dataservice.owner, None)
551
581
  self.assertEqual(dataservice.organization.id, me_org.id)
552
582
 
583
+ def test_dataservice_api_create_with_multiple_conditions_for_a_role(self):
584
+ """It shouldn't create a dataservice with multiple conditions for the same role"""
585
+ self.login()
586
+
587
+ response = self.post(
588
+ url_for("api.dataservices"),
589
+ {
590
+ "title": "My title",
591
+ "base_api_url": "https://example.org",
592
+ "access_type": DATASERVICE_ACCESS_TYPE_RESTRICTED,
593
+ "access_audiences": [
594
+ {
595
+ "role": DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
596
+ "condition": DATASERVICE_ACCESS_AUDIENCE_YES,
597
+ },
598
+ {
599
+ "role": DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
600
+ "condition": DATASERVICE_ACCESS_AUDIENCE_UNDER_CONDITIONS,
601
+ },
602
+ ],
603
+ },
604
+ )
605
+ self.assert400(response)
606
+ self.assertEqual(Dataservice.objects.count(), 0)
607
+
608
+ def test_dataservice_api_multiple_conditions_for_a_role(self):
609
+ """It shouldn't update the dataservice with multiple conditions for the same role"""
610
+ user = self.login()
611
+ original_member = Member(user=user, role="editor")
612
+ original_org = OrganizationFactory(members=[original_member])
613
+ dataservice = DataserviceFactory(owner=user, organization=original_org)
614
+
615
+ data = dataservice.to_dict()
616
+ data["access_type"] = DATASERVICE_ACCESS_TYPE_RESTRICTED
617
+ data["access_audiences"] = [
618
+ {
619
+ "role": DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
620
+ "condition": DATASERVICE_ACCESS_AUDIENCE_YES,
621
+ },
622
+ {
623
+ "role": DATASERVICE_ACCESS_AUDIENCE_ADMINISTRATION,
624
+ "condition": DATASERVICE_ACCESS_AUDIENCE_UNDER_CONDITIONS,
625
+ },
626
+ ]
627
+ response = self.patch(url_for("api.dataservice", dataservice=dataservice), data)
628
+ self.assert400(response)
629
+ self.assertEqual(Dataservice.objects.count(), 1)
630
+
553
631
  def test_dataservice_api_update_org(self):
554
632
  """It shouldn't update the dataservice org"""
555
633
  user = self.login()
@@ -1,6 +1,7 @@
1
1
  from flask import url_for
2
2
 
3
3
  from udata.api import api
4
+ from udata.core.dataset.factories import DatasetFactory
4
5
  from udata.core.followers.api import FollowAPI
5
6
  from udata.core.followers.signals import on_follow, on_unfollow
6
7
  from udata.core.user.factories import UserFactory
@@ -139,3 +140,22 @@ class FollowAPITest(APITestCase):
139
140
 
140
141
  response = self.delete(url_for("api.follow_fake", id=to_follow.id))
141
142
  self.assert404(response)
143
+
144
+ def test_get_followed_datasets_for_user(self):
145
+ user_a = UserFactory()
146
+ user_b = UserFactory()
147
+ dataset_a = DatasetFactory()
148
+ dataset_b = DatasetFactory()
149
+ dataset_c = DatasetFactory()
150
+
151
+ Follow.objects.create(follower=user_a, following=dataset_a)
152
+ Follow.objects.create(follower=user_a, following=dataset_b)
153
+ Follow.objects.create(follower=user_b, following=dataset_a)
154
+ Follow.objects.create(follower=user_b, following=dataset_b)
155
+ Follow.objects.create(follower=user_b, following=dataset_c)
156
+
157
+ response = self.get(url_for("api.datasets", followed_by=user_a.id))
158
+ self.assertEqual(response.json["total"], 2)
159
+
160
+ response = self.get(url_for("api.datasets", followed_by=user_b.id))
161
+ self.assertEqual(response.json["total"], 3)
@@ -8,6 +8,7 @@ import udata.core.organization.constants as org_constants
8
8
  from udata.core import csv
9
9
  from udata.core.badges.factories import badge_factory
10
10
  from udata.core.badges.signals import on_badge_added, on_badge_removed
11
+ from udata.core.dataservices.factories import DataserviceFactory
11
12
  from udata.core.dataset.factories import DatasetFactory, ResourceFactory
12
13
  from udata.core.discussions.factories import DiscussionFactory
13
14
  from udata.core.organization.factories import OrganizationFactory
@@ -1042,6 +1043,30 @@ class OrganizationCsvExportsTest:
1042
1043
  assert str(hidden_dataset.id) not in dataset_ids
1043
1044
  assert str(not_org_dataset.id) not in dataset_ids
1044
1045
 
1046
+ def test_dataservices_csv(self, api):
1047
+ org = OrganizationFactory()
1048
+ [DataserviceFactory(organization=org) for _ in range(3)]
1049
+
1050
+ response = api.get(url_for("api.organization_dataservices_csv", org=org))
1051
+
1052
+ assert200(response)
1053
+ assert response.mimetype == "text/csv"
1054
+ assert response.charset == "utf-8"
1055
+
1056
+ csvfile = StringIO(response.data.decode("utf-8"))
1057
+ reader = csv.get_reader(csvfile)
1058
+ header = next(reader)
1059
+
1060
+ assert header[0] == "id"
1061
+ assert "title" in header
1062
+ assert "url" in header
1063
+ assert "description" in header
1064
+ assert "created_at" in header
1065
+ assert "metadata_modified_at" in header
1066
+ assert "tags" in header
1067
+ assert "metric.views" in header
1068
+ assert "datasets" in header
1069
+
1045
1070
  def test_discussions_csv_content_empty(self, api):
1046
1071
  organization = OrganizationFactory()
1047
1072
  response = api.get(url_for("api.organization_discussions_csv", org=organization))
@@ -45,6 +45,19 @@ class FakeBadgeMixin(BadgeMixin):
45
45
  __badges__ = BADGES
46
46
 
47
47
 
48
+ @generate_fields()
49
+ class FakeEmbedded(db.EmbeddedDocument):
50
+ title = field(
51
+ db.StringField(required=True),
52
+ sortable=True,
53
+ show_as_ref=True,
54
+ )
55
+ description = field(
56
+ db.StringField(required=True),
57
+ markdown=True,
58
+ )
59
+
60
+
48
61
  @generate_fields(
49
62
  searchable=True,
50
63
  additional_sorts=[
@@ -113,6 +126,8 @@ class Fake(WithMetrics, FakeBadgeMixin, Owned, db.Document):
113
126
  db.DateTimeField(),
114
127
  )
115
128
 
129
+ embedded = field(db.EmbeddedDocumentField(FakeEmbedded))
130
+
116
131
  def __str__(self) -> str:
117
132
  return self.title or ""
118
133
 
@@ -228,6 +243,26 @@ class PatchTest:
228
243
  patch_and_save(fake, fake_request)
229
244
 
230
245
 
246
+ class PatchEmbeddedTest:
247
+ class FakeRequest:
248
+ json = {
249
+ "url": URL_RAISE_ERROR,
250
+ "description": "desc",
251
+ "embedded": {"title": "embedded title", "description": "d2"},
252
+ }
253
+
254
+ def test_patch_check(self) -> None:
255
+ fake: Fake = FakeFactory.create()
256
+ with pytest.raises(ValueError, match=URL_EXISTS_ERROR_MESSAGE):
257
+ patch(fake, self.FakeRequest())
258
+
259
+ def test_patch_and_save(self) -> None:
260
+ fake: Fake = FakeFactory.create()
261
+ fake_request = self.FakeRequest()
262
+ fake_request.json["url"] = "ok url"
263
+ patch_and_save(fake, fake_request)
264
+
265
+
231
266
  class ApplySortAndFiltersTest:
232
267
  def test_filterable_field(self, app) -> None:
233
268
  """A filterable field filters the results."""
Binary file
@@ -2,8 +2,8 @@ msgid ""
2
2
  msgstr ""
3
3
  "Project-Id-Version: udata\n"
4
4
  "Report-Msgid-Bugs-To: i18n@opendata.team\n"
5
- "POT-Creation-Date: 2025-04-30 14:18+0200\n"
6
- "PO-Revision-Date: 2025-04-30 12:35\n"
5
+ "POT-Creation-Date: 2025-06-23 10:12+0200\n"
6
+ "PO-Revision-Date: 2025-06-23 09:34\n"
7
7
  "Last-Translator: Open Data Team <i18n@opendata.team>\n"
8
8
  "Language: ar\n"
9
9
  "Language-Team: Arabic\n"
@@ -51,7 +51,7 @@ msgstr ""
51
51
  msgid "Invalid URL \"{url}\": {reason}"
52
52
  msgstr ""
53
53
 
54
- #: udata/tests/api/test_datasets_api.py:1029 udata/tests/test_model.py:403
54
+ #: udata/tests/api/test_datasets_api.py:1113 udata/tests/test_model.py:403
55
55
  #: udata/uris.py:55
56
56
  #, python-brace-format
57
57
  msgid "Invalid URL \"{url}\""
@@ -208,7 +208,7 @@ msgid "Your udata instance is ready!"
208
208
  msgstr ""
209
209
 
210
210
  #: udata/core/owned.py:64 udata/forms/fields.py:752
211
- #: udata/tests/api/test_dataservices_api.py:474
211
+ #: udata/tests/api/test_dataservices_api.py:540
212
212
  msgid "You can only set yourself as owner"
213
213
  msgstr "يمكنك تعيين نفسك فقط كمالك"
214
214
 
@@ -217,7 +217,7 @@ msgid "Unknown organization"
217
217
  msgstr ""
218
218
 
219
219
  #: udata/core/owned.py:77 udata/forms/fields.py:784
220
- #: udata/tests/api/test_dataservices_api.py:487
220
+ #: udata/tests/api/test_dataservices_api.py:553
221
221
  msgid "Permission denied for this organization"
222
222
  msgstr "تم رفض الإذن لهذه المؤسسة"
223
223
 
@@ -275,16 +275,36 @@ msgstr ""
275
275
  msgid "At least an email or a contact form is required for a contact point"
276
276
  msgstr ""
277
277
 
278
- #: udata/core/dataservices/models.py:120
278
+ #: udata/core/dataservices/activities.py:21
279
+ msgid "created a dataservice"
280
+ msgstr ""
281
+
282
+ #: udata/core/dataservices/activities.py:27
283
+ msgid "updated a dataservice"
284
+ msgstr ""
285
+
286
+ #: udata/core/dataservices/activities.py:34
287
+ msgid "deleted a dataservice"
288
+ msgstr ""
289
+
290
+ #: udata/core/dataservices/api.py:62
291
+ msgid "Latest APIs"
292
+ msgstr ""
293
+
294
+ #: udata/core/dataservices/models.py:128
295
+ msgid "You can only set one condition for a given access audience role"
296
+ msgstr ""
297
+
298
+ #: udata/core/dataservices/models.py:158
279
299
  msgid "dataservice"
280
300
  msgstr ""
281
301
 
282
- #: udata/core/dataservices/models.py:194 udata/core/dataset/models.py:575
302
+ #: udata/core/dataservices/models.py:240 udata/core/dataset/models.py:585
283
303
  #: udata/mongo/datetime_fields.py:60
284
304
  msgid "Creation date"
285
305
  msgstr "تاريخ الإنشاء"
286
306
 
287
- #: udata/core/dataservices/models.py:200 udata/core/dataset/models.py:578
307
+ #: udata/core/dataservices/models.py:246 udata/core/dataset/models.py:590
288
308
  #: udata/mongo/datetime_fields.py:66
289
309
  msgid "Last modification date"
290
310
  msgstr "تاريخ التعديل الأخير"
@@ -301,6 +321,22 @@ msgstr "قام بتحديث مجموعة بيانات"
301
321
  msgid "deleted a dataset"
302
322
  msgstr "قام بحذف مجموعة بيانات"
303
323
 
324
+ #: udata/core/dataset/activities.py:41
325
+ msgid "added a resource to a dataset"
326
+ msgstr ""
327
+
328
+ #: udata/core/dataset/activities.py:47
329
+ msgid "updated a resource"
330
+ msgstr ""
331
+
332
+ #: udata/core/dataset/activities.py:53
333
+ msgid "removed a resource from a dataset"
334
+ msgstr ""
335
+
336
+ #: udata/core/dataset/api.py:321
337
+ msgid "Latest datasets"
338
+ msgstr ""
339
+
304
340
  #: udata/core/dataset/constants.py:10
305
341
  msgid "Unknown"
306
342
  msgstr "غير معروف"
@@ -507,7 +543,7 @@ msgstr "حجم الملف بالبايت"
507
543
  msgid "Related dataset"
508
544
  msgstr "مجموعة البيانات متعلقة"
509
545
 
510
- #: udata/core/dataset/forms.py:138 udata/tests/api/test_datasets_api.py:941
546
+ #: udata/core/dataset/forms.py:138 udata/tests/api/test_datasets_api.py:1025
511
547
  msgid "Wrong contact point id or contact point ownership mismatch"
512
548
  msgstr ""
513
549
 
@@ -573,36 +609,36 @@ msgstr "خاص"
573
609
  msgid "Restrict the dataset visibility to you or your organization only."
574
610
  msgstr "قم بتقييد رؤية البيانات لك أو لمؤسستك فقط."
575
611
 
576
- #: udata/core/dataset/models.py:61
612
+ #: udata/core/dataset/models.py:63
577
613
  msgid "Pivotal data"
578
614
  msgstr "بيانات محورية"
579
615
 
580
- #: udata/core/dataset/models.py:137
616
+ #: udata/core/dataset/models.py:139
581
617
  msgid "A schema must contains a name or an URL when a version is provided."
582
618
  msgstr ""
583
619
 
584
- #: udata/core/dataset/models.py:169 udata/tests/api/test_datasets_api.py:1037
585
- #: udata/tests/api/test_datasets_api.py:1048
620
+ #: udata/core/dataset/models.py:171 udata/tests/api/test_datasets_api.py:1121
621
+ #: udata/tests/api/test_datasets_api.py:1132
586
622
  #, python-brace-format
587
623
  msgid "Schema name \"{schema}\" is not an allowed value. Allowed values: {values}"
588
624
  msgstr ""
589
625
 
590
- #: udata/core/dataset/models.py:188 udata/tests/api/test_datasets_api.py:1060
626
+ #: udata/core/dataset/models.py:190 udata/tests/api/test_datasets_api.py:1144
591
627
  #, python-brace-format
592
628
  msgid "Version \"{version}\" is not an allowed value for the schema \"{name}\". Allowed versions: {values}"
593
629
  msgstr ""
594
630
 
595
- #: udata/core/dataset/models.py:467 udata/core/dataset/rdf.py:603
631
+ #: udata/core/dataset/models.py:469 udata/core/dataset/rdf.py:603
596
632
  #: udata/tests/dataset/test_dataset_rdf.py:687
597
633
  #: udata/tests/dataset/test_dataset_rdf.py:700
598
634
  msgid "Nameless resource"
599
635
  msgstr "مورد مجهول"
600
636
 
601
- #: udata/core/dataset/models.py:559
637
+ #: udata/core/dataset/models.py:564
602
638
  msgid "Future date of update"
603
639
  msgstr "تاريخ التحديث في المستقبل"
604
640
 
605
- #: udata/core/dataset/models.py:624
641
+ #: udata/core/dataset/models.py:640
606
642
  msgid "dataset"
607
643
  msgstr "مجموعة البيانات"
608
644
 
@@ -611,7 +647,7 @@ msgstr "مجموعة البيانات"
611
647
  msgid "{format} resource"
612
648
  msgstr ""
613
649
 
614
- #: udata/core/dataset/tasks.py:113
650
+ #: udata/core/dataset/tasks.py:112
615
651
  msgid "You need to update some frequency-based datasets"
616
652
  msgstr "يجب تحديث بعض مجموعات البيانات المستندة إلى الترددات"
617
653
 
@@ -689,17 +725,17 @@ msgid "Refused"
689
725
  msgstr "مرفوض"
690
726
 
691
727
  #: udata/core/organization/forms.py:25
692
- #: udata/tests/api/test_organizations_api.py:132
728
+ #: udata/tests/api/test_organizations_api.py:137
693
729
  msgid "A siret number is made of 14 digits"
694
730
  msgstr ""
695
731
 
696
732
  #: udata/core/organization/forms.py:36
697
- #: udata/tests/api/test_organizations_api.py:144
733
+ #: udata/tests/api/test_organizations_api.py:149
698
734
  msgid "A siret number is only made of digits"
699
735
  msgstr ""
700
736
 
701
737
  #: udata/core/organization/forms.py:39
702
- #: udata/tests/api/test_organizations_api.py:138
738
+ #: udata/tests/api/test_organizations_api.py:143
703
739
  msgid "Invalid Siret number"
704
740
  msgstr ""
705
741
 
@@ -731,23 +767,23 @@ msgstr ""
731
767
  msgid "Business identification number"
732
768
  msgstr ""
733
769
 
734
- #: udata/core/organization/models.py:35
770
+ #: udata/core/organization/models.py:37
735
771
  msgid "Public Service"
736
772
  msgstr "خدمات عامة"
737
773
 
738
- #: udata/core/organization/models.py:36
774
+ #: udata/core/organization/models.py:38
739
775
  msgid "Certified"
740
776
  msgstr "معتمد"
741
777
 
742
- #: udata/core/organization/models.py:37
778
+ #: udata/core/organization/models.py:39
743
779
  msgid "Association"
744
780
  msgstr ""
745
781
 
746
- #: udata/core/organization/models.py:38
782
+ #: udata/core/organization/models.py:40
747
783
  msgid "Company"
748
784
  msgstr ""
749
785
 
750
- #: udata/core/organization/models.py:39
786
+ #: udata/core/organization/models.py:41
751
787
  msgid "Local authority"
752
788
  msgstr ""
753
789
 
@@ -789,6 +825,10 @@ msgstr ""
789
825
  msgid "Your organization \"%(name)s\" has been identified as a local authority"
790
826
  msgstr ""
791
827
 
828
+ #: udata/core/post/api.py:119
829
+ msgid "Latests posts"
830
+ msgstr ""
831
+
792
832
  #: udata/core/post/constants.py:9
793
833
  msgid "Markdown"
794
834
  msgstr ""
@@ -873,6 +913,10 @@ msgstr "قام بتحديث استخدام"
873
913
  msgid "deleted a reuse"
874
914
  msgstr "قام بحذف استخدام"
875
915
 
916
+ #: udata/core/reuse/api.py:141
917
+ msgid "Latests reuses"
918
+ msgstr ""
919
+
876
920
  #: udata/core/reuse/constants.py:5
877
921
  msgid "Application"
878
922
  msgstr "تطبيق"
@@ -957,11 +1001,11 @@ msgstr ""
957
1001
  msgid "Open data tools"
958
1002
  msgstr ""
959
1003
 
960
- #: udata/core/reuse/models.py:37
1004
+ #: udata/core/reuse/models.py:38
961
1005
  msgid "This URL is already registered"
962
1006
  msgstr "هذا العنوان الإلكتروني مسجل من قبل"
963
1007
 
964
- #: udata/core/reuse/models.py:178
1008
+ #: udata/core/reuse/models.py:183
965
1009
  msgid "reuse"
966
1010
  msgstr "استخدام"
967
1011
 
@@ -1070,34 +1114,50 @@ msgstr ""
1070
1114
  msgid "French arrondissement"
1071
1115
  msgstr ""
1072
1116
 
1117
+ #: udata/core/topic/activities.py:17
1118
+ msgid "created a topic"
1119
+ msgstr ""
1120
+
1121
+ #: udata/core/topic/activities.py:23
1122
+ msgid "updated a topic"
1123
+ msgstr ""
1124
+
1073
1125
  #: udata/core/topic/forms.py:28
1074
1126
  msgid "Featured"
1075
1127
  msgstr "مميز"
1076
1128
 
1077
- #: udata/core/user/activities.py:33 udata/core/user/activities.py:65
1078
- msgid "followed an organization"
1079
- msgstr "تابع منظمة"
1080
-
1081
- #: udata/core/user/activities.py:38
1129
+ #: udata/core/user/activities.py:35
1082
1130
  msgid "followed a user"
1083
1131
  msgstr "تابع مستعمل"
1084
1132
 
1085
- #: udata/core/user/activities.py:45
1133
+ #: udata/core/user/activities.py:42
1134
+ msgid "discussed a dataservice"
1135
+ msgstr ""
1136
+
1137
+ #: udata/core/user/activities.py:47
1086
1138
  msgid "discussed a dataset"
1087
1139
  msgstr "ناقش مجموعة بيانات"
1088
1140
 
1089
- #: udata/core/user/activities.py:50
1141
+ #: udata/core/user/activities.py:52
1090
1142
  msgid "discussed a reuse"
1091
1143
  msgstr "ناقش إعادة إستخدام"
1092
1144
 
1093
- #: udata/core/user/activities.py:55
1145
+ #: udata/core/user/activities.py:57
1146
+ msgid "followed a dataservice"
1147
+ msgstr ""
1148
+
1149
+ #: udata/core/user/activities.py:62
1094
1150
  msgid "followed a dataset"
1095
1151
  msgstr "تابع مجموعة بيانات"
1096
1152
 
1097
- #: udata/core/user/activities.py:60
1153
+ #: udata/core/user/activities.py:67
1098
1154
  msgid "followed a reuse"
1099
1155
  msgstr "تابع إعادة إستخدام"
1100
1156
 
1157
+ #: udata/core/user/activities.py:72
1158
+ msgid "followed an organization"
1159
+ msgstr "تابع منظمة"
1160
+
1101
1161
  #: udata/core/user/forms.py:22
1102
1162
  msgid "Avatar"
1103
1163
  msgstr "الصورة الرمزية"
@@ -1110,7 +1170,7 @@ msgstr "حول"
1110
1170
  msgid "Roles"
1111
1171
  msgstr "الأدوار"
1112
1172
 
1113
- #: udata/core/user/models.py:291 udata/tests/api/test_me_api.py:297
1173
+ #: udata/core/user/models.py:304 udata/tests/api/test_me_api.py:297
1114
1174
  msgid "Account deletion"
1115
1175
  msgstr "حذف الحساب"
1116
1176
 
Binary file